Make anonymous classes for callable references synthetic

#KT-28453 Fixed
This commit is contained in:
Alexander Udalov
2018-12-13 18:06:46 +01:00
parent ca4521d57d
commit c1ef89df2c
13 changed files with 61 additions and 16 deletions
@@ -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);
}
@@ -142,13 +142,14 @@ public class ClosureCodegen extends MemberCodegen<KtElement> {
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);
@@ -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,