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

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

Issue 11360051: Make library, import, export, part built-in identifiers (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 1 month 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 | « no previous file | runtime/vm/scanner.cc » ('j') | tests/language/pseudo_kw_illegal_test.dart » ('J')
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 "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/class_finalizer.h" 8 #include "vm/class_finalizer.h"
9 #include "vm/compiler.h" 9 #include "vm/compiler.h"
10 #include "vm/compiler_stats.h" 10 #include "vm/compiler_stats.h"
(...skipping 4070 matching lines...) Expand 10 before | Expand all | Expand 10 after
4081 library_.AddObject(func, accessor_name); 4081 library_.AddObject(func, accessor_name);
4082 } else { 4082 } else {
4083 library_.ReplaceObject(func, accessor_name); 4083 library_.ReplaceObject(func, accessor_name);
4084 } 4084 }
4085 } 4085 }
4086 4086
4087 4087
4088 // TODO(hausner): Remove support for old library definition syntax. 4088 // TODO(hausner): Remove support for old library definition syntax.
4089 void Parser::ParseLibraryNameObsoleteSyntax() { 4089 void Parser::ParseLibraryNameObsoleteSyntax() {
4090 if ((script_.kind() == RawScript::kLibraryTag) && 4090 if ((script_.kind() == RawScript::kLibraryTag) &&
4091 (CurrentToken() != Token::kLIBRARY)) { 4091 (CurrentToken() != Token::kLEGACY_LIBRARY)) {
4092 // Handle error case early to get consistent error message. 4092 // Handle error case early to get consistent error message.
4093 ExpectToken(Token::kLIBRARY); 4093 ExpectToken(Token::kLEGACY_LIBRARY);
4094 } 4094 }
4095 if (CurrentToken() == Token::kLIBRARY) { 4095 if (CurrentToken() == Token::kLEGACY_LIBRARY) {
4096 ConsumeToken(); 4096 ConsumeToken();
4097 ExpectToken(Token::kLPAREN); 4097 ExpectToken(Token::kLPAREN);
4098 if (CurrentToken() != Token::kSTRING) { 4098 if (CurrentToken() != Token::kSTRING) {
4099 ErrorMsg("library name expected"); 4099 ErrorMsg("library name expected");
4100 } 4100 }
4101 const String& name = *CurrentLiteral(); 4101 const String& name = *CurrentLiteral();
4102 ConsumeToken(); 4102 ConsumeToken();
4103 ExpectToken(Token::kRPAREN); 4103 ExpectToken(Token::kRPAREN);
4104 ExpectToken(Token::kSEMICOLON); 4104 ExpectToken(Token::kSEMICOLON);
4105 library_.SetName(name); 4105 library_.SetName(name);
(...skipping 16 matching lines...) Expand all
4122 Error& prev_error = Error::Handle(); 4122 Error& prev_error = Error::Handle();
4123 prev_error ^= Api::UnwrapHandle(result); 4123 prev_error ^= Api::UnwrapHandle(result);
4124 AppendErrorMsg(prev_error, token_pos, "library handler failed"); 4124 AppendErrorMsg(prev_error, token_pos, "library handler failed");
4125 } 4125 }
4126 return result; 4126 return result;
4127 } 4127 }
4128 4128
4129 4129
4130 // TODO(hausner): Remove support for old library definition syntax. 4130 // TODO(hausner): Remove support for old library definition syntax.
4131 void Parser::ParseLibraryImportObsoleteSyntax() { 4131 void Parser::ParseLibraryImportObsoleteSyntax() {
4132 while (CurrentToken() == Token::kIMPORT) { 4132 while (CurrentToken() == Token::kLEGACY_IMPORT) {
4133 const intptr_t import_pos = TokenPos(); 4133 const intptr_t import_pos = TokenPos();
4134 ConsumeToken(); 4134 ConsumeToken();
4135 ExpectToken(Token::kLPAREN); 4135 ExpectToken(Token::kLPAREN);
4136 if (CurrentToken() != Token::kSTRING) { 4136 if (CurrentToken() != Token::kSTRING) {
4137 ErrorMsg("library url expected"); 4137 ErrorMsg("library url expected");
4138 } 4138 }
4139 const String& url = *CurrentLiteral(); 4139 const String& url = *CurrentLiteral();
4140 ConsumeToken(); 4140 ConsumeToken();
4141 String& prefix = String::Handle(); 4141 String& prefix = String::Handle();
4142 if (CurrentToken() == Token::kCOMMA) { 4142 if (CurrentToken() == Token::kCOMMA) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
4189 library_prefix = LibraryPrefix::New(prefix, import); 4189 library_prefix = LibraryPrefix::New(prefix, import);
4190 library_.AddObject(library_prefix, prefix); 4190 library_.AddObject(library_prefix, prefix);
4191 } 4191 }
4192 } 4192 }
4193 } 4193 }
4194 } 4194 }
4195 4195
4196 4196
4197 // TODO(hausner): Remove support for old library definition syntax. 4197 // TODO(hausner): Remove support for old library definition syntax.
4198 void Parser::ParseLibraryIncludeObsoleteSyntax() { 4198 void Parser::ParseLibraryIncludeObsoleteSyntax() {
4199 while (CurrentToken() == Token::kSOURCE) { 4199 while (CurrentToken() == Token::kLEGACY_SOURCE) {
4200 const intptr_t source_pos = TokenPos(); 4200 const intptr_t source_pos = TokenPos();
4201 ConsumeToken(); 4201 ConsumeToken();
4202 ExpectToken(Token::kLPAREN); 4202 ExpectToken(Token::kLPAREN);
4203 if (CurrentToken() != Token::kSTRING) { 4203 if (CurrentToken() != Token::kSTRING) {
4204 ErrorMsg("source url expected"); 4204 ErrorMsg("source url expected");
4205 } 4205 }
4206 const String& url = *CurrentLiteral(); 4206 const String& url = *CurrentLiteral();
4207 ConsumeToken(); 4207 ConsumeToken();
4208 ExpectToken(Token::kRPAREN); 4208 ExpectToken(Token::kRPAREN);
4209 ExpectToken(Token::kSEMICOLON); 4209 ExpectToken(Token::kSEMICOLON);
4210 Dart_Handle handle = CallLibraryTagHandler(kCanonicalizeUrl, 4210 Dart_Handle handle = CallLibraryTagHandler(kCanonicalizeUrl,
4211 source_pos, 4211 source_pos,
4212 url); 4212 url);
4213 const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle)); 4213 const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle));
4214 CallLibraryTagHandler(kSourceTag, source_pos, canon_url); 4214 CallLibraryTagHandler(kSourceTag, source_pos, canon_url);
4215 } 4215 }
4216 } 4216 }
4217 4217
4218 4218
4219 void Parser::ParseLibraryName() { 4219 void Parser::ParseLibraryName() {
4220 ASSERT(IsLiteral("library")); 4220 ASSERT(CurrentToken() == Token::kLIBRARY);
4221 ConsumeToken(); 4221 ConsumeToken();
4222 // TODO(hausner): Exact syntax of library name still unclear: identifier, 4222 // TODO(hausner): Exact syntax of library name still unclear: identifier,
4223 // qualified identifier or even multiple dots allowed? For now we just 4223 // qualified identifier or even multiple dots allowed? For now we just
4224 // accept simple identifiers. 4224 // accept simple identifiers.
4225 const String& lib_name = *ExpectIdentifier("library name expected"); 4225 const String& lib_name = *ExpectIdentifier("library name expected");
4226 library_.SetName(lib_name); 4226 library_.SetName(lib_name);
4227 ExpectSemicolon(); 4227 ExpectSemicolon();
4228 } 4228 }
4229 4229
4230 4230
4231 void Parser::ParseIdentList(GrowableObjectArray* names) { 4231 void Parser::ParseIdentList(GrowableObjectArray* names) {
4232 while (IsIdentifier()) { 4232 while (IsIdentifier()) {
4233 names->Add(*CurrentLiteral()); 4233 names->Add(*CurrentLiteral());
4234 ConsumeToken(); // Identifier. 4234 ConsumeToken(); // Identifier.
4235 if (CurrentToken() != Token::kCOMMA) { 4235 if (CurrentToken() != Token::kCOMMA) {
4236 return; 4236 return;
4237 } 4237 }
4238 ConsumeToken(); // Comma. 4238 ConsumeToken(); // Comma.
4239 } 4239 }
4240 } 4240 }
4241 4241
4242 4242
4243 void Parser::ParseLibraryImportExport() { 4243 void Parser::ParseLibraryImportExport() {
4244 bool is_import = IsLiteral("import"); 4244 bool is_import = (CurrentToken() == Token::kIMPORT);
4245 bool is_export = IsLiteral("export"); 4245 bool is_export = (CurrentToken() == Token::kEXPORT);
4246 ASSERT(is_import || is_export); 4246 ASSERT(is_import || is_export);
4247 const intptr_t import_pos = TokenPos(); 4247 const intptr_t import_pos = TokenPos();
4248 ConsumeToken(); 4248 ConsumeToken();
4249 if (CurrentToken() != Token::kSTRING) { 4249 if (CurrentToken() != Token::kSTRING) {
4250 ErrorMsg("library url expected"); 4250 ErrorMsg("library url expected");
4251 } 4251 }
4252 const String& url = *CurrentLiteral(); 4252 const String& url = *CurrentLiteral();
4253 if (url.Length() == 0) { 4253 if (url.Length() == 0) {
4254 ErrorMsg("library url expected"); 4254 ErrorMsg("library url expected");
4255 } 4255 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
4345 void Parser::ParseLibraryDefinition() { 4345 void Parser::ParseLibraryDefinition() {
4346 TRACE_PARSER("ParseLibraryDefinition"); 4346 TRACE_PARSER("ParseLibraryDefinition");
4347 4347
4348 // Handle the script tag. 4348 // Handle the script tag.
4349 if (CurrentToken() == Token::kSCRIPTTAG) { 4349 if (CurrentToken() == Token::kSCRIPTTAG) {
4350 // Nothing to do for script tags except to skip them. 4350 // Nothing to do for script tags except to skip them.
4351 ConsumeToken(); 4351 ConsumeToken();
4352 } 4352 }
4353 4353
4354 // TODO(hausner): Remove support for old library definition syntax. 4354 // TODO(hausner): Remove support for old library definition syntax.
4355 if ((CurrentToken() == Token::kLIBRARY) || 4355 if ((CurrentToken() == Token::kLEGACY_LIBRARY) ||
4356 (CurrentToken() == Token::kIMPORT) || 4356 (CurrentToken() == Token::kLEGACY_IMPORT) ||
4357 (CurrentToken() == Token::kSOURCE)) { 4357 (CurrentToken() == Token::kLEGACY_SOURCE)) {
4358 ParseLibraryNameObsoleteSyntax(); 4358 ParseLibraryNameObsoleteSyntax();
4359 ParseLibraryImportObsoleteSyntax(); 4359 ParseLibraryImportObsoleteSyntax();
4360 ParseLibraryIncludeObsoleteSyntax(); 4360 ParseLibraryIncludeObsoleteSyntax();
4361 // Core lib has not been explicitly imported, so we implicitly 4361 // Core lib has not been explicitly imported, so we implicitly
4362 // import it here. 4362 // import it here.
4363 if (!library_.ImportsCorelib()) { 4363 if (!library_.ImportsCorelib()) {
4364 Library& core_lib = Library::Handle(Library::CoreLibrary()); 4364 Library& core_lib = Library::Handle(Library::CoreLibrary());
4365 ASSERT(!core_lib.IsNull()); 4365 ASSERT(!core_lib.IsNull());
4366 const Namespace& core_ns = Namespace::Handle( 4366 const Namespace& core_ns = Namespace::Handle(
4367 Namespace::New(core_lib, Array::Handle(), Array::Handle())); 4367 Namespace::New(core_lib, Array::Handle(), Array::Handle()));
4368 library_.AddImport(core_ns); 4368 library_.AddImport(core_ns);
4369 } 4369 }
4370 return; 4370 return;
4371 } 4371 }
4372 4372
4373 // We may read metadata tokens that are part of the toplevel 4373 // We may read metadata tokens that are part of the toplevel
4374 // declaration that follows the library definitions. Therefore, we 4374 // declaration that follows the library definitions. Therefore, we
4375 // need to remember the position of the last token that was 4375 // need to remember the position of the last token that was
4376 // successfully consumed. 4376 // successfully consumed.
4377 intptr_t metadata_pos = TokenPos(); 4377 intptr_t metadata_pos = TokenPos();
4378 SkipMetadata(); 4378 SkipMetadata();
4379 if (IsLiteral("library")) { 4379 if (CurrentToken() == Token::kLIBRARY) {
4380 ParseLibraryName(); 4380 ParseLibraryName();
4381 metadata_pos = TokenPos(); 4381 metadata_pos = TokenPos();
4382 SkipMetadata(); 4382 SkipMetadata();
4383 } else if (script_.kind() == RawScript::kLibraryTag) { 4383 } else if (script_.kind() == RawScript::kLibraryTag) {
4384 ErrorMsg("library name definition expected"); 4384 ErrorMsg("library name definition expected");
4385 } 4385 }
4386 while (IsLiteral("import") || IsLiteral("export")) { 4386 while ((CurrentToken() == Token::kIMPORT) ||
4387 (CurrentToken() == Token::kEXPORT)) {
4387 ParseLibraryImportExport(); 4388 ParseLibraryImportExport();
4388 metadata_pos = TokenPos(); 4389 metadata_pos = TokenPos();
4389 SkipMetadata(); 4390 SkipMetadata();
4390 } 4391 }
4391 // Core lib has not been explicitly imported, so we implicitly 4392 // Core lib has not been explicitly imported, so we implicitly
4392 // import it here. 4393 // import it here.
4393 if (!library_.ImportsCorelib()) { 4394 if (!library_.ImportsCorelib()) {
4394 Library& core_lib = Library::Handle(Library::CoreLibrary()); 4395 Library& core_lib = Library::Handle(Library::CoreLibrary());
4395 ASSERT(!core_lib.IsNull()); 4396 ASSERT(!core_lib.IsNull());
4396 const Namespace& core_ns = Namespace::Handle( 4397 const Namespace& core_ns = Namespace::Handle(
4397 Namespace::New(core_lib, Array::Handle(), Array::Handle())); 4398 Namespace::New(core_lib, Array::Handle(), Array::Handle()));
4398 library_.AddImport(core_ns); 4399 library_.AddImport(core_ns);
4399 } 4400 }
4400 while (IsLiteral("part")) { 4401 while (CurrentToken() == Token::kPART) {
4401 ParseLibraryPart(); 4402 ParseLibraryPart();
4402 metadata_pos = TokenPos(); 4403 metadata_pos = TokenPos();
4403 SkipMetadata(); 4404 SkipMetadata();
4404 } 4405 }
4405 if (IsLiteral("library") || IsLiteral("import") || IsLiteral("export")) {
4406 ErrorMsg("unexpected token '%s'", CurrentLiteral()->ToCString());
4407 }
4408 SetPosition(metadata_pos); 4406 SetPosition(metadata_pos);
4409 } 4407 }
4410 4408
4411 4409
4412 void Parser::ParsePartHeader() { 4410 void Parser::ParsePartHeader() {
4413 intptr_t metadata_pos = TokenPos(); 4411 intptr_t metadata_pos = TokenPos();
4414 SkipMetadata(); 4412 SkipMetadata();
4415 // TODO(hausner): Once support for old #source directive is removed 4413 // TODO(hausner): Once support for old #source directive is removed
4416 // from the compiler, add an error message here if we don't find 4414 // from the compiler, add an error message here if we don't find
4417 // a 'part of' directive. 4415 // a 'part of' directive.
4418 if (IsLiteral("part")) { 4416 if (CurrentToken() == Token::kPART) {
4419 ConsumeToken(); 4417 ConsumeToken();
4420 if (!IsLiteral("of")) { 4418 if (!IsLiteral("of")) {
4421 ErrorMsg("'part of' expected"); 4419 ErrorMsg("'part of' expected");
4422 } 4420 }
4423 ConsumeToken(); 4421 ConsumeToken();
4424 // TODO(hausner): Exact syntax of library name still unclear: identifier, 4422 // TODO(hausner): Exact syntax of library name still unclear: identifier,
4425 // qualified identifier or even multiple dots allowed? For now we just 4423 // qualified identifier or even multiple dots allowed? For now we just
4426 // accept simple identifiers. 4424 // accept simple identifiers.
4427 // The VM is not required to check that the library name matches the 4425 // The VM is not required to check that the library name matches the
4428 // name of the current library, so we ignore it. 4426 // name of the current library, so we ignore it.
(...skipping 5439 matching lines...) Expand 10 before | Expand all | Expand 10 after
9868 void Parser::SkipQualIdent() { 9866 void Parser::SkipQualIdent() {
9869 ASSERT(IsIdentifier()); 9867 ASSERT(IsIdentifier());
9870 ConsumeToken(); 9868 ConsumeToken();
9871 if (CurrentToken() == Token::kPERIOD) { 9869 if (CurrentToken() == Token::kPERIOD) {
9872 ConsumeToken(); // Consume the kPERIOD token. 9870 ConsumeToken(); // Consume the kPERIOD token.
9873 ExpectIdentifier("identifier expected after '.'"); 9871 ExpectIdentifier("identifier expected after '.'");
9874 } 9872 }
9875 } 9873 }
9876 9874
9877 } // namespace dart 9875 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/scanner.cc » ('j') | tests/language/pseudo_kw_illegal_test.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698