From 5e38c99f8196c787aef7814013e1b12884084b62 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 8 Sep 2015 17:57:17 +0300 Subject: [PATCH] Name clash test for file class vs multifile class --- .../jetbrains/kotlin/codegen/ClassFileFactory.java | 11 +++++++---- .../jetbrains/kotlin/codegen/MultifileClassCodegen.kt | 2 +- .../resolve/jvm/diagnostics/JvmDeclarationOrigin.kt | 4 ++-- .../kotlin/asJava/duplicateJvmSignatureUtil.kt | 1 + .../cli/jvm/fileClassAndMultifileClassClash.args | 4 ++++ .../cli/jvm/fileClassAndMultifileClassClash.out | 7 +++++++ .../cli/jvm/fileClassAndMultifileClassClash1.kt | 5 +++++ .../cli/jvm/fileClassAndMultifileClassClash2.kt | 5 +++++ .../kotlin/cli/KotlincExecutableTestGenerated.java | 6 ++++++ 9 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/cli/jvm/fileClassAndMultifileClassClash.args create mode 100644 compiler/testData/cli/jvm/fileClassAndMultifileClassClash.out create mode 100644 compiler/testData/cli/jvm/fileClassAndMultifileClassClash1.kt create mode 100644 compiler/testData/cli/jvm/fileClassAndMultifileClassClash2.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java index b8e8394ba91..0146d059c37 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java @@ -84,12 +84,15 @@ public class ClassFileFactory implements OutputFileCollection { void done() { if (!isDone) { isDone = true; - Collection values = package2codegen.values(); - for (PackageCodegen codegen : values) { + Collection packageCodegens = package2codegen.values(); + for (PackageCodegen codegen : packageCodegens) { codegen.done(); } - - writeModuleMappings(values); + for (MultifileClassCodegen codegen : multifileClass2codegen.values()) { + codegen.done(); + } + // TODO module mappings for multifile classes + writeModuleMappings(packageCodegens); } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index cdf86433efa..bf8d7dac344 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -70,7 +70,7 @@ public class MultifileClassCodegen( val actualPackageFragment = packageFragment ?: compiledPackageFragment ?: throw AssertionError("No package fragment for multifile facade $facadeFqName; files: $files") - val declarationOrigin = MultifileClass(actualPackageFragment, facadeFqName) + val declarationOrigin = MultifileClass(sourceFile, actualPackageFragment, facadeFqName) val classBuilder = state.factory.newVisitor(declarationOrigin, facadeClassType, filesWithTopLevelCallables) classBuilder.defineClass(sourceFile, Opcodes.V1_6, FACADE_CLASS_ATTRIBUTES, diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt index 2765c759839..be7051fb694 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/JvmDeclarationOrigin.kt @@ -71,8 +71,8 @@ public fun Bridge(descriptor: DeclarationDescriptor, element: PsiElement? = Desc public fun PackageFacade(descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(PACKAGE_FACADE, null, descriptor) public fun PackagePart(file: JetFile, descriptor: PackageFragmentDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(PACKAGE_PART, file, descriptor) -public fun MultifileClass(descriptor: PackageFragmentDescriptor, multifileClassFqName: FqName): JvmDeclarationOrigin = - JvmDeclarationOrigin(MULTIFILE_CLASS, null, descriptor, multifileClassFqName) +public fun MultifileClass(someFile: JetFile?, descriptor: PackageFragmentDescriptor, multifileClassFqName: FqName): JvmDeclarationOrigin = + JvmDeclarationOrigin(MULTIFILE_CLASS, someFile, descriptor, multifileClassFqName) public fun MultifileClassPart(file: JetFile, descriptor: PackageFragmentDescriptor, multifileClassFqName: FqName): JvmDeclarationOrigin = JvmDeclarationOrigin(MULTIFILE_CLASS_PART, file, descriptor, multifileClassFqName) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt index 8e677294f16..706971d89d7 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt @@ -135,6 +135,7 @@ private fun ConflictingJvmDeclarationsData.higherThan(other: ConflictingJvmDecla return when (other.classOrigin.originKind) { PACKAGE_PART -> this.classOrigin.originKind == PACKAGE_FACADE TRAIT_IMPL -> this.classOrigin.originKind != TRAIT_IMPL + MULTIFILE_CLASS_PART -> this.classOrigin.originKind == MULTIFILE_CLASS else -> false } } diff --git a/compiler/testData/cli/jvm/fileClassAndMultifileClassClash.args b/compiler/testData/cli/jvm/fileClassAndMultifileClassClash.args new file mode 100644 index 00000000000..711c84b2736 --- /dev/null +++ b/compiler/testData/cli/jvm/fileClassAndMultifileClassClash.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/fileClassAndMultifileClassClash1.kt +$TESTDATA_DIR$/fileClassAndMultifileClassClash2.kt +-d +$TEMP_DIR$ diff --git a/compiler/testData/cli/jvm/fileClassAndMultifileClassClash.out b/compiler/testData/cli/jvm/fileClassAndMultifileClassClash.out new file mode 100644 index 00000000000..20bc3ae1978 --- /dev/null +++ b/compiler/testData/cli/jvm/fileClassAndMultifileClassClash.out @@ -0,0 +1,7 @@ +compiler/testData/cli/jvm/fileClassAndMultifileClassClash1.kt:1:1: error: duplicate JVM class name 'test/Util' generated from: package-fragment test, package-fragment test +@file:JvmName("Util") +^ +compiler/testData/cli/jvm/fileClassAndMultifileClassClash2.kt:1:1: error: duplicate JVM class name 'test/Util' generated from: package-fragment test, package-fragment test +@file:JvmName("Util") +^ +COMPILATION_ERROR \ No newline at end of file diff --git a/compiler/testData/cli/jvm/fileClassAndMultifileClassClash1.kt b/compiler/testData/cli/jvm/fileClassAndMultifileClassClash1.kt new file mode 100644 index 00000000000..0b860377510 --- /dev/null +++ b/compiler/testData/cli/jvm/fileClassAndMultifileClassClash1.kt @@ -0,0 +1,5 @@ +@file:JvmName("Util") +// @file:JvmMultifileClass +package test + +public fun foo() {} diff --git a/compiler/testData/cli/jvm/fileClassAndMultifileClassClash2.kt b/compiler/testData/cli/jvm/fileClassAndMultifileClassClash2.kt new file mode 100644 index 00000000000..f4330261cba --- /dev/null +++ b/compiler/testData/cli/jvm/fileClassAndMultifileClassClash2.kt @@ -0,0 +1,5 @@ +@file:JvmName("Util") +@file:JvmMultifileClass +package test + +public fun bar() {} diff --git a/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java index 38a03155760..51c5f0e4e6e 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/KotlincExecutableTestGenerated.java @@ -115,6 +115,12 @@ public class KotlincExecutableTestGenerated extends AbstractKotlincExecutableTes doJvmTest(fileName); } + @TestMetadata("fileClassAndMultifileClassClash.args") + public void testFileClassAndMultifileClassClash() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/cli/jvm/fileClassAndMultifileClassClash.args"); + doJvmTest(fileName); + } + @TestMetadata("fileClassAndTImplClash.args") public void testFileClassAndTImplClash() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/cli/jvm/fileClassAndTImplClash.args");