Skip to content
This repository was archived by the owner on Nov 4, 2024. It is now read-only.

Commit 4281c6a

Browse files
author
Mikhail Arkhipov
authored
Merge pull request microsoft#323 from MikhailArkhipov/302
Fix navigation/references in module names
2 parents cd18568 + ff5a2bf commit 4281c6a

File tree

1 file changed

+43
-26
lines changed

1 file changed

+43
-26
lines changed

src/LanguageServer/Impl/Implementation/Server.FindReferences.cs

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -42,31 +42,7 @@ public override async Task<Reference[]> FindReferences(ReferencesParams @params,
4242
}
4343

4444
tree = GetParseTree(entry, uri, cancellationToken, out var version);
45-
var extras = new List<Reference>();
46-
47-
if (@params.context?.includeDeclaration ?? false) {
48-
var index = tree.LocationToIndex(@params.position);
49-
var w = new ImportedModuleNameWalker(entry, index, tree);
50-
tree.Walk(w);
51-
52-
if (w.ImportedType != null) {
53-
@params._expr = w.ImportedType.Name;
54-
} else {
55-
foreach (var n in w.ImportedModules) {
56-
if (Analyzer.Modules.TryGetImportedModule(n.Name, out var modRef) && modRef.AnalysisModule != null) {
57-
// Return a module reference
58-
extras.AddRange(modRef.AnalysisModule.Locations
59-
.Select(l => new Reference {
60-
uri = l.DocumentUri,
61-
range = l.Span,
62-
_version = version?.Version,
63-
_kind = ReferenceKind.Definition
64-
})
65-
.ToArray());
66-
}
67-
}
68-
}
69-
}
45+
var modRefs = GetModuleReferences(entry, tree, version, @params);
7046

7147
IEnumerable<IAnalysisVariable> result;
7248
if (!string.IsNullOrEmpty(@params._expr)) {
@@ -97,14 +73,55 @@ public override async Task<Reference[]> FindReferences(ReferencesParams @params,
9773
_kind = ToReferenceKind(v.Type),
9874
_version = version?.Version
9975
})
100-
.Concat(extras)
76+
.Concat(modRefs)
10177
.GroupBy(r => r, ReferenceComparer.Instance)
10278
.Select(g => g.OrderByDescending(r => (SourceLocation)r.range.end).ThenBy(r => (int?)r._kind ?? int.MaxValue).First())
10379
.ToArray();
10480

10581
return res;
10682
}
10783

84+
private IEnumerable<Reference> GetModuleReferences(IPythonProjectEntry entry, PythonAst tree, BufferVersion version, ReferencesParams @params) {
85+
if (!@params.context?.includeDeclaration == true) {
86+
return Enumerable.Empty<Reference>();
87+
}
88+
89+
var index = tree.LocationToIndex(@params.position);
90+
var w = new ImportedModuleNameWalker(entry, index, tree);
91+
tree.Walk(w);
92+
93+
if (w.ImportedType != null) {
94+
@params._expr = w.ImportedType.Name;
95+
return Enumerable.Empty<Reference>();
96+
}
97+
98+
var modulesNamesInRange = w.ImportedModules.Where(m => {
99+
var start = tree.LocationToIndex(m.SourceSpan.Start);
100+
var end = tree.LocationToIndex(m.SourceSpan.End);
101+
return start <= index && index < end;
102+
}).ToArray();
103+
104+
if (modulesNamesInRange.Length == 0) {
105+
return Enumerable.Empty<Reference>();
106+
}
107+
108+
var refs = new List<Reference>();
109+
foreach (var n in modulesNamesInRange) {
110+
if (Analyzer.Modules.TryGetImportedModule(n.Name, out var modRef) && modRef.AnalysisModule != null) {
111+
// Return a module reference
112+
refs.AddRange(modRef.AnalysisModule.Locations
113+
.Select(l => new Reference {
114+
uri = l.DocumentUri,
115+
range = l.Span,
116+
_version = version?.Version,
117+
_kind = ReferenceKind.Definition
118+
})
119+
.ToArray());
120+
}
121+
}
122+
return refs;
123+
}
124+
108125
private static ReferenceKind ToReferenceKind(VariableType type) {
109126
switch (type) {
110127
case VariableType.None: return ReferenceKind.Value;

0 commit comments

Comments
 (0)