Skip to content

Commit 615cea9

Browse files
Name property accessors as children of their property
Port #973's accessor symbols: getters and setters are now `Class#banana.get().` / `Class#banana.set().` instead of `Class#getBanana().` / `Class#setBanana().`, for source properties, `val`/`var` constructor parameters, explicit accessors, the enum `entries` getter and references to library properties (`kotlin/String#length.get().`). Setter parameters follow (`Class#banana.set().(value)`). Co-authored-by: Amp <amp@ampcode.com> Amp-Thread-ID: https://ampcode.com/threads/T-01a153c0-ec1f-774a-993c-bca3256017ce
1 parent 1062cad commit 615cea9

10 files changed

Lines changed: 86 additions & 97 deletions

File tree

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ class KotlinAnalysisIndexer(
225225
}
226226

227227
// Property references fan out to the property and its accessors
228-
// (`banana` → `Class#banana.`, `Class#getBanana().`, `Class#setBanana().`).
228+
// (`banana` → `Class#banana.`, `Class#banana.get().`, `Class#banana.set().`).
229229
if (target is KaPropertySymbol) {
230230
propertyReferenceSymbols(target).forEach { addReference(it, range) }
231231
return
@@ -364,7 +364,7 @@ class KotlinAnalysisIndexer(
364364
documentation = null,
365365
)
366366
emitDefinition(
367-
symbol = cache.memberMethodSymbol(declaration, "getEntries"),
367+
symbol = cache.accessorSymbol(entries, setter = false),
368368
range = range,
369369
kind = Kind.Method,
370370
enclosingSymbol = entries,

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

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import org.jetbrains.kotlin.psi.KtVariableDeclaration
3838
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
3939
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
4040
import org.jetbrains.kotlin.psi.psiUtil.parents
41-
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
4241
import org.scip_code.scip_java.kotlin_analysis.ScipSymbolDescriptor.Kind
4342
import org.scip_code.scip_java.shared.LocalSymbolsCache as SharedLocalSymbolsCache
4443

@@ -92,14 +91,19 @@ class SymbolsCache {
9291

9392
/**
9493
* The synthetic getter/setter of a property (or `val`/`var` constructor parameter) without
95-
* explicit accessor PSI. Owned by the property's container (`Class#getBanana().`), not by the
96-
* constructor declaring the parameter.
94+
* explicit accessor PSI (`Class#banana.get().`).
9795
*/
9896
fun syntheticAccessorSymbol(property: KtDeclaration, setter: Boolean): Symbol {
99-
val name = (property as? KtNamedDeclaration)?.name.orEmpty()
100-
return Symbol.createGlobal(propertyOwnerSymbol(property), accessorDescriptor(name, setter))
97+
val propertySymbol =
98+
if (property is KtParameter) parameterPropertySymbol(property)
99+
else symbolForDeclaration(property)
100+
return accessorSymbol(propertySymbol, setter)
101101
}
102102

103+
/** The getter or setter of [property] (`Class#banana.get().`, `Class#banana.set().`). */
104+
fun accessorSymbol(property: Symbol, setter: Boolean): Symbol =
105+
Symbol.createGlobal(property, accessorDescriptor(setter))
106+
103107
/** The property symbol declared by a `val`/`var` constructor parameter (`Class#banana.`). */
104108
fun parameterPropertySymbol(parameter: KtParameter): Symbol =
105109
Symbol.createGlobal(
@@ -147,14 +151,10 @@ class SymbolsCache {
147151
*/
148152
fun syntheticLocalSymbol(key: PsiElement): Symbol = locals.get(key) ?: locals.put(key)
149153

150-
private fun propertyOwnerSymbol(property: KtDeclaration): Symbol =
151-
when (property) {
152-
is KtParameter ->
153-
(ownerDeclarationOfParameter(property) as? KtConstructor<*>)
154-
?.containingClassOrObject
155-
?.let { symbolForDeclaration(it) } ?: Symbol.NONE
156-
else -> ownerSymbol(property)
157-
}
154+
private fun propertyOwnerSymbol(parameter: KtParameter): Symbol =
155+
(ownerDeclarationOfParameter(parameter) as? KtConstructor<*>)
156+
?.containingClassOrObject
157+
?.let { symbolForDeclaration(it) } ?: Symbol.NONE
158158

159159
/** The `(value)` parameter symbol of a synthetic setter. */
160160
fun syntheticSetterValueSymbol(property: KtDeclaration): Symbol =
@@ -230,19 +230,13 @@ class SymbolsCache {
230230
target: KaCallableSymbol,
231231
setter: Boolean,
232232
): Symbol {
233-
val callableId = target.callableId ?: return Symbol.NONE
234-
val owner = callableId.classId?.let(::classSymbol) ?: packageSymbol(callableId.packageName)
235-
return Symbol.createGlobal(
236-
owner,
237-
accessorDescriptor(callableId.callableName.asString(), setter),
238-
)
233+
val property = externalCallableSymbol(session, target)
234+
if (property == Symbol.NONE) return Symbol.NONE
235+
return accessorSymbol(property, setter)
239236
}
240237

241-
private fun accessorDescriptor(propertyName: String, setter: Boolean): ScipSymbolDescriptor =
242-
ScipSymbolDescriptor(
243-
Kind.METHOD,
244-
(if (setter) "set" else "get") + propertyName.capitalizeAsciiOnly(),
245-
)
238+
private fun accessorDescriptor(setter: Boolean): ScipSymbolDescriptor =
239+
ScipSymbolDescriptor(Kind.METHOD, if (setter) "set" else "get")
246240

247241
private fun uncachedSymbol(declaration: KtDeclaration): Symbol {
248242
// Anonymous functions and lambdas have no symbol of their own, mirroring FIR.
@@ -300,9 +294,7 @@ class SymbolsCache {
300294
is KtParameter ->
301295
ownerDeclarationOfParameter(declaration)?.let { symbolForDeclaration(it) }
302296
?: Symbol.NONE
303-
is KtPropertyAccessor ->
304-
declaration.property.containingClassOrObject?.let { symbolForDeclaration(it) }
305-
?: packageSymbol(declaration.containingKtFile.packageFqName)
297+
is KtPropertyAccessor -> symbolForDeclaration(declaration.property)
306298
else ->
307299
declaration.containingClassOrObject?.let { symbolForDeclaration(it) }
308300
?: packageSymbol(declaration.containingKtFile.packageFqName)
@@ -321,10 +313,7 @@ class SymbolsCache {
321313
ScipSymbolDescriptor(Kind.TYPE, declaration.name ?: "Companion")
322314
declaration is KtClassOrObject ->
323315
ScipSymbolDescriptor(Kind.TYPE, declaration.name.orEmpty())
324-
declaration is KtPropertyAccessor && declaration.isSetter ->
325-
accessorDescriptor(declaration.property.name.orEmpty(), setter = true)
326-
declaration is KtPropertyAccessor ->
327-
accessorDescriptor(declaration.property.name.orEmpty(), setter = false)
316+
declaration is KtPropertyAccessor -> accessorDescriptor(declaration.isSetter)
328317
declaration is KtConstructor<*> ->
329318
ScipSymbolDescriptor(Kind.METHOD, "<init>", constructorDisambiguator(declaration))
330319
declaration is KtNamedFunction ->

‎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
@@ -82,7 +82,7 @@ class KotlinAnalysisIndexerTest {
8282
enclosingSymbols["snapshots/Greeter#`<init>`().(name)"],
8383
)
8484
assertEquals("snapshots/Greeter#", enclosingSymbols["snapshots/Greeter#name."])
85-
assertEquals("snapshots/Greeter#name.", enclosingSymbols["snapshots/Greeter#getName()."])
85+
assertEquals("snapshots/Greeter#name.", enclosingSymbols["snapshots/Greeter#name.get()."])
8686

8787
val mainDefinitions = definitions(main)
8888
assertContains(mainDefinitions, "snapshots/useGreeter().")

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// ⌄ enclosing_range_start scip-java maven . . snapshots/Tagged#`<init>`().
1212
// ⌄ enclosing_range_start scip-java maven . . snapshots/Tagged#`<init>`().(tag)
1313
// ⌄ enclosing_range_start scip-java maven . . snapshots/Tagged#tag.
14-
// ⌄ enclosing_range_start scip-java maven . . snapshots/Tagged#getTag().
14+
// ⌄ enclosing_range_start scip-java maven . . snapshots/Tagged#tag.get().
1515
annotation class Tagged(val tag: String)
1616
// ^^^^^^ definition scip-java maven . . snapshots/Tagged#
1717
// kind Class
@@ -35,15 +35,15 @@
3535
// signature_documentation
3636
// > public final val tag: String
3737
// ^^^ reference scip-java maven . . snapshots/Tagged#`<init>`().(tag)
38-
// ^^^ definition scip-java maven . . snapshots/Tagged#getTag().
38+
// ^^^ definition scip-java maven . . snapshots/Tagged#tag.get().
3939
// kind Method
4040
// display_name tag
4141
// signature_documentation
4242
// > public get(): String
4343
// ^^^^^^ reference scip-java maven . . kotlin/String#
4444
// ⌃ enclosing_range_end scip-java maven . . snapshots/Tagged#`<init>`().(tag)
4545
// ⌃ enclosing_range_end scip-java maven . . snapshots/Tagged#tag.
46-
// ⌃ enclosing_range_end scip-java maven . . snapshots/Tagged#getTag().
46+
// ⌃ enclosing_range_end scip-java maven . . snapshots/Tagged#tag.get().
4747
// ⌃ enclosing_range_end scip-java maven . . snapshots/Tagged#
4848
// ⌃ enclosing_range_end scip-java maven . . snapshots/Tagged#`<init>`().
4949

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

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#`<init>`().
66
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#`<init>`().(banana)
77
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#banana.
8-
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#getBanana().
9-
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#setBanana().
10-
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#setBanana().(value)
8+
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#banana.get().
9+
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#banana.set().
10+
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#banana.set().(value)
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#
@@ -32,17 +32,17 @@
3232
// signature_documentation
3333
// > private final var banana: Int
3434
// ^^^^^^ reference scip-java maven . . snapshots/Class#`<init>`().(banana)
35-
// ^^^^^^ definition scip-java maven . . snapshots/Class#getBanana().
35+
// ^^^^^^ definition scip-java maven . . snapshots/Class#banana.get().
3636
// kind Method
3737
// display_name banana
3838
// signature_documentation
3939
// > private get(): Int
40-
// ^^^^^^ definition scip-java maven . . snapshots/Class#setBanana().
40+
// ^^^^^^ definition scip-java maven . . snapshots/Class#banana.set().
4141
// kind Method
4242
// display_name banana
4343
// signature_documentation
4444
// > private set(value: Int): Unit
45-
// ^^^^^^ definition scip-java maven . . snapshots/Class#setBanana().(value)
45+
// ^^^^^^ definition scip-java maven . . snapshots/Class#banana.set().(value)
4646
// kind Parameter
4747
// display_name value
4848
// signature_documentation
@@ -56,9 +56,9 @@
5656
// ^^^^^^ reference scip-java maven . . kotlin/String#
5757
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#`<init>`().(banana)
5858
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#banana.
59-
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#getBanana().
60-
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#setBanana().
61-
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#setBanana().(value)
59+
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#banana.get().
60+
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#banana.set().
61+
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#banana.set().(value)
6262
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#`<init>`().(apple)
6363
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#`<init>`().
6464
Throwable(banana.toString() + apple) {
@@ -73,14 +73,14 @@
7373
}
7474

7575
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#asdf.
76-
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#getAsdf().
76+
// ⌄ enclosing_range_start scip-java maven . . snapshots/Class#asdf.get().
7777
val asdf =
7878
// ^^^^ definition scip-java maven . . snapshots/Class#asdf.
7979
// kind Property
8080
// display_name asdf
8181
// signature_documentation
8282
// > public final val asdf: Any
83-
// ^^^^ definition scip-java maven . . snapshots/Class#getAsdf().
83+
// ^^^^ definition scip-java maven . . snapshots/Class#asdf.get().
8484
// kind Method
8585
// display_name asdf
8686
// signature_documentation
@@ -109,7 +109,7 @@
109109
// ⌃ enclosing_range_end scip-java maven . . snapshots/`<anonymous object at 177>`#doStuff().
110110
}
111111
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#asdf.
112-
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#getAsdf().
112+
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#asdf.get().
113113
// ⌃ enclosing_range_end scip-java maven . . snapshots/`<anonymous object at 177>`#
114114
// ⌃ enclosing_range_end scip-java maven . . snapshots/`<anonymous object at 177>`#`<init>`().
115115

@@ -153,12 +153,12 @@
153153
println("I eat $banana for lunch")
154154
// ^^^^^^^ reference scip-java maven . . kotlin/io/println().
155155
// ^^^^^^ reference scip-java maven . . snapshots/Class#banana.
156-
// ^^^^^^ reference scip-java maven . . snapshots/Class#getBanana().
157-
// ^^^^^^ reference scip-java maven . . snapshots/Class#setBanana().
156+
// ^^^^^^ reference scip-java maven . . snapshots/Class#banana.get().
157+
// ^^^^^^ reference scip-java maven . . snapshots/Class#banana.set().
158158
banana = 42
159159
// ^^^^^^ reference scip-java maven . . snapshots/Class#banana.
160-
// ^^^^^^ reference scip-java maven . . snapshots/Class#getBanana().
161-
// ^^^^^^ reference scip-java maven . . snapshots/Class#setBanana().
160+
// ^^^^^^ reference scip-java maven . . snapshots/Class#banana.get().
161+
// ^^^^^^ reference scip-java maven . . snapshots/Class#banana.set().
162162
}
163163
// ⌃ enclosing_range_end scip-java maven . . snapshots/Class#run().
164164
}

0 commit comments

Comments
 (0)