Name clash test for file class vs multifile class

This commit is contained in:
Dmitry Petrov
2015-09-08 17:57:17 +03:00
parent 0c951b2ed3
commit 5e38c99f81
9 changed files with 38 additions and 7 deletions
@@ -84,12 +84,15 @@ public class ClassFileFactory implements OutputFileCollection {
void done() {
if (!isDone) {
isDone = true;
Collection<PackageCodegen> values = package2codegen.values();
for (PackageCodegen codegen : values) {
Collection<PackageCodegen> 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);
}
}
@@ -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,
@@ -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)
@@ -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
}
}
@@ -0,0 +1,4 @@
$TESTDATA_DIR$/fileClassAndMultifileClassClash1.kt
$TESTDATA_DIR$/fileClassAndMultifileClassClash2.kt
-d
$TEMP_DIR$
@@ -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
@@ -0,0 +1,5 @@
@file:JvmName("Util")
// @file:JvmMultifileClass
package test
public fun foo() {}
@@ -0,0 +1,5 @@
@file:JvmName("Util")
@file:JvmMultifileClass
package test
public fun bar() {}
@@ -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");