Skip to content

Commit 683fc96

Browse files
Populate SymbolInformation kind and enclosing_symbol
Port the remaining SymbolInformation fields #973 added to scip-kotlinc. - kind follows the declaration: Class (including objects, enums and annotation classes), Interface, TypeAlias, Constructor, Method (including accessors and local functions), Property (including local variables, loop and catch variables, and destructuring entries), Parameter, TypeParameter and EnumMember. - enclosing_symbol is the nearest containing declaration, or the package for top-level declarations. Synthetic accessors are enclosed by their property, and `val`/`var` constructor parameter properties by the class. Declarations inside lambdas have no enclosing symbol. On the Kotlin snapshot corpus, every global symbol and every local emitted by both indexers has the same kind and enclosing_symbol as scip-kotlinc on main. The ported AnalyzerTest cases get back their kind and enclosing_symbol expectations, and the snapshot goldens gain `kind` lines. Co-authored-by: Amp <amp@ampcode.com> Amp-Thread-ID: https://ampcode.com/threads/T-01a153c0-ec1f-774a-993c-bca3256017ce
1 parent 97821ff commit 683fc96

14 files changed

Lines changed: 288 additions & 7 deletions

File tree

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

Lines changed: 98 additions & 7 deletions
Large diffs are not rendered by default.

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import kotlin.test.assertEquals
99
import kotlin.test.assertTrue
1010
import org.junit.jupiter.api.io.TempDir
1111
import org.scip_code.scip.Document
12+
import org.scip_code.scip.SymbolInformation.Kind
1213
import org.scip_code.scip.SymbolRole
1314

1415
class KotlinAnalysisIndexerTest {
@@ -73,6 +74,15 @@ class KotlinAnalysisIndexerTest {
7374
assertContains(references(greeter), "snapshots/Greeter#greet().")
7475
// The stdlib type reference resolves to a classpath symbol.
7576
assertContains(references(greeter), "kotlin/String#")
77+
// A `val` constructor parameter's property belongs to the class, and its
78+
// synthetic getter to the property.
79+
val enclosingSymbols = greeter.symbolsList.associate { it.symbol to it.enclosingSymbol }
80+
assertEquals(
81+
"snapshots/Greeter#`<init>`().",
82+
enclosingSymbols["snapshots/Greeter#`<init>`().(name)"],
83+
)
84+
assertEquals("snapshots/Greeter#", enclosingSymbols["snapshots/Greeter#name."])
85+
assertEquals("snapshots/Greeter#name.", enclosingSymbols["snapshots/Greeter#getName()."])
7686

7787
val mainDefinitions = definitions(main)
7888
assertContains(mainDefinitions, "snapshots/useGreeter().")
@@ -169,16 +179,21 @@ class KotlinAnalysisIndexerTest {
169179
arrayOf(
170180
scipSymbol {
171181
symbol = "sample/use()."
182+
kind = Kind.Method
183+
enclosingSymbol = "sample/"
172184
displayName = "use"
173185
signatureText = "public final fun use(): Unit"
174186
},
175187
scipSymbol {
176188
symbol = "local 0"
189+
kind = Kind.Property
190+
enclosingSymbol = "sample/use()."
177191
displayName = "f"
178192
signatureText = "local val f: (Int) -> Int"
179193
},
180194
scipSymbol {
181195
symbol = "local 1"
196+
kind = Kind.Parameter
182197
displayName = "n"
183198
signatureText = "n: Int"
184199
},
@@ -325,6 +340,8 @@ class KotlinAnalysisIndexerTest {
325340
arrayOf(
326341
scipSymbol {
327342
symbol = "sample/bar()."
343+
kind = Kind.Method
344+
enclosingSymbol = "sample/"
328345
displayName = "bar"
329346
signatureText = "public final fun bar(): MyClass"
330347
}
@@ -386,6 +403,8 @@ class KotlinAnalysisIndexerTest {
386403
arrayOf(
387404
scipSymbol {
388405
symbol = "sample/MyAlias#"
406+
kind = Kind.TypeAlias
407+
enclosingSymbol = "sample/"
389408
displayName = "MyAlias"
390409
signatureText = "public final typealias MyAlias = Int\n"
391410
}
@@ -446,6 +465,8 @@ class KotlinAnalysisIndexerTest {
446465
arrayOf(
447466
scipSymbol {
448467
symbol = "sample/identity().[T]"
468+
kind = Kind.TypeParameter
469+
enclosingSymbol = "sample/identity()."
449470
displayName = "T"
450471
signatureText = "T"
451472
}
@@ -891,22 +912,30 @@ class KotlinAnalysisIndexerTest {
891912
arrayOf(
892913
scipSymbol {
893914
symbol = "sample/Color#"
915+
kind = Kind.Class
916+
enclosingSymbol = "sample/"
894917
displayName = "Color"
895918
addOverriddenSymbols("kotlin/Enum#")
896919
signatureText = "public final enum class Color : Enum<Color>"
897920
},
898921
scipSymbol {
899922
symbol = "sample/Color#RED."
923+
kind = Kind.EnumMember
924+
enclosingSymbol = "sample/Color#"
900925
displayName = "RED"
901926
signatureText = "public final val RED: Color"
902927
},
903928
scipSymbol {
904929
symbol = "sample/Color#GREEN."
930+
kind = Kind.EnumMember
931+
enclosingSymbol = "sample/Color#"
905932
displayName = "GREEN"
906933
signatureText = "public final val GREEN: Color"
907934
},
908935
scipSymbol {
909936
symbol = "sample/Color#BLUE."
937+
kind = Kind.EnumMember
938+
enclosingSymbol = "sample/Color#"
910939
displayName = "BLUE"
911940
signatureText = "public final val BLUE: Color"
912941
},
@@ -975,6 +1004,8 @@ class KotlinAnalysisIndexerTest {
9751004
arrayOf(
9761005
scipSymbol {
9771006
symbol = "sample/Op#PLUS.apply()."
1007+
kind = Kind.Method
1008+
enclosingSymbol = "sample/Op#PLUS."
9781009
displayName = "apply"
9791010
addOverriddenSymbols("sample/Op#apply().")
9801011
signatureText = "public open override fun apply(a: Int, b: Int): Int"
@@ -1059,11 +1090,15 @@ class KotlinAnalysisIndexerTest {
10591090
arrayOf(
10601091
scipSymbol {
10611092
symbol = "sample/MySingleton#"
1093+
kind = Kind.Class
1094+
enclosingSymbol = "sample/"
10621095
displayName = "MySingleton"
10631096
signatureText = "public final object MySingleton : Any"
10641097
},
10651098
scipSymbol {
10661099
symbol = "sample/MySingleton#hello()."
1100+
kind = Kind.Method
1101+
enclosingSymbol = "sample/MySingleton#"
10671102
displayName = "hello"
10681103
signatureText = "public final fun hello(): String"
10691104
},
@@ -1175,16 +1210,22 @@ class KotlinAnalysisIndexerTest {
11751210
arrayOf(
11761211
scipSymbol {
11771212
symbol = "sample/Foo#"
1213+
kind = Kind.Class
1214+
enclosingSymbol = "sample/"
11781215
displayName = "Foo"
11791216
signatureText = "public final class Foo : Any"
11801217
},
11811218
scipSymbol {
11821219
symbol = "sample/Foo#Factory#"
1220+
kind = Kind.Class
1221+
enclosingSymbol = "sample/Foo#"
11831222
displayName = "Factory"
11841223
signatureText = "public final companion object Factory : Any"
11851224
},
11861225
scipSymbol {
11871226
symbol = "sample/Foo#Factory#create()."
1227+
kind = Kind.Method
1228+
enclosingSymbol = "sample/Foo#Factory#"
11881229
displayName = "create"
11891230
signatureText = "public final fun create(): Foo"
11901231
},
@@ -1286,16 +1327,22 @@ class KotlinAnalysisIndexerTest {
12861327
arrayOf(
12871328
scipSymbol {
12881329
symbol = "sample/Bar#"
1330+
kind = Kind.Class
1331+
enclosingSymbol = "sample/"
12891332
displayName = "Bar"
12901333
signatureText = "public final class Bar : Any"
12911334
},
12921335
scipSymbol {
12931336
symbol = "sample/Bar#Companion#"
1337+
kind = Kind.Class
1338+
enclosingSymbol = "sample/Bar#"
12941339
displayName = "Companion"
12951340
signatureText = "public final companion object Companion : Any"
12961341
},
12971342
scipSymbol {
12981343
symbol = "sample/Bar#Companion#instance()."
1344+
kind = Kind.Method
1345+
enclosingSymbol = "sample/Bar#Companion#"
12991346
displayName = "instance"
13001347
signatureText = "public final fun instance(): Bar"
13011348
},
@@ -1366,6 +1413,8 @@ class KotlinAnalysisIndexerTest {
13661413
arrayOf(
13671414
scipSymbol {
13681415
symbol = "sample/greet()."
1416+
kind = Kind.Method
1417+
enclosingSymbol = "sample/"
13691418
displayName = "greet"
13701419
signatureText = "public final fun greet(name: String): String"
13711420
}
@@ -1443,6 +1492,8 @@ class KotlinAnalysisIndexerTest {
14431492
arrayOf(
14441493
scipSymbol {
14451494
symbol = "sample/Person#"
1495+
kind = Kind.Class
1496+
enclosingSymbol = "sample/"
14461497
displayName = "Person"
14471498
addOverriddenSymbols("sample/Named#")
14481499
addOverriddenSymbols("sample/Speakable#")
@@ -1558,16 +1609,22 @@ class KotlinAnalysisIndexerTest {
15581609
arrayOf(
15591610
scipSymbol {
15601611
symbol = "sample/add()."
1612+
kind = Kind.Method
1613+
enclosingSymbol = "sample/"
15611614
displayName = "add"
15621615
signatureText = "public final fun add(x: Int, y: Int): Int"
15631616
},
15641617
scipSymbol {
15651618
symbol = "sample/add(+1)."
1619+
kind = Kind.Method
1620+
enclosingSymbol = "sample/"
15661621
displayName = "add"
15671622
signatureText = "public final fun add(x: Double, y: Double): Double"
15681623
},
15691624
scipSymbol {
15701625
symbol = "sample/add(+2)."
1626+
kind = Kind.Method
1627+
enclosingSymbol = "sample/"
15711628
displayName = "add"
15721629
signatureText = "public final fun add(x: String, y: String): String"
15731630
},

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ class ScipOccurrenceBuilder {
7575
@ScipBuilderDsl
7676
class ScipSymbolInformationBuilder {
7777
var symbol: String = ""
78+
var kind: SymbolInformation.Kind = SymbolInformation.Kind.UnspecifiedKind
79+
var enclosingSymbol: String = ""
7880
var displayName: String = ""
7981
var signatureText: String? = null
8082
private val docs = mutableListOf<String>()
@@ -91,6 +93,8 @@ class ScipSymbolInformationBuilder {
9193

9294
internal fun build(): SymbolInformation = symbolInformation {
9395
symbol = this@ScipSymbolInformationBuilder.symbol
96+
kind = this@ScipSymbolInformationBuilder.kind
97+
enclosingSymbol = this@ScipSymbolInformationBuilder.enclosingSymbol
9498
if (this@ScipSymbolInformationBuilder.displayName.isNotEmpty()) {
9599
displayName = this@ScipSymbolInformationBuilder.displayName
96100
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,24 +14,29 @@
1414
// ⌄ enclosing_range_start scip-java maven . . snapshots/Tagged#getTag().
1515
annotation class Tagged(val tag: String)
1616
// ^^^^^^ definition scip-java maven . . snapshots/Tagged#
17+
// kind Class
1718
// display_name Tagged
1819
// signature_documentation
1920
// > @Target(...) public final annotation class Tagged : Annotation
2021
// relationship scip-java maven . . kotlin/Annotation# implementation
2122
// ^^^^^^ definition scip-java maven . . snapshots/Tagged#`<init>`().
23+
// kind Constructor
2224
// display_name Tagged
2325
// signature_documentation
2426
// > public constructor(tag: String): Tagged
2527
// ^^^ definition scip-java maven . . snapshots/Tagged#`<init>`().(tag)
28+
// kind Parameter
2629
// display_name tag
2730
// signature_documentation
2831
// > tag: String
2932
// ^^^ definition scip-java maven . . snapshots/Tagged#tag.
33+
// kind Property
3034
// display_name tag
3135
// signature_documentation
3236
// > public final val tag: String
3337
// ^^^ reference scip-java maven . . snapshots/Tagged#`<init>`().(tag)
3438
// ^^^ definition scip-java maven . . snapshots/Tagged#getTag().
39+
// kind Method
3540
// display_name tag
3641
// signature_documentation
3742
// > public get(): String
@@ -48,10 +53,12 @@
4853
// ^^^^^^ reference scip-java maven . . snapshots/Tagged#
4954
class AnnotatedService {
5055
// ^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/AnnotatedService#
56+
// kind Class
5157
// display_name AnnotatedService
5258
// signature_documentation
5359
// > @Tagged(...) public final class AnnotatedService : Any
5460
// ^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/AnnotatedService#`<init>`().
61+
// kind Constructor
5562
// display_name AnnotatedService
5663
// signature_documentation
5764
// > public constructor(): AnnotatedService
@@ -60,6 +67,7 @@
6067
// ^^^^^^ reference scip-java maven . . snapshots/Tagged#
6168
fun run(): String = "running"
6269
// ^^^ definition scip-java maven . . snapshots/AnnotatedService#run().
70+
// kind Method
6371
// display_name run
6472
// signature_documentation
6573
// > @Tagged(...) public final fun run(): String

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,45 @@
1111
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#`<init>`().(apple)
1212
class Class constructor(private var banana: Int, apple: String) :
1313
// ^^^^^ definition scip-java maven . . snapshots/Class#
14+
// kind Class
1415
// display_name Class
1516
// signature_documentation
1617
// > public final class Class : Throwable
1718
// relationship scip-java maven . . kotlin/Throwable# implementation
1819
// ^^^^^^^^^^^ definition scip-java maven . . snapshots/Class#`<init>`().
20+
// kind Constructor
1921
// display_name Class
2022
// signature_documentation
2123
// > public constructor(banana: Int, apple: String): Class
2224
// ^^^^^^ definition scip-java maven . . snapshots/Class#`<init>`().(banana)
25+
// kind Parameter
2326
// display_name banana
2427
// signature_documentation
2528
// > banana: Int
2629
// ^^^^^^ definition scip-java maven . . snapshots/Class#banana.
30+
// kind Property
2731
// display_name banana
2832
// signature_documentation
2933
// > private final var banana: Int
3034
// ^^^^^^ reference scip-java maven . . snapshots/Class#`<init>`().(banana)
3135
// ^^^^^^ definition scip-java maven . . snapshots/Class#getBanana().
36+
// kind Method
3237
// display_name banana
3338
// signature_documentation
3439
// > private get(): Int
3540
// ^^^^^^ definition scip-java maven . . snapshots/Class#setBanana().
41+
// kind Method
3642
// display_name banana
3743
// signature_documentation
3844
// > private set(value: Int): Unit
3945
// ^^^^^^ definition scip-java maven . . snapshots/Class#setBanana().(value)
46+
// kind Parameter
4047
// display_name value
4148
// signature_documentation
4249
// > value: Int
4350
// ^^^ reference scip-java maven . . kotlin/Int#
4451
// ^^^^^ definition scip-java maven . . snapshots/Class#`<init>`().(apple)
52+
// kind Parameter
4553
// display_name apple
4654
// signature_documentation
4755
// > apple: String
@@ -68,27 +76,32 @@
6876
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#getAsdf().
6977
val asdf =
7078
// ^^^^ definition scip-java maven . . snapshots/Class#asdf.
79+
// kind Property
7180
// display_name asdf
7281
// signature_documentation
7382
// > public final val asdf: Any
7483
// ^^^^ definition scip-java maven . . snapshots/Class#getAsdf().
84+
// kind Method
7585
// display_name asdf
7686
// signature_documentation
7787
// > public get(): Any
7888
// ⌄ enclosing_range_start scip-java maven . . snapshots/`<anonymous object at 177>`#
7989
// ⌄ enclosing_range_start scip-java maven . . snapshots/`<anonymous object at 177>`#`<init>`().
8090
object {
8191
// ^^^^^^ definition scip-java maven . . snapshots/`<anonymous object at 177>`#
92+
// kind Class
8293
// display_name <anonymous>
8394
// signature_documentation
8495
// > object : Any
8596
// ^^^^^^ definition scip-java maven . . snapshots/`<anonymous object at 177>`#`<init>`().
97+
// kind Constructor
8698
// display_name <anonymous>
8799
// signature_documentation
88100
// > private constructor(): <anonymous>
89101
// ⌄ enclosing_range_start scip-java maven . . snapshots/`<anonymous object at 177>`#doStuff().
90102
fun doStuff() = Unit
91103
// ^^^^^^^ definition scip-java maven . . snapshots/`<anonymous object at 177>`#doStuff().
104+
// kind Method
92105
// display_name doStuff
93106
// signature_documentation
94107
// > public final fun doStuff(): Unit
@@ -103,6 +116,7 @@
103116
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#`<init>`(+1).
104117
constructor() : this(1, "")
105118
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Class#`<init>`(+1).
119+
// kind Constructor
106120
// display_name Class
107121
// signature_documentation
108122
// > public constructor(): Class
@@ -112,10 +126,12 @@
112126
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#`<init>`(+2).(banana)
113127
constructor(banana: Int) : this(banana, "")
114128
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ definition scip-java maven . . snapshots/Class#`<init>`(+2).
129+
// kind Constructor
115130
// display_name Class
116131
// signature_documentation
117132
// > public constructor(banana: Int): Class
118133
// ^^^^^^ definition scip-java maven . . snapshots/Class#`<init>`(+2).(banana)
134+
// kind Parameter
119135
// display_name banana
120136
// signature_documentation
121137
// > banana: Int
@@ -127,6 +143,7 @@
127143
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#run().
128144
fun run() {
129145
// ^^^ definition scip-java maven . . snapshots/Class#run().
146+
// kind Method
130147
// display_name run
131148
// signature_documentation
132149
// > public final fun run(): Unit

0 commit comments

Comments
 (0)