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

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

Issue 1411203002: [es6] implement destructuring assignment [clean diff] (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rename `recorded_first()` to `FirstRecorded()` because non-accessor Created 5 years, 1 month 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 | « src/bootstrapper.cc ('k') | src/flag-definitions.h » ('j') | no next file with comments »
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/messages.h" 8 #include "src/messages.h"
9 #include "src/scanner.h" 9 #include "src/scanner.h"
10 #include "src/token.h" 10 #include "src/token.h"
(...skipping 18 matching lines...) Expand all
29 enum TargetProduction { 29 enum TargetProduction {
30 ExpressionProduction = 1 << 0, 30 ExpressionProduction = 1 << 0,
31 FormalParameterInitializerProduction = 1 << 1, 31 FormalParameterInitializerProduction = 1 << 1,
32 BindingPatternProduction = 1 << 2, 32 BindingPatternProduction = 1 << 2,
33 AssignmentPatternProduction = 1 << 3, 33 AssignmentPatternProduction = 1 << 3,
34 DistinctFormalParametersProduction = 1 << 4, 34 DistinctFormalParametersProduction = 1 << 4,
35 StrictModeFormalParametersProduction = 1 << 5, 35 StrictModeFormalParametersProduction = 1 << 5,
36 StrongModeFormalParametersProduction = 1 << 6, 36 StrongModeFormalParametersProduction = 1 << 6,
37 ArrowFormalParametersProduction = 1 << 7, 37 ArrowFormalParametersProduction = 1 << 7,
38 LetPatternProduction = 1 << 8, 38 LetPatternProduction = 1 << 8,
39 CoverInitializedNameProduction = 1 << 9,
39 40
40 ExpressionProductions = 41 ExpressionProductions =
41 (ExpressionProduction | FormalParameterInitializerProduction), 42 (ExpressionProduction | FormalParameterInitializerProduction),
42 PatternProductions = (BindingPatternProduction | 43 PatternProductions = (BindingPatternProduction |
43 AssignmentPatternProduction | LetPatternProduction), 44 AssignmentPatternProduction | LetPatternProduction),
44 FormalParametersProductions = (DistinctFormalParametersProduction | 45 FormalParametersProductions = (DistinctFormalParametersProduction |
45 StrictModeFormalParametersProduction | 46 StrictModeFormalParametersProduction |
46 StrongModeFormalParametersProduction), 47 StrongModeFormalParametersProduction),
47 StandardProductions = ExpressionProductions | PatternProductions, 48 StandardProductions = ExpressionProductions | PatternProductions,
48 AllProductions = (StandardProductions | FormalParametersProductions | 49 AllProductions =
49 ArrowFormalParametersProduction) 50 (StandardProductions | FormalParametersProductions |
51 ArrowFormalParametersProduction | CoverInitializedNameProduction)
50 }; 52 };
51 53
52 enum FunctionProperties { NonSimpleParameter = 1 << 0 }; 54 enum FunctionProperties { NonSimpleParameter = 1 << 0 };
53 55
54 ExpressionClassifier() 56 ExpressionClassifier()
55 : invalid_productions_(0), 57 : invalid_productions_(0),
56 function_properties_(0), 58 function_properties_(0),
57 duplicate_finder_(nullptr) {} 59 duplicate_finder_(nullptr) {}
58 60
59 explicit ExpressionClassifier(DuplicateFinder* duplicate_finder) 61 explicit ExpressionClassifier(DuplicateFinder* duplicate_finder)
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 const Error& strict_mode_formal_parameter_error() const { 128 const Error& strict_mode_formal_parameter_error() const {
127 return strict_mode_formal_parameter_error_; 129 return strict_mode_formal_parameter_error_;
128 } 130 }
129 131
130 const Error& strong_mode_formal_parameter_error() const { 132 const Error& strong_mode_formal_parameter_error() const {
131 return strong_mode_formal_parameter_error_; 133 return strong_mode_formal_parameter_error_;
132 } 134 }
133 135
134 const Error& let_pattern_error() const { return let_pattern_error_; } 136 const Error& let_pattern_error() const { return let_pattern_error_; }
135 137
138 bool has_cover_initialized_name() const {
139 return !is_valid(CoverInitializedNameProduction);
140 }
141 const Error& cover_initialized_name_error() const {
142 return cover_initialized_name_error_;
143 }
144
136 bool is_simple_parameter_list() const { 145 bool is_simple_parameter_list() const {
137 return !(function_properties_ & NonSimpleParameter); 146 return !(function_properties_ & NonSimpleParameter);
138 } 147 }
139 148
140 void RecordNonSimpleParameter() { 149 void RecordNonSimpleParameter() {
141 function_properties_ |= NonSimpleParameter; 150 function_properties_ |= NonSimpleParameter;
142 } 151 }
143 152
144 void RecordExpressionError(const Scanner::Location& loc, 153 void RecordExpressionError(const Scanner::Location& loc,
145 MessageTemplate::Template message, 154 MessageTemplate::Template message,
(...skipping 28 matching lines...) Expand all
174 void RecordAssignmentPatternError(const Scanner::Location& loc, 183 void RecordAssignmentPatternError(const Scanner::Location& loc,
175 MessageTemplate::Template message, 184 MessageTemplate::Template message,
176 const char* arg = nullptr) { 185 const char* arg = nullptr) {
177 if (!is_valid_assignment_pattern()) return; 186 if (!is_valid_assignment_pattern()) return;
178 invalid_productions_ |= AssignmentPatternProduction; 187 invalid_productions_ |= AssignmentPatternProduction;
179 assignment_pattern_error_.location = loc; 188 assignment_pattern_error_.location = loc;
180 assignment_pattern_error_.message = message; 189 assignment_pattern_error_.message = message;
181 assignment_pattern_error_.arg = arg; 190 assignment_pattern_error_.arg = arg;
182 } 191 }
183 192
193 void RecordPatternError(const Scanner::Location& loc,
194 MessageTemplate::Template message,
195 const char* arg = nullptr) {
196 RecordBindingPatternError(loc, message, arg);
197 RecordAssignmentPatternError(loc, message, arg);
198 }
199
184 void RecordArrowFormalParametersError(const Scanner::Location& loc, 200 void RecordArrowFormalParametersError(const Scanner::Location& loc,
185 MessageTemplate::Template message, 201 MessageTemplate::Template message,
186 const char* arg = nullptr) { 202 const char* arg = nullptr) {
187 if (!is_valid_arrow_formal_parameters()) return; 203 if (!is_valid_arrow_formal_parameters()) return;
188 invalid_productions_ |= ArrowFormalParametersProduction; 204 invalid_productions_ |= ArrowFormalParametersProduction;
189 arrow_formal_parameters_error_.location = loc; 205 arrow_formal_parameters_error_.location = loc;
190 arrow_formal_parameters_error_.message = message; 206 arrow_formal_parameters_error_.message = message;
191 arrow_formal_parameters_error_.arg = arg; 207 arrow_formal_parameters_error_.arg = arg;
192 } 208 }
193 209
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 void RecordLetPatternError(const Scanner::Location& loc, 241 void RecordLetPatternError(const Scanner::Location& loc,
226 MessageTemplate::Template message, 242 MessageTemplate::Template message,
227 const char* arg = nullptr) { 243 const char* arg = nullptr) {
228 if (!is_valid_let_pattern()) return; 244 if (!is_valid_let_pattern()) return;
229 invalid_productions_ |= LetPatternProduction; 245 invalid_productions_ |= LetPatternProduction;
230 let_pattern_error_.location = loc; 246 let_pattern_error_.location = loc;
231 let_pattern_error_.message = message; 247 let_pattern_error_.message = message;
232 let_pattern_error_.arg = arg; 248 let_pattern_error_.arg = arg;
233 } 249 }
234 250
251 void RecordCoverInitializedNameError(const Scanner::Location& loc,
252 MessageTemplate::Template message,
253 const char* arg = nullptr) {
254 if (has_cover_initialized_name()) return;
255 invalid_productions_ |= CoverInitializedNameProduction;
256 cover_initialized_name_error_.location = loc;
257 cover_initialized_name_error_.message = message;
258 cover_initialized_name_error_.arg = arg;
259 }
260
261 void ForgiveCoverInitializedNameError() {
262 invalid_productions_ &= ~CoverInitializedNameProduction;
263 cover_initialized_name_error_.location = Scanner::Location::invalid();
264 }
265
235 void Accumulate(const ExpressionClassifier& inner, 266 void Accumulate(const ExpressionClassifier& inner,
236 unsigned productions = StandardProductions) { 267 unsigned productions = StandardProductions) {
237 // Propagate errors from inner, but don't overwrite already recorded 268 // Propagate errors from inner, but don't overwrite already recorded
238 // errors. 269 // errors.
239 unsigned non_arrow_inner_invalid_productions = 270 unsigned non_arrow_inner_invalid_productions =
240 inner.invalid_productions_ & ~ArrowFormalParametersProduction; 271 inner.invalid_productions_ & ~ArrowFormalParametersProduction;
241 if (non_arrow_inner_invalid_productions == 0) return; 272 if (non_arrow_inner_invalid_productions == 0) return;
242 unsigned non_arrow_productions = 273 unsigned non_arrow_productions =
243 productions & ~ArrowFormalParametersProduction; 274 productions & ~ArrowFormalParametersProduction;
244 unsigned errors = 275 unsigned errors =
(...skipping 14 matching lines...) Expand all
259 duplicate_formal_parameter_error_ = 290 duplicate_formal_parameter_error_ =
260 inner.duplicate_formal_parameter_error_; 291 inner.duplicate_formal_parameter_error_;
261 if (errors & StrictModeFormalParametersProduction) 292 if (errors & StrictModeFormalParametersProduction)
262 strict_mode_formal_parameter_error_ = 293 strict_mode_formal_parameter_error_ =
263 inner.strict_mode_formal_parameter_error_; 294 inner.strict_mode_formal_parameter_error_;
264 if (errors & StrongModeFormalParametersProduction) 295 if (errors & StrongModeFormalParametersProduction)
265 strong_mode_formal_parameter_error_ = 296 strong_mode_formal_parameter_error_ =
266 inner.strong_mode_formal_parameter_error_; 297 inner.strong_mode_formal_parameter_error_;
267 if (errors & LetPatternProduction) 298 if (errors & LetPatternProduction)
268 let_pattern_error_ = inner.let_pattern_error_; 299 let_pattern_error_ = inner.let_pattern_error_;
300 if (errors & CoverInitializedNameProduction)
301 cover_initialized_name_error_ = inner.cover_initialized_name_error_;
269 } 302 }
270 303
271 // As an exception to the above, the result continues to be a valid arrow 304 // As an exception to the above, the result continues to be a valid arrow
272 // formal parameters if the inner expression is a valid binding pattern. 305 // formal parameters if the inner expression is a valid binding pattern.
273 if (productions & ArrowFormalParametersProduction && 306 if (productions & ArrowFormalParametersProduction &&
274 is_valid_arrow_formal_parameters()) { 307 is_valid_arrow_formal_parameters()) {
275 // Also copy function properties if expecting an arrow function 308 // Also copy function properties if expecting an arrow function
276 // parameter. 309 // parameter.
277 function_properties_ |= inner.function_properties_; 310 function_properties_ |= inner.function_properties_;
278 311
279 if (!inner.is_valid_binding_pattern()) { 312 if (!inner.is_valid_binding_pattern()) {
280 invalid_productions_ |= ArrowFormalParametersProduction; 313 invalid_productions_ |= ArrowFormalParametersProduction;
281 arrow_formal_parameters_error_ = inner.binding_pattern_error_; 314 arrow_formal_parameters_error_ = inner.binding_pattern_error_;
282 } 315 }
283 } 316 }
284 } 317 }
285 318
319 static const Error& FirdRecorded(const Error& a, const Error& b) {
320 // Determine message which occurred earlier in source. Used by
321 // ParserBase::ValidateExpression()
322 DCHECK(a.location.IsValid() || b.location.IsValid());
323 if (a.location.beg_pos < 0) return b;
324 if (b.location.beg_pos < 0 || b.location.beg_pos >= a.location.beg_pos) {
325 return a;
326 }
327 return b;
328 }
329
286 private: 330 private:
287 unsigned invalid_productions_; 331 unsigned invalid_productions_;
288 unsigned function_properties_; 332 unsigned function_properties_;
289 Error expression_error_; 333 Error expression_error_;
290 Error formal_parameter_initializer_error_; 334 Error formal_parameter_initializer_error_;
291 Error binding_pattern_error_; 335 Error binding_pattern_error_;
292 Error assignment_pattern_error_; 336 Error assignment_pattern_error_;
293 Error arrow_formal_parameters_error_; 337 Error arrow_formal_parameters_error_;
294 Error duplicate_formal_parameter_error_; 338 Error duplicate_formal_parameter_error_;
295 Error strict_mode_formal_parameter_error_; 339 Error strict_mode_formal_parameter_error_;
296 Error strong_mode_formal_parameter_error_; 340 Error strong_mode_formal_parameter_error_;
297 Error let_pattern_error_; 341 Error let_pattern_error_;
342 Error cover_initialized_name_error_;
298 DuplicateFinder* duplicate_finder_; 343 DuplicateFinder* duplicate_finder_;
299 }; 344 };
300 345
301 } // namespace internal 346 } // namespace internal
302 } // namespace v8 347 } // namespace v8
303 348
304 #endif // V8_EXPRESSION_CLASSIFIER_H 349 #endif // V8_EXPRESSION_CLASSIFIER_H
OLDNEW
« no previous file with comments | « src/bootstrapper.cc ('k') | src/flag-definitions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698