Index: pkg/compiler/lib/src/kernel/element_map_impl.dart |
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
index f938dc25a9ce1740899388bb0dbfe183498ddbc6..59193efafeaa2e7e15cbef101523bc472905f7c8 100644 |
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart |
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
@@ -125,6 +125,47 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
Iterable<LibraryEntity> get _libraries; |
+ SourceSpan _getSourceSpanFromTreeNode(ir.TreeNode node) { |
+ // TODO(johnniwinther): Use [ir.Location] directly as a [SourceSpan]. |
+ Uri uri; |
+ int offset; |
+ while (node != null) { |
+ if (node.fileOffset != ir.TreeNode.noOffset) { |
+ offset = node.fileOffset; |
+ uri = Uri.parse(node.location.file); |
+ break; |
+ } |
+ node = node.parent; |
+ } |
+ if (uri != null) { |
+ return new SourceSpan(uri, offset, offset + 1); |
+ } |
+ return null; |
+ } |
+ |
+ SourceSpan getSourceSpan(Spannable spannable, Entity currentElement) { |
+ SourceSpan fromSpannable(Spannable spannable) { |
+ if (spannable is IndexedLibrary && |
+ spannable.libraryIndex < _libraryEnvs.length) { |
+ LibraryEnv env = _libraryEnvs[spannable.libraryIndex]; |
+ return _getSourceSpanFromTreeNode(env.library); |
+ } else if (spannable is IndexedClass && |
+ spannable.classIndex < _classEnvs.length) { |
+ ClassEnv env = _classEnvs[spannable.classIndex]; |
+ return _getSourceSpanFromTreeNode(env.cls); |
+ } else if (spannable is IndexedMember && |
+ spannable.memberIndex < _memberData.length) { |
+ MemberData data = _memberData[spannable.memberIndex]; |
+ return _getSourceSpanFromTreeNode(data.node); |
+ } |
+ return null; |
+ } |
+ |
+ SourceSpan sourceSpan = fromSpannable(spannable); |
+ sourceSpan ??= fromSpannable(currentElement); |
+ return sourceSpan; |
+ } |
+ |
LibraryEntity lookupLibrary(Uri uri) { |
LibraryEnv libraryEnv = _env.lookupLibrary(uri); |
if (libraryEnv == null) return null; |
@@ -536,7 +577,12 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
} |
Spannable _getSpannable(MemberEntity member, ir.Node node) { |
- return member; |
+ SourceSpan sourceSpan; |
+ if (node is ir.TreeNode) { |
+ sourceSpan = _getSourceSpanFromTreeNode(node); |
+ } |
+ sourceSpan ??= getSourceSpan(member, null); |
+ return sourceSpan; |
} |
ir.Member _getMemberNode(covariant IndexedMember member) { |