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 if (Check(Token::COMMA)) { |
| 3311 typename TypeSystem::Type type_element = this->HoleTypeElement(); |
| 3312 elements->Add(type_element, zone()); |
| 3313 valid_type = false; |
| 3314 trailing_comma = true; |
| 3315 continue; |
| 3316 } else { |
| 3317 trailing_comma = false; |
| 3318 } |
| 3319 if (Check(Token::ELLIPSIS)) { |
| 3320 typename TypeSystem::Type type_element = ParseType(CHECK_OK_TYPE); |
| 3321 elements->Add(type_element, zone()); |
| 3322 valid_type = false; |
| 3323 spread = true; |
| 3324 break; |
| 3325 } |
| 3326 typename TypeSystem::Type type_element = ParseType(CHECK_OK_TYPE); |
| 3327 elements->Add(type_element, zone()); |
| 3328 if (!type_element->IsValidType()) valid_type = false; |
| 3329 if (!type_element->IsValidBindingIdentifierOrPattern()) |
| 3330 valid_binder = false; |
| 3331 if (peek() != Token::RBRACK) { // Braces required here. |
| 3332 Expect(Token::COMMA, CHECK_OK_TYPE); |
| 3333 trailing_comma = true; |
| 3334 } |
| 3335 } while (peek() != Token::RBRACK); |
| 3336 } |
| 3337 Consume(Token::RBRACK); |
| 3338 type = factory()->NewTupleType(elements, valid_type && !trailing_comma, |
| 3339 valid_binder, spread, pos); |
| 3340 break; |
| 3341 } |
3303 case Token::TYPEOF: { | 3342 case Token::TYPEOF: { |
3304 Consume(Token::TYPEOF); | 3343 Consume(Token::TYPEOF); |
3305 IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); | 3344 IdentifierT name = ParseIdentifierName(CHECK_OK_TYPE); |
3306 IdentifierListT property_names = this->NullIdentifierList(); | 3345 IdentifierListT property_names = this->NullIdentifierList(); |
3307 if (peek() == Token::PERIOD) { // Braces required here. | 3346 if (peek() == Token::PERIOD) { // Braces required here. |
3308 property_names = ParsePropertyNameList(CHECK_OK_TYPE); | 3347 property_names = ParsePropertyNameList(CHECK_OK_TYPE); |
3309 } | 3348 } |
3310 type = factory()->NewQueryType(name, property_names, pos); | 3349 type = factory()->NewQueryType(name, property_names, pos); |
3311 break; | 3350 break; |
3312 } | 3351 } |
3313 case Token::VOID: { | 3352 case Token::VOID: { |
3314 Consume(Token::VOID); | 3353 Consume(Token::VOID); |
3315 type = factory()->NewPredefinedType(typesystem::PredefinedType::kVoidType, | 3354 type = factory()->NewPredefinedType(typesystem::PredefinedType::kVoidType, |
3316 pos); | 3355 pos); |
3317 break; | 3356 break; |
3318 } | 3357 } |
3319 case Token::THIS: { | 3358 case Token::THIS: { |
3320 Consume(Token::THIS); | 3359 Consume(Token::THIS); |
3321 type = factory()->NewThisType(pos); | 3360 type = factory()->NewThisType(pos); |
3322 break; | 3361 break; |
3323 } | 3362 } |
3324 // TODO(nikolaos): Missing object types. | 3363 // TODO(nikolaos): Missing object types. |
3325 // TODO(nikolaos): Missing tuple types. | |
3326 case Token::STRING: { | 3364 case Token::STRING: { |
3327 Consume(Token::STRING); | 3365 Consume(Token::STRING); |
3328 IdentifierT str = this->GetSymbol(scanner()); | 3366 IdentifierT str = this->GetSymbol(scanner()); |
3329 type = factory()->NewStringLiteralType(str, pos); | 3367 type = factory()->NewStringLiteralType(str, pos); |
3330 break; | 3368 break; |
3331 } | 3369 } |
3332 default: | 3370 default: |
3333 ReportUnexpectedToken(Next()); | 3371 ReportUnexpectedToken(Next()); |
3334 *ok = false; | 3372 *ok = false; |
3335 return type; | 3373 return type; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3420 has_seen_constructor_ = true; | 3458 has_seen_constructor_ = true; |
3421 return; | 3459 return; |
3422 } | 3460 } |
3423 } | 3461 } |
3424 | 3462 |
3425 | 3463 |
3426 } // namespace internal | 3464 } // namespace internal |
3427 } // namespace v8 | 3465 } // namespace v8 |
3428 | 3466 |
3429 #endif // V8_PARSING_PARSER_BASE_H | 3467 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |