17static void addLexToken(QList<Token> &tokens,
int tokenKind, QQmlJS::Lexer &lexer,
18 bool ®expMayFollow)
21 case QQmlJSGrammar::T_DIVIDE_:
22 case QQmlJSGrammar::T_DIVIDE_EQ:
23 if (lexer.state().currentChar.isSpace()) {
24 regexpMayFollow =
false;
27 if (regexpMayFollow) {
28 QQmlJS::Lexer::RegExpBodyPrefix prefix;
29 if (tokenKind == QQmlJSGrammar::T_DIVIDE_)
30 prefix = QQmlJS::Lexer::NoPrefix;
32 prefix = QQmlJS::Lexer::EqualPrefix;
33 if (lexer.scanRegExp(prefix)) {
34 regexpMayFollow =
false;
37 qCWarning(domLog) <<
"lexing error scannign regexp in" << lexer.code()
38 << lexer.errorCode() << lexer.errorMessage();
41 }
else if (tokenKind == QQmlJSGrammar::T_DIVIDE_) {
42 regexpMayFollow =
true;
46 case QQmlJSGrammar::T_AND:
47 case QQmlJSGrammar::T_AND_AND:
48 case QQmlJSGrammar::T_AND_EQ:
49 case QQmlJSGrammar::T_ARROW:
50 case QQmlJSGrammar::T_EQ:
51 case QQmlJSGrammar::T_EQ_EQ:
52 case QQmlJSGrammar::T_EQ_EQ_EQ:
53 case QQmlJSGrammar::T_GE:
54 case QQmlJSGrammar::T_GT:
55 case QQmlJSGrammar::T_GT_GT:
56 case QQmlJSGrammar::T_GT_GT_EQ:
57 case QQmlJSGrammar::T_GT_GT_GT:
58 case QQmlJSGrammar::T_GT_GT_GT_EQ:
59 case QQmlJSGrammar::T_LE:
60 case QQmlJSGrammar::T_LT:
61 case QQmlJSGrammar::T_LT_LT:
62 case QQmlJSGrammar::T_LT_LT_EQ:
63 case QQmlJSGrammar::T_MINUS:
64 case QQmlJSGrammar::T_MINUS_EQ:
65 case QQmlJSGrammar::T_MINUS_MINUS:
66 case QQmlJSGrammar::T_NOT:
67 case QQmlJSGrammar::T_NOT_EQ:
68 case QQmlJSGrammar::T_NOT_EQ_EQ:
69 case QQmlJSGrammar::T_OR:
70 case QQmlJSGrammar::T_OR_EQ:
71 case QQmlJSGrammar::T_OR_OR:
72 case QQmlJSGrammar::T_PLUS:
73 case QQmlJSGrammar::T_PLUS_EQ:
74 case QQmlJSGrammar::T_PLUS_PLUS:
75 case QQmlJSGrammar::T_QUESTION:
76 case QQmlJSGrammar::T_QUESTION_DOT:
77 case QQmlJSGrammar::T_QUESTION_QUESTION:
78 case QQmlJSGrammar::T_REMAINDER:
79 case QQmlJSGrammar::T_REMAINDER_EQ:
80 case QQmlJSGrammar::T_STAR:
81 case QQmlJSGrammar::T_STAR_EQ:
82 case QQmlJSGrammar::T_STAR_STAR:
83 case QQmlJSGrammar::T_STAR_STAR_EQ:
84 case QQmlJSGrammar::T_TILDE:
85 case QQmlJSGrammar::T_XOR:
86 case QQmlJSGrammar::T_XOR_EQ:
88 case QQmlJSGrammar::T_AT:
90 case QQmlJSGrammar::T_AUTOMATIC_SEMICOLON:
91 case QQmlJSGrammar::T_COMPATIBILITY_SEMICOLON:
92 case QQmlJSGrammar::T_SEMICOLON:
94 case QQmlJSGrammar::T_COLON:
95 case QQmlJSGrammar::T_COMMA:
96 case QQmlJSGrammar::T_LBRACE:
97 case QQmlJSGrammar::T_LBRACKET:
98 case QQmlJSGrammar::T_LPAREN:
100 case QQmlJSGrammar::T_ELLIPSIS:
101 regexpMayFollow =
true;
104 case QQmlJSGrammar::T_FUNCTION:
106 tokens.append(Token(lexer.tokenStartColumn() - 1,
107 lexer.tokenLength() - ((lexer.tokenText().endsWith(u' ')) ? 1 : 0),
111 case QQmlJSGrammar::T_DOT:
112 case QQmlJSGrammar::T_RBRACE:
113 case QQmlJSGrammar::T_RBRACKET:
114 case QQmlJSGrammar::T_RPAREN:
115 regexpMayFollow =
false;
120 case QQmlJSGrammar::T_TEMPLATE_HEAD:
121 regexpMayFollow =
true;
122 tokens.append(Token(lexer.tokenStartColumn() - 1, lexer.tokenLength() - 2, tokenKind));
123 tokens.append(Token(lexer.tokenStartColumn() + lexer.tokenLength() - 3, 2,
124 QQmlJSGrammar::T_PLUS));
126 case QQmlJSGrammar::T_TEMPLATE_MIDDLE:
127 regexpMayFollow =
true;
128 tokens.append(Token(lexer.tokenStartColumn() - 1, 1, QQmlJSGrammar::T_PLUS));
129 tokens.append(Token(lexer.tokenStartColumn(), lexer.tokenLength() - 3, tokenKind));
130 tokens.append(Token(lexer.tokenStartColumn() + lexer.tokenLength() - 3, 2,
131 QQmlJSGrammar::T_PLUS));
133 case QQmlJSGrammar::T_TEMPLATE_TAIL:
134 regexpMayFollow =
true;
135 tokens.append(Token(lexer.tokenStartColumn() - 1, 1, QQmlJSGrammar::T_PLUS));
136 tokens.append(Token(lexer.tokenStartColumn(), lexer.tokenLength() - 1, tokenKind));
138 case QQmlJSGrammar::T_PARTIAL_TEMPLATE_MIDDLE:
139 regexpMayFollow =
true;
140 tokens.append(Token(lexer.tokenStartColumn() - 1, 1, QQmlJSGrammar::T_PLUS));
141 tokens.append(Token(lexer.tokenStartColumn(), lexer.tokenLength() - 1, tokenKind));
143 case QQmlJSGrammar::T_MULTILINE_STRING_LITERAL:
144 case QQmlJSGrammar::T_NO_SUBSTITUTION_TEMPLATE:
145 case QQmlJSGrammar::T_STRING_LITERAL:
146 case QQmlJSGrammar::T_PARTIAL_SINGLE_QUOTE_STRING_LITERAL:
147 case QQmlJSGrammar::T_PARTIAL_DOUBLE_QUOTE_STRING_LITERAL:
148 case QQmlJSGrammar::T_PARTIAL_TEMPLATE_HEAD:
149 regexpMayFollow = (tokenKind == QQmlJSGrammar::T_TEMPLATE_MIDDLE
150 || tokenKind == QQmlJSGrammar::T_TEMPLATE_HEAD);
153 case QQmlJSGrammar::T_VERSION_NUMBER:
154 if (lexer.state().currentChar == u'.') {
155 int offset = lexer.tokenStartColumn() - 1;
156 int length = lexer.tokenLength();
157 tokenKind = lexer.lex();
158 Q_ASSERT(tokenKind == QQmlJSGrammar::T_DOT);
159 tokenKind = lexer.lex();
160 Q_ASSERT(tokenKind == QQmlJSGrammar::T_VERSION_NUMBER);
161 length += 1 + lexer.tokenLength();
162 tokens.append(Token(offset, length, QQmlJSGrammar::T_NUMERIC_LITERAL));
171 qsizetype len = lexer.code().size();
172 if (lexer.code().endsWith(u'\n'))
174 len -= lexer.tokenStartColumn() - 1;
177 if (lexer.tokenLength() < len)
178 len = lexer.tokenLength();
179 tokens.append(Token(lexer.tokenStartColumn() - 1, len, tokenKind));
182bool Token::lexKindIsDelimiter(
int kind)
185 case QQmlJSGrammar::T_AND:
186 case QQmlJSGrammar::T_AND_AND:
187 case QQmlJSGrammar::T_AND_EQ:
188 case QQmlJSGrammar::T_ARROW:
189 case QQmlJSGrammar::T_EQ:
190 case QQmlJSGrammar::T_EQ_EQ:
191 case QQmlJSGrammar::T_EQ_EQ_EQ:
192 case QQmlJSGrammar::T_GE:
193 case QQmlJSGrammar::T_GT:
194 case QQmlJSGrammar::T_GT_GT:
195 case QQmlJSGrammar::T_GT_GT_EQ:
196 case QQmlJSGrammar::T_GT_GT_GT:
197 case QQmlJSGrammar::T_GT_GT_GT_EQ:
198 case QQmlJSGrammar::T_LE:
199 case QQmlJSGrammar::T_LT:
200 case QQmlJSGrammar::T_LT_LT:
201 case QQmlJSGrammar::T_LT_LT_EQ:
202 case QQmlJSGrammar::T_MINUS:
203 case QQmlJSGrammar::T_MINUS_EQ:
204 case QQmlJSGrammar::T_NOT:
205 case QQmlJSGrammar::T_NOT_EQ:
206 case QQmlJSGrammar::T_NOT_EQ_EQ:
207 case QQmlJSGrammar::T_OR:
208 case QQmlJSGrammar::T_OR_EQ:
209 case QQmlJSGrammar::T_OR_OR:
210 case QQmlJSGrammar::T_PLUS:
211 case QQmlJSGrammar::T_PLUS_EQ:
212 case QQmlJSGrammar::T_QUESTION:
213 case QQmlJSGrammar::T_QUESTION_DOT:
214 case QQmlJSGrammar::T_QUESTION_QUESTION:
215 case QQmlJSGrammar::T_REMAINDER:
216 case QQmlJSGrammar::T_REMAINDER_EQ:
217 case QQmlJSGrammar::T_STAR:
218 case QQmlJSGrammar::T_STAR_EQ:
219 case QQmlJSGrammar::T_STAR_STAR:
220 case QQmlJSGrammar::T_STAR_STAR_EQ:
221 case QQmlJSGrammar::T_TILDE:
222 case QQmlJSGrammar::T_XOR:
223 case QQmlJSGrammar::T_XOR_EQ:
224 case QQmlJSGrammar::T_AT:
225 case QQmlJSGrammar::T_COMMA:
226 case QQmlJSGrammar::T_COLON:
227 case QQmlJSGrammar::T_LPAREN:
228 case QQmlJSGrammar::T_DIVIDE_:
229 case QQmlJSGrammar::T_DIVIDE_EQ:
314bool Token::lexKindIsIdentifier(
int kind)
317 case QQmlJSGrammar::T_IDENTIFIER:
318 case QQmlJSGrammar::T_COMPONENT:
319 case QQmlJSGrammar::T_REQUIRED:
320 case QQmlJSGrammar::T_AS:
321 case QQmlJSGrammar::T_PRAGMA:
322 case QQmlJSGrammar::T_IMPORT:
323 case QQmlJSGrammar::T_ENUM:
324 case QQmlJSGrammar::T_PACKAGE:
325 case QQmlJSGrammar::T_ABSTRACT:
326 case QQmlJSGrammar::T_INTERFACE:
327 case QQmlJSGrammar::T_IMPLEMENTS:
328 case QQmlJSGrammar::T_PUBLIC:
329 case QQmlJSGrammar::T_PROTECTED:
330 case QQmlJSGrammar::T_PRIVATE:
331 case QQmlJSGrammar::T_NATIVE:
332 case QQmlJSGrammar::T_VOLATILE:
333 case QQmlJSGrammar::T_TRANSIENT:
334 case QQmlJSGrammar::T_SYNCHRONIZED:
335 case QQmlJSGrammar::T_THROWS:
336 case QQmlJSGrammar::T_SET:
337 case QQmlJSGrammar::T_SIGNAL:
338 case QQmlJSGrammar::T_PROPERTY:
339 case QQmlJSGrammar::T_READONLY:
340 case QQmlJSGrammar::T_NULL:
341 case QQmlJSGrammar::T_OF:
342 case QQmlJSGrammar::T_ON:
343 case QQmlJSGrammar::T_STATIC:
344 case QQmlJSGrammar::T_TRUE:
345 case QQmlJSGrammar::T_TRY:
346 case QQmlJSGrammar::T_TYPEOF:
347 case QQmlJSGrammar::T_WITHOUTAS:
348 case QQmlJSGrammar::T_FROM: