From e37a20d6b32eb6f8a879d65323ab9270ab458a7d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 11 Oct 2016 14:14:59 +0300 Subject: [PATCH] Do not deserialize type aliases in compatibility mode When "-language-version 1.0" is specified in command line arguments, the compiler should not be able to see the declarations of type aliases in libraries, because that corresponds to the behavior of the compiler of version 1.0. Note that type aliases are _completely invisible_ in this mode (i.e. "unresolved reference" is reported) because they must not interfere with the classifier resolution --- .../CompilerDeserializationConfiguration.kt | 6 +++++- .../main.kt | 8 +++++++ .../output.txt | 16 ++++++++++++++ .../typeAliases.kt | 10 +++++++++ ...ompileKotlinAgainstCustomBinariesTest.java | 21 ++++++++++++------- .../DeserializationConfiguration.kt | 3 +++ .../descriptors/DeserializedMemberScope.kt | 4 +++- 7 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/output.txt create mode 100644 compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/typeAliases.kt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerDeserializationConfiguration.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerDeserializationConfiguration.kt index ff5a9315c9a..81e0b9667de 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerDeserializationConfiguration.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerDeserializationConfiguration.kt @@ -16,7 +16,11 @@ package org.jetbrains.kotlin.resolve +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.serialization.deserialization.DeserializationConfiguration -class CompilerDeserializationConfiguration(private val languageVersionSettings: LanguageVersionSettings) : DeserializationConfiguration +class CompilerDeserializationConfiguration(private val languageVersionSettings: LanguageVersionSettings) : DeserializationConfiguration { + override val typeAliasesAllowed: Boolean + get() = languageVersionSettings.supportsFeature(LanguageFeature.TypeAliases) +} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt new file mode 100644 index 00000000000..d22cda1a673 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt @@ -0,0 +1,8 @@ +import test.* +import test.Str + +fun use( + str: Str, + l: L, + nested: Klass.Nested +) {} diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/output.txt b/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/output.txt new file mode 100644 index 00000000000..220511ed980 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/output.txt @@ -0,0 +1,16 @@ +compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt:2:13: error: unresolved reference: Str +import test.Str + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt:5:14: error: unresolved reference: Str + str: Str, + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt:6:12: error: unresolved reference: L + l: L, + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt:6:14: error: unresolved reference: Str + l: L, + ^ +compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/main.kt:7:23: error: unresolved reference: Nested + nested: Klass.Nested + ^ +COMPILATION_ERROR \ No newline at end of file diff --git a/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/typeAliases.kt b/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/typeAliases.kt new file mode 100644 index 00000000000..a2733f9cde4 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstCustomBinaries/typeAliasesAreInvisibleInCompatibilityMode/typeAliases.kt @@ -0,0 +1,10 @@ +package test + +typealias Str = String +typealias L = List + +class Klass { + typealias Nested = Z + + class Z +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java index dc3db0287ed..cfc2ce74a83 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstCustomBinariesTest.java @@ -188,14 +188,14 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir { @NotNull File output, @NotNull File... classpath ) { - return compileKotlin(fileName, output, false, classpath); + return compileKotlin(fileName, output, Collections.emptyList(), classpath); } @NotNull private Pair compileKotlin( @NotNull String fileName, @NotNull File output, - boolean jvm8Target, + List additionalOptions, @NotNull File... classpath ) { List args = new ArrayList(); @@ -208,10 +208,7 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir { } args.add("-d"); args.add(output.getPath()); - if (jvm8Target) { - args.add("-jvm-target"); - args.add("1.8"); - } + args.addAll(additionalOptions); return AbstractCliTest.executeCompilerGrabOutput(new K2JVMCompiler(), args); } @@ -427,9 +424,17 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir { private void target6Inheritance() { compileKotlin("target6.kt", tmpdir); - compileKotlin("main.kt", tmpdir, true, tmpdir); + Pair outputMain = compileKotlin("main.kt", tmpdir, Arrays.asList("-jvm-target", "1.8"), tmpdir); - Pair outputMain = compileKotlin("main.kt", tmpdir, true, tmpdir); + KotlinTestUtils.assertEqualsToFile( + new File(getTestDataDirectory(), "output.txt"), normalizeOutput(outputMain) + ); + } + + public void testTypeAliasesAreInvisibleInCompatibilityMode() { + compileKotlin("typeAliases.kt", tmpdir); + + Pair outputMain = compileKotlin("main.kt", tmpdir, Arrays.asList("-language-version", "1.0"), tmpdir); KotlinTestUtils.assertEqualsToFile( new File(getTestDataDirectory(), "output.txt"), normalizeOutput(outputMain) diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializationConfiguration.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializationConfiguration.kt index 1ecb077eb5e..28c81c9e74d 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializationConfiguration.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/DeserializationConfiguration.kt @@ -17,5 +17,8 @@ package org.jetbrains.kotlin.serialization.deserialization interface DeserializationConfiguration { + val typeAliasesAllowed: Boolean + get() = true + object Default : DeserializationConfiguration } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt index a5ee76d26b6..f3726e2a798 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberScope.kt @@ -51,7 +51,9 @@ abstract class DeserializedMemberScope protected constructor( } private val typeAliasProtos by c.storageManager.createLazyValue { - typeAliasList.groupByName { it.name } + if (c.components.configuration.typeAliasesAllowed) + typeAliasList.groupByName { it.name } + else emptyMap() } private val functions =