Name clash test for file class vs multifile class
This commit is contained in:
@@ -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,
|
||||
|
||||
+2
-2
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user