@@ -42,31 +42,7 @@ public override async Task<Reference[]> FindReferences(ReferencesParams @params,
42
42
}
43
43
44
44
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 ) ;
70
46
71
47
IEnumerable < IAnalysisVariable > result ;
72
48
if ( ! string . IsNullOrEmpty ( @params . _expr ) ) {
@@ -97,14 +73,55 @@ public override async Task<Reference[]> FindReferences(ReferencesParams @params,
97
73
_kind = ToReferenceKind ( v . Type ) ,
98
74
_version = version ? . Version
99
75
} )
100
- . Concat ( extras )
76
+ . Concat ( modRefs )
101
77
. GroupBy ( r => r , ReferenceComparer . Instance )
102
78
. Select ( g => g . OrderByDescending ( r => ( SourceLocation ) r . range . end ) . ThenBy ( r => ( int ? ) r . _kind ?? int . MaxValue ) . First ( ) )
103
79
. ToArray ( ) ;
104
80
105
81
return res ;
106
82
}
107
83
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
+
108
125
private static ReferenceKind ToReferenceKind ( VariableType type ) {
109
126
switch ( type ) {
110
127
case VariableType . None : return ReferenceKind . Value ;
0 commit comments