summaryrefslogtreecommitdiffstats
path: root/src/tools/moc
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/moc')
-rw-r--r--src/tools/moc/preprocessor.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp
index cb53e665d0..b49ab9c210 100644
--- a/src/tools/moc/preprocessor.cpp
+++ b/src/tools/moc/preprocessor.cpp
@@ -1067,8 +1067,30 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed)
int start = index;
until(PP_NEWLINE);
macro.symbols.reserve(index - start - 1);
- for (int i = start; i < index - 1; ++i)
- macro.symbols += symbols.at(i);
+
+ // remove whitespace where there shouldn't be any:
+ // Before and after the macro, after a # and around ##
+ Token lastToken = HASH; // skip shitespace at the beginning
+ for (int i = start; i < index - 1; ++i) {
+ Token token = symbols.at(i).token;
+ if (token == PP_WHITESPACE || token == WHITESPACE) {
+ if (lastToken == PP_HASH || lastToken == HASH ||
+ lastToken == PP_HASHHASH ||
+ lastToken == PP_WHITESPACE || lastToken == WHITESPACE)
+ continue;
+ } else if (token == PP_HASHHASH) {
+ if (!macro.symbols.isEmpty() &&
+ (lastToken == PP_WHITESPACE || lastToken == WHITESPACE))
+ macro.symbols.pop_back();
+ }
+ macro.symbols.append(symbols.at(i));
+ lastToken = token;
+ }
+ // remove trailing whitespace
+ while (!macro.symbols.isEmpty() &&
+ (macro.symbols.last().token == PP_WHITESPACE || macro.symbols.last().token == WHITESPACE))
+ macro.symbols.pop_back();
+
macros.insert(name, macro);
continue;
}