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

Side by Side Diff: runtime/vm/parser.cc

Issue 23872010: Add metadata for type parameters (TypeVariableMirror). (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: addressed comments Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object.cc ('k') | tests/lib/lib.status » ('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 (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/parser.h" 5 #include "vm/parser.h"
6 6
7 #include "lib/invocation_mirror.h" 7 #include "lib/invocation_mirror.h"
8 #include "vm/bigint_operations.h" 8 #include "vm/bigint_operations.h"
9 #include "vm/bootstrap.h" 9 #include "vm/bootstrap.h"
10 #include "vm/class_finalizer.h" 10 #include "vm/class_finalizer.h"
(...skipping 4229 matching lines...) Expand 10 before | Expand all | Expand 10 after
4240 if (CurrentToken() == Token::kLT) { 4240 if (CurrentToken() == Token::kLT) {
4241 const GrowableObjectArray& type_parameters_array = 4241 const GrowableObjectArray& type_parameters_array =
4242 GrowableObjectArray::Handle(GrowableObjectArray::New()); 4242 GrowableObjectArray::Handle(GrowableObjectArray::New());
4243 intptr_t index = 0; 4243 intptr_t index = 0;
4244 TypeParameter& type_parameter = TypeParameter::Handle(); 4244 TypeParameter& type_parameter = TypeParameter::Handle();
4245 TypeParameter& existing_type_parameter = TypeParameter::Handle(); 4245 TypeParameter& existing_type_parameter = TypeParameter::Handle();
4246 String& existing_type_parameter_name = String::Handle(); 4246 String& existing_type_parameter_name = String::Handle();
4247 AbstractType& type_parameter_bound = Type::Handle(); 4247 AbstractType& type_parameter_bound = Type::Handle();
4248 do { 4248 do {
4249 ConsumeToken(); 4249 ConsumeToken();
4250 SkipMetadata(); 4250 const intptr_t metadata_pos = SkipMetadata();
4251 const intptr_t type_parameter_pos = TokenPos(); 4251 const intptr_t type_parameter_pos = TokenPos();
4252 String& type_parameter_name = 4252 String& type_parameter_name =
4253 *ExpectUserDefinedTypeIdentifier("type parameter expected"); 4253 *ExpectUserDefinedTypeIdentifier("type parameter expected");
4254 // Check for duplicate type parameters. 4254 // Check for duplicate type parameters.
4255 for (intptr_t i = 0; i < index; i++) { 4255 for (intptr_t i = 0; i < index; i++) {
4256 existing_type_parameter ^= type_parameters_array.At(i); 4256 existing_type_parameter ^= type_parameters_array.At(i);
4257 existing_type_parameter_name = existing_type_parameter.name(); 4257 existing_type_parameter_name = existing_type_parameter.name();
4258 if (existing_type_parameter_name.Equals(type_parameter_name)) { 4258 if (existing_type_parameter_name.Equals(type_parameter_name)) {
4259 ErrorMsg(type_parameter_pos, "duplicate type parameter '%s'", 4259 ErrorMsg(type_parameter_pos, "duplicate type parameter '%s'",
4260 type_parameter_name.ToCString()); 4260 type_parameter_name.ToCString());
4261 } 4261 }
4262 } 4262 }
4263 if (CurrentToken() == Token::kEXTENDS) { 4263 if (CurrentToken() == Token::kEXTENDS) {
4264 ConsumeToken(); 4264 ConsumeToken();
4265 // A bound may refer to the owner of the type parameter it applies to, 4265 // A bound may refer to the owner of the type parameter it applies to,
4266 // i.e. to the class or interface currently being parsed. 4266 // i.e. to the class or interface currently being parsed.
4267 // Postpone resolution in order to avoid resolving the class and its 4267 // Postpone resolution in order to avoid resolving the class and its
4268 // type parameters, as they are not fully parsed yet. 4268 // type parameters, as they are not fully parsed yet.
4269 type_parameter_bound = ParseType(ClassFinalizer::kDoNotResolve); 4269 type_parameter_bound = ParseType(ClassFinalizer::kDoNotResolve);
4270 } else { 4270 } else {
4271 type_parameter_bound = isolate()->object_store()->object_type(); 4271 type_parameter_bound = isolate()->object_store()->object_type();
4272 } 4272 }
4273 type_parameter = TypeParameter::New(cls, 4273 type_parameter = TypeParameter::New(cls,
4274 index, 4274 index,
4275 type_parameter_name, 4275 type_parameter_name,
4276 type_parameter_bound, 4276 type_parameter_bound,
4277 type_parameter_pos); 4277 type_parameter_pos);
4278 type_parameters_array.Add(type_parameter); 4278 type_parameters_array.Add(type_parameter);
4279 if (metadata_pos >= 0) {
4280 library_.AddTypeParameterMetadata(type_parameter, metadata_pos);
4281 }
4279 index++; 4282 index++;
4280 } while (CurrentToken() == Token::kCOMMA); 4283 } while (CurrentToken() == Token::kCOMMA);
4281 Token::Kind token = CurrentToken(); 4284 Token::Kind token = CurrentToken();
4282 if ((token == Token::kGT) || (token == Token::kSHR)) { 4285 if ((token == Token::kGT) || (token == Token::kSHR)) {
4283 ConsumeRightAngleBracket(); 4286 ConsumeRightAngleBracket();
4284 } else { 4287 } else {
4285 ErrorMsg("right angle bracket expected"); 4288 ErrorMsg("right angle bracket expected");
4286 } 4289 }
4287 const TypeArguments& type_parameters = 4290 const TypeArguments& type_parameters =
4288 TypeArguments::Handle(NewTypeArguments(type_parameters_array)); 4291 TypeArguments::Handle(NewTypeArguments(type_parameters_array));
(...skipping 6133 matching lines...) Expand 10 before | Expand all | Expand 10 after
10422 void Parser::SkipQualIdent() { 10425 void Parser::SkipQualIdent() {
10423 ASSERT(IsIdentifier()); 10426 ASSERT(IsIdentifier());
10424 ConsumeToken(); 10427 ConsumeToken();
10425 if (CurrentToken() == Token::kPERIOD) { 10428 if (CurrentToken() == Token::kPERIOD) {
10426 ConsumeToken(); // Consume the kPERIOD token. 10429 ConsumeToken(); // Consume the kPERIOD token.
10427 ExpectIdentifier("identifier expected after '.'"); 10430 ExpectIdentifier("identifier expected after '.'");
10428 } 10431 }
10429 } 10432 }
10430 10433
10431 } // namespace dart 10434 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | tests/lib/lib.status » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698