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

Unified Diff: sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart

Issue 119913002: Align source mirrors with runtime mirrors. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Updated cf. comments + small fix. Created 6 years, 11 months 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 side-by-side diff with in-line comments
Download patch
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;
+}

Powered by Google App Engine
This is Rietveld 408576698