| Index: frog/leg/scanner/scanner_task.dart
|
| ===================================================================
|
| --- frog/leg/scanner/scanner_task.dart (revision 5925)
|
| +++ frog/leg/scanner/scanner_task.dart (working copy)
|
| @@ -1,204 +0,0 @@
|
| -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -class ScannerTask extends CompilerTask {
|
| - ScannerTask(Compiler compiler) : super(compiler);
|
| - String get name() => 'Scanner';
|
| -
|
| - void scan(CompilationUnitElement compilationUnit) {
|
| - measure(() {
|
| - if (compilationUnit.kind === ElementKind.LIBRARY) {
|
| - compiler.log("scanning library ${compilationUnit.script.name}");
|
| - }
|
| - scanElements(compilationUnit);
|
| - if (compilationUnit.kind === ElementKind.LIBRARY) {
|
| - processScriptTags(compilationUnit);
|
| - }
|
| - });
|
| - }
|
| -
|
| - void processScriptTags(LibraryElement library) {
|
| - int tagState = TagState.NO_TAG_SEEN;
|
| -
|
| - /**
|
| - * If [value] is less than [tagState] complain and return
|
| - * [tagState]. Otherwise return the new value for [tagState]
|
| - * (transition function for state machine).
|
| - */
|
| - int checkTag(int value, ScriptTag tag) {
|
| - if (tagState > value) {
|
| - compiler.reportError(tag, 'out of order');
|
| - return tagState;
|
| - }
|
| - return TagState.NEXT[value];
|
| - }
|
| -
|
| - LinkBuilder<ScriptTag> imports = new LinkBuilder<ScriptTag>();
|
| - Uri cwd = new Uri(scheme: 'file', path: compiler.currentDirectory);
|
| - Uri base = cwd.resolve(library.script.name.toString());
|
| - for (ScriptTag tag in library.tags.reverse()) {
|
| - StringNode argument = tag.argument;
|
| - // TODO(lrn): Support interpolations here. We need access to the
|
| - // special constants that can be inserted into script tag strings.
|
| - Uri resolved = base.resolve(argument.dartString.slowToString());
|
| - if (tag.isImport()) {
|
| - tagState = checkTag(TagState.IMPORT, tag);
|
| - // It is not safe to import other libraries at this point as
|
| - // another library could then observe the current library
|
| - // before it fully declares all the members that are sourced
|
| - // in.
|
| - imports.addLast(tag);
|
| - } else if (tag.isLibrary()) {
|
| - tagState = checkTag(TagState.LIBRARY, tag);
|
| - if (library.libraryTag !== null) {
|
| - compiler.cancel("duplicated library declaration", node: tag);
|
| - } else {
|
| - library.libraryTag = tag;
|
| - }
|
| - } else if (tag.isSource()) {
|
| - tagState = checkTag(TagState.SOURCE, tag);
|
| - Script script = compiler.readScript(resolved, tag);
|
| - CompilationUnitElement unit =
|
| - new CompilationUnitElement(script, library);
|
| - compiler.withCurrentElement(unit, () => scan(unit));
|
| - } else if (tag.isResource()) {
|
| - tagState = checkTag(TagState.RESOURCE, tag);
|
| - compiler.reportWarning(tag, 'ignoring resource tag');
|
| - } else {
|
| - compiler.cancel("illegal script tag: ${tag.tag}", node: tag);
|
| - }
|
| - }
|
| - // TODO(ahe): During Compiler.scanBuiltinLibraries,
|
| - // compiler.coreLibrary is null. Clean this up when there is a
|
| - // better way to access "dart:core".
|
| - bool implicitlyImportCoreLibrary = compiler.coreLibrary !== null;
|
| - for (ScriptTag tag in imports.toLink()) {
|
| - // Now that we have processed all the source tags, it is safe to
|
| - // start loading other libraries.
|
| - StringNode argument = tag.argument;
|
| - Uri resolved = base.resolve(argument.dartString.slowToString());
|
| - if (resolved.toString() == "dart:core") {
|
| - implicitlyImportCoreLibrary = false;
|
| - }
|
| - importLibrary(library, loadLibrary(resolved, tag), tag);
|
| - }
|
| - if (implicitlyImportCoreLibrary) {
|
| - importLibrary(library, compiler.coreLibrary, null);
|
| - }
|
| - }
|
| -
|
| - void scanElements(CompilationUnitElement compilationUnit) {
|
| - Script script = compilationUnit.script;
|
| - Token tokens;
|
| - try {
|
| - tokens = new StringScanner(script.text).tokenize();
|
| - } catch (MalformedInputException ex) {
|
| - Token token;
|
| - var message;
|
| - if (ex.position is num) {
|
| - // TODO(ahe): Always use tokens in MalformedInputException.
|
| - token = new Token(EOF_INFO, ex.position);
|
| - } else {
|
| - token = ex.position;
|
| - }
|
| - compiler.cancel(ex.message, token: token);
|
| - }
|
| - compiler.dietParser.dietParse(compilationUnit, tokens);
|
| - }
|
| -
|
| - LibraryElement loadLibrary(Uri uri, ScriptTag node) {
|
| - bool newLibrary = false;
|
| - LibraryElement library =
|
| - compiler.universe.libraries.putIfAbsent(uri.toString(), () {
|
| - newLibrary = true;
|
| - Script script = compiler.readScript(uri, node);
|
| - LibraryElement element = new LibraryElement(script);
|
| - native.maybeEnableNative(compiler, element, uri);
|
| - return element;
|
| - });
|
| - if (newLibrary) {
|
| - compiler.withCurrentElement(library, () => scan(library));
|
| - compiler.onLibraryLoaded(library, uri);
|
| - }
|
| - return library;
|
| - }
|
| -
|
| - void importLibrary(LibraryElement library, LibraryElement imported,
|
| - ScriptTag tag) {
|
| - if (!imported.hasLibraryName()) {
|
| - compiler.withCurrentElement(library, () {
|
| - compiler.reportError(tag,
|
| - 'no #library tag found in ${imported.script.uri}');
|
| - });
|
| - }
|
| - if (tag !== null && tag.prefix !== null) {
|
| - SourceString prefix =
|
| - new SourceString(tag.prefix.dartString.slowToString());
|
| - Element e = library.find(prefix);
|
| - if (e === null) {
|
| - e = new PrefixElement(prefix, library, tag.getBeginToken());
|
| - library.define(e, compiler);
|
| - }
|
| - if (e.kind !== ElementKind.PREFIX) {
|
| - compiler.withCurrentElement(e, () {
|
| - compiler.reportWarning(new Identifier(e.position()),
|
| - 'duplicated definition');
|
| - });
|
| - compiler.reportError(tag.prefix, 'duplicate defintion');
|
| - }
|
| - imported.forEachExport((Element element) {
|
| - Element existing = e.imported.putIfAbsent(element.name, () => element);
|
| - if (existing !== element) {
|
| - compiler.withCurrentElement(existing, () {
|
| - compiler.reportWarning(new Identifier(existing.position()),
|
| - 'duplicated import');
|
| - });
|
| - compiler.withCurrentElement(element, () {
|
| - compiler.reportError(new Identifier(element.position()),
|
| - 'duplicated import');
|
| - });
|
| - }
|
| - });
|
| - } else {
|
| - imported.forEachExport((Element element) {
|
| - compiler.withCurrentElement(element, () {
|
| - library.define(element, compiler);
|
| - });
|
| - });
|
| - }
|
| - }
|
| -}
|
| -
|
| -class DietParserTask extends CompilerTask {
|
| - DietParserTask(Compiler compiler) : super(compiler);
|
| - final String name = 'Diet Parser';
|
| -
|
| - dietParse(CompilationUnitElement compilationUnit, Token tokens) {
|
| - measure(() {
|
| - ElementListener listener = new ElementListener(compiler, compilationUnit);
|
| - PartialParser parser = new PartialParser(listener);
|
| - parser.parseUnit(tokens);
|
| - });
|
| - }
|
| -}
|
| -
|
| -/**
|
| - * The fields of this class models a state machine for checking script
|
| - * tags come in the correct order.
|
| - */
|
| -class TagState {
|
| - static final int NO_TAG_SEEN = 0;
|
| - static final int LIBRARY = 1;
|
| - static final int IMPORT = 2;
|
| - static final int SOURCE = 3;
|
| - static final int RESOURCE = 4;
|
| -
|
| - /** Next state. */
|
| - static final List<int> NEXT =
|
| - const <int>[NO_TAG_SEEN,
|
| - IMPORT, // Only one library tag is allowed.
|
| - IMPORT,
|
| - SOURCE,
|
| - RESOURCE];
|
| -}
|
|
|