OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_PARSING_EXPRESSION_CLASSIFIER_H | 5 #ifndef V8_PARSING_EXPRESSION_CLASSIFIER_H |
6 #define V8_PARSING_EXPRESSION_CLASSIFIER_H | 6 #define V8_PARSING_EXPRESSION_CLASSIFIER_H |
7 | 7 |
8 #include "src/messages.h" | 8 #include "src/messages.h" |
9 #include "src/parsing/scanner.h" | 9 #include "src/parsing/scanner.h" |
10 #include "src/parsing/token.h" | 10 #include "src/parsing/token.h" |
11 | 11 |
12 namespace v8 { | 12 namespace v8 { |
13 namespace internal { | 13 namespace internal { |
14 | 14 |
15 class DuplicateFinder; | 15 class DuplicateFinder; |
16 | 16 |
17 #define ERROR_CODES(T) \ | 17 #define ERROR_CODES(T) \ |
18 T(ExpressionProduction, 0) \ | 18 T(ExpressionProduction, 0) \ |
19 T(FormalParameterInitializerProduction, 1) \ | 19 T(FormalParameterInitializerProduction, 1) \ |
20 T(BindingPatternProduction, 2) \ | 20 T(BindingPatternProduction, 2) \ |
21 T(AssignmentPatternProduction, 3) \ | 21 T(AssignmentPatternProduction, 3) \ |
22 T(DistinctFormalParametersProduction, 4) \ | 22 T(DistinctFormalParametersProduction, 4) \ |
23 T(StrictModeFormalParametersProduction, 5) \ | 23 T(StrictModeFormalParametersProduction, 5) \ |
24 T(ArrowFormalParametersProduction, 6) \ | 24 T(ArrowFormalParametersProduction, 6) \ |
25 T(LetPatternProduction, 7) \ | 25 T(LetPatternProduction, 7) \ |
26 T(ObjectLiteralProduction, 8) \ | 26 T(TailCallExpressionProduction, 8) \ |
27 T(TailCallExpressionProduction, 9) \ | 27 T(AsyncArrowFormalParametersProduction, 9) |
28 T(AsyncArrowFormalParametersProduction, 10) | |
29 | 28 |
30 template <typename Traits> | 29 template <typename Traits> |
31 class ExpressionClassifier { | 30 class ExpressionClassifier { |
32 public: | 31 public: |
33 enum ErrorKind : unsigned { | 32 enum ErrorKind : unsigned { |
34 #define DEFINE_ERROR_KIND(NAME, CODE) k##NAME = CODE, | 33 #define DEFINE_ERROR_KIND(NAME, CODE) k##NAME = CODE, |
35 ERROR_CODES(DEFINE_ERROR_KIND) | 34 ERROR_CODES(DEFINE_ERROR_KIND) |
36 #undef DEFINE_ERROR_KIND | 35 #undef DEFINE_ERROR_KIND |
37 kUnusedError = 15 // Larger than error codes; should fit in 4 bits | 36 kUnusedError = 15 // Larger than error codes; should fit in 4 bits |
38 }; | 37 }; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 } | 157 } |
159 | 158 |
160 V8_INLINE const Error& strict_mode_formal_parameter_error() const { | 159 V8_INLINE const Error& strict_mode_formal_parameter_error() const { |
161 return reported_error(kStrictModeFormalParametersProduction); | 160 return reported_error(kStrictModeFormalParametersProduction); |
162 } | 161 } |
163 | 162 |
164 V8_INLINE const Error& let_pattern_error() const { | 163 V8_INLINE const Error& let_pattern_error() const { |
165 return reported_error(kLetPatternProduction); | 164 return reported_error(kLetPatternProduction); |
166 } | 165 } |
167 | 166 |
168 V8_INLINE bool has_object_literal_error() const { | |
169 return !is_valid(ObjectLiteralProduction); | |
170 } | |
171 | |
172 V8_INLINE const Error& object_literal_error() const { | |
173 return reported_error(kObjectLiteralProduction); | |
174 } | |
175 | |
176 V8_INLINE bool has_tail_call_expression() const { | 167 V8_INLINE bool has_tail_call_expression() const { |
177 return !is_valid(TailCallExpressionProduction); | 168 return !is_valid(TailCallExpressionProduction); |
178 } | 169 } |
179 V8_INLINE const Error& tail_call_expression_error() const { | 170 V8_INLINE const Error& tail_call_expression_error() const { |
180 return reported_error(kTailCallExpressionProduction); | 171 return reported_error(kTailCallExpressionProduction); |
181 } | 172 } |
182 | 173 |
183 V8_INLINE const Error& async_arrow_formal_parameters_error() const { | 174 V8_INLINE const Error& async_arrow_formal_parameters_error() const { |
184 return reported_error(kAsyncArrowFormalParametersProduction); | 175 return reported_error(kAsyncArrowFormalParametersProduction); |
185 } | 176 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 } | 265 } |
275 | 266 |
276 void RecordLetPatternError(const Scanner::Location& loc, | 267 void RecordLetPatternError(const Scanner::Location& loc, |
277 MessageTemplate::Template message, | 268 MessageTemplate::Template message, |
278 const char* arg = nullptr) { | 269 const char* arg = nullptr) { |
279 if (!is_valid_let_pattern()) return; | 270 if (!is_valid_let_pattern()) return; |
280 invalid_productions_ |= LetPatternProduction; | 271 invalid_productions_ |= LetPatternProduction; |
281 Add(Error(loc, message, kLetPatternProduction, arg)); | 272 Add(Error(loc, message, kLetPatternProduction, arg)); |
282 } | 273 } |
283 | 274 |
284 void RecordObjectLiteralError(const Scanner::Location& loc, | |
285 MessageTemplate::Template message, | |
286 const char* arg = nullptr) { | |
287 if (has_object_literal_error()) return; | |
288 invalid_productions_ |= ObjectLiteralProduction; | |
289 Add(Error(loc, message, kObjectLiteralProduction, arg)); | |
290 } | |
291 | |
292 void RecordTailCallExpressionError(const Scanner::Location& loc, | 275 void RecordTailCallExpressionError(const Scanner::Location& loc, |
293 MessageTemplate::Template message, | 276 MessageTemplate::Template message, |
294 const char* arg = nullptr) { | 277 const char* arg = nullptr) { |
295 if (has_tail_call_expression()) return; | 278 if (has_tail_call_expression()) return; |
296 invalid_productions_ |= TailCallExpressionProduction; | 279 invalid_productions_ |= TailCallExpressionProduction; |
297 Add(Error(loc, message, kTailCallExpressionProduction, arg)); | 280 Add(Error(loc, message, kTailCallExpressionProduction, arg)); |
298 } | 281 } |
299 | 282 |
300 void Accumulate(ExpressionClassifier* inner, unsigned productions, | 283 void Accumulate(ExpressionClassifier* inner, unsigned productions, |
301 bool merge_non_patterns = true) { | 284 bool merge_non_patterns = true) { |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 }; | 442 }; |
460 | 443 |
461 | 444 |
462 #undef ERROR_CODES | 445 #undef ERROR_CODES |
463 | 446 |
464 | 447 |
465 } // namespace internal | 448 } // namespace internal |
466 } // namespace v8 | 449 } // namespace v8 |
467 | 450 |
468 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H | 451 #endif // V8_PARSING_EXPRESSION_CLASSIFIER_H |
OLD | NEW |