From c956b4aeaea1e6ec75f270ae1b5d937f3863083d Mon Sep 17 00:00:00 2001 From: aleksandrina-streltsova Date: Wed, 26 Apr 2023 12:30:25 +0300 Subject: [PATCH] [Analysis API FIR] Use stable module name when mangling internal name ^KTIJ-25046 --- analysis/light-classes-base/build.gradle.kts | 1 + .../src/org/jetbrains/kotlin/asJava/lightClassUtils.kt | 4 +++- .../kotlin/analysis/project/structure/KtModule.kt | 7 +++++++ .../light/classes/symbol/methods/SymbolLightMethodBase.kt | 4 ++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/analysis/light-classes-base/build.gradle.kts b/analysis/light-classes-base/build.gradle.kts index 2d635d03d69..f4f3fae5042 100644 --- a/analysis/light-classes-base/build.gradle.kts +++ b/analysis/light-classes-base/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { api(project(":compiler:frontend.common.jvm")) api(project(":compiler:resolution.common.jvm")) api(project(":core:compiler.common.jvm")) + implementation(project(":analysis:project-structure")) compileOnly(intellijCore()) compileOnly(commonDependency("org.jetbrains.intellij.deps:trove4j")) } diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt index a3befb9241b..15617f1c889 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/lightClassUtils.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.asJava import com.intellij.lang.jvm.JvmModifier import com.intellij.psi.* import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.asJava.classes.KtFakeLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.elements.* @@ -194,7 +195,8 @@ fun demangleInternalName(name: String): String? { return if (indexOfDollar >= 0) name.substring(0, indexOfDollar) else null } -fun mangleInternalName(name: String, moduleName: String): String { +fun mangleInternalName(name: String, module: KtSourceModule): String { + val moduleName = (module.stableModuleName ?: module.moduleName).removeSurrounding("<", ">") return name + "$" + NameUtils.sanitizeAsJavaIdentifier(moduleName) } diff --git a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtModule.kt b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtModule.kt index 89a4304e73f..fea0111d3e2 100644 --- a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtModule.kt +++ b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtModule.kt @@ -92,6 +92,13 @@ public sealed interface KtModule { public interface KtSourceModule : KtModule { public val moduleName: String + /** + * A stable binary name of module from the *Kotlin* point of view. + * Having correct module name is critical for `internal`-visibility mangling. See [org.jetbrains.kotlin.asJava.mangleInternalName] + */ + public val stableModuleName: String? + get() = null + override val moduleDescription: String get() = "Sources of $moduleName" diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightMethodBase.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightMethodBase.kt index 1315b0f552d..3303a3d7fc2 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightMethodBase.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/methods/SymbolLightMethodBase.kt @@ -117,8 +117,8 @@ internal abstract class SymbolLightMethodBase( if (containingClass is KtLightClassForFacade) return defaultName if (hasPublishedApiAnnotation(annotationUseSiteTarget.toFilter())) return defaultName - val moduleName = (ktModule as? KtSourceModule)?.moduleName ?: return defaultName - return mangleInternalName(defaultName, moduleName) + val sourceModule = ktModule as? KtSourceModule ?: return defaultName + return mangleInternalName(defaultName, sourceModule) } abstract fun isOverride(): Boolean