Skip to content

Commit cda099f

Browse files
Reference the class when its name stands for the companion
Port #973's resolved-qualifier references: a class name used as its companion object's receiver (`Bar.instance()`, `CompanionOwner.create()`) now references the class (`Bar#`) instead of the companion (`Bar#Companion#`). Naming the companion explicitly (`Bar.Companion`, `Foo.Factory`) still references it. Amp-Thread-ID: https://ampcode.com/threads/T-01a153c0-ec1f-774a-993c-bca3256017ce Co-authored-by: Amp <amp@ampcode.com>
1 parent ba94b26 commit cda099f

3 files changed

Lines changed: 17 additions & 2 deletions

File tree

‎scip-kotlin-analysis/src/main/kotlin/org/scip_code/scip_java/kotlin_analysis/KotlinAnalysisIndexer.kt‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.analyze
1212
import org.jetbrains.kotlin.analysis.api.renderer.types.impl.KaTypeRendererForSource
1313
import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession
1414
import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol
15+
import org.jetbrains.kotlin.analysis.api.symbols.KaClassKind
1516
import org.jetbrains.kotlin.analysis.api.symbols.KaClassSymbol
1617
import org.jetbrains.kotlin.analysis.api.symbols.KaConstructorSymbol
1718
import org.jetbrains.kotlin.analysis.api.symbols.KaFunctionSymbol
@@ -230,6 +231,20 @@ class KotlinAnalysisIndexer(
230231
return
231232
}
232233

234+
// A class name standing for its companion object (`Bar.instance()`) references the
235+
// class, like scip-kotlinc; `Bar.Companion` still references the companion.
236+
if (
237+
target is KaClassSymbol &&
238+
target.classKind == KaClassKind.COMPANION_OBJECT &&
239+
target.name?.asString() != referencedName
240+
) {
241+
val containingClass = with(session) { target.containingSymbol }
242+
if (containingClass != null) {
243+
addReference(cache.symbolForReference(session, containingClass), range)
244+
return
245+
}
246+
}
247+
233248
addReference(cache.symbolForReference(session, target), range)
234249
}
235250

‎scip-kotlin-analysis/src/test/kotlin/org/scip_code/scip_java/kotlin_analysis/KotlinAnalysisIndexerTest.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1652,7 +1652,7 @@ class KotlinAnalysisIndexerTest {
16521652
},
16531653
scipOccurrence {
16541654
role = REFERENCE
1655-
symbol = "sample/Bar#Companion#"
1655+
symbol = "sample/Bar#"
16561656
range {
16571657
startLine = 7
16581658
startCharacter = 12

‎scip-snapshots/expected/kotlin/common/scip-snapshots/cases/kotlin/common/src/main/kotlin/snapshots/CompanionOwner.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
// signature_documentation
4949
// > public final fun create(): Int
5050
// ^^^ reference scip-java maven . . kotlin/Int#
51-
// ^^^^^^^^^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#Companion#
51+
// ^^^^^^^^^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#
5252
// ^^^^^^ reference scip-java maven . . snapshots/CompanionOwner#Companion#create().
5353
// ^^^^^^^^ reference scip-java maven . . kotlin/Any#hashCode().
5454
// ⌃ enclosing_range_end scip-java maven . . snapshots/CompanionOwner#create().

0 commit comments

Comments
 (0)