Index: sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart |
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart |
index c48fc9249317734dd963dfa0d62956db0beb7e22..acff12a5627e9bea6e2d0ac657889110cf0ffad7 100644 |
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart |
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirror.dart |
@@ -433,12 +433,40 @@ abstract class Dart2JsMirror implements Mirror { |
Dart2JsMirrorSystem get mirrors; |
} |
-abstract class Dart2JsDeclarationMirror |
- implements Dart2JsMirror, DeclarationMirror { |
+abstract class Dart2JsDeclarationMirror extends Dart2JsMirror |
+ implements DeclarationMirror { |
bool get isTopLevel => owner != null && owner is LibraryMirror; |
bool get isPrivate => _isPrivate(simpleName); |
+ |
+ /** |
+ * Returns the first token for the source of this declaration. |
+ */ |
+ Token getBeginToken(); |
+ |
+ /** |
+ * Returns the last token for the source of this declaration. |
+ */ |
+ Token getEndToken(); |
+ |
+ /** |
+ * Returns the script for the source of this declaration. |
+ */ |
+ Script getScript(); |
+ |
+ SourceLocation get location { |
+ Token beginToken = getBeginToken(); |
+ Script script = getScript(); |
+ SourceSpan span; |
+ if (beginToken == null) { |
+ span = new SourceSpan(script.uri, 0, 0); |
+ } else { |
+ Token endToken = getEndToken(); |
+ span = mirrors.compiler.spanFromTokens(beginToken, endToken, script.uri); |
+ } |
+ return new Dart2JsSourceLocation(script, span); |
+ } |
} |
abstract class Dart2JsMemberMirror extends Dart2JsElementMirror |
@@ -477,9 +505,41 @@ abstract class Dart2JsElementMirror extends Dart2JsDeclarationMirror { |
String get displayName => simpleName; |
- SourceLocation get location => new Dart2JsSourceLocation( |
- _element.getCompilationUnit().script, |
- mirrors.compiler.spanFromElement(_element)); |
+ /** |
+ * Computes the first token for this declaration using the first metadata |
+ * annotation, the begin token of the element node or element position as |
+ * indicator. |
+ */ |
+ Token getBeginToken() { |
+ if (!_element.metadata.isEmpty) { |
+ for (MetadataAnnotation metadata in _element.metadata) { |
+ if (metadata.beginToken != null) { |
+ return metadata.beginToken; |
+ } |
+ } |
+ } |
+ // TODO(johnniwinther): Avoid calling [parseNode]. |
+ Node node = _element.parseNode(mirrors.compiler); |
+ if (node == null) { |
+ return _element.position(); |
+ } |
+ return node.getBeginToken(); |
+ } |
+ |
+ /** |
+ * Computes the last token for this declaration using the end token of the |
+ * element node or element position as indicator. |
+ */ |
+ Token getEndToken() { |
+ // TODO(johnniwinther): Avoid calling [parseNode]. |
+ Node node = _element.parseNode(mirrors.compiler); |
+ if (node == null) { |
+ return _element.position(); |
+ } |
+ return node.getEndToken(); |
+ } |
+ |
+ Script getScript() => _element.getCompilationUnit().script; |
String toString() => _element.toString(); |
@@ -499,21 +559,11 @@ abstract class Dart2JsElementMirror extends Dart2JsDeclarationMirror { |
} |
} |
-abstract class Dart2JsProxyMirror extends Dart2JsDeclarationMirror { |
- final Dart2JsMirrorSystem mirrors; |
- |
- Dart2JsProxyMirror(this.mirrors); |
- |
- String get displayName => simpleName; |
- |
- int get hashCode => qualifiedName.hashCode; |
-} |
- |
//------------------------------------------------------------------------------ |
// Mirror system implementation. |
//------------------------------------------------------------------------------ |
-class Dart2JsMirrorSystem implements MirrorSystem, Dart2JsMirror { |
+class Dart2JsMirrorSystem implements MirrorSystem { |
final api.Compiler compiler; |
Map<String, Dart2JsLibraryMirror> _libraries; |
Map<LibraryElement, Dart2JsLibraryMirror> _libraryMap; |
@@ -679,15 +729,35 @@ class Dart2JsLibraryMirror extends Dart2JsContainerMirror |
return new ImmutableMapWrapper<String, ClassMirror>(_classes); |
} |
- SourceLocation get location { |
- var script = _library.getCompilationUnit().script; |
- SourceSpan span; |
+ /** |
+ * Computes the first token of this library using the first metadata |
+ * annotation or the first library tag as indicator. |
+ */ |
+ Token getBeginToken() { |
+ if (!_element.metadata.isEmpty) { |
+ for (MetadataAnnotation metadata in _element.metadata) { |
+ if (metadata.beginToken != null) { |
+ return metadata.beginToken; |
+ } |
+ } |
+ } |
if (_library.libraryTag != null) { |
- span = mirrors.compiler.spanFromNode(_library.libraryTag, script.uri); |
- } else { |
- span = new SourceSpan(script.uri, 0, 0); |
+ return _library.libraryTag.getBeginToken(); |
+ } else if (!_library.tags.isEmpty) { |
+ return _library.tags.reverse().head.getBeginToken(); |
} |
- return new Dart2JsSourceLocation(script, span); |
+ return null; |
+ } |
+ |
+ /** |
+ * Computes the first token of this library using the last library tag as |
+ * indicator. |
+ */ |
+ Token getEndToken() { |
+ if (!_library.tags.isEmpty) { |
+ return _library.tags.head.getEndToken(); |
+ } |
+ return null; |
} |
} |
@@ -869,18 +939,6 @@ class Dart2JsClassMirror extends Dart2JsContainerMirror |
String get qualifiedName => '${library.qualifiedName}.${simpleName}'; |
- SourceLocation get location { |
- if (_class is PartialClassElement) { |
- var node = _class.parseNode(mirrors.compiler); |
- if (node != null) { |
- var script = _class.getCompilationUnit().script; |
- var span = mirrors.compiler.spanFromNode(node, script.uri); |
- return new Dart2JsSourceLocation(script, span); |
- } |
- } |
- return super.location; |
- } |
- |
void _ensureMembers() { |
if (_members == null) { |
_members = <String, Dart2JsMemberMirror>{}; |
@@ -1005,16 +1063,6 @@ class Dart2JsTypedefMirror extends Dart2JsTypeElementMirror |
String get qualifiedName => '${library.qualifiedName}.${simpleName}'; |
- SourceLocation get location { |
- var node = _typedef.element.parseNode(_diagnosticListener); |
- if (node != null) { |
- var script = _typedef.element.getCompilationUnit().script; |
- var span = mirrors.compiler.spanFromNode(node, script.uri); |
- return new Dart2JsSourceLocation(script, span); |
- } |
- return super.location; |
- } |
- |
LibraryMirror get library => _library; |
bool get isTypedef => true; |
@@ -1123,22 +1171,16 @@ class Dart2JsTypeVariableMirror extends Dart2JsTypeElementMirror |
// Types |
//------------------------------------------------------------------------------ |
-abstract class Dart2JsTypeElementMirror extends Dart2JsProxyMirror |
+abstract class Dart2JsTypeElementMirror extends Dart2JsElementMirror |
implements Dart2JsTypeMirror { |
final DartType _type; |
- List<InstanceMirror> _metadata; |
- Dart2JsTypeElementMirror(Dart2JsMirrorSystem system, this._type) |
- : super(system); |
+ Dart2JsTypeElementMirror(Dart2JsMirrorSystem system, DartType type) |
+ : super(system, type.element), |
+ this._type = type; |
String get simpleName => _type.name.slowToString(); |
- SourceLocation get location { |
- var script = _type.element.getCompilationUnit().script; |
- return new Dart2JsSourceLocation(script, |
- mirrors.compiler.spanFromElement(_type.element)); |
- } |
- |
DeclarationMirror get owner => library; |
LibraryMirror get library { |
@@ -1157,7 +1199,7 @@ abstract class Dart2JsTypeElementMirror extends Dart2JsProxyMirror |
bool get isFunction => false; |
- String toString() => _type.element.toString(); |
+ String toString() => _type.toString(); |
Map<String, MemberMirror> get members => const <String, MemberMirror>{}; |
@@ -1172,20 +1214,6 @@ abstract class Dart2JsTypeElementMirror extends Dart2JsProxyMirror |
Map<String, VariableMirror> get variables => const <String, VariableMirror>{}; |
ClassMirror get defaultFactory => null; |
- |
- // TODO(johnniwinther): Should a type show the metadata of its declaration? |
- List<InstanceMirror> get metadata { |
- if (_metadata == null) { |
- var _metadata = <InstanceMirror>[]; |
- for (MetadataAnnotation metadata in _type.element.metadata) { |
- metadata.ensureResolved(mirrors.compiler); |
- _metadata.add( |
- _convertConstantToInstanceMirror(mirrors, metadata.value)); |
- } |
- } |
- // TODO(johnniwinther): Return an unmodifiable list instead. |
- return new List<InstanceMirror>.from(_metadata); |
- } |
} |
class Dart2JsInterfaceTypeMirror extends Dart2JsTypeElementMirror |
@@ -1566,17 +1594,6 @@ class Dart2JsMethodMirror extends Dart2JsMemberMirror |
bool get isSetter => _kind == Dart2JsMethodKind.SETTER; |
bool get isOperator => _kind == Dart2JsMethodKind.OPERATOR; |
- |
- SourceLocation get location { |
- var node = _function.parseNode(_diagnosticListener); |
- if (node != null) { |
- var script = _function.getCompilationUnit().script; |
- var span = mirrors.compiler.spanFromNode(node, script.uri); |
- return new Dart2JsSourceLocation(script, span); |
- } |
- return super.location; |
- } |
- |
} |
class Dart2JsFieldMirror extends Dart2JsMemberMirror implements VariableMirror { |
@@ -1607,18 +1624,6 @@ class Dart2JsFieldMirror extends Dart2JsMemberMirror implements VariableMirror { |
TypeMirror get type => _convertTypeToTypeMirror(mirrors, |
_variable.computeType(mirrors.compiler), |
mirrors.compiler.types.dynamicType); |
- |
- SourceLocation get location { |
- var script = _variable.getCompilationUnit().script; |
- var node = _variable.variables.parseNode(_diagnosticListener); |
- if (node != null) { |
- var span = mirrors.compiler.spanFromNode(node, script.uri); |
- return new Dart2JsSourceLocation(script, span); |
- } else { |
- var span = mirrors.compiler.spanFromElement(_variable); |
- return new Dart2JsSourceLocation(script, span); |
- } |
- } |
} |
//////////////////////////////////////////////////////////////////////////////// |