Skip to content

Commit a43ab02

Browse files
ting-yuanKSP Auto Pick
authored and
KSP Auto Pick
committed
KSP2: get module name from metadata
Also fork mangledName.txt for a minor difference in enum constructor. (cherry picked from commit 1630cf9)
1 parent b6dcf9f commit a43ab02

File tree

4 files changed

+219
-5
lines changed

4 files changed

+219
-5
lines changed

kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt

+12-1
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,11 @@ import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
5959
import org.jetbrains.kotlin.codegen.state.InfoForMangling
6060
import org.jetbrains.kotlin.codegen.state.collectFunctionSignatureForManglingSuffix
6161
import org.jetbrains.kotlin.codegen.state.md5base64
62+
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
63+
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
6264
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
6365
import org.jetbrains.kotlin.fir.declarations.getTargetType
66+
import org.jetbrains.kotlin.fir.declarations.utils.moduleName
6467
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
6568
import org.jetbrains.kotlin.fir.expressions.FirArrayLiteral
6669
import org.jetbrains.kotlin.fir.expressions.FirExpression
@@ -990,6 +993,7 @@ internal fun KaCallableSymbol.explictJvmName(): String? {
990993
}?.arguments?.single()?.expression?.toValue() as? String
991994
}
992995

996+
@OptIn(SymbolInternals::class)
993997
internal val KaDeclarationSymbol.internalSuffix: String
994998
get() = analyze {
995999
if (visibility != KaSymbolVisibility.INTERNAL)
@@ -1011,7 +1015,14 @@ internal val KaDeclarationSymbol.internalSuffix: String
10111015
fun String.toSuffix(): String = "\$$this"
10121016
when (val module = containingModule) {
10131017
is KaSourceModule -> module.name.toSuffix()
1014-
is KaLibraryModule -> module.libraryName.toSuffix()
1018+
is KaLibraryModule -> {
1019+
// Read module name from metadata.
1020+
// FIXME: need an API in AA.
1021+
val firSymbol = (this@internalSuffix as? KaFirSymbol<*>)?.firSymbol
1022+
val firClassSymbol = firSymbol?.getContainingClassSymbol()
1023+
val moduleName = (firClassSymbol?.fir as? FirRegularClass)?.moduleName
1024+
(moduleName ?: module.libraryName.toSuffix()).toSuffix()
1025+
}
10151026
else -> ""
10161027
}
10171028
}

kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/test/AbstractKSPAATest.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ abstract class AbstractKSPAATest : AbstractKSPTest(FrontendKinds.FIR) {
5656
}
5757
}
5858

59-
private fun compileKotlin(dependencies: List<File>, sourcesPath: String, javaSourcePath: String, outDir: File) {
59+
private fun compileKotlin(
60+
dependencies: List<File>,
61+
sourcesPath: String,
62+
javaSourcePath: String,
63+
outDir: File,
64+
moduleName: String
65+
) {
6066
val classpath = mutableListOf<String>()
6167
classpath.addAll(dependencies.map { it.canonicalPath })
6268
if (File(sourcesPath).isDirectory) {
@@ -69,6 +75,7 @@ abstract class AbstractKSPAATest : AbstractKSPTest(FrontendKinds.FIR) {
6975
javaSourcePath,
7076
"-d", outDir.absolutePath,
7177
"-no-stdlib",
78+
"-module-name", moduleName,
7279
"-classpath", classpath.joinToString(File.pathSeparator)
7380
)
7481
runJvmCompiler(args)
@@ -86,7 +93,7 @@ abstract class AbstractKSPAATest : AbstractKSPTest(FrontendKinds.FIR) {
8693
module.writeKtFiles()
8794
val javaFiles = module.writeJavaFiles()
8895
val dependencies = module.allDependencies.map { outDirForModule(it.moduleName) }
89-
compileKotlin(dependencies, module.kotlinSrc.path, module.javaDir.path, module.outDir)
96+
compileKotlin(dependencies, module.kotlinSrc.path, module.javaDir.path, module.outDir, module.name)
9097
val classpath = (dependencies + KtTestUtil.getAnnotationsJar() + module.outDir)
9198
.joinToString(File.pathSeparator) { it.absolutePath }
9299
val options = listOf(

kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/test/KSPAATest.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -413,11 +413,10 @@ class KSPAATest : AbstractKSPAATest() {
413413
runTest("../test-utils/testData/api/makeNullable.kt")
414414
}
415415

416-
@Disabled
417416
@TestMetadata("mangledNames.kt")
418417
@Test
419418
fun testMangledNames() {
420-
runTest("../test-utils/testData/api/mangledNames.kt")
419+
runTest("../kotlin-analysis-api/testData/mangledNames.kt")
421420
}
422421

423422
@TestMetadata("multipleModules.kt")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
/*
2+
* Copyright 2020 Google LLC
3+
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
// WITH_RUNTIME
19+
// TEST PROCESSOR: MangledNamesProcessor
20+
// EXPECTED:
21+
// JavaEnum -> declarations
22+
// JavaEnum.VAL1 -> declarations
23+
// JavaEnum.VAL2 -> declarations
24+
// valueOf -> valueOf
25+
// values -> values
26+
// JavaInput -> declarations
27+
// <init> -> <init>
28+
// getX -> getX
29+
// getY -> getY
30+
// javaFunction -> javaFunction
31+
// setY -> setY
32+
// staticJavaFunction -> staticJavaFunction
33+
// mainPackage.AbstractKotlinClass -> declarations
34+
// get-abstractVal -> getAbstractVal
35+
// get-abstractVar -> getAbstractVar
36+
// set-abstractVar -> setAbstractVar
37+
// get-internalAbstractVal -> getInternalAbstractVal$mainModule
38+
// set-internalAbstractVal -> setInternalAbstractVal$mainModule
39+
// get-internalAbstractVar -> getInternalAbstractVar$mainModule
40+
// set-internalAbstractVar -> setInternalAbstractVar$mainModule
41+
// mainPackage.Anno -> declarations
42+
// get-a -> a
43+
// mainPackage.Foo -> declarations
44+
// hasJvmName -> explicitJvmName
45+
// get-inlineProp -> getInlineProp-HRn7Rpw
46+
// set-inlineProp -> setInlineProp-E03SJzc
47+
// inlineReceivingFun -> inlineReceivingFun-E03SJzc
48+
// inlineReturningFun -> inlineReturningFun-HRn7Rpw
49+
// get-internalInlineProp -> getInternalInlineProp-HRn7Rpw$mainModule
50+
// set-internalInlineProp -> setInternalInlineProp-E03SJzc$mainModule
51+
// internalInlineReceivingFun -> internalInlineReceivingFun-E03SJzc$mainModule
52+
// internalInlineReturningFun -> internalInlineReturningFun-HRn7Rpw$mainModule
53+
// get-internalProp -> getInternalProp$mainModule
54+
// set-internalProp -> setInternalProp$mainModule
55+
// get-jvmNameProp -> explicitGetterName
56+
// set-jvmNameProp -> explicitSetterName
57+
// normalFun -> normalFun
58+
// get-normalProp -> getNormalProp
59+
// set-normalProp -> setNormalProp
60+
// mainPackage.MyInterface -> declarations
61+
// get-x -> getX
62+
// get-y -> getY
63+
// set-y -> setY
64+
// fileLevelInlineReceivingFun -> fileLevelInlineReceivingFun-E03SJzc
65+
// fileLevelInlineReturningFun -> fileLevelInlineReturningFun
66+
// fileLevelInternalFun -> fileLevelInternalFun
67+
// fileLevelInternalInlineReceivingFun -> fileLevelInternalInlineReceivingFun-E03SJzc
68+
// fileLevelInternalInlineReturningFun -> fileLevelInternalInlineReturningFun
69+
// libPackage.Foo -> declarations
70+
// <init> -> <init>
71+
// hasJvmName -> explicitJvmName
72+
// get-inlineProp -> getInlineProp-b_MPbnQ
73+
// set-inlineProp -> setInlineProp-mQ73O9w
74+
// inlineReceivingFun -> inlineReceivingFun-mQ73O9w
75+
// inlineReturningFun -> inlineReturningFun-b_MPbnQ
76+
// get-internalInlineProp -> getInternalInlineProp-b_MPbnQ$lib
77+
// set-internalInlineProp -> setInternalInlineProp-mQ73O9w$lib
78+
// internalInlineReceivingFun -> internalInlineReceivingFun-mQ73O9w$lib
79+
// internalInlineReturningFun -> internalInlineReturningFun-b_MPbnQ$lib
80+
// get-internalProp -> getInternalProp$lib
81+
// set-internalProp -> setInternalProp$lib
82+
// get-jvmNameProp -> explicitGetterName
83+
// set-jvmNameProp -> explicitSetterName
84+
// normalFun -> normalFun
85+
// get-normalProp -> getNormalProp
86+
// set-normalProp -> setNormalProp
87+
// libPackage.AbstractKotlinClass -> declarations
88+
// get-abstractVal -> getAbstractVal
89+
// get-abstractVar -> getAbstractVar
90+
// set-abstractVar -> setAbstractVar
91+
// get-internalAbstractVal -> getInternalAbstractVal$lib
92+
// set-internalAbstractVal -> setInternalAbstractVal$lib
93+
// get-internalAbstractVar -> getInternalAbstractVar$lib
94+
// set-internalAbstractVar -> setInternalAbstractVar$lib
95+
// libPackage.MyInterface -> declarations
96+
// get-x -> getX
97+
// get-y -> getY
98+
// set-y -> setY
99+
// END
100+
// MODULE: lib
101+
// FILE: input.kt
102+
/**
103+
* control group
104+
*/
105+
package libPackage;
106+
inline class Inline1(val value:String)
107+
class Foo {
108+
var normalProp:String = TODO()
109+
var inlineProp: Inline1 = TODO()
110+
internal var internalProp: String = TODO()
111+
internal var internalInlineProp: Inline1 = TODO()
112+
@get:JvmName("explicitGetterName")
113+
@set:JvmName("explicitSetterName")
114+
var jvmNameProp:String
115+
fun normalFun() {}
116+
@JvmName("explicitJvmName")
117+
fun hasJvmName() {}
118+
fun inlineReceivingFun(value: Inline1) {}
119+
fun inlineReturningFun(): Inline1 = TODO()
120+
internal fun internalInlineReceivingFun(value: Inline1) {}
121+
internal fun internalInlineReturningFun(): Inline1 = TODO()
122+
}
123+
124+
abstract class AbstractKotlinClass {
125+
abstract var abstractVar:String
126+
abstract val abstractVal:String
127+
internal abstract var internalAbstractVar:String
128+
internal abstract var internalAbstractVal:String
129+
}
130+
131+
interface MyInterface {
132+
val x:Int
133+
var y:Int
134+
}
135+
// MODULE: mainModule(lib)
136+
// FILE: input.kt
137+
package mainPackage;
138+
inline class Inline1(val value:String)
139+
class Foo {
140+
var normalProp:String = TODO()
141+
var inlineProp: Inline1 = TODO()
142+
internal var internalProp: String = TODO()
143+
internal var internalInlineProp: Inline1 = TODO()
144+
@get:JvmName("explicitGetterName")
145+
@set:JvmName("explicitSetterName")
146+
var jvmNameProp:String
147+
fun normalFun() {}
148+
@JvmName("explicitJvmName")
149+
fun hasJvmName() {}
150+
fun inlineReceivingFun(value: Inline1) {}
151+
fun inlineReturningFun(): Inline1 = TODO()
152+
internal fun internalInlineReceivingFun(value: Inline1) {}
153+
internal fun internalInlineReturningFun(): Inline1 = TODO()
154+
}
155+
156+
annotation class Anno(val a: String)
157+
abstract class AbstractKotlinClass {
158+
abstract var abstractVar:String
159+
abstract val abstractVal:String
160+
internal abstract var internalAbstractVar:String
161+
internal abstract var internalAbstractVal:String
162+
}
163+
164+
internal fun fileLevelInternalFun(): Unit = TODO()
165+
fun fileLevelInlineReceivingFun(inline1: Inline1): Unit = TODO()
166+
fun fileLevelInlineReturningFun(): Inline1 = TODO()
167+
fun fileLevelInternalInlineReceivingFun(inline1: Inline1): Unit = TODO()
168+
fun fileLevelInternalInlineReturningFun(): Inline1 = TODO()
169+
170+
interface MyInterface {
171+
val x:Int
172+
var y:Int
173+
}
174+
175+
// FILE: JavaInput.java
176+
import mainPackage.MyInterface;
177+
178+
class JavaInput implements MyInterface {
179+
String javaField;
180+
String javaFunction() {}
181+
static String staticJavaField;
182+
static void staticJavaFunction() {}
183+
public int getX() {
184+
return 1;
185+
}
186+
public int getY() {
187+
return 1;
188+
}
189+
public void setY(int value) {
190+
}
191+
}
192+
193+
// FILE: JavaEnum.java
194+
public enum JavaEnum {
195+
VAL1,
196+
VAL2;
197+
}

0 commit comments

Comments
 (0)