Fix AssertionError on property generation in multi-file classes
See 4a533168d9 for the original change which
introduced the problem
Note that the added test case _was not failing_ before the change. It's added
because there were no tests on multi-file class behavior in light classes mode
at all. The actual repro for the problem is difficult to make a test from
#KT-12755 Fixed
This commit is contained in:
@@ -120,7 +120,6 @@ public class PropertyCodegen {
|
|||||||
assert kind == OwnerKind.PACKAGE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.DEFAULT_IMPLS
|
assert kind == OwnerKind.PACKAGE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.DEFAULT_IMPLS
|
||||||
: "Generating property with a wrong kind (" + kind + "): " + descriptor;
|
: "Generating property with a wrong kind (" + kind + "): " + descriptor;
|
||||||
|
|
||||||
assert declaration != null : "Declaration is null: " + descriptor + " (context=" + context + ")";
|
|
||||||
genBackingFieldAndAnnotations(declaration, descriptor, false);
|
genBackingFieldAndAnnotations(declaration, descriptor, false);
|
||||||
|
|
||||||
if (isAccessorNeeded(declaration, descriptor, getter)) {
|
if (isAccessorNeeded(declaration, descriptor, getter)) {
|
||||||
@@ -131,8 +130,10 @@ public class PropertyCodegen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void genBackingFieldAndAnnotations(@NotNull KtNamedDeclaration declaration, @NotNull PropertyDescriptor descriptor, boolean isParameter) {
|
private void genBackingFieldAndAnnotations(
|
||||||
boolean hasBackingField = hasBackingField(declaration, descriptor);
|
@Nullable KtNamedDeclaration declaration, @NotNull PropertyDescriptor descriptor, boolean isParameter
|
||||||
|
) {
|
||||||
|
boolean hasBackingField = hasBackingField(descriptor);
|
||||||
boolean hasDelegate = declaration instanceof KtProperty && ((KtProperty) declaration).hasDelegate();
|
boolean hasDelegate = declaration instanceof KtProperty && ((KtProperty) declaration).hasDelegate();
|
||||||
|
|
||||||
AnnotationSplitter annotationSplitter =
|
AnnotationSplitter annotationSplitter =
|
||||||
@@ -150,6 +151,7 @@ public class PropertyCodegen {
|
|||||||
if (isBackingFieldOwner) {
|
if (isBackingFieldOwner) {
|
||||||
Annotations fieldAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.FIELD);
|
Annotations fieldAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.FIELD);
|
||||||
Annotations delegateAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD);
|
Annotations delegateAnnotations = annotationSplitter.getAnnotationsForTarget(AnnotationUseSiteTarget.PROPERTY_DELEGATE_FIELD);
|
||||||
|
assert declaration != null : "Declaration is null: " + descriptor + " (context=" + context + ")";
|
||||||
generateBackingField(declaration, descriptor, fieldAnnotations, delegateAnnotations);
|
generateBackingField(declaration, descriptor, fieldAnnotations, delegateAnnotations);
|
||||||
generateSyntheticMethodIfNeeded(descriptor, propertyAnnotations);
|
generateSyntheticMethodIfNeeded(descriptor, propertyAnnotations);
|
||||||
}
|
}
|
||||||
@@ -239,7 +241,7 @@ public class PropertyCodegen {
|
|||||||
mv.visitEnd();
|
mv.visitEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean hasBackingField(@NotNull KtNamedDeclaration p, @NotNull PropertyDescriptor descriptor) {
|
private boolean hasBackingField(@NotNull PropertyDescriptor descriptor) {
|
||||||
return !isJvmInterface(descriptor.getContainingDeclaration()) &&
|
return !isJvmInterface(descriptor.getContainingDeclaration()) &&
|
||||||
kind != OwnerKind.DEFAULT_IMPLS &&
|
kind != OwnerKind.DEFAULT_IMPLS &&
|
||||||
!Boolean.FALSE.equals(bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, descriptor));
|
!Boolean.FALSE.equals(bindingContext.get(BindingContext.BACKING_FIELD_REQUIRED, descriptor));
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
public final class MultiFile {
|
||||||
|
public static final int getFoo() { /* compiled code */ }
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// test.MultiFile
|
||||||
|
|
||||||
|
@file:JvmMultifileClass
|
||||||
|
@file:JvmName("MultiFile")
|
||||||
|
|
||||||
|
package test
|
||||||
|
|
||||||
|
val foo = 42
|
||||||
@@ -88,6 +88,12 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultiFile.kt")
|
||||||
|
public void testMultiFile() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/MultiFile.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("SingleFile.kt")
|
@TestMetadata("SingleFile.kt")
|
||||||
public void testSingleFile() throws Exception {
|
public void testSingleFile() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/SingleFile.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/SingleFile.kt");
|
||||||
|
|||||||
+6
@@ -76,6 +76,12 @@ public class IdeCompiledLightClassTestGenerated extends AbstractIdeCompiledLight
|
|||||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/facades"), Pattern.compile("^([^\\.]+)\\.kt$"), true);
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/asJava/lightClasses/facades"), Pattern.compile("^([^\\.]+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultiFile.kt")
|
||||||
|
public void testMultiFile() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/MultiFile.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("SingleFile.kt")
|
@TestMetadata("SingleFile.kt")
|
||||||
public void testSingleFile() throws Exception {
|
public void testSingleFile() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/SingleFile.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/SingleFile.kt");
|
||||||
|
|||||||
@@ -61,6 +61,12 @@ public class IdeLightClassTestGenerated extends AbstractIdeLightClassTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("MultiFile.kt")
|
||||||
|
public void testMultiFile() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/MultiFile.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("SingleFile.kt")
|
@TestMetadata("SingleFile.kt")
|
||||||
public void testSingleFile() throws Exception {
|
public void testSingleFile() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/SingleFile.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/asJava/lightClasses/facades/SingleFile.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user