diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 194773fd18c..dc275c889fd 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -435,6 +435,11 @@ public class AsmUtil { return InlineUtil.isInlineOrContainingInline(descriptor.getContainingDeclaration()) ? ACC_PUBLIC : NO_FLAG_PACKAGE_PRIVATE; } + public static int getSyntheticAccessFlagForLambdaClass(@NotNull ClassDescriptor descriptor) { + return descriptor instanceof SyntheticClassDescriptorForLambda && + ((SyntheticClassDescriptorForLambda) descriptor).isCallableReference() ? ACC_SYNTHETIC : 0; + } + public static int calculateInnerClassAccessFlags(@NotNull ClassDescriptor innerClass) { int visibility = innerClass instanceof SyntheticClassDescriptorForLambda @@ -443,6 +448,7 @@ public class AsmUtil { ? ACC_PUBLIC : getVisibilityAccessFlag(innerClass); return visibility | + getSyntheticAccessFlagForLambdaClass(innerClass) | innerAccessFlagsForModalityAndKind(innerClass) | (innerClass.isInner() ? 0 : ACC_STATIC); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java index 118e6d4ebfc..68ea4e2a7ce 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClosureCodegen.java @@ -142,13 +142,14 @@ public class ClosureCodegen extends MemberCodegen { sw.writeInterfaceEnd(); } - v.defineClass(element, - state.getClassFileVersion(), - ACC_FINAL | ACC_SUPER | visibilityFlag, - asmType.getInternalName(), - sw.makeJavaGenericSignature(), - superClassAsmType.getInternalName(), - superInterfaceAsmTypes + v.defineClass( + element, + state.getClassFileVersion(), + ACC_FINAL | ACC_SUPER | visibilityFlag | getSyntheticAccessFlagForLambdaClass(classDescriptor), + asmType.getInternalName(), + sw.makeJavaGenericSignature(), + superClassAsmType.getInternalName(), + superInterfaceAsmTypes ); initDefaultSourceMappingIfNeeded(context, this, state); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index 4d1e64efdde..fdf5057d47b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -92,7 +92,9 @@ class PropertyReferenceCodegen( v.defineClass( element, state.classFileVersion, - ACC_FINAL or ACC_SUPER or AsmUtil.getVisibilityAccessFlagForClass(classDescriptor), + ACC_FINAL or ACC_SUPER or + AsmUtil.getVisibilityAccessFlagForClass(classDescriptor) or + AsmUtil.getSyntheticAccessFlagForLambdaClass(classDescriptor), asmType.internalName, null, superAsmType.internalName, diff --git a/compiler/testData/codegen/box/callableReference/classesAreSynthetic.kt b/compiler/testData/codegen/box/callableReference/classesAreSynthetic.kt new file mode 100644 index 00000000000..ce7189625b0 --- /dev/null +++ b/compiler/testData/codegen/box/callableReference/classesAreSynthetic.kt @@ -0,0 +1,20 @@ +// TARGET_BACKEND: JVM +// IGNORE_BACKEND: JVM_IR +// WITH_RUNTIME + +class C { + fun f() {} + val r = 0 +} + +fun check(c: Class<*>) { + if (!c.isSynthetic) throw AssertionError("Fail: $c is not synthetic: ${c.modifiers}") +} + +fun box(): String { + check(C::f.javaClass) + check(C::r.javaClass) + check(C()::f.javaClass) + check(C()::r.javaClass) + return "OK" +} diff --git a/compiler/testData/codegen/bytecodeListing/noReceiverInCallableReferenceClasses.txt b/compiler/testData/codegen/bytecodeListing/noReceiverInCallableReferenceClasses.txt index c0694e36ebd..804d7697387 100644 --- a/compiler/testData/codegen/bytecodeListing/noReceiverInCallableReferenceClasses.txt +++ b/compiler/testData/codegen/bytecodeListing/noReceiverInCallableReferenceClasses.txt @@ -7,7 +7,7 @@ public final class A { } @kotlin.Metadata -final class NoReceiverInCallableReferenceClassesKt$A_bar$1 { +synthetic final class NoReceiverInCallableReferenceClassesKt$A_bar$1 { public final static field INSTANCE: kotlin.reflect.KProperty1 static method (): void method (): void @@ -18,7 +18,7 @@ final class NoReceiverInCallableReferenceClassesKt$A_bar$1 { } @kotlin.Metadata -final class NoReceiverInCallableReferenceClassesKt$A_foo$1 { +synthetic final class NoReceiverInCallableReferenceClassesKt$A_foo$1 { public final static field INSTANCE: NoReceiverInCallableReferenceClassesKt$A_foo$1 inner class NoReceiverInCallableReferenceClassesKt$A_foo$1 static method (): void @@ -31,7 +31,7 @@ final class NoReceiverInCallableReferenceClassesKt$A_foo$1 { } @kotlin.Metadata -final class NoReceiverInCallableReferenceClassesKt$aBar$1 { +synthetic final class NoReceiverInCallableReferenceClassesKt$aBar$1 { method (p0: A): void public @org.jetbrains.annotations.Nullable method get(): java.lang.Object public method getName(): java.lang.String @@ -40,7 +40,7 @@ final class NoReceiverInCallableReferenceClassesKt$aBar$1 { } @kotlin.Metadata -final class NoReceiverInCallableReferenceClassesKt$aFoo$1 { +synthetic final class NoReceiverInCallableReferenceClassesKt$aFoo$1 { inner class NoReceiverInCallableReferenceClassesKt$aFoo$1 method (p0: A): void public final method getName(): java.lang.String diff --git a/compiler/testData/writeFlags/callableReference/visibility/functionReference.kt b/compiler/testData/writeFlags/callableReference/visibility/functionReference.kt index 6ff451d264e..bae66e6de6c 100644 --- a/compiler/testData/writeFlags/callableReference/visibility/functionReference.kt +++ b/compiler/testData/writeFlags/callableReference/visibility/functionReference.kt @@ -6,4 +6,4 @@ class A { // TESTED_OBJECT_KIND: class // TESTED_OBJECTS: A$bar$1 -// FLAGS: ACC_FINAL, ACC_SUPER +// FLAGS: ACC_FINAL, ACC_SUPER, ACC_SYNTHETIC diff --git a/compiler/testData/writeFlags/callableReference/visibility/functionReferenceInInlineFunction.kt b/compiler/testData/writeFlags/callableReference/visibility/functionReferenceInInlineFunction.kt index ac3186c0552..5c706fde3f7 100644 --- a/compiler/testData/writeFlags/callableReference/visibility/functionReferenceInInlineFunction.kt +++ b/compiler/testData/writeFlags/callableReference/visibility/functionReferenceInInlineFunction.kt @@ -6,4 +6,4 @@ class A { // TESTED_OBJECT_KIND: class // TESTED_OBJECTS: A$bar$1 -// FLAGS: ACC_FINAL, ACC_PUBLIC, ACC_SUPER +// FLAGS: ACC_FINAL, ACC_PUBLIC, ACC_SUPER, ACC_SYNTHETIC diff --git a/compiler/testData/writeFlags/callableReference/visibility/propertyReference.kt b/compiler/testData/writeFlags/callableReference/visibility/propertyReference.kt index 8f737e2a173..eeab284fba0 100644 --- a/compiler/testData/writeFlags/callableReference/visibility/propertyReference.kt +++ b/compiler/testData/writeFlags/callableReference/visibility/propertyReference.kt @@ -6,4 +6,4 @@ class A { // TESTED_OBJECT_KIND: class // TESTED_OBJECTS: A$bar$1 -// FLAGS: ACC_FINAL, ACC_SUPER +// FLAGS: ACC_FINAL, ACC_SUPER, ACC_SYNTHETIC diff --git a/compiler/testData/writeFlags/callableReference/visibility/propertyReferenceInInlineFunction.kt b/compiler/testData/writeFlags/callableReference/visibility/propertyReferenceInInlineFunction.kt index 261fa973e3e..e61f47a5710 100644 --- a/compiler/testData/writeFlags/callableReference/visibility/propertyReferenceInInlineFunction.kt +++ b/compiler/testData/writeFlags/callableReference/visibility/propertyReferenceInInlineFunction.kt @@ -6,4 +6,4 @@ class A { // TESTED_OBJECT_KIND: class // TESTED_OBJECTS: A$bar$1 -// FLAGS: ACC_FINAL, ACC_PUBLIC, ACC_SUPER +// FLAGS: ACC_FINAL, ACC_PUBLIC, ACC_SUPER, ACC_SYNTHETIC diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 8b9a2e88208..6998669dfef 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -1744,6 +1744,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("classesAreSynthetic.kt") + public void testClassesAreSynthetic() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/classesAreSynthetic.kt"); + } + @TestMetadata("compiler/testData/codegen/box/callableReference/bound") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 8b01e27ce8e..e8ab7b6ab80 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -1744,6 +1744,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("classesAreSynthetic.kt") + public void testClassesAreSynthetic() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/classesAreSynthetic.kt"); + } + @TestMetadata("compiler/testData/codegen/box/callableReference/bound") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 0aa0abda80c..e131642a1e4 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -1744,6 +1744,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/callableReference"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true); } + @TestMetadata("classesAreSynthetic.kt") + public void testClassesAreSynthetic() throws Exception { + runTest("compiler/testData/codegen/box/callableReference/classesAreSynthetic.kt"); + } + @TestMetadata("compiler/testData/codegen/box/callableReference/bound") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/filter/KotlinSyntheticTypeComponentProvider.kt b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/filter/KotlinSyntheticTypeComponentProvider.kt index f6bc78d415d..1586d9cc102 100644 --- a/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/filter/KotlinSyntheticTypeComponentProvider.kt +++ b/idea/idea-jvm/src/org/jetbrains/kotlin/idea/debugger/filter/KotlinSyntheticTypeComponentProvider.kt @@ -33,6 +33,7 @@ class KotlinSyntheticTypeComponentProvider: SyntheticTypeComponentProvider { val typeName = containingType.name() if (!FqNameUnsafe.isValid(typeName)) return false + // TODO: this is most likely not necessary since KT-28453 is fixed, but still can be useful when debugging old compiled code if (containingType.isCallableReferenceSyntheticClass()) { return true }