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..dcff93a538cdddccb751f41d3560ec3f1039ba98 100644 |
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart |
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart |
@@ -125,6 +125,46 @@ abstract class KernelToElementMapBase extends KernelToElementMapBaseMixin { |
Iterable<LibraryEntity> get _libraries; |
+ SourceSpan _getSourceSpanFromTreeNode(ir.TreeNode node) { |
+ ir.Location location; |
Siggi Cherem (dart-lang)
2017/07/07 19:25:02
Let's store here just the Uri, and only use locati
Johnni Winther
2017/07/11 08:06:59
Done.
Siggi Cherem (dart-lang)
2017/07/11 19:04:55
I'd like to use package:source_span for this (mayb
|
+ int offset; |
+ while (node != null) { |
+ if (node.fileOffset != ir.TreeNode.noOffset) { |
+ offset = node.fileOffset; |
+ location = node.location; |
+ break; |
+ } |
+ node = node.parent; |
+ } |
+ if (location != null) { |
+ return new SourceSpan(Uri.parse(location.file), 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); |
Siggi Cherem (dart-lang)
2017/07/07 19:25:02
there is not a common interface for these in kerne
Johnni Winther
2017/07/11 08:06:59
They might, but MemberData.node might be a functio
|
+ } |
+ 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 +576,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) { |