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

Side by Side Diff: src/parsing/parser-base.h

Issue 1810943002: Add parsing for tuple types (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@types
Patch Set: Created 4 years, 9 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
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698