Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(313)

Side by Side Diff: src/expression-classifier.h

Issue 1168643005: [es6] parse destructuring assignment (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase on top of rest+arrow functions Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/messages.h » ('j') | src/preparser.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_EXPRESSION_CLASSIFIER_H 5 #ifndef V8_EXPRESSION_CLASSIFIER_H
6 #define V8_EXPRESSION_CLASSIFIER_H 6 #define V8_EXPRESSION_CLASSIFIER_H
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/messages.h" 10 #include "src/messages.h"
(...skipping 30 matching lines...) Expand all
41 (BindingPatternProduction | AssignmentPatternProduction), 41 (BindingPatternProduction | AssignmentPatternProduction),
42 FormalParametersProductions = (DistinctFormalParametersProduction | 42 FormalParametersProductions = (DistinctFormalParametersProduction |
43 StrictModeFormalParametersProduction | 43 StrictModeFormalParametersProduction |
44 StrongModeFormalParametersProduction), 44 StrongModeFormalParametersProduction),
45 StandardProductions = ExpressionProduction | PatternProductions, 45 StandardProductions = ExpressionProduction | PatternProductions,
46 AllProductions = (StandardProductions | FormalParametersProductions | 46 AllProductions = (StandardProductions | FormalParametersProductions |
47 ArrowFormalParametersProduction) 47 ArrowFormalParametersProduction)
48 }; 48 };
49 49
50 ExpressionClassifier() 50 ExpressionClassifier()
51 : invalid_productions_(0), duplicate_finder_(nullptr) {} 51 : lhs_type_(TARGET_NONE),
52 assigned_(false),
53 invalid_productions_(0),
54 duplicate_finder_(nullptr) {}
52 55
53 explicit ExpressionClassifier(DuplicateFinder* duplicate_finder) 56 explicit ExpressionClassifier(DuplicateFinder* duplicate_finder)
54 : invalid_productions_(0), duplicate_finder_(duplicate_finder) {} 57 : lhs_type_(TARGET_NONE),
58 assigned_(false),
59 invalid_productions_(0),
60 duplicate_finder_(duplicate_finder) {}
61
62 enum AssignmentTargetType {
63 TARGET_NONE = 0,
64
65 // IdentifierReference
66 TARGET_IDENTIFIER,
67
68 // MemberExpression . <property name>
69 // MemberExpression [<property name>]
70 TARGET_PROPERTY,
71
72 // MemberExpression ( arguments )
73 // new MemberExpression ( arguments )
74 // MemberExpression TemplateLiteral
75 TARGET_CALL,
76
77 // this
78 // Literal
79 // ArrayLiteral
80 // ObjectLiteral
81 // FunctionExpression
82 // ClassExpression
83 // GeneratorExpression
84 // RegularExpressionLiteral
85 // TemplateLiteral
86 // CoverParenthesizedExpressionAndArrowParameterList
87 TARGET_PRIMARY,
88
89 // new.target
90 // yield (in generator)
91 TARGET_RESTRICTED,
noordhuis 2015/06/15 22:01:09 TARGET_RESTRICTED doesn't seem to be used anywhere
caitp (gmail) 2015/06/19 14:23:20 Done.
92
93 // UnaryExpression
94 // MultiplicativeExpression
95 // AdditiveExpression
96 // ShiftExpression
97 // RelationalExpression
98 // EqualityExpression
99 // BitwiseANDExpression
100 // BitwiseXORExpression
101 // BitwiseORExpression
102 // LogicalANDExpression
103 // LogicalORExpression
104 // ConditionalExpression
105 // AssignmentExpression
106 // ... Pretty much any binary operator
107 UNACCEPTABLE_TARGET,
108
109 // BindingPattern
110 TARGET_PATTERN
111 };
112
113 inline AssignmentTargetType AssignmentTarget() const { return lhs_type_; }
114
115 inline void AppendAssignmentTarget(AssignmentTargetType type) {
116 if (lhs_type_ == UNACCEPTABLE_TARGET) return;
117 lhs_type_ = type;
118 }
119
120 inline void ReportInvalidSimpleAssignmentTarget() {
121 lhs_type_ = UNACCEPTABLE_TARGET;
122 }
123
124 inline bool IsValidSimpleAssignmentTarget() const {
125 // Only identifiers and properties are valid targets.
126 return lhs_type_ >= TARGET_IDENTIFIER && lhs_type_ <= TARGET_PROPERTY;
noordhuis 2015/06/15 22:01:09 This code is perhaps a little easier to understand
caitp (gmail) 2015/06/19 14:23:20 Done.
127 }
128
129 inline bool IsPatternAssignmentElement() const {
130 // Any AssignmentElement for which IsValidSimpleAssignmentTarget is false.
131 // Used for nested AssignmentPatterns
132 return lhs_type_ == TARGET_PATTERN && is_valid_assignment_pattern();
133 }
134
135 inline bool IsValidPattern() const { return lhs_type_ == TARGET_PATTERN; }
136
137 inline bool IsAssigned() const { return assigned_; }
138
139 void set_assigned() { assigned_ = true; }
140
141 bool is_destructuring_assignment() const {
142 return lhs_type_ == TARGET_PATTERN && assigned_;
noordhuis 2015/06/15 22:01:09 I think this can be written as `return IsValidPatt
caitp (gmail) 2015/06/19 14:23:20 Done.
143 }
144
55 145
56 bool is_valid(unsigned productions) const { 146 bool is_valid(unsigned productions) const {
57 return (invalid_productions_ & productions) == 0; 147 return (invalid_productions_ & productions) == 0;
58 } 148 }
59 149
60 DuplicateFinder* duplicate_finder() const { return duplicate_finder_; } 150 DuplicateFinder* duplicate_finder() const { return duplicate_finder_; }
61 151
62 bool is_valid_expression() const { return is_valid(ExpressionProduction); } 152 bool is_valid_expression() const { return is_valid(ExpressionProduction); }
63 153
64 bool is_valid_binding_pattern() const { 154 bool is_valid_binding_pattern() const {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 void RecordStrongModeFormalParameterError(const Scanner::Location& loc, 268 void RecordStrongModeFormalParameterError(const Scanner::Location& loc,
179 MessageTemplate::Template message, 269 MessageTemplate::Template message,
180 const char* arg = nullptr) { 270 const char* arg = nullptr) {
181 if (!is_valid_strong_mode_formal_parameters()) return; 271 if (!is_valid_strong_mode_formal_parameters()) return;
182 invalid_productions_ |= StrongModeFormalParametersProduction; 272 invalid_productions_ |= StrongModeFormalParametersProduction;
183 strong_mode_formal_parameter_error_.location = loc; 273 strong_mode_formal_parameter_error_.location = loc;
184 strong_mode_formal_parameter_error_.message = message; 274 strong_mode_formal_parameter_error_.message = message;
185 strong_mode_formal_parameter_error_.arg = arg; 275 strong_mode_formal_parameter_error_.arg = arg;
186 } 276 }
187 277
278 void AccumulateValidSimpleAssignmentTarget(
279 const ExpressionClassifier& inner) {
280 if (lhs_type_ != UNACCEPTABLE_TARGET) {
281 lhs_type_ = inner.lhs_type_;
282 }
283 }
284
285
188 void Accumulate(const ExpressionClassifier& inner, 286 void Accumulate(const ExpressionClassifier& inner,
189 unsigned productions = StandardProductions) { 287 unsigned productions = StandardProductions) {
190 // Propagate errors from inner, but don't overwrite already recorded 288 // Propagate errors from inner, but don't overwrite already recorded
191 // errors. 289 // errors.
192 unsigned non_arrow_inner_invalid_productions = 290 unsigned non_arrow_inner_invalid_productions =
193 inner.invalid_productions_ & ~ArrowFormalParametersProduction; 291 inner.invalid_productions_ & ~ArrowFormalParametersProduction;
194 if (non_arrow_inner_invalid_productions == 0) return; 292 if (non_arrow_inner_invalid_productions == 0) return;
195 unsigned non_arrow_productions = 293 unsigned non_arrow_productions =
196 productions & ~ArrowFormalParametersProduction; 294 productions & ~ArrowFormalParametersProduction;
197 unsigned errors = 295 unsigned errors =
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 if (is_valid_binding_pattern()) { 330 if (is_valid_binding_pattern()) {
233 binding_pattern_error_ = inner.expression_error(); 331 binding_pattern_error_ = inner.expression_error();
234 } 332 }
235 if (is_valid_assignment_pattern()) { 333 if (is_valid_assignment_pattern()) {
236 assignment_pattern_error_ = inner.expression_error(); 334 assignment_pattern_error_ = inner.expression_error();
237 } 335 }
238 } 336 }
239 } 337 }
240 338
241 private: 339 private:
340 AssignmentTargetType lhs_type_;
341 bool assigned_;
242 unsigned invalid_productions_; 342 unsigned invalid_productions_;
243 Error expression_error_; 343 Error expression_error_;
244 Error binding_pattern_error_; 344 Error binding_pattern_error_;
245 Error assignment_pattern_error_; 345 Error assignment_pattern_error_;
246 Error arrow_formal_parameters_error_; 346 Error arrow_formal_parameters_error_;
247 Error duplicate_formal_parameter_error_; 347 Error duplicate_formal_parameter_error_;
248 Error strict_mode_formal_parameter_error_; 348 Error strict_mode_formal_parameter_error_;
249 Error strong_mode_formal_parameter_error_; 349 Error strong_mode_formal_parameter_error_;
250 DuplicateFinder* duplicate_finder_; 350 DuplicateFinder* duplicate_finder_;
251 }; 351 };
252 } 352 }
253 } // v8::internal 353 } // v8::internal
254 354
255 #endif // V8_EXPRESSION_CLASSIFIER_H 355 #endif // V8_EXPRESSION_CLASSIFIER_H
OLDNEW
« no previous file with comments | « no previous file | src/messages.h » ('j') | src/preparser.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698