Chromium Code Reviews| 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) { |