| Index: runtime/vm/parser.cc
 | 
| ===================================================================
 | 
| --- runtime/vm/parser.cc	(revision 12215)
 | 
| +++ runtime/vm/parser.cc	(working copy)
 | 
| @@ -4018,8 +4018,8 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void Parser::ParseLibraryName() {
 | 
| -  TRACE_PARSER("ParseLibraryName");
 | 
| +// TODO(hausner): Remove support for old library definition syntax.
 | 
| +void Parser::ParseLibraryNameObsoleteSyntax() {
 | 
|    if ((script_.kind() == RawScript::kLibraryTag) &&
 | 
|        (CurrentToken() != Token::kLIBRARY)) {
 | 
|      // Handle error case early to get consistent error message.
 | 
| @@ -4060,8 +4060,8 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void Parser::ParseLibraryImport() {
 | 
| -  TRACE_PARSER("ParseLibraryImport");
 | 
| +// TODO(hausner): Remove support for old library definition syntax.
 | 
| +void Parser::ParseLibraryImportObsoleteSyntax() {
 | 
|    while (CurrentToken() == Token::kIMPORT) {
 | 
|      const intptr_t import_pos = TokenPos();
 | 
|      ConsumeToken();
 | 
| @@ -4125,8 +4125,8 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void Parser::ParseLibraryInclude() {
 | 
| -  TRACE_PARSER("ParseLibraryInclude");
 | 
| +// TODO(hausner): Remove support for old library definition syntax.
 | 
| +void Parser::ParseLibraryIncludeObsoleteSyntax() {
 | 
|    while (CurrentToken() == Token::kSOURCE) {
 | 
|      const intptr_t source_pos = TokenPos();
 | 
|      ConsumeToken();
 | 
| @@ -4147,8 +4147,8 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void Parser::ParseLibraryResource() {
 | 
| -  TRACE_PARSER("ParseLibraryResource");
 | 
| +// TODO(hausner): Remove support for old library definition syntax.
 | 
| +void Parser::ParseLibraryResourceObsoleteSyntax() {
 | 
|    while (CurrentToken() == Token::kRESOURCE) {
 | 
|      // Currently the VM does ignore #resource library tags. They are only used
 | 
|      // by the IDE.
 | 
| @@ -4164,18 +4164,134 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +void Parser::ParseLibraryName() {
 | 
| +  ASSERT(IsLiteral("library"));
 | 
| +  ConsumeToken();
 | 
| +  // TODO(hausner): Exact syntax of library name still unclear: identifier,
 | 
| +  // qualified identifier or even multiple dots allowed? For now we just
 | 
| +  // accept simple identifiers.
 | 
| +  const String& lib_name = *ExpectIdentifier("library name expected");
 | 
| +  library_.SetName(lib_name);
 | 
| +  ExpectSemicolon();
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void Parser::ParseLibraryImportExport() {
 | 
| +  if (IsLiteral("import")) {
 | 
| +    const intptr_t import_pos = TokenPos();
 | 
| +    ConsumeToken();
 | 
| +    if (CurrentToken() != Token::kSTRING) {
 | 
| +      ErrorMsg("library url expected");
 | 
| +    }
 | 
| +    const String& url = *CurrentLiteral();
 | 
| +    if (url.Length() == 0) {
 | 
| +      ErrorMsg("library url expected");
 | 
| +    }
 | 
| +    ConsumeToken();
 | 
| +    String& prefix = String::Handle();
 | 
| +    if (IsLiteral("as")) {
 | 
| +      ConsumeToken();
 | 
| +      prefix = ExpectIdentifier("prefix expected")->raw();
 | 
| +    }
 | 
| +    if (IsLiteral("show")) {
 | 
| +      ErrorMsg("show combinator not yet supported");
 | 
| +    } else if (IsLiteral("hide")) {
 | 
| +      ErrorMsg("hide combinator not yet supported");
 | 
| +    }
 | 
| +    ExpectSemicolon();
 | 
| +
 | 
| +    // Canonicalize library URL.
 | 
| +    Dart_Handle handle =
 | 
| +        CallLibraryTagHandler(kCanonicalizeUrl, import_pos, url);
 | 
| +    const String& canon_url = String::CheckedHandle(Api::UnwrapHandle(handle));
 | 
| +    // Lookup the library URL.
 | 
| +    Library& library = Library::Handle(Library::LookupLibrary(canon_url));
 | 
| +    if (library.IsNull()) {
 | 
| +      // Call the library tag handler to load the library.
 | 
| +      CallLibraryTagHandler(kImportTag, import_pos, canon_url);
 | 
| +      // If the library tag handler succeded without registering the
 | 
| +      // library we create an empty library to import.
 | 
| +      library = Library::LookupLibrary(canon_url);
 | 
| +      if (library.IsNull()) {
 | 
| +        library = Library::New(canon_url);
 | 
| +        library.Register();
 | 
| +      }
 | 
| +    }
 | 
| +    // Add the import to the library.
 | 
| +    if (prefix.IsNull() || (prefix.Length() == 0)) {
 | 
| +      library_.AddImport(library);
 | 
| +    } else {
 | 
| +      LibraryPrefix& library_prefix = LibraryPrefix::Handle();
 | 
| +      library_prefix = library_.LookupLocalLibraryPrefix(prefix);
 | 
| +      if (!library_prefix.IsNull()) {
 | 
| +        library_prefix.AddLibrary(library);
 | 
| +      } else {
 | 
| +        library_prefix = LibraryPrefix::New(prefix, library);
 | 
| +        library_.AddObject(library_prefix, prefix);
 | 
| +      }
 | 
| +    }
 | 
| +  } else if (IsLiteral("export")) {
 | 
| +    ErrorMsg("export clause not yet supported");
 | 
| +  } else {
 | 
| +    ErrorMsg("unreachable");
 | 
| +    UNREACHABLE();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void Parser::ParseLibraryPart() {
 | 
| +  ErrorMsg("library part definitions not implemented");
 | 
| +}
 | 
| +
 | 
| +
 | 
|  void Parser::ParseLibraryDefinition() {
 | 
|    TRACE_PARSER("ParseLibraryDefinition");
 | 
| +
 | 
|    // Handle the script tag.
 | 
|    if (CurrentToken() == Token::kSCRIPTTAG) {
 | 
|      // Nothing to do for script tags except to skip them.
 | 
|      ConsumeToken();
 | 
|    }
 | 
|  
 | 
| -  ParseLibraryName();
 | 
| -  ParseLibraryImport();
 | 
| -  ParseLibraryInclude();
 | 
| -  ParseLibraryResource();
 | 
| +  // TODO(hausner): Remove support for old library definition syntax.
 | 
| +  if ((CurrentToken() == Token::kLIBRARY) ||
 | 
| +      (CurrentToken() == Token::kIMPORT) ||
 | 
| +      (CurrentToken() == Token::kSOURCE) ||
 | 
| +      (CurrentToken() == Token::kRESOURCE)) {
 | 
| +    ParseLibraryNameObsoleteSyntax();
 | 
| +    ParseLibraryImportObsoleteSyntax();
 | 
| +    ParseLibraryIncludeObsoleteSyntax();
 | 
| +    ParseLibraryResourceObsoleteSyntax();
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  // We may read metadata tokens that are part of the toplevel
 | 
| +  // declaration that follows the library definitions. Therefore, we
 | 
| +  // need to remember the position of the last token that was
 | 
| +  // successfully consumed.
 | 
| +  intptr_t metadata_pos = TokenPos();
 | 
| +  SkipMetadata();
 | 
| +  if (IsLiteral("library")) {
 | 
| +    ParseLibraryName();
 | 
| +    metadata_pos = TokenPos();
 | 
| +    SkipMetadata();
 | 
| +  } else if (script_.kind() == RawScript::kLibraryTag) {
 | 
| +    ErrorMsg("library name definition expected");
 | 
| +  }
 | 
| +  while (IsLiteral("import") || IsLiteral("export")) {
 | 
| +    ParseLibraryImportExport();
 | 
| +    metadata_pos = TokenPos();
 | 
| +    SkipMetadata();
 | 
| +  }
 | 
| +  while (IsLiteral("part")) {
 | 
| +    ParseLibraryPart();
 | 
| +    metadata_pos = TokenPos();
 | 
| +    SkipMetadata();
 | 
| +  }
 | 
| +  if (IsLiteral("library") || IsLiteral("import") || IsLiteral("export")) {
 | 
| +    ErrorMsg("unexpected token '%s'", CurrentLiteral()->ToCString());
 | 
| +  }
 | 
| +  SetPosition(metadata_pos);
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |