| Index: sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9a5e58da3b12be1e231d7642664bfc1fdeba68e3
|
| --- /dev/null
|
| +++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
|
| @@ -0,0 +1,234 @@
|
| +// Copyright (c) 2013, 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.
|
| +
|
| +part of dart2js.mirrors;
|
| +
|
| +
|
| +class Dart2JsLibraryMirror
|
| + extends Dart2JsElementMirror
|
| + with ObjectMirrorMixin, ContainerMixin
|
| + implements LibrarySourceMirror {
|
| + List<LibraryDependencyMirror> _libraryDependencies;
|
| +
|
| + Dart2JsLibraryMirror(Dart2JsMirrorSystem system, LibraryElement library)
|
| + : super(system, library);
|
| +
|
| + Function operator [](Symbol name) {
|
| + throw new UnsupportedError('LibraryMirror.operator [] unsupported.');
|
| + }
|
| +
|
| + LibraryElement get _element => super._element;
|
| +
|
| + Uri get uri => _element.canonicalUri;
|
| +
|
| + DeclarationMirror get owner => null;
|
| +
|
| + bool get isPrivate => false;
|
| +
|
| + LibraryMirror library() => this;
|
| +
|
| + /**
|
| + * Returns the library name (for libraries with a library tag) or the script
|
| + * file name (for scripts without a library tag). The latter case is used to
|
| + * provide a 'library name' for scripts, to use for instance in dartdoc.
|
| + */
|
| + String get _simpleNameString {
|
| + if (_element.libraryTag != null) {
|
| + return _element.libraryTag.name.toString();
|
| + } else {
|
| + // Use the file name as script name.
|
| + String path = _element.canonicalUri.path;
|
| + return path.substring(path.lastIndexOf('/') + 1);
|
| + }
|
| + }
|
| +
|
| + Symbol get qualifiedName => simpleName;
|
| +
|
| + void _forEachElement(f(Element element)) => _element.forEachLocalMember(f);
|
| +
|
| + Iterable<Dart2JsDeclarationMirror> _getDeclarationMirrors(Element element) {
|
| + if (element.isClass() || element.isTypedef()) {
|
| + return [mirrorSystem._getTypeDeclarationMirror(element)];
|
| + } else {
|
| + return super._getDeclarationMirrors(element);
|
| + }
|
| + }
|
| +
|
| + Map<Symbol, MethodMirror> get topLevelMembers => null;
|
| +
|
| + /**
|
| + * Computes the first token of this library using the first library tag as
|
| + * indicator.
|
| + */
|
| + Token getBeginToken() {
|
| + if (_element.libraryTag != null) {
|
| + return _element.libraryTag.getBeginToken();
|
| + } else if (!_element.tags.isEmpty) {
|
| + return _element.tags.reverse().head.getBeginToken();
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + /**
|
| + * Computes the first token of this library using the last library tag as
|
| + * indicator.
|
| + */
|
| + Token getEndToken() {
|
| + if (!_element.tags.isEmpty) {
|
| + return _element.tags.head.getEndToken();
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + void _ensureLibraryDependenciesAnalyzed() {
|
| + if (_libraryDependencies == null) {
|
| + _libraryDependencies = <LibraryDependencyMirror>[];
|
| + for (LibraryTag node in _element.tags.reverse()) {
|
| + LibraryDependency libraryDependency = node.asLibraryDependency();
|
| + if (libraryDependency != null) {
|
| + LibraryElement targetLibraryElement =
|
| + _element.getLibraryFromTag(libraryDependency);
|
| + assert(targetLibraryElement != null);
|
| + LibraryMirror targetLibrary =
|
| + mirrorSystem._getLibrary(targetLibraryElement);
|
| + _libraryDependencies.add(new Dart2JsLibraryDependencyMirror(
|
| + libraryDependency, this, targetLibrary));
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + List<LibraryDependencyMirror> get libraryDependencies {
|
| + _ensureLibraryDependenciesAnalyzed();
|
| + return _libraryDependencies;
|
| + }
|
| +}
|
| +
|
| +class Dart2JsLibraryDependencyMirror implements LibraryDependencyMirror {
|
| + final LibraryDependency _node;
|
| + final Dart2JsLibraryMirror _sourceLibrary;
|
| + final Dart2JsLibraryMirror _targetLibrary;
|
| + List<CombinatorMirror> _combinators;
|
| +
|
| + Dart2JsLibraryDependencyMirror(this._node,
|
| + this._sourceLibrary,
|
| + this._targetLibrary);
|
| +
|
| + SourceLocation get location {
|
| + return new Dart2JsSourceLocation(
|
| + _sourceLibrary._element.entryCompilationUnit.script,
|
| + _sourceLibrary.mirrorSystem.compiler.spanFromNode(_node));
|
| + }
|
| +
|
| + List<CombinatorMirror> get combinators {
|
| + if (_combinators == null) {
|
| + _combinators = <CombinatorMirror>[];
|
| + if (_node.combinators != null) {
|
| + for (Combinator combinator in _node.combinators.nodes) {
|
| + List<String> identifiers = <String>[];
|
| + for (Identifier identifier in combinator.identifiers.nodes) {
|
| + identifiers.add(identifier.source);
|
| + }
|
| + _combinators.add(new Dart2JsCombinatorMirror(
|
| + identifiers, isShow: combinator.isShow));
|
| + }
|
| + }
|
| + }
|
| + return _combinators;
|
| + }
|
| +
|
| + LibraryMirror get sourceLibrary => _sourceLibrary;
|
| +
|
| + LibraryMirror get targetLibrary => _targetLibrary;
|
| +
|
| + String get prefix {
|
| + Import import = _node.asImport();
|
| + if (import != null && import.prefix != null) {
|
| + return import.prefix.source;
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + bool get isImport => _node.asImport() != null;
|
| +
|
| + bool get isExport => _node.asExport() != null;
|
| +}
|
| +
|
| +class Dart2JsCombinatorMirror implements CombinatorMirror {
|
| + final List<String> identifiers;
|
| + final bool isShow;
|
| +
|
| + Dart2JsCombinatorMirror(this.identifiers, {bool isShow: true})
|
| + : this.isShow = isShow;
|
| +
|
| + bool get isHide => !isShow;
|
| +}
|
| +
|
| +class Dart2JsSourceLocation implements SourceLocation {
|
| + final Script _script;
|
| + final SourceSpan _span;
|
| + int _line;
|
| + int _column;
|
| +
|
| + Dart2JsSourceLocation(this._script, this._span);
|
| +
|
| + int _computeLine() {
|
| + var sourceFile = _script.file;
|
| + if (sourceFile != null) {
|
| + return sourceFile.getLine(offset) + 1;
|
| + }
|
| + var index = 0;
|
| + var lineNumber = 0;
|
| + while (index <= offset && index < sourceText.length) {
|
| + index = sourceText.indexOf('\n', index) + 1;
|
| + if (index <= 0) break;
|
| + lineNumber++;
|
| + }
|
| + return lineNumber;
|
| + }
|
| +
|
| + int get line {
|
| + if (_line == null) {
|
| + _line = _computeLine();
|
| + }
|
| + return _line;
|
| + }
|
| +
|
| + int _computeColumn() {
|
| + if (length == 0) return 0;
|
| +
|
| + var sourceFile = _script.file;
|
| + if (sourceFile != null) {
|
| + return sourceFile.getColumn(sourceFile.getLine(offset), offset) + 1;
|
| + }
|
| + int index = offset - 1;
|
| + var columnNumber = 0;
|
| + while (0 <= index && index < sourceText.length) {
|
| + columnNumber++;
|
| + var codeUnit = sourceText.codeUnitAt(index);
|
| + if (codeUnit == $CR || codeUnit == $LF) {
|
| + break;
|
| + }
|
| + index--;
|
| + }
|
| + return columnNumber;
|
| + }
|
| +
|
| + int get column {
|
| + if (_column == null) {
|
| + _column = _computeColumn();
|
| + }
|
| + return _column;
|
| + }
|
| +
|
| + int get offset => _span.begin;
|
| +
|
| + int get length => _span.end - _span.begin;
|
| +
|
| + String get text => _script.text.substring(_span.begin, _span.end);
|
| +
|
| + Uri get sourceUri => _script.uri;
|
| +
|
| + String get sourceText => _script.text;
|
| +}
|
|
|