summaryrefslogtreecommitdiffstats
path: root/src/tools/moc/moc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/moc/moc.cpp')
-rw-r--r--src/tools/moc/moc.cpp40
1 files changed, 26 insertions, 14 deletions
diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp
index 2c3f795346..ea4838c8f2 100644
--- a/src/tools/moc/moc.cpp
+++ b/src/tools/moc/moc.cpp
@@ -224,14 +224,11 @@ Type Moc::parseType()
;
}
if (test(LANGLE)) {
- QByteArray templ = lexemUntil(RANGLE);
- for (int i = 0; i < templ.size(); ++i) {
- type.name += templ.at(i);
- if ((templ.at(i) == '<' && i+1 < templ.size() && templ.at(i+1) == ':')
- || (templ.at(i) == '>' && i+1 < templ.size() && templ.at(i+1) == '>')) {
- type.name += ' ';
- }
+ if (type.name.isEmpty()) {
+ // '<' cannot start a type
+ return type;
}
+ type.name += lexemUntil(RANGLE);
}
if (test(SCOPE)) {
type.name += lexem();
@@ -1402,10 +1399,14 @@ QByteArray Moc::lexemUntil(Token target)
QByteArray s;
while (from <= index) {
QByteArray n = symbols.at(from++-1).lexem();
- if (s.size() && n.size()
- && is_ident_char(s.at(s.size()-1))
- && is_ident_char(n.at(0)))
- s += ' ';
+ if (s.size() && n.size()) {
+ char prev = s.at(s.size()-1);
+ char next = n.at(0);
+ if ((is_ident_char(prev) && is_ident_char(next))
+ || (prev == '<' && next == ':')
+ || (prev == '>' && next == '>'))
+ s += ' ';
+ }
s += n;
}
return s;
@@ -1440,9 +1441,20 @@ bool Moc::until(Token target) {
case RBRACK: --brackCount; break;
case LPAREN: ++parenCount; break;
case RPAREN: --parenCount; break;
- case LANGLE: ++angleCount; break;
- case RANGLE: --angleCount; break;
- case GTGT: angleCount -= 2; t = RANGLE; break;
+ case LANGLE:
+ if (parenCount == 0 && braceCount == 0 && parenCount == 0)
+ ++angleCount;
+ break;
+ case RANGLE:
+ if (parenCount == 0 && braceCount == 0)
+ --angleCount;
+ break;
+ case GTGT:
+ if (parenCount == 0 && braceCount == 0) {
+ angleCount -= 2;
+ t = RANGLE;
+ }
+ break;
default: break;
}
if (t == target