Skip to content

Commit 96e4b96

Browse files
fix: Fix incorrect symbols for class vars.
1 parent 50cf55d commit 96e4b96

File tree

7 files changed

+39
-105
lines changed

7 files changed

+39
-105
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
@@ -604,6 +604,8 @@ class AliasMap final {
604604
switch (result.inherited.kind()) {
605605
case FieldQueryResult::Kind::FromUndeclared: {
606606
checkExists(result.inherited.originalClass().exists(), "class");
607+
klass = FieldResolver::normalizeParentForClassVar(gs, klass.asClassOrModuleRef(),
608+
instr->name.shortName(gs));
607609
auto namedSymRef = GenericSymbolRef::undeclaredField(klass, instr->name, bind.bind.type);
608610
if (!cacheHit) {
609611
// 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 & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -296,22 +296,12 @@ def p1
296296
# | @x (T.untyped)
297297
# | ```
298298
@@y = 10
299-
# ^^^ definition [..] K1#`@@y`.
300-
# documentation
301-
# | ```ruby
302-
# | @@y (T.untyped)
303-
# | ```
304-
# relation definition=[..] `<Class:K1>`#`@@y`.
305-
# ^^^^^^^^ reference [..] K1#`@@y`.
299+
# ^^^ definition [..] `<Class:K1>`#`@@y`.
300+
# ^^^^^^^^ reference [..] `<Class:K1>`#`@@y`.
306301
# override_documentation
307302
# | ```ruby
308303
# | @@y (Integer(10))
309304
# | ```
310-
# documentation
311-
# | ```ruby
312-
# | @@y (T.untyped)
313-
# | ```
314-
# relation definition=[..] `<Class:K1>`#`@@y`.
315305
end
316306

317307
# lorem ipsum, you get it
@@ -326,10 +316,6 @@ def self.p2
326316
# | lorem ipsum, you get it
327317
@z = 10
328318
# ^^ definition [..] `<Class:K1>`#`@z`.
329-
# documentation
330-
# | ```ruby
331-
# | @z (T.untyped)
332-
# | ```
333319
# ^^^^^^^ reference [..] `<Class:K1>`#`@z`.
334320
# override_documentation
335321
# | ```ruby
@@ -357,12 +343,6 @@ class K2 < K1
357343
# doc comment on class var ooh
358344
@z = 9
359345
# ^^ definition [..] `<Class:K2>`#`@z`.
360-
# documentation
361-
# | ```ruby
362-
# | @z (T.untyped)
363-
# | ```
364-
# documentation
365-
# | doc comment on class var ooh
366346

367347
# overrides K1's p1
368348
def p1
@@ -376,31 +356,23 @@ def p1
376356
# | overrides K1's p1
377357
@x = 20
378358
# ^^ definition [..] K2#`@x`.
379-
# documentation
380-
# | ```ruby
381-
# | @x (T.untyped)
382-
# | ```
383359
# relation definition=[..] K1#`@x`.
384360
@@y = 20
385-
# ^^^ definition [..] K2#`@@y`.
361+
# ^^^ definition [..] `<Class:K2>`#`@@y`.
386362
# documentation
387363
# | ```ruby
388364
# | @@y (T.untyped)
389365
# | ```
390366
# relation definition=[..] `<Class:K1>`#`@@y`.
391367
@z += @x
392-
# ^^ reference (write) [..] K2#`@z`.
393-
# ^^ reference [..] K2#`@z`.
394-
# ^^^^^^^^ reference [..] K2#`@z`.
368+
# ^^ reference (write) [..] `<Class:K2>`#`@z`.
369+
# ^^ reference [..] `<Class:K2>`#`@z`.
370+
# ^^^^^^^^ reference [..] `<Class:K2>`#`@z`.
395371
# ^^ reference [..] K2#`@x`.
396372
# override_documentation
397373
# | ```ruby
398374
# | @x (Integer(20))
399375
# | ```
400-
# documentation
401-
# | ```ruby
402-
# | @x (T.untyped)
403-
# | ```
404376
# relation definition=[..] K1#`@x`.
405377
end
406378
end

test/scip/testdata/type_change.snapshot.rb

Lines changed: 14 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,6 @@ class C
132132
# | ```
133133
@k = nil
134134
# ^^ definition [..] `<Class:C>`#`@k`.
135-
# documentation
136-
# | ```ruby
137-
# | @k (T.untyped)
138-
# | ```
139135

140136
def change_type(b)
141137
# ^^^^^^^^^^^ definition [..] C#change_type().
@@ -151,23 +147,10 @@ def change_type(b)
151147
# | ```
152148
@f = nil
153149
# ^^ definition [..] C#`@f`.
154-
# documentation
155-
# | ```ruby
156-
# | @f (T.untyped)
157-
# | ```
158150
@@g = nil
159-
# ^^^ definition [..] C#`@@g`.
160-
# documentation
161-
# | ```ruby
162-
# | @@g (T.untyped)
163-
# | ```
164-
# relation definition=[..] `<Class:C>`#`@@g`.
151+
# ^^^ definition [..] `<Class:C>`#`@@g`.
165152
@k = nil
166-
# ^^ definition [..] C#`@k`.
167-
# documentation
168-
# | ```ruby
169-
# | @k (T.untyped)
170-
# | ```
153+
# ^^ definition [..] `<Class:C>`#`@k`.
171154
if b
172155
@f = 1
173156
# ^^ reference (write) [..] C#`@f`.
@@ -176,23 +159,18 @@ def change_type(b)
176159
# | @f (Integer(1))
177160
# | ```
178161
@@g = 1
179-
# ^^^ reference (write) [..] C#`@@g`.
162+
# ^^^ reference (write) [..] `<Class:C>`#`@@g`.
180163
# override_documentation
181164
# | ```ruby
182165
# | @@g (Integer(1))
183166
# | ```
184-
# documentation
185-
# | ```ruby
186-
# | @@g (T.untyped)
187-
# | ```
188-
# relation definition=[..] `<Class:C>`#`@@g`.
189167
@k = 1
190-
# ^^ reference (write) [..] C#`@k`.
168+
# ^^ reference (write) [..] `<Class:C>`#`@k`.
191169
# override_documentation
192170
# | ```ruby
193171
# | @k (Integer(1))
194172
# | ```
195-
# ^^^^^^ reference [..] C#`@k`.
173+
# ^^^^^^ reference [..] `<Class:C>`#`@k`.
196174
# override_documentation
197175
# | ```ruby
198176
# | @k (Integer(1))
@@ -205,23 +183,18 @@ def change_type(b)
205183
# | @f (String("f"))
206184
# | ```
207185
@@g = 'g'
208-
# ^^^ reference (write) [..] C#`@@g`.
186+
# ^^^ reference (write) [..] `<Class:C>`#`@@g`.
209187
# override_documentation
210188
# | ```ruby
211189
# | @@g (String("g"))
212190
# | ```
213-
# documentation
214-
# | ```ruby
215-
# | @@g (T.untyped)
216-
# | ```
217-
# relation definition=[..] `<Class:C>`#`@@g`.
218191
@k = 'k'
219-
# ^^ reference (write) [..] C#`@k`.
192+
# ^^ reference (write) [..] `<Class:C>`#`@k`.
220193
# override_documentation
221194
# | ```ruby
222195
# | @k (String("k"))
223196
# | ```
224-
# ^^^^^^^^ reference [..] C#`@k`.
197+
# ^^^^^^^^ reference [..] `<Class:C>`#`@k`.
225198
# override_documentation
226199
# | ```ruby
227200
# | @k (String("k"))
@@ -264,29 +237,19 @@ def change_type(b)
264237
# | ```
265238
# relation definition=[..] C#`@f`.
266239
@@g = 1
267-
# ^^^ definition [..] D#`@@g`.
240+
# ^^^ definition [..] `<Class:D>`#`@@g`.
268241
# documentation
269242
# | ```ruby
270243
# | @@g (T.untyped)
271244
# | ```
272245
# relation definition=[..] `<Class:C>`#`@@g`.
273246
@k = 1
274-
# ^^ definition [..] D#`@k`.
275-
# documentation
276-
# | ```ruby
277-
# | @k (T.untyped)
278-
# | ```
279-
# relation definition=[..] C#`@k`.
280-
# ^^^^^^ reference [..] D#`@k`.
247+
# ^^ definition [..] `<Class:D>`#`@k`.
248+
# ^^^^^^ reference [..] `<Class:D>`#`@k`.
281249
# override_documentation
282250
# | ```ruby
283251
# | @k (Integer(1))
284252
# | ```
285-
# documentation
286-
# | ```ruby
287-
# | @k (T.untyped)
288-
# | ```
289-
# relation definition=[..] C#`@k`.
290253
else
291254
@f = 'f'
292255
# ^^ definition [..] D#`@f`.
@@ -296,29 +259,19 @@ def change_type(b)
296259
# | ```
297260
# relation definition=[..] C#`@f`.
298261
@@g = 'g'
299-
# ^^^ definition [..] D#`@@g`.
262+
# ^^^ definition [..] `<Class:D>`#`@@g`.
300263
# documentation
301264
# | ```ruby
302265
# | @@g (T.untyped)
303266
# | ```
304267
# relation definition=[..] `<Class:C>`#`@@g`.
305268
@k = 'k'
306-
# ^^ definition [..] D#`@k`.
307-
# documentation
308-
# | ```ruby
309-
# | @k (T.untyped)
310-
# | ```
311-
# relation definition=[..] C#`@k`.
312-
# ^^^^^^^^ reference [..] D#`@k`.
269+
# ^^ definition [..] `<Class:D>`#`@k`.
270+
# ^^^^^^^^ reference [..] `<Class:D>`#`@k`.
313271
# override_documentation
314272
# | ```ruby
315273
# | @k (String("k"))
316274
# | ```
317-
# documentation
318-
# | ```ruby
319-
# | @k (T.untyped)
320-
# | ```
321-
# relation definition=[..] C#`@k`.
322275
end
323276
end
324277
end

0 commit comments

Comments
 (0)