Cache matches of the RegExprRule to avoid unnecessary calls.
This is essentially the same optimization existent in Kate.
A colateral effect of this implementation is a mechanism to
notify the rules when a progress (highlight of the current
line) is finished.
this is a wrapper around QProcess with these features:
- setEnvironment() takes a Utils::Environment instead of a QStringList
- instead of taking a stringlist with arguments, take a single shell
command string which is fully compatible with the system's native
shell (the bourne shell on unix and cmd.exe on windows) - with support
for environment variable expansion, and subject to the shell's
splitting and quoting rules. if the command is too complex (e.g.,
contains redirections), it is transparently executed through a real
shell.
- additionally, the class contains a set of helper functions for
manipulating (constructing, splitting, etc.) shell command lines.
in particular, it contains a shell-safe macro expander and the nested
class ArgIterator which can be used for inspecting and manipulating a
shell command line without going through the stringlist indirection
(which is potentially lossy).
some of this is based on KDE code (KShell and KMacroExpander) which i
have written myself.
AbstractMacroExpander (any macros), AbstractQtcMacroExpander (%{var}
style macros, which is a hybrid of printf format specifiers and unix
environment expansions) and expandMacros() for the actual string
manipulation.
instead of being os-agnostic, interpret the os-native expansion style,
so it is consistent with proper (shell) command lines.
don't interpret quotes, as this function is meant for expanding isolated
filepaths, where nobody would expect quoting. instead, use the windows
style of simply not doing an expansion if a referenced variable is not
found, which should be good enough - it's rather unlikely that something
which happens to be an expansion of an existing variable is actually not
meant to be one.
- unify unix and windows paths
- on windows:
- we don't need to care for trailing backslashes, as we never append
directly to quoted strings
- simplify, as this doesn't need to be fast.
unfortunately, it's impossible to use
ret.replace(QRegExp(QLatin1String("(\\\\*)$")), QLatin1String("\"\\1"));
as that matches foo\ twice (once one backslash and once an empty
string).
qtLibraryTarget is only defined if used with TEMPLATE=lib, which makes
it fail in pri files that are used for app pro files. The tests still
don't run because of run time linking issues.
QRegExp matching is quite expensive, and has to be done for every file
in the project directory tree against all possible suffixes. Optimize
for the common case that the pattern is "*.suffix" by doing a
fileName.endsWidth(suffix) in this case.
This speeds up loading of examples/declarative/declarative.qmlproject by
about 30%.
Reviewed-by: Christian Kamm