From 5f18439442b8502e3d6ebaabbb35575556989729 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 30 Aug 2018 19:33:36 +0200 Subject: [PATCH] Use correct module name when calling internal members from other module This is needed to avoid using the same module name for test root as for the main source root in the Gradle plugin, which is needed to fix KT-18955 --- .../codegen/state/KotlinTypeMapper.java | 8 +++++- .../internalWithOtherModuleName.kt | 14 ++++++++++ ...bstractCompileKotlinAgainstKotlinTest.java | 28 +++++++++++-------- ...mpileKotlinAgainstKotlinTestGenerated.java | 5 ++++ 4 files changed, 42 insertions(+), 13 deletions(-) create mode 100644 compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index a17016e538d..825c020bff8 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -1098,12 +1098,18 @@ public class KotlinTypeMapper { if (!(descriptor instanceof ConstructorDescriptor) && descriptor.getVisibility() == Visibilities.INTERNAL && !DescriptorUtilsKt.isPublishedApi(descriptor)) { - return InternalNameMapper.mangleInternalName(name, moduleName); + return InternalNameMapper.mangleInternalName(name, getModuleName(descriptor)); } return name; } + @NotNull + private String getModuleName(@NotNull CallableMemberDescriptor descriptor) { + String deserialized = ModuleNameKt.getJvmModuleNameForDeserializedDescriptor(descriptor); + return deserialized != null ? deserialized : moduleName; + } + @Nullable private static String getPartSimpleNameForMangling(@NotNull CallableMemberDescriptor descriptor) { KtFile containingFile = DescriptorToSourceUtils.getContainingFile(descriptor); diff --git a/compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt b/compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt new file mode 100644 index 00000000000..29b13fe5666 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt @@ -0,0 +1,14 @@ +// IGNORE_BACKEND: NATIVE +// FILE: A.kt + +package a + +class Box(val value: String) { + internal fun result(): String = value +} + +// FILE: B.kt + +fun box(): String { + return a.Box("OK").result() +} diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java index 10533205016..6290e51ec30 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codegen/AbstractCompileKotlinAgainstKotlinTest.java @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.cli.common.modules.ModuleBuilder; import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime; +import org.jetbrains.kotlin.config.CommonConfigurationKeys; import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.load.kotlin.ModuleVisibilityManager; import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils; @@ -25,7 +26,6 @@ import org.jetbrains.kotlin.test.KotlinTestUtils; import org.jetbrains.kotlin.utils.ExceptionUtilsKt; import java.io.File; -import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; @@ -90,12 +90,14 @@ public abstract class AbstractCompileKotlinAgainstKotlinTest extends CodegenTest } @NotNull - private ClassFileFactory compileA(@NotNull TestFile testFile, List files) throws IOException { + private ClassFileFactory compileA(@NotNull TestFile testFile, List files) { Disposable compileDisposable = createDisposable("compileA"); - CompilerConfiguration configuration = - createConfiguration(ConfigurationKind.ALL, getJdkKind(files), - Collections.singletonList(KotlinTestUtils.getAnnotationsJar()), - Collections.emptyList(), Collections.singletonList(testFile)); + CompilerConfiguration configuration = createConfiguration( + ConfigurationKind.ALL, getJdkKind(files), Collections.singletonList(KotlinTestUtils.getAnnotationsJar()), + Collections.emptyList(), Collections.singletonList(testFile) + ); + + configuration.put(CommonConfigurationKeys.MODULE_NAME, "a"); KotlinCoreEnvironment environment = KotlinCoreEnvironment.createForTests( compileDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES); @@ -110,16 +112,18 @@ public abstract class AbstractCompileKotlinAgainstKotlinTest extends CodegenTest } @NotNull - private ClassFileFactory compileB(@NotNull TestFile testFile, List files) throws IOException { + private ClassFileFactory compileB(@NotNull TestFile testFile, List files) { String commonHeader = StringsKt.substringBefore(files.get(0).content, "FILE:", ""); - CompilerConfiguration configurationWithADirInClasspath = - createConfiguration(ConfigurationKind.ALL, getJdkKind(files), - Lists.newArrayList(KotlinTestUtils.getAnnotationsJar(), aDir), - Collections.emptyList(), Lists.newArrayList(testFile, new TestFile("header", commonHeader))); + CompilerConfiguration configuration = createConfiguration( + ConfigurationKind.ALL, getJdkKind(files), Lists.newArrayList(KotlinTestUtils.getAnnotationsJar(), aDir), + Collections.emptyList(), Lists.newArrayList(testFile, new TestFile("header", commonHeader)) + ); + + configuration.put(CommonConfigurationKeys.MODULE_NAME, "b"); Disposable compileDisposable = createDisposable("compileB"); KotlinCoreEnvironment environment = KotlinCoreEnvironment.createForTests( - compileDisposable, configurationWithADirInClasspath, EnvironmentConfigFiles.JVM_CONFIG_FILES + compileDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES ); return compileKotlin(Collections.singletonList(testFile), bDir, environment, compileDisposable); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java index 8a927e363b7..78e689b49e1 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java @@ -138,6 +138,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl runTest("compiler/testData/compileKotlinAgainstKotlin/internalSetterOverridden.kt"); } + @TestMetadata("internalWithOtherModuleName.kt") + public void testInternalWithOtherModuleName() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt"); + } + @TestMetadata("jvmField.kt") public void testJvmField() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/jvmField.kt");