Index: pkg/dev_compiler/lib/src/compiler/element_loader.dart |
diff --git a/pkg/dev_compiler/lib/src/compiler/element_loader.dart b/pkg/dev_compiler/lib/src/compiler/element_loader.dart |
deleted file mode 100644 |
index a2635eb26e6dcb34a7e4d6ed319e0d192a1bfb08..0000000000000000000000000000000000000000 |
--- a/pkg/dev_compiler/lib/src/compiler/element_loader.dart |
+++ /dev/null |
@@ -1,117 +0,0 @@ |
-// Copyright (c) 2015, 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. |
- |
-import 'dart:collection' show HashMap; |
- |
-import 'package:analyzer/dart/ast/ast.dart'; |
-import 'package:analyzer/dart/element/element.dart'; |
-import 'package:func/func.dart'; |
-import '../js_ast/js_ast.dart' as JS; |
- |
-/// Helper that tracks order of elements visited by the compiler, detecting |
-/// if the top level item can be loaded eagerly or not. |
-class ElementLoader { |
- final HashMap<Element, AstNode> _declarationNodes; |
- |
- /// The stack of currently emitting elements, if generating top-level code |
- /// for them. This is not used when inside method bodies, because order does |
- /// not matter for those. |
- final _topLevelElements = new List<Element>(); |
- |
- /// The current element being loaded. |
- /// We can use this to determine if we're loading top-level code or not: |
- /// |
- /// _currentElements.last == _topLevelElements.last |
- final _currentElements = new List<Element>(); |
- |
- bool _checkReferences; |
- |
- ElementLoader(this._declarationNodes) { |
- assert(!_declarationNodes.containsKey(null)); |
- } |
- |
- Element get currentElement => _currentElements.last; |
- |
- bool isLoaded(Element e) => !_declarationNodes.containsKey(e); |
- |
- /// True if the element is currently being loaded. |
- bool _isLoading(Element e) => _currentElements.contains(e); |
- |
- /// Start generating top-level code for the element [e]. |
- /// |
- /// Subsequent [emitDeclaration] calls will cause those elements to be |
- /// generated before this one, until [finishTopLevel] is called. |
- void startTopLevel(Element e) { |
- assert(identical(e, currentElement)); |
- _topLevelElements.add(e); |
- } |
- |
- /// Finishes the top-level code for the element [e]. |
- void finishTopLevel(Element e) { |
- var last = _topLevelElements.removeLast(); |
- assert(identical(e, last)); |
- } |
- |
- /// Starts recording calls to [declareBeforeUse], until |
- /// [finishCheckingReferences] is called. |
- void startCheckingReferences() { |
- // This function should not be reentrant, and we should not current be |
- // emitting top-level code. |
- assert(_checkReferences == null); |
- assert(_topLevelElements.isEmpty || |
- !identical(currentElement, _topLevelElements.last)); |
- // Assume true until proven otherwise |
- _checkReferences = true; |
- } |
- |
- /// Finishes recording references, and returns `true` if all referenced |
- /// items were loaded (or if no items were referenced). |
- bool finishCheckingReferences() { |
- var result = _checkReferences; |
- _checkReferences = null; |
- return result; |
- } |
- |
- /// Ensures a top-level declaration is generated, and returns `true` if it |
- /// is part of the current module. |
- /*=T*/ emitDeclaration/*<T extends JS.Node>*/( |
- Element e, Func1<AstNode, JS.Node/*=T*/ > visit) { |
- var node = _declarationNodes.remove(e); |
- if (node == null) return null; // not from this module or already loaded. |
- |
- _currentElements.add(e); |
- |
- var result = visit(node); |
- |
- var last = _currentElements.removeLast(); |
- assert(identical(e, last)); |
- |
- return result; |
- } |
- |
- /// To emit top-level module items, we sometimes need to reorder them. |
- /// |
- /// This function takes care of that, and also detects cases where reordering |
- /// failed, and we need to resort to lazy loading, by marking the element as |
- /// lazy. All elements need to be aware of this possibility and generate code |
- /// accordingly. |
- /// |
- /// If we are not emitting top-level code, this does nothing, because all |
- /// declarations are assumed to be available before we start execution. |
- /// See [startTopLevel]. |
- void declareBeforeUse(Element e, VoidFunc1<Element> emit) { |
- if (e == null) return; |
- |
- if (_checkReferences != null) { |
- _checkReferences = _checkReferences && isLoaded(e) && !_isLoading(e); |
- return; |
- } |
- |
- var topLevel = _topLevelElements; |
- if (topLevel.isNotEmpty && identical(currentElement, topLevel.last)) { |
- // If the item is from our library, try to emit it now. |
- emit(e); |
- } |
- } |
-} |