sitter added a comment.
Looks so much better already! I'd really love a unit test for this though. plasma-workspace's servicesrunner should have an example one INLINE COMMENTS > converterrunner.cpp:19 > > +#define CONVERSION_CHAR QLatin1Char( '>' ) > #include "converterrunner.h" Please move this after the includes. If any header in the future decides to want to use the name as well we're in for an awkward debugging session. > converterrunner.cpp:57 > + const QString valueGroup = QStringLiteral("([0-9,./]+)"); > + const QString unitGroup = QStringLiteral("([a-zA-Z/\"'^0-9$£¥€]+)"); > + const QString separatorsGroup = QStringLiteral("(?: in | to | as | ?> > ?)"); I am sure we can do better than hardcoding currency symbols. Perhaps iterate QLocales and get the currencySymbol for each? (needs checking that performance doesn't degrade) > converterrunner.cpp:59 > + const QString separatorsGroup = QStringLiteral("(?: in | to | as | ?> > ?)"); > + matchRegex = QRegularExpression(QStringLiteral("^%1 > ?%2(?:%3%2)?$").arg(valueGroup, unitGroup, separatorsGroup)); > } I'd really prefer named capture groups. Popping data out of the captures by index is fairly terrible to read and also easier to mess up in the future. > converterrunner.cpp:68 > { > - const QString term = context.query(); > - if (term.size() < 2) { > + const QString &term = context.query(); > + if (term.size() < 2 || !context.isValid()) { unnecessary ref. > converterrunner.cpp:78 > + const QString value = regexMatch.captured(1); > + const QString unit1 = regexMatch.captured(2); > + const QString unit2 = regexMatch.lastCapturedIndex() == 3 ? > regexMatch.captured(3) : QString(); unit1 and unit2 should probably be unitString1 and unitString2 so the actual units can be unit1 and unit2. same for value I suppose. > converterrunner.cpp:82 > + KUnitConversion::UnitCategory category = > converter.categoryForUnit(unit1); > + const KUnitConversion::Unit u1 = category.unit(unit1); > + const QList<KUnitConversion::Unit> &units = createResultUnits(unit2, > category); Please use more descriptive names than u1, such as unit1. In fact, isn't unit1 "inputUnit" and unit2 "outputUnit"? If so I'd name them thusly. > converterrunner.cpp:83 > + const KUnitConversion::Unit u1 = category.unit(unit1); > + const QList<KUnitConversion::Unit> &units = createResultUnits(unit2, > category); > + const auto numberDataPair = getValidatedNumberValue(value); unnecessary ref. > converterrunner.cpp:92 > + QList<Plasma::QueryMatch> matches; > + for (const KUnitConversion::Unit &u: units) { > + const KUnitConversion::Value &v = > category.convert(KUnitConversion::Value(numberValue, u1), u); `s/u/unit` > converterrunner.cpp:93 > + for (const KUnitConversion::Unit &u: units) { > + const KUnitConversion::Value &v = > category.convert(KUnitConversion::Value(numberValue, u1), u); > + if (!v.isValid() || u1 == u) { `s/v/value` > converterrunner.cpp:114 > + QGuiApplication::clipboard()->setText(match.data().toString()); > +} > +double ConverterRunner::stringToDouble(const QStringRef &value, bool *ok) newline missing it seems > converterrunner.cpp:124 > + > +QPair<bool, double> ConverterRunner::getValidatedNumberValue(const QString > &value) > +{ in all return statements you can use list initialization `return { ok, output };` > converterrunner.h:50 > + > + double stringToDouble(const QStringRef &value, bool *ok); > + QPair<bool, double> getValidatedNumberValue(const QString &value); stringToDouble and getValidatedNumberValue seem to have conflicting ideas of api design. either both should use the pair return or both should use the ok pointer. > converterrunner.h:52 > + QPair<bool, double> getValidatedNumberValue(const QString &value); > + QList<KUnitConversion::Unit> createResultUnits(const QString &unit2, > const KUnitConversion::UnitCategory &category); > }; Please use multiple lines to declare multiple members, even when they have the same type. Same line declaration is unnecessarily increasing reading complexity. REPOSITORY R114 Plasma Addons REVISION DETAIL https://phabricator.kde.org/D27166 To: alex, broulik, ngraham, #plasma, sitter Cc: sitter, plasma-devel, Orage, LeGast00n, The-Feren-OS-Dev, cblack, jraleigh, zachus, fbampaloukas, GB_2, ragreen, ZrenBot, ngraham, alexeymin, himcesjf, lesliezhai, ali-mohamed, jensreuterberg, abetts, sebas, apol, ahiemstra, mart