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 |