Skip to content

Commit 6cceb98

Browse files
fix: Fix incorrect symbols for class vars.
1 parent 0ba671e commit 6cceb98

File tree

7 files changed

+39
-59
lines changed

7 files changed

+39
-59
lines changed

scip_indexer/SCIPFieldResolve.cc

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ void FieldResolver::findUnresolvedFieldInMixinsTransitive(const core::GlobalStat
6262
}
6363
}
6464

65+
core::ClassOrModuleRef FieldResolver::normalizeParentForClassVar(const core::GlobalState &gs,
66+
core::ClassOrModuleRef klass, std::string_view name) {
67+
auto isClassVar = name.size() >= 2 && name[0] == '@' && name[1] == '@';
68+
if (isClassVar && !klass.data(gs)->isSingletonClass(gs)) {
69+
// Triggered when undeclared class variables are accessed from instance methods.
70+
return klass.data(gs)->lookupSingletonClass(gs);
71+
}
72+
return klass;
73+
}
74+
6575
FieldQueryResult::Data FieldResolver::findUnresolvedFieldInInheritanceChain(const core::GlobalState &gs, core::Loc loc,
6676
FieldQuery query) {
6777
auto start = query.start;
@@ -75,11 +85,7 @@ FieldQueryResult::Data FieldResolver::findUnresolvedFieldInInheritanceChain(cons
7585
if (isClassInstanceVar) {
7686
return FieldQueryResult::Data(start);
7787
}
78-
auto isClassVar = fieldText.size() >= 2 && fieldText[0] == '@' && fieldText[1] == '@';
79-
if (isClassVar && !start.data(gs)->isSingletonClass(gs)) {
80-
// Triggered when undeclared class variables are accessed from instance methods.
81-
start = start.data(gs)->lookupSingletonClass(gs);
82-
}
88+
start = FieldResolver::normalizeParentForClassVar(gs, start, fieldText);
8389

8490
if (gs.unresolvedFields.find(start) == gs.unresolvedFields.end() ||
8591
!gs.unresolvedFields.find(start)->second.contains(field)) {

scip_indexer/SCIPFieldResolve.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ class FieldResolver final {
107107
std::pair<FieldQueryResult, /*cacheHit*/ bool> findUnresolvedFieldTransitive(const core::GlobalState &gs,
108108
core::Loc loc, FieldQuery query);
109109

110+
static core::ClassOrModuleRef normalizeParentForClassVar(const core::GlobalState &gs, core::ClassOrModuleRef klass,
111+
std::string_view name);
112+
110113
private:
111114
void resetMixins();
112115

scip_indexer/SCIPIndexer.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,8 @@ class AliasMap final {
598598
switch (result.inherited.kind()) {
599599
case FieldQueryResult::Kind::FromUndeclared: {
600600
checkExists(result.inherited.originalClass().exists(), "class");
601+
klass = FieldResolver::normalizeParentForClassVar(gs, klass.asClassOrModuleRef(),
602+
instr->name.shortName(gs));
601603
auto namedSymRef = GenericSymbolRef::undeclaredField(klass, instr->name, bind.bind.type);
602604
if (!cacheHit) {
603605
// It may be the case that the mixin values are already stored because of the

test/scip/testdata/field_inheritance.snapshot.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ def get_inherited_ivar
2929
# ^^ reference [..] C2#`@f`.
3030
# relation definition=[..] C1#`@f`.
3131
# ^^ reference [..] C2#`@h`.
32-
# relation definition=[..] C1#`@h`.
3332
end
3433

3534
def set_inherited_ivar
@@ -65,6 +64,7 @@ def refs
6564
# ^^ reference [..] C3#`@g`.
6665
# relation definition=[..] C2#`@g`.
6766
# ^^ reference [..] C3#`@i`.
67+
# relation definition=[..] C1#`@i`.
6868
return
6969
end
7070
end

test/scip/testdata/fields_and_attrs.snapshot.rb

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,8 @@ def self.m1
7878
def m2
7979
# ^^ definition [..] N#m2().
8080
@@b = @@a
81-
# ^^^ definition [..] N#`@@b`.
82-
# relation definition=[..] `<Class:N>`#`@@b`.
83-
# ^^^ reference [..] N#`@@a`.
84-
# relation definition=[..] `<Class:N>`#`@@a`.
81+
# ^^^ definition [..] `<Class:N>`#`@@b`.
82+
# ^^^ reference [..] `<Class:N>`#`@@a`.
8583
return
8684
end
8785

test/scip/testdata/hoverdocs.snapshot.rb

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -296,22 +296,16 @@ def p1
296296
# | @x (T.untyped)
297297
# | ```
298298
@@y = 10
299-
# ^^^ definition [..] K1#`@@y`.
299+
# ^^^ definition [..] `<Class:K1>`#`@@y`.
300300
# documentation
301301
# | ```ruby
302302
# | @@y (T.untyped)
303303
# | ```
304-
# relation definition=[..] `<Class:K1>`#`@@y`.
305-
# ^^^^^^^^ reference [..] K1#`@@y`.
304+
# ^^^^^^^^ reference [..] `<Class:K1>`#`@@y`.
306305
# override_documentation
307306
# | ```ruby
308307
# | @@y (Integer(10))
309308
# | ```
310-
# documentation
311-
# | ```ruby
312-
# | @@y (T.untyped)
313-
# | ```
314-
# relation definition=[..] `<Class:K1>`#`@@y`.
315309
end
316310

317311
# lorem ipsum, you get it
@@ -382,16 +376,16 @@ def p1
382376
# | ```
383377
# relation definition=[..] K1#`@x`.
384378
@@y = 20
385-
# ^^^ definition [..] K2#`@@y`.
379+
# ^^^ definition [..] `<Class:K2>`#`@@y`.
386380
# documentation
387381
# | ```ruby
388382
# | @@y (T.untyped)
389383
# | ```
390384
# relation definition=[..] `<Class:K1>`#`@@y`.
391385
@z += @x
392-
# ^^ reference [..] K2#`@z`.
393-
# ^^ reference (write) [..] K2#`@z`.
394-
# ^^^^^^^^ reference [..] K2#`@z`.
386+
# ^^ reference [..] `<Class:K2>`#`@z`.
387+
# ^^ reference (write) [..] `<Class:K2>`#`@z`.
388+
# ^^^^^^^^ reference [..] `<Class:K2>`#`@z`.
395389
# ^^ reference [..] K2#`@x`.
396390
# override_documentation
397391
# | ```ruby

test/scip/testdata/type_change.snapshot.rb

Lines changed: 14 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,13 @@ def change_type(b)
156156
# | @f (T.untyped)
157157
# | ```
158158
@@g = nil
159-
# ^^^ definition [..] C#`@@g`.
159+
# ^^^ definition [..] `<Class:C>`#`@@g`.
160160
# documentation
161161
# | ```ruby
162162
# | @@g (T.untyped)
163163
# | ```
164-
# relation definition=[..] `<Class:C>`#`@@g`.
165164
@k = nil
166-
# ^^ definition [..] C#`@k`.
165+
# ^^ definition [..] `<Class:C>`#`@k`.
167166
# documentation
168167
# | ```ruby
169168
# | @k (T.untyped)
@@ -176,23 +175,18 @@ def change_type(b)
176175
# | @f (Integer(1))
177176
# | ```
178177
@@g = 1
179-
# ^^^ reference (write) [..] C#`@@g`.
178+
# ^^^ reference (write) [..] `<Class:C>`#`@@g`.
180179
# override_documentation
181180
# | ```ruby
182181
# | @@g (Integer(1))
183182
# | ```
184-
# documentation
185-
# | ```ruby
186-
# | @@g (T.untyped)
187-
# | ```
188-
# relation definition=[..] `<Class:C>`#`@@g`.
189183
@k = 1
190-
# ^^ reference (write) [..] C#`@k`.
184+
# ^^ reference (write) [..] `<Class:C>`#`@k`.
191185
# override_documentation
192186
# | ```ruby
193187
# | @k (Integer(1))
194188
# | ```
195-
# ^^^^^^ reference [..] C#`@k`.
189+
# ^^^^^^ reference [..] `<Class:C>`#`@k`.
196190
# override_documentation
197191
# | ```ruby
198192
# | @k (Integer(1))
@@ -205,23 +199,18 @@ def change_type(b)
205199
# | @f (String("f"))
206200
# | ```
207201
@@g = 'g'
208-
# ^^^ reference (write) [..] C#`@@g`.
202+
# ^^^ reference (write) [..] `<Class:C>`#`@@g`.
209203
# override_documentation
210204
# | ```ruby
211205
# | @@g (String("g"))
212206
# | ```
213-
# documentation
214-
# | ```ruby
215-
# | @@g (T.untyped)
216-
# | ```
217-
# relation definition=[..] `<Class:C>`#`@@g`.
218207
@k = 'k'
219-
# ^^ reference (write) [..] C#`@k`.
208+
# ^^ reference (write) [..] `<Class:C>`#`@k`.
220209
# override_documentation
221210
# | ```ruby
222211
# | @k (String("k"))
223212
# | ```
224-
# ^^^^^^^^ reference [..] C#`@k`.
213+
# ^^^^^^^^ reference [..] `<Class:C>`#`@k`.
225214
# override_documentation
226215
# | ```ruby
227216
# | @k (String("k"))
@@ -264,29 +253,23 @@ def change_type(b)
264253
# | ```
265254
# relation definition=[..] C#`@f`.
266255
@@g = 1
267-
# ^^^ definition [..] D#`@@g`.
256+
# ^^^ definition [..] `<Class:D>`#`@@g`.
268257
# documentation
269258
# | ```ruby
270259
# | @@g (T.untyped)
271260
# | ```
272261
# relation definition=[..] `<Class:C>`#`@@g`.
273262
@k = 1
274-
# ^^ definition [..] D#`@k`.
263+
# ^^ definition [..] `<Class:D>`#`@k`.
275264
# documentation
276265
# | ```ruby
277266
# | @k (T.untyped)
278267
# | ```
279-
# relation definition=[..] C#`@k`.
280-
# ^^^^^^ reference [..] D#`@k`.
268+
# ^^^^^^ reference [..] `<Class:D>`#`@k`.
281269
# override_documentation
282270
# | ```ruby
283271
# | @k (Integer(1))
284272
# | ```
285-
# documentation
286-
# | ```ruby
287-
# | @k (T.untyped)
288-
# | ```
289-
# relation definition=[..] C#`@k`.
290273
else
291274
@f = 'f'
292275
# ^^ definition [..] D#`@f`.
@@ -296,29 +279,23 @@ def change_type(b)
296279
# | ```
297280
# relation definition=[..] C#`@f`.
298281
@@g = 'g'
299-
# ^^^ definition [..] D#`@@g`.
282+
# ^^^ definition [..] `<Class:D>`#`@@g`.
300283
# documentation
301284
# | ```ruby
302285
# | @@g (T.untyped)
303286
# | ```
304287
# relation definition=[..] `<Class:C>`#`@@g`.
305288
@k = 'k'
306-
# ^^ definition [..] D#`@k`.
289+
# ^^ definition [..] `<Class:D>`#`@k`.
307290
# documentation
308291
# | ```ruby
309292
# | @k (T.untyped)
310293
# | ```
311-
# relation definition=[..] C#`@k`.
312-
# ^^^^^^^^ reference [..] D#`@k`.
294+
# ^^^^^^^^ reference [..] `<Class:D>`#`@k`.
313295
# override_documentation
314296
# | ```ruby
315297
# | @k (String("k"))
316298
# | ```
317-
# documentation
318-
# | ```ruby
319-
# | @k (T.untyped)
320-
# | ```
321-
# relation definition=[..] C#`@k`.
322299
end
323300
end
324301
end

0 commit comments

Comments
 (0)