Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
| 6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
| 7 | 7 |
| 8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/hashmap.h" | 10 #include "src/hashmap.h" |
| (...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 835 } | 835 } |
| 836 | 836 |
| 837 // Parsing optional types. | 837 // Parsing optional types. |
| 838 typename TypeSystem::Type ParseValidType(bool* ok); | 838 typename TypeSystem::Type ParseValidType(bool* ok); |
| 839 typename TypeSystem::Type ParseValidTypeOrStringLiteral(bool* ok); | 839 typename TypeSystem::Type ParseValidTypeOrStringLiteral(bool* ok); |
| 840 typename TypeSystem::Type ParseType(bool* ok); | 840 typename TypeSystem::Type ParseType(bool* ok); |
| 841 typename TypeSystem::Type ParseUnionOrIntersectionOrPrimaryType(bool* ok); | 841 typename TypeSystem::Type ParseUnionOrIntersectionOrPrimaryType(bool* ok); |
| 842 typename TypeSystem::Type ParseIntersectionOrPrimaryType(bool* ok); | 842 typename TypeSystem::Type ParseIntersectionOrPrimaryType(bool* ok); |
| 843 typename TypeSystem::Type ParsePrimaryTypeOrParameterList(bool* ok); | 843 typename TypeSystem::Type ParsePrimaryTypeOrParameterList(bool* ok); |
| 844 typename TypeSystem::TypeParameters ParseTypeParameters(bool* ok); | 844 typename TypeSystem::TypeParameters ParseTypeParameters(bool* ok); |
| 845 typename TypeSystem::TypeArguments ParseTypeArguments(bool* ok); | 845 typename TypeSystem::TypeList ParseTypeArguments(bool* ok); |
| 846 IdentifierListT ParsePropertyNameList(bool* ok); | 846 IdentifierListT ParsePropertyNameList(bool* ok); |
| 847 | 847 |
| 848 typename TypeSystem::Type ValidateType(typename TypeSystem::Type type, | 848 typename TypeSystem::Type ValidateType(typename TypeSystem::Type type, |
| 849 Scanner::Location location, bool* ok) { | 849 Scanner::Location location, bool* ok) { |
| 850 typename TypeSystem::Type result = type->Uncover(ok); | 850 typename TypeSystem::Type result = type->Uncover(ok); |
| 851 if (*ok) { | 851 if (*ok) { |
| 852 if (!result->IsStringLiteralType()) return result; | 852 if (!result->IsStringLiteralType()) return result; |
| 853 *ok = false; | 853 *ok = false; |
| 854 } | 854 } |
| 855 ReportMessageAt(location, MessageTemplate::kInvalidType); | 855 ReportMessageAt(location, MessageTemplate::kInvalidType); |
| (...skipping 2299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3155 extends = ParseValidType(CHECK_OK_CUSTOM(NullTypeParameters)); | 3155 extends = ParseValidType(CHECK_OK_CUSTOM(NullTypeParameters)); |
| 3156 } | 3156 } |
| 3157 parameters->Add(factory()->NewTypeParameter(name, extends, pos), zone()); | 3157 parameters->Add(factory()->NewTypeParameter(name, extends, pos), zone()); |
| 3158 } while (Check(Token::COMMA)); | 3158 } while (Check(Token::COMMA)); |
| 3159 Expect(Token::GT, CHECK_OK_CUSTOM(NullTypeParameters)); | 3159 Expect(Token::GT, CHECK_OK_CUSTOM(NullTypeParameters)); |
| 3160 return parameters; | 3160 return parameters; |
| 3161 } | 3161 } |
| 3162 | 3162 |
| 3163 | 3163 |
| 3164 template <typename Traits> | 3164 template <typename Traits> |
| 3165 typename ParserBase<Traits>::TypeSystem::TypeArguments | 3165 typename ParserBase<Traits>::TypeSystem::TypeList |
| 3166 ParserBase<Traits>::ParseTypeArguments(bool* ok) { | 3166 ParserBase<Traits>::ParseTypeArguments(bool* ok) { |
| 3167 Expect(Token::LT, CHECK_OK_CUSTOM(NullTypeArguments)); | 3167 Expect(Token::LT, CHECK_OK_CUSTOM(NullTypeList)); |
| 3168 typename TypeSystem::TypeArguments arguments = this->EmptyTypeArguments(); | 3168 typename TypeSystem::TypeList arguments = this->EmptyTypeList(); |
| 3169 do { | 3169 do { |
| 3170 typename TypeSystem::Type type = | 3170 typename TypeSystem::Type type = |
| 3171 ParseValidType(CHECK_OK_CUSTOM(NullTypeArguments)); | 3171 ParseValidType(CHECK_OK_CUSTOM(NullTypeList)); |
| 3172 arguments->Add(type, zone()); | 3172 arguments->Add(type, zone()); |
| 3173 } while (Check(Token::COMMA)); | 3173 } while (Check(Token::COMMA)); |
| 3174 Expect(Token::GT, CHECK_OK_CUSTOM(NullTypeArguments)); | 3174 Expect(Token::GT, CHECK_OK_CUSTOM(NullTypeList)); |
| 3175 return arguments; | 3175 return arguments; |
| 3176 } | 3176 } |
| 3177 | 3177 |
| 3178 | 3178 |
| 3179 template <typename Traits> | 3179 template <typename Traits> |
| 3180 typename ParserBase<Traits>::TypeSystem::Type | 3180 typename ParserBase<Traits>::TypeSystem::Type |
| 3181 ParserBase<Traits>::ParseUnionOrIntersectionOrPrimaryType(bool* ok) { | 3181 ParserBase<Traits>::ParseUnionOrIntersectionOrPrimaryType(bool* ok) { |
| 3182 Scanner::Location type_location = scanner()->peek_location(); | 3182 Scanner::Location type_location = scanner()->peek_location(); |
| 3183 typename TypeSystem::Type type = | 3183 typename TypeSystem::Type type = |
| 3184 ParseIntersectionOrPrimaryType(CHECK_OK_TYPE); | 3184 ParseIntersectionOrPrimaryType(CHECK_OK_TYPE); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3224 typename TypeSystem::Type type = this->EmptyType(); | 3224 typename TypeSystem::Type type = this->EmptyType(); |
| 3225 switch (peek()) { | 3225 switch (peek()) { |
| 3226 case Token::LPAREN: { | 3226 case Token::LPAREN: { |
| 3227 Consume(Token::LPAREN); | 3227 Consume(Token::LPAREN); |
| 3228 typename TypeSystem::FormalParameters parameters = | 3228 typename TypeSystem::FormalParameters parameters = |
| 3229 this->EmptyFormalParameters(); | 3229 this->EmptyFormalParameters(); |
| 3230 if (peek() != Token::RPAREN) { | 3230 if (peek() != Token::RPAREN) { |
| 3231 do { | 3231 do { |
| 3232 Scanner::Location parameter_location = scanner()->peek_location(); | 3232 Scanner::Location parameter_location = scanner()->peek_location(); |
| 3233 if (Check(Token::ELLIPSIS)) { | 3233 if (Check(Token::ELLIPSIS)) { |
| 3234 int name_pos = peek_position(); | |
| 3234 IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); | 3235 IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
| 3235 if (Check(Token::COLON)) { // Braces required here. | 3236 if (Check(Token::COLON)) { // Braces required here. |
| 3236 type = ParseValidType(CHECK_OK_TYPE); | 3237 type = ParseValidType(CHECK_OK_TYPE); |
| 3237 } else { | 3238 } else { |
| 3238 type = this->EmptyType(); | 3239 type = this->EmptyType(); |
| 3239 } | 3240 } |
| 3240 parameters->Add( | 3241 parameters->Add(factory()->NewFormalParameter( |
| 3241 factory()->NewFormalParameter(name, false, true, type, | 3242 factory()->NewTypeReference( |
| 3242 parameter_location.beg_pos), | 3243 name, this->NullTypeList(), name_pos), |
| 3243 zone()); | 3244 false, true, type, parameter_location.beg_pos), |
| 3245 zone()); | |
| 3244 break; | 3246 break; |
| 3245 } | 3247 } |
| 3246 type = ParseType(CHECK_OK_TYPE); | 3248 type = ParseType(CHECK_OK_TYPE); |
| 3247 if (peek() == Token::CONDITIONAL || peek() == Token::COLON) { | 3249 if (peek() == Token::CONDITIONAL || peek() == Token::COLON) { |
| 3248 if (!type->IsSimpleIdentifier()) { | 3250 if (!type->IsValidBindingIdentifierOrPattern()) { |
| 3249 ReportUnexpectedToken(Next()); | 3251 ReportUnexpectedToken(Next()); |
| 3250 *ok = false; | 3252 *ok = false; |
| 3251 return this->EmptyType(); | 3253 return this->EmptyType(); |
| 3252 } | 3254 } |
| 3253 bool optional = Check(Token::CONDITIONAL); | 3255 bool optional = Check(Token::CONDITIONAL); |
| 3254 IdentifierT name = type->AsSimpleIdentifier(); | 3256 typename TypeSystem::Type of_type = this->EmptyType(); |
| 3255 if (Check(Token::COLON)) { // Braces required here. | 3257 if (Check(Token::COLON)) { // Braces required here. |
| 3256 type = ParseValidTypeOrStringLiteral(CHECK_OK_TYPE); | 3258 type = ParseValidTypeOrStringLiteral(CHECK_OK_TYPE); |
| 3257 } else { | |
| 3258 type = this->EmptyType(); | |
| 3259 } | 3259 } |
| 3260 parameters->Add( | 3260 parameters->Add( |
| 3261 factory()->NewFormalParameter(name, optional, false, type, | 3261 factory()->NewFormalParameter(type, optional, false, of_type, |
| 3262 parameter_location.beg_pos), | 3262 parameter_location.beg_pos), |
| 3263 zone()); | 3263 zone()); |
| 3264 } else { | 3264 } else { |
| 3265 type = ValidateType(type, parameter_location, CHECK_OK_TYPE); | 3265 type = ValidateType(type, parameter_location, CHECK_OK_TYPE); |
| 3266 parameters->Add( | 3266 parameters->Add( |
| 3267 factory()->NewFormalParameter(type, parameter_location.beg_pos), | 3267 factory()->NewFormalParameter(type, parameter_location.beg_pos), |
| 3268 zone()); | 3268 zone()); |
| 3269 } | 3269 } |
| 3270 } while (Check(Token::COMMA)); | 3270 } while (Check(Token::COMMA)); |
| 3271 } | 3271 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 3284 type = factory()->NewPredefinedType( | 3284 type = factory()->NewPredefinedType( |
| 3285 typesystem::PredefinedType::kNumberType, pos); | 3285 typesystem::PredefinedType::kNumberType, pos); |
| 3286 } else if (CheckContextualKeyword(CStrVector("string"))) { | 3286 } else if (CheckContextualKeyword(CStrVector("string"))) { |
| 3287 type = factory()->NewPredefinedType( | 3287 type = factory()->NewPredefinedType( |
| 3288 typesystem::PredefinedType::kStringType, pos); | 3288 typesystem::PredefinedType::kStringType, pos); |
| 3289 } else if (CheckContextualKeyword(CStrVector("symbol"))) { | 3289 } else if (CheckContextualKeyword(CStrVector("symbol"))) { |
| 3290 type = factory()->NewPredefinedType( | 3290 type = factory()->NewPredefinedType( |
| 3291 typesystem::PredefinedType::kSymbolType, pos); | 3291 typesystem::PredefinedType::kSymbolType, pos); |
| 3292 } else { | 3292 } else { |
| 3293 IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); | 3293 IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
| 3294 typename TypeSystem::TypeArguments type_arguments = | 3294 typename TypeSystem::TypeList type_arguments = this->NullTypeList(); |
| 3295 this->NullTypeArguments(); | |
| 3296 if (peek() == Token::LT) { // Braces required here. | 3295 if (peek() == Token::LT) { // Braces required here. |
| 3297 type_arguments = ParseTypeArguments(CHECK_OK_TYPE); | 3296 type_arguments = ParseTypeArguments(CHECK_OK_TYPE); |
| 3298 } | 3297 } |
| 3299 type = factory()->NewTypeReference(name, type_arguments, pos); | 3298 type = factory()->NewTypeReference(name, type_arguments, pos); |
| 3300 } | 3299 } |
| 3301 break; | 3300 break; |
| 3302 } | 3301 } |
| 3302 case Token::LBRACK: { | |
| 3303 Consume(Token::LBRACK); | |
| 3304 typename TypeSystem::TypeList elements = this->EmptyTypeList(); | |
| 3305 bool valid_type = false, valid_binder = true, spread = false; | |
| 3306 bool trailing_comma = false; | |
| 3307 if (peek() != Token::RBRACK) { | |
| 3308 valid_type = true; | |
| 3309 do { | |
| 3310 trailing_comma = false; | |
|
rossberg
2016/03/17 16:51:37
Nit: you could make that into an else-branch for t
nickie
2016/03/18 11:12:01
Done.
| |
| 3311 if (Check(Token::COMMA)) { | |
| 3312 typename TypeSystem::Type type_element = this->HoleTypeElement(); | |
| 3313 elements->Add(type_element, zone()); | |
| 3314 valid_type = false; | |
| 3315 trailing_comma = true; | |
| 3316 continue; | |
| 3317 } | |
| 3318 if (Check(Token::ELLIPSIS)) { | |
| 3319 typename TypeSystem::Type type_element = ParseType(CHECK_OK_TYPE); | |
| 3320 elements->Add(type_element, zone()); | |
| 3321 valid_type = false; | |
| 3322 spread = true; | |
| 3323 break; | |
| 3324 } | |
| 3325 typename TypeSystem::Type type_element = ParseType(CHECK_OK_TYPE); | |
| 3326 elements->Add(type_element, zone()); | |
| 3327 if (!type_element->IsValidType()) valid_type = false; | |
| 3328 if (!type_element->IsValidBindingIdentifierOrPattern()) | |
| 3329 valid_binder = false; | |
| 3330 if (peek() != Token::RBRACK) { // Braces required here. | |
| 3331 Expect(Token::COMMA, CHECK_OK_TYPE); | |
| 3332 trailing_comma = true; | |
| 3333 } | |
| 3334 } while (peek() != Token::RBRACK); | |
| 3335 } | |
| 3336 Consume(Token::RBRACK); | |
| 3337 type = factory()->NewTupleType(elements, valid_type && !trailing_comma, | |
| 3338 valid_binder, spread, pos); | |
| 3339 break; | |
| 3340 } | |
| 3303 case Token::TYPEOF: { | 3341 case Token::TYPEOF: { |
| 3304 Consume(Token::TYPEOF); | 3342 Consume(Token::TYPEOF); |
| 3305 IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); | 3343 IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
| 3306 IdentifierListT property_names = this->NullIdentifierList(); | 3344 IdentifierListT property_names = this->NullIdentifierList(); |
| 3307 if (peek() == Token::PERIOD) { // Braces required here. | 3345 if (peek() == Token::PERIOD) { // Braces required here. |
| 3308 property_names = ParsePropertyNameList(CHECK_OK_TYPE); | 3346 property_names = ParsePropertyNameList(CHECK_OK_TYPE); |
| 3309 } | 3347 } |
| 3310 type = factory()->NewQueryType(name, property_names, pos); | 3348 type = factory()->NewQueryType(name, property_names, pos); |
| 3311 break; | 3349 break; |
| 3312 } | 3350 } |
| 3313 case Token::VOID: { | 3351 case Token::VOID: { |
| 3314 Consume(Token::VOID); | 3352 Consume(Token::VOID); |
| 3315 type = factory()->NewPredefinedType(typesystem::PredefinedType::kVoidType, | 3353 type = factory()->NewPredefinedType(typesystem::PredefinedType::kVoidType, |
| 3316 pos); | 3354 pos); |
| 3317 break; | 3355 break; |
| 3318 } | 3356 } |
| 3319 case Token::THIS: { | 3357 case Token::THIS: { |
| 3320 Consume(Token::THIS); | 3358 Consume(Token::THIS); |
| 3321 type = factory()->NewThisType(pos); | 3359 type = factory()->NewThisType(pos); |
| 3322 break; | 3360 break; |
| 3323 } | 3361 } |
| 3324 // TODO(nikolaos): Missing object types. | 3362 // TODO(nikolaos): Missing object types. |
| 3325 // TODO(nikolaos): Missing tuple types. | |
| 3326 case Token::STRING: { | 3363 case Token::STRING: { |
| 3327 Consume(Token::STRING); | 3364 Consume(Token::STRING); |
| 3328 IdentifierT str = this->GetSymbol(scanner()); | 3365 IdentifierT str = this->GetSymbol(scanner()); |
| 3329 type = factory()->NewStringLiteralType(str, pos); | 3366 type = factory()->NewStringLiteralType(str, pos); |
| 3330 break; | 3367 break; |
| 3331 } | 3368 } |
| 3332 default: | 3369 default: |
| 3333 ReportUnexpectedToken(Next()); | 3370 ReportUnexpectedToken(Next()); |
| 3334 *ok = false; | 3371 *ok = false; |
| 3335 return type; | 3372 return type; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3420 has_seen_constructor_ = true; | 3457 has_seen_constructor_ = true; |
| 3421 return; | 3458 return; |
| 3422 } | 3459 } |
| 3423 } | 3460 } |
| 3424 | 3461 |
| 3425 | 3462 |
| 3426 } // namespace internal | 3463 } // namespace internal |
| 3427 } // namespace v8 | 3464 } // namespace v8 |
| 3428 | 3465 |
| 3429 #endif // V8_PARSING_PARSER_BASE_H | 3466 #endif // V8_PARSING_PARSER_BASE_H |
| OLD | NEW |