diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index b9413298eca..93f4ec5768e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -180,9 +180,9 @@ public class AsmUtil { return new Method(name, Type.getMethodDescriptor(returnType, parameterTypes)); } - public static boolean isAbstractMethod(FunctionDescriptor functionDescriptor, OwnerKind kind, GenerationState state) { + public static boolean isAbstractMethod(FunctionDescriptor functionDescriptor, OwnerKind kind) { return (functionDescriptor.getModality() == Modality.ABSTRACT || - (isJvmInterface(functionDescriptor.getContainingDeclaration()) && !state.isJvm8TargetWithDefaults())) + (isJvmInterface(functionDescriptor.getContainingDeclaration()) && !CodegenUtilKt.hasJvmDefaultAnnotation(functionDescriptor))) && !isStaticMethod(kind, functionDescriptor); } @@ -226,7 +226,7 @@ public class AsmUtil { flags |= ACC_STATIC; } - if (isAbstractMethod(functionDescriptor, kind, state)) { + if (isAbstractMethod(functionDescriptor, kind)) { flags |= ACC_ABSTRACT; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index ef6adbb5ca1..034628b24d2 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -66,7 +66,6 @@ import java.util.*; import static org.jetbrains.kotlin.builtins.KotlinBuiltIns.isNullableAny; import static org.jetbrains.kotlin.codegen.AsmUtil.*; -import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvm8InterfaceWithDefaultsMember; import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.METHOD_FOR_FUNCTION; import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DECLARATION; import static org.jetbrains.kotlin.descriptors.ModalityKt.isOverridable; @@ -173,11 +172,7 @@ public class FunctionCodegen { ) { OwnerKind contextKind = methodContext.getContextKind(); DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration(); - if (isInterface(containingDeclaration) && - functionDescriptor.getVisibility() == Visibilities.PRIVATE && - !processInterfaceMember(functionDescriptor, contextKind, state)) { - return; - } + if (isInterface(containingDeclaration) && !processInterfaceMethod(functionDescriptor, contextKind, false)) return; boolean hasSpecialBridge = hasSpecialBridgeMethod(functionDescriptor); JvmMethodGenericSignature jvmSignature = strategy.mapMethodSignature(functionDescriptor, typeMapper, contextKind, hasSpecialBridge); @@ -220,7 +215,7 @@ public class FunctionCodegen { generateBridges(functionDescriptor); } - if (isJvm8InterfaceWithDefaultsMember(functionDescriptor, state) && contextKind != OwnerKind.DEFAULT_IMPLS && state.getGenerateDefaultImplsForJvm8()) { + if (CodegenUtilKt.hasJvmDefaultAnnotation(functionDescriptor) && contextKind != OwnerKind.DEFAULT_IMPLS && state.getGenerateDefaultImplsForJvm8()) { generateDelegateForDefaultImpl(functionDescriptor, origin.getElement()); } @@ -376,7 +371,7 @@ public class FunctionCodegen { boolean staticInCompanionObject ) { OwnerKind contextKind = methodContext.getContextKind(); - if (!state.getClassBuilderMode().generateBodies || isAbstractMethod(functionDescriptor, contextKind, state)) { + if (!state.getClassBuilderMode().generateBodies || isAbstractMethod(functionDescriptor, contextKind)) { generateLocalVariableTable( mv, jvmSignature, @@ -597,7 +592,7 @@ public class FunctionCodegen { generateFacadeDelegateMethodBody(mv, signature.getAsmMethod(), (MultifileClassFacadeContext) context.getParentContext()); methodEnd = new Label(); } - else if (OwnerKind.DEFAULT_IMPLS == context.getContextKind() && isJvm8InterfaceWithDefaultsMember(functionDescriptor, parentCodegen.state)) { + else if (OwnerKind.DEFAULT_IMPLS == context.getContextKind() && CodegenUtilKt.hasJvmDefaultAnnotation(functionDescriptor)) { int flags = AsmUtil.getMethodAsmFlags(functionDescriptor, OwnerKind.DEFAULT_IMPLS, context.getState()); assert (flags & Opcodes.ACC_ABSTRACT) == 0 : "Interface method with body should be non-abstract" + functionDescriptor; Type type = typeMapper.mapOwner(functionDescriptor); @@ -1001,7 +996,7 @@ public class FunctionCodegen { } } - if (!descriptor.getKind().isReal() && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION, state)) { + if (!descriptor.getKind().isReal() && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION)) { CallableDescriptor overridden = SpecialBuiltinMembers.getOverriddenBuiltinReflectingJvmDescriptor(descriptor); assert overridden != null; @@ -1073,7 +1068,8 @@ public class FunctionCodegen { ) { DeclarationDescriptor contextClass = owner.getContextDescriptor().getContainingDeclaration(); - if (isInterface(contextClass) && !processInterface(contextClass, kind, state)) { + if (isInterface(contextClass) && + !processInterfaceMethod(functionDescriptor, kind, true)) { return; } @@ -1330,7 +1326,7 @@ public class FunctionCodegen { iv.invokespecial(parentInternalName, delegateTo.getName(), delegateTo.getDescriptor(), false); } else { - if (isJvm8InterfaceWithDefaultsMember(descriptor, state)) { + if (CodegenUtilKt.hasJvmDefaultAnnotation(descriptor)) { iv.invokeinterface(v.getThisName(), delegateTo.getName(), delegateTo.getDescriptor()); } else { @@ -1489,20 +1485,23 @@ public class FunctionCodegen { ); } - public static boolean processInterfaceMember( - @NotNull CallableMemberDescriptor function, + public static boolean processInterfaceMethod( + @NotNull CallableMemberDescriptor memberDescriptor, @NotNull OwnerKind kind, - @NotNull GenerationState state + boolean isDefaultOrSynthetic ) { - return processInterface(function.getContainingDeclaration(), kind, state); - } + DeclarationDescriptor containingDeclaration = memberDescriptor.getContainingDeclaration(); + assert isInterface(containingDeclaration) : "'processInterfaceMethod' method should be called only for interfaces, but: " + + containingDeclaration; - public static boolean processInterface( - @NotNull DeclarationDescriptor contextClass, - @NotNull OwnerKind kind, - @NotNull GenerationState state - ) { - assert isInterface(contextClass) : "'processInterface' method should be called only for interfaces, but: " + contextClass; - return JvmCodegenUtil.isJvm8InterfaceWithDefaults(contextClass, state) ? kind != OwnerKind.DEFAULT_IMPLS : kind == OwnerKind.DEFAULT_IMPLS; + if (CodegenUtilKt.hasJvmDefaultAnnotation(memberDescriptor)) { + return kind != OwnerKind.DEFAULT_IMPLS; + } else { + switch (kind) { + case DEFAULT_IMPLS: return true; + case IMPLEMENTATION: return !Visibilities.isPrivate(memberDescriptor.getVisibility()) && !isDefaultOrSynthetic; + default: return false; + } + } } } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 7c9f68f82ab..4f527c3122a 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -216,7 +216,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @Override protected void generateDefaultImplsIfNeeded() { - if (isInterface(descriptor) && !isLocal && (!JvmCodegenUtil.isJvm8InterfaceWithDefaults(descriptor, state) || state.getGenerateDefaultImplsForJvm8())) { + if (isInterface(descriptor) && !isLocal) { Type defaultImplsType = state.getTypeMapper().mapDefaultImpls(descriptor); ClassBuilder defaultImplsBuilder = state.getFactory().newVisitor(JvmDeclarationOriginKt.DefaultImpls(myClass.getPsiOrParent(), descriptor), defaultImplsType, myClass.getContainingKtFile()); @@ -1407,21 +1407,13 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { private void generateTraitMethods() { if (isInterfaceWithoutDefaults(descriptor, state)) return; - List restrictedInheritance = new ArrayList<>(); for (Map.Entry entry : CodegenUtil.getNonPrivateTraitMethods(descriptor).entrySet()) { FunctionDescriptor interfaceFun = entry.getKey(); //skip java 8 default methods - if (!CodegenUtilKt.isDefinitelyNotDefaultImplsMethod(interfaceFun) && !isJvm8InterfaceWithDefaultsMember(interfaceFun, state)) { - if (state.isJvm8TargetWithDefaults() && !JvmCodegenUtil.isJvm8InterfaceWithDefaults(interfaceFun.getContainingDeclaration(), state)) { - restrictedInheritance.add(interfaceFun); - } - else { - generateDelegationToDefaultImpl(interfaceFun, entry.getValue()); - } + if (!CodegenUtilKt.isDefinitelyNotDefaultImplsMethod(interfaceFun) && !CodegenUtilKt.hasJvmDefaultAnnotation(interfaceFun)) { + generateDelegationToDefaultImpl(interfaceFun, entry.getValue()); } } - - CodegenUtilKt.reportTarget6InheritanceErrorIfNeeded(descriptor, myClass.getPsiOrParent(), restrictedInheritance, state); } private void generateDelegationToDefaultImpl(@NotNull FunctionDescriptor interfaceFun, @NotNull FunctionDescriptor inheritedFun) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java index f0f135de061..4655dda3ff7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/JvmCodegenUtil.java @@ -56,10 +56,13 @@ public class JvmCodegenUtil { } public static boolean isInterfaceWithoutDefaults(@NotNull DeclarationDescriptor descriptor, @NotNull GenerationState state) { - return isInterfaceWithoutDefaults(descriptor, state.isJvm8Target(), state.isJvm8TargetWithDefaults()); + return isInterfaceWithoutDefaults(descriptor, state.isJvm8Target()); } - private static boolean isInterfaceWithoutDefaults(@NotNull DeclarationDescriptor descriptor, boolean isJvm8Target, boolean isJvm8TargetWithDefaults) { + private static boolean isInterfaceWithoutDefaults( + @NotNull DeclarationDescriptor descriptor, + boolean isJvm8PlusTarget + ) { if (!DescriptorUtils.isInterface(descriptor)) return false; if (descriptor instanceof DeserializedClassDescriptor) { @@ -68,27 +71,15 @@ public class JvmCodegenUtil { KotlinJvmBinaryClass binaryClass = ((KotlinJvmBinarySourceElement) source).getBinaryClass(); assert binaryClass instanceof FileBasedKotlinClass : "KotlinJvmBinaryClass should be subclass of FileBasedKotlinClass, but " + binaryClass; - /*TODO need add some flags to compiled code*/ - return true || ((FileBasedKotlinClass) binaryClass).getClassVersion() == Opcodes.V1_6; + return ((FileBasedKotlinClass) binaryClass).getClassVersion() == Opcodes.V1_6; } } - return !isJvm8TargetWithDefaults; + //we can't determine is interface have default methods or not + //we need inspect all methods for jvm target 1.8+ + return !isJvm8PlusTarget; } - public static boolean isJvm8InterfaceWithDefaults(@NotNull DeclarationDescriptor descriptor, @NotNull GenerationState state) { - return isJvm8InterfaceWithDefaults(descriptor, state.isJvm8Target(), state.isJvm8TargetWithDefaults()); - } - - public static boolean isJvm8InterfaceWithDefaults(@NotNull DeclarationDescriptor descriptor, boolean isJvm8Target, boolean isJvm8TargetWithDefaults) { - return DescriptorUtils.isInterface(descriptor) && !isInterfaceWithoutDefaults(descriptor, isJvm8Target, isJvm8TargetWithDefaults); - } - - public static boolean isJvm8InterfaceWithDefaultsMember(@NotNull CallableMemberDescriptor descriptor, @NotNull GenerationState state) { - DeclarationDescriptor declaration = descriptor.getContainingDeclaration(); - return isJvm8InterfaceWithDefaults(declaration, state); - } - - public static boolean isNonDefaultInterfaceMember(@NotNull CallableMemberDescriptor descriptor, @NotNull GenerationState state) { + public static boolean isNonDefaultInterfaceMember(@NotNull CallableMemberDescriptor descriptor) { if (!isJvmInterface(descriptor.getContainingDeclaration())) { return false; } @@ -96,7 +87,7 @@ public class JvmCodegenUtil { return descriptor.getModality() == Modality.ABSTRACT; } - return !isJvm8InterfaceWithDefaultsMember(descriptor, state); + return !CodegenUtilKt.hasJvmDefaultAnnotation(descriptor); } public static boolean isJvmInterface(DeclarationDescriptor descriptor) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index fa0f0f89739..9ce044718f9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -63,7 +63,6 @@ import java.util.LinkedHashSet; import java.util.List; import static org.jetbrains.kotlin.codegen.AsmUtil.*; -import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvm8InterfaceWithDefaultsMember; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isNonDefaultInterfaceMember; import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtilsKt.getInlineName; import static org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED; @@ -407,7 +406,8 @@ public abstract class MemberCodegen, state: GenerationState -) { - if (!restrictedInheritance.isEmpty()) { - val groupBy = restrictedInheritance.groupBy { descriptor -> descriptor.containingDeclaration as ClassDescriptor } - - for ((key, value) in groupBy) { - state.diagnostics.report( - ErrorsJvm.TARGET6_INTERFACE_INHERITANCE.on( - classElement, classDescriptor, key, - value.joinToString(separator = "\n", prefix = "\n") { - Renderers.COMPACT.render(JvmCodegenUtil.getDirectMember(it), RenderingContext.Empty) - } - ) - ) - } - } -} - fun CallableDescriptor.isJvmStaticInObjectOrClassOrInterface(): Boolean = isJvmStaticIn { DescriptorUtils.isNonCompanionObject(it) || @@ -440,3 +423,5 @@ fun MethodNode.textifyMethodNode(): String { text.print(PrintWriter(sw)) return "$sw" } + +fun CallableMemberDescriptor.hasJvmDefaultAnnotation() = getDirectMember(this).annotations.hasAnnotation(JVM_DEFAULT_FQ_NAME) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java index 2d64a3c3966..133ecdd4cc9 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java @@ -414,7 +414,7 @@ public abstract class CodegenContext { @NotNull D descriptor, @Nullable ClassDescriptor superCallTarget, @NotNull GenerationState state) { - if (superCallTarget != null && !isNonDefaultInterfaceMember(descriptor, state)) { + if (superCallTarget != null && !isNonDefaultInterfaceMember(descriptor)) { CodegenContext afterInline = getFirstCrossInlineOrNonInlineContext(); CodegenContext c = afterInline.findParentContextWithDescriptor(superCallTarget); assert c != null : "Couldn't find a context for a super-call: " + descriptor; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java index 64f0660a8be..ed32e727954 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/KotlinTypeMapper.java @@ -83,7 +83,6 @@ public class KotlinTypeMapper { private final IncompatibleClassTracker incompatibleClassTracker; private final String moduleName; private final boolean isJvm8Target; - private final boolean isJvm8TargetWithDefaults; private final TypeMappingConfiguration typeMappingConfiguration = new TypeMappingConfiguration() { @NotNull @@ -151,7 +150,6 @@ public class KotlinTypeMapper { this.incompatibleClassTracker = incompatibleClassTracker; this.moduleName = moduleName; this.isJvm8Target = isJvm8Target; - this.isJvm8TargetWithDefaults = isJvm8TargetWithDefaults; } @NotNull @@ -730,8 +728,8 @@ public class KotlinTypeMapper { descriptor = classCallable; continue; } - else if (isSuperCall && !isJvm8TargetWithDefaults && !isInterface(descriptor.getContainingDeclaration())) { - //Don't unwrap fake overrides from class to interface cause substituted override would be implicitly generated for target 1.6 + else if (isSuperCall && !CodegenUtilKt.hasJvmDefaultAnnotation(descriptor) && !isInterface(descriptor.getContainingDeclaration())) { + //Don't unwrap fake overrides from class to interface cause substituted override would be implicitly generated return descriptor; } @@ -788,13 +786,13 @@ public class KotlinTypeMapper { baseMethodDescriptor = findBaseDeclaration(functionDescriptor).getOriginal(); ClassDescriptor ownerForDefault = (ClassDescriptor) baseMethodDescriptor.getContainingDeclaration(); ownerForDefaultImpl = - isJvmInterface(ownerForDefault) && !isJvm8InterfaceWithDefaults(ownerForDefault) ? + isJvmInterface(ownerForDefault) && !CodegenUtilKt.hasJvmDefaultAnnotation(baseMethodDescriptor) ? mapDefaultImpls(ownerForDefault) : mapClass(ownerForDefault); if (isInterface && (superCall || descriptor.getVisibility() == Visibilities.PRIVATE || isAccessor(descriptor))) { thisClass = mapClass(currentOwner); dispatchReceiverKotlinType = currentOwner.getDefaultType(); - if (declarationOwner instanceof JavaClassDescriptor || isJvm8InterfaceWithDefaults(declarationOwner)) { + if (declarationOwner instanceof JavaClassDescriptor || CodegenUtilKt.hasJvmDefaultAnnotation(declarationFunctionDescriptor)) { invokeOpcode = INVOKESPECIAL; signature = mapSignatureSkipGeneric(functionDescriptor); returnKotlinType = functionDescriptor.getReturnType(); @@ -900,11 +898,6 @@ public class KotlinTypeMapper { ); } - private boolean isJvm8InterfaceWithDefaults(@NotNull ClassDescriptor ownerForDefault) { - return isJvmInterface(ownerForDefault) && - JvmCodegenUtil.isJvm8InterfaceWithDefaults(ownerForDefault, isJvm8Target, isJvm8TargetWithDefaults); - } - public static boolean isAccessor(@Nullable CallableMemberDescriptor descriptor) { return descriptor instanceof AccessorForCallableDescriptor; } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt index 311c44e2ca0..f9b0ca5e4c7 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/BridgeLowering.kt @@ -160,7 +160,7 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass { } } - if (!descriptor.kind.isReal && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION, state)) { + if (!descriptor.kind.isReal && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION)) { descriptor.getOverriddenBuiltinReflectingJvmDescriptor() ?: error("Expect to find overridden descriptors for $descriptor") diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/bridgeInClass.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/bridgeInClass.kt index 4cda1ff96c9..f7a975ec793 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/bridgeInClass.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/bridgeInClass.kt @@ -1,7 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Test { + @kotlin.annotations.JvmDefault fun test(p: T): T { return p } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/bridgeInInterface.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/bridgeInInterface.kt index 450e27941bc..42178acbc8f 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/bridgeInInterface.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/bridgeInInterface.kt @@ -1,13 +1,16 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Test { + @kotlin.annotations.JvmDefault fun test(p: T): T { return p } } interface Test2: Test { + @kotlin.annotations.JvmDefault override fun test(p: String): String { return p + "K" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/callableReference.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/callableReference.kt new file mode 100644 index 00000000000..c44959b8b48 --- /dev/null +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/callableReference.kt @@ -0,0 +1,24 @@ +// !API_VERSION: 1.3 +// JVM_TARGET: 1.8 +// WITH_RUNTIME + +interface Test { + @kotlin.annotations.JvmDefault + fun foo(): String = "O" + + @kotlin.annotations.JvmDefault + val bar: String + get() = "K" + + fun test(): String { + return (::foo)() + (::bar)() + } +} + +class TestClass : Test { + +} + +fun box(): String { + return TestClass().test() +} diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/capturedSuperCall.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/capturedSuperCall.kt index 6dfab89d205..b1211d25476 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/capturedSuperCall.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/capturedSuperCall.kt @@ -1,7 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface IBase { + @kotlin.annotations.JvmDefault fun bar() = "OK" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/defaultArgs.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/defaultArgs.kt index 6f122836584..b8dc91931b7 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/defaultArgs.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/defaultArgs.kt @@ -1,7 +1,8 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS - +// WITH_RUNTIME interface Z { + @kotlin.annotations.JvmDefault fun test(s: String = "OK"): String { return s } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/diamond.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/diamond.kt index 6817ed96c0a..4faedef46a4 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/diamond.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/diamond.kt @@ -1,9 +1,10 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS // WITH_REFLECT // FULL_JDK interface Test { + @kotlin.annotations.JvmDefault fun test(): String { return "Test" } @@ -15,6 +16,7 @@ open class TestClass : Test { interface Test2 : Test { + @kotlin.annotations.JvmDefault override fun test(): String { return "Test2" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/kt11969.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/kt11969.kt index f33682a7ec4..cfa64a5974d 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/kt11969.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/kt11969.kt @@ -1,17 +1,23 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS // WITH_RUNTIME // IGNORE_BACKEND: JS interface Z { + + @kotlin.annotations.JvmDefault private fun privateFun() = { "OK" } + @kotlin.annotations.JvmDefault fun callPrivateFun() = privateFun() + @kotlin.annotations.JvmDefault fun publicFun() = { "OK" } + @kotlin.annotations.JvmDefault fun funWithDefaultArgs(s: () -> Unit = {}): () -> Unit + @kotlin.annotations.JvmDefault val property: () -> Unit get() = {} diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243.kt index 20f0a5726ab..0edb6a448bc 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243.kt @@ -1,7 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Z { + @kotlin.annotations.JvmDefault fun test(p: T): T { return p } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243_2.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243_2.kt index c78115ffe47..a693f47c49d 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243_2.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243_2.kt @@ -1,7 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Z { + @kotlin.annotations.JvmDefault fun test(p: T): T { return p } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243_prop.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243_prop.kt index 27d8cc319e2..8ea5dd2587c 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243_prop.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/kt14243_prop.kt @@ -1,9 +1,12 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Z { + val value: T + @kotlin.annotations.JvmDefault val z: T get() = value } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInClass.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInClass.kt index 5d31e16b4a4..dba8fdea305 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInClass.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInClass.kt @@ -1,8 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS // WITH_RUNTIME // FULL_JDK interface Test { + @kotlin.annotations.JvmDefault fun test() { } } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInInterface.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInInterface.kt index bc8e629cb52..23f130f205f 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInInterface.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInInterface.kt @@ -1,8 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS // WITH_RUNTIME // FULL_JDK interface Test { + @kotlin.annotations.JvmDefault fun test() { } } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInInterface2.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInInterface2.kt index 7feafaf0992..0ed08741ae3 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInInterface2.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/noDelegation/noDelegationToDefaultMethodInInterface2.kt @@ -1,9 +1,10 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS // WITH_RUNTIME // FULL_JDK interface Test { + @kotlin.annotations.JvmDefault fun test() { } } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/oneImplementation.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/oneImplementation.kt index eb3cd929267..ebd28cd9cb5 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/oneImplementation.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/oneImplementation.kt @@ -1,10 +1,14 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME + interface KCallable { + @kotlin.annotations.JvmDefault val returnType: String } interface KCallableImpl : KCallable { + @kotlin.annotations.JvmDefault override val returnType: String get() = "OK" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/oneImplementation2.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/oneImplementation2.kt index c616545e0c8..76638b93ed6 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/oneImplementation2.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/oneImplementation2.kt @@ -1,10 +1,14 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME + interface KCallable { + @kotlin.annotations.JvmDefault val returnType: String } interface KCallableImpl : KCallable { + @kotlin.annotations.JvmDefault override val returnType: String get() = "OK" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt index 74ff04c6099..bbe239d9c4a 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt @@ -1,5 +1,5 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS // WITH_REFLECT annotation class Property(val value: String) @@ -7,6 +7,7 @@ annotation class Accessor(val value: String) interface Z { @Property("OK") + @kotlin.annotations.JvmDefault val z: String @Accessor("OK") get() = "OK" @@ -16,7 +17,7 @@ interface Z { class Test : Z fun box() : String { - val value = (Z::z.annotations.single() as Property).value + val value = Z::z.annotations.filterIsInstance().single().value if (value != "OK") return value return (Z::z.getter.annotations.single() as Accessor).value } \ No newline at end of file diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotationsCompatibility.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotationsCompatibility.kt deleted file mode 100644 index 42afca896fd..00000000000 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotationsCompatibility.kt +++ /dev/null @@ -1,24 +0,0 @@ -// JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS, +JVM.INTERFACE_COMPATIBILITY -// WITH_REFLECT - -annotation class Property(val value: String) -annotation class Accessor(val value: String) - -interface Z { - @Property("OK") - val z: String - @Accessor("OK") - get() = "OK" -} - - -class Test : Z - -fun box() : String { - val value = (Z::z.annotations.single() as Property).value - if (value != "OK") return value - val forName = Class.forName("Z\$DefaultImpls") - val annotation = forName.getDeclaredMethod("z\$annotations").getAnnotation(Property::class.java) - return annotation.value -} \ No newline at end of file diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/simpleCall.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/simpleCall.kt index 99507f77a55..88ddefb0985 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/simpleCall.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/simpleCall.kt @@ -1,7 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Test { + @kotlin.annotations.JvmDefault fun test(): String { return "OK" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/simpleProperty.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/simpleProperty.kt index 2d90bfd0258..bb1b204544c 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/simpleProperty.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/simpleProperty.kt @@ -1,7 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Z { + @kotlin.annotations.JvmDefault val z: String get() = "OK" } diff --git a/compiler/testData/codegen/java8/box/jvm8/defaults/superCall.kt b/compiler/testData/codegen/java8/box/jvm8/defaults/superCall.kt index 803f6be1412..9a5f4baba07 100644 --- a/compiler/testData/codegen/java8/box/jvm8/defaults/superCall.kt +++ b/compiler/testData/codegen/java8/box/jvm8/defaults/superCall.kt @@ -1,14 +1,16 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS - +// WITH_RUNTIME interface Test { + @kotlin.annotations.JvmDefault fun test(): String { return "OK" } } interface Test2 : Test { + @kotlin.annotations.JvmDefault override fun test(): String { return super.test() } diff --git a/compiler/testData/codegen/java8/box/mapRemove/noDefaultImpls.kt b/compiler/testData/codegen/java8/box/mapRemove/noDefaultImpls.kt index 842710f905a..c2ec96cf006 100644 --- a/compiler/testData/codegen/java8/box/mapRemove/noDefaultImpls.kt +++ b/compiler/testData/codegen/java8/box/mapRemove/noDefaultImpls.kt @@ -1,5 +1,6 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME // FULL_JDK // There should be no DefaultImpls method for MutableMap.remove(K;V) @@ -11,6 +12,7 @@ class B : A, java.util.AbstractMap() { } interface C : MutableMap { + @kotlin.annotations.JvmDefault override fun remove(key: K, value: V) = true } diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInClass.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superCall.kt similarity index 78% rename from compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInClass.kt rename to compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superCall.kt index d80713f1e46..2757b9cf496 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInClass.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superCall.kt @@ -1,13 +1,15 @@ +// !API_VERSION: 1.3 +// JVM_TARGET: 1.8 +// WITH_RUNTIME // FILE: 1.kt interface Test { + @kotlin.annotations.JvmDefault fun test(): String { return "OK" } } // FILE: 2.kt -// JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS class TestClass : Test { override fun test(): String { return super.test() diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInInterface.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superCallFromInterface.kt similarity index 62% rename from compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInInterface.kt rename to compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superCallFromInterface.kt index c20f369822d..b82523127ed 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInInterface.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superCallFromInterface.kt @@ -1,23 +1,23 @@ +// !API_VERSION: 1.3 +// JVM_TARGET: 1.8 +// WITH_RUNTIME // FILE: 1.kt interface Test { + @kotlin.annotations.JvmDefault fun test(): String { return "OK" } } // FILE: 2.kt -// JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS + interface Test2 : Test { + @kotlin.annotations.JvmDefault override fun test(): String { return super.test() } } -class TestClass : Test2 { - -} - fun box(): String { - return TestClass().test() + return object : Test2 {}.test() } diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superPropAccess.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superPropAccess.kt new file mode 100644 index 00000000000..e96eaab019e --- /dev/null +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superPropAccess.kt @@ -0,0 +1,19 @@ +// !API_VERSION: 1.3 +// JVM_TARGET: 1.8 +// WITH_RUNTIME +// FILE: 1.kt +interface Test { + @kotlin.annotations.JvmDefault + val prop: String + get() = "OK" +} + +// FILE: 2.kt +class TestClass : Test { + override val prop: String + get() = super.prop +} + +fun box(): String { + return TestClass().prop +} diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superPropAccessFromInterface.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superPropAccessFromInterface.kt new file mode 100644 index 00000000000..f69005a0320 --- /dev/null +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superPropAccessFromInterface.kt @@ -0,0 +1,20 @@ +// !API_VERSION: 1.3 +// JVM_TARGET: 1.8 +// WITH_RUNTIME +// FILE: 1.kt +interface Test { + @kotlin.annotations.JvmDefault + val prop: String + get() = "OK" +} + +// FILE: 2.kt +interface Test2 : Test { + @kotlin.annotations.JvmDefault + override val prop: String + get() = super.prop +} + +fun box(): String { + return object : Test2 {}.prop +} diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond.kt index c6445e323ec..a16e6309b7e 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond.kt @@ -1,3 +1,4 @@ +// !API_VERSION: 1.3 // FILE: 1.kt interface Test { fun test(): String { @@ -7,8 +8,9 @@ interface Test { // FILE: 2.kt // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Test2 : Test { + @kotlin.annotations.JvmDefault override fun test(): String { return super.test() } @@ -20,6 +22,7 @@ interface Test3 : Test { interface Test4 : Test2, Test3 { + @kotlin.annotations.JvmDefault override fun test(): String { return super.test() } diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond2.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond2.kt index b81bafca4ae..6f85946ea88 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond2.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond2.kt @@ -1,3 +1,4 @@ +// !API_VERSION: 1.3 // FILE: 1.kt interface Test { fun test(): String { @@ -7,7 +8,7 @@ interface Test { // FILE: 2.kt // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME open class TestClass : Test { override fun test(): String { return super.test() @@ -15,6 +16,7 @@ open class TestClass : Test { } interface Test2 : Test { + @kotlin.annotations.JvmDefault override fun test(): String } diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond3.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond3.kt index 880cb11479b..08c5302255d 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond3.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond3.kt @@ -1,3 +1,4 @@ +// !API_VERSION: 1.3 // FILE: 1.kt interface Test { fun test(): String { @@ -7,12 +8,13 @@ interface Test { // FILE: 2.kt // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME abstract class TestClass : Test { abstract override fun test(): String } interface Test2 : Test { + @kotlin.annotations.JvmDefault override fun test(): String { return "OK" } diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCall.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCall.kt index 746a9318fbd..eceedef8df0 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCall.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCall.kt @@ -8,7 +8,6 @@ interface Test { // FILE: 2.kt // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS class TestClass : Test { override fun test(): String { return super.test() diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInInterface2.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithBigHierarchy.kt similarity index 81% rename from compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInInterface2.kt rename to compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithBigHierarchy.kt index a829d1e9bbf..492685094a3 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInInterface2.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithBigHierarchy.kt @@ -1,3 +1,4 @@ +// !API_VERSION: 1.3 // FILE: 1.kt interface Test { fun test(): String { @@ -7,8 +8,9 @@ interface Test { // FILE: 2.kt // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Test2 : Test { + @kotlin.annotations.JvmDefault override fun test(): String { return super.test() } diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithHierarchy.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithHierarchy.kt index bcb7f0d0a4d..5de7ed20994 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithHierarchy.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithHierarchy.kt @@ -1,3 +1,4 @@ +// !API_VERSION: 1.3 // FILE: 1.kt interface Test { @@ -8,8 +9,9 @@ interface Test { // FILE: 2.kt // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Test2 : Test { + @kotlin.annotations.JvmDefault override fun test(): String { return super.test() } diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleProp.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleProp.kt index 5238cbc7951..ce7cdd97a93 100644 --- a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleProp.kt +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleProp.kt @@ -7,7 +7,6 @@ interface Test { // FILE: 2.kt // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS class TestClass : Test { override val test: String get() = super.test diff --git a/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simplePropWithHierarchy.kt b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simplePropWithHierarchy.kt new file mode 100644 index 00000000000..1c1cf0e679d --- /dev/null +++ b/compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simplePropWithHierarchy.kt @@ -0,0 +1,26 @@ +// !API_VERSION: 1.3 +// FILE: 1.kt + +interface Test { + val test: String + get() = "OK" +} + +// FILE: 2.kt +// JVM_TARGET: 1.8 +// WITH_RUNTIME +interface Test2 : Test { + @kotlin.annotations.JvmDefault + override val test: String + get() = super.test +} + + +class TestClass : Test2 { + +} + + +fun box(): String { + return TestClass().test +} diff --git a/compiler/testData/codegen/java8/writeFlags/defaults/defaultMethod.kt b/compiler/testData/codegen/java8/writeFlags/defaults/defaultMethod.kt index 729867e5828..0d4232e1df1 100644 --- a/compiler/testData/codegen/java8/writeFlags/defaults/defaultMethod.kt +++ b/compiler/testData/codegen/java8/writeFlags/defaults/defaultMethod.kt @@ -1,12 +1,18 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Test { + @kotlin.annotations.JvmDefault fun test(): String { return "OK" } fun testAbstract(): String + + fun testDefaultImpl() { + + } } // TESTED_OBJECT_KIND: function @@ -16,3 +22,19 @@ interface Test { // TESTED_OBJECT_KIND: function // TESTED_OBJECTS: Test, testAbstract // FLAGS: ACC_PUBLIC, ACC_ABSTRACT + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: Test, testDefaultImpl +// FLAGS: ACC_PUBLIC, ACC_ABSTRACT + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: Test$DefaultImpls, test +// ABSENT: TRUE + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: Test$DefaultImpls, testAbstract +// ABSENT: TRUE + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: Test$DefaultImpls, testDefaultImpl +// FLAGS: ACC_PUBLIC, ACC_STATIC diff --git a/compiler/testData/codegen/java8/writeFlags/defaults/defaultMethodCompatibility.kt b/compiler/testData/codegen/java8/writeFlags/defaults/defaultMethodCompatibility.kt deleted file mode 100644 index 1ff1d4bf485..00000000000 --- a/compiler/testData/codegen/java8/writeFlags/defaults/defaultMethodCompatibility.kt +++ /dev/null @@ -1,24 +0,0 @@ -// JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS, +JVM.INTERFACE_COMPATIBILITY - -interface Test { - fun test(): String { - return "OK" - } -} - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test, test -// FLAGS: ACC_PUBLIC - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test, test$defaultImpl -// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC - -// TESTED_OBJECT_KIND: class -// TESTED_OBJECTS: Test$DefaultImpls -// FLAGS: ACC_PUBLIC, ACC_FINAL, ACC_SUPER - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test$DefaultImpls, test -// FLAGS: ACC_PUBLIC, ACC_STATIC diff --git a/compiler/testData/codegen/java8/writeFlags/defaults/defaultProperty.kt b/compiler/testData/codegen/java8/writeFlags/defaults/defaultProperty.kt index 796d255c3be..aa6a6b9c841 100644 --- a/compiler/testData/codegen/java8/writeFlags/defaults/defaultProperty.kt +++ b/compiler/testData/codegen/java8/writeFlags/defaults/defaultProperty.kt @@ -1,7 +1,9 @@ +// !API_VERSION: 1.3 // JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS +// WITH_RUNTIME interface Test { + @kotlin.annotations.JvmDefault var z: String get() = "OK" set(value) {} diff --git a/compiler/testData/codegen/java8/writeFlags/defaults/defaultPropertyCompatibility.kt b/compiler/testData/codegen/java8/writeFlags/defaults/defaultPropertyCompatibility.kt deleted file mode 100644 index e77741e3219..00000000000 --- a/compiler/testData/codegen/java8/writeFlags/defaults/defaultPropertyCompatibility.kt +++ /dev/null @@ -1,37 +0,0 @@ -// JVM_TARGET: 1.8 -// KOTLIN_CONFIGURATION_FLAGS: +JVM.JVM8_TARGET_WITH_DEFAULTS, +JVM.INTERFACE_COMPATIBILITY - -interface Test { - var z: String - get() = "OK" - set(value) {} -} - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test, getZ -// FLAGS: ACC_PUBLIC - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test, setZ -// FLAGS: ACC_PUBLIC - - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test, getZ$defaultImpl -// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test, setZ$defaultImpl -// FLAGS: ACC_PUBLIC, ACC_STATIC, ACC_SYNTHETIC - -// TESTED_OBJECT_KIND: class -// TESTED_OBJECTS: Test$DefaultImpls -// FLAGS: ACC_PUBLIC, ACC_FINAL, ACC_SUPER - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test$DefaultImpls, getZ -// FLAGS: ACC_PUBLIC, ACC_STATIC - -// TESTED_OBJECT_KIND: function -// TESTED_OBJECTS: Test$DefaultImpls, setZ -// FLAGS: ACC_PUBLIC, ACC_STATIC diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java index 2be5e77faa8..f1d9dea02a2 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/BlackBoxWithJava8CodegenTestGenerated.java @@ -353,6 +353,12 @@ public class BlackBoxWithJava8CodegenTestGenerated extends AbstractBlackBoxCodeg doTest(fileName); } + @TestMetadata("callableReference.kt") + public void testCallableReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/jvm8/defaults/callableReference.kt"); + doTest(fileName); + } + @TestMetadata("capturedSuperCall.kt") public void testCapturedSuperCall() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/jvm8/defaults/capturedSuperCall.kt"); @@ -465,12 +471,6 @@ public class BlackBoxWithJava8CodegenTestGenerated extends AbstractBlackBoxCodeg String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotations.kt"); doTest(fileName); } - - @TestMetadata("propertyAnnotationsCompatibility.kt") - public void testPropertyAnnotationsCompatibility() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/box/jvm8/defaults/reflection/propertyAnnotationsCompatibility.kt"); - doTest(fileName); - } } } diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java index c047225d667..58671bd0521 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java @@ -40,6 +40,48 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl } } + @TestMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Jvm8 extends AbstractCompileKotlinAgainstKotlinTest { + public void testAllFilesPresentInJvm8() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Defaults extends AbstractCompileKotlinAgainstKotlinTest { + public void testAllFilesPresentInDefaults() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("superCall.kt") + public void testSuperCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superCall.kt"); + doTest(fileName); + } + + @TestMetadata("superCallFromInterface.kt") + public void testSuperCallFromInterface() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superCallFromInterface.kt"); + doTest(fileName); + } + + @TestMetadata("superPropAccess.kt") + public void testSuperPropAccess() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superPropAccess.kt"); + doTest(fileName); + } + + @TestMetadata("superPropAccessFromInterface.kt") + public void testSuperPropAccessFromInterface() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8/defaults/superPropAccessFromInterface.kt"); + doTest(fileName); + } + } + } + @TestMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @@ -54,6 +96,12 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl doTest(fileName); } + @TestMetadata("simpleCallWithBigHierarchy.kt") + public void testSimpleCallWithBigHierarchy() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithBigHierarchy.kt"); + doTest(fileName); + } + @TestMetadata("simpleCallWithHierarchy.kt") public void testSimpleCallWithHierarchy() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simpleCallWithHierarchy.kt"); @@ -66,6 +114,12 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl doTest(fileName); } + @TestMetadata("simplePropWithHierarchy.kt") + public void testSimplePropWithHierarchy() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/simplePropWithHierarchy.kt"); + doTest(fileName); + } + @TestMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) @@ -74,24 +128,6 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } - @TestMetadata("delegationToDefaultMethodInClass.kt") - public void testDelegationToDefaultMethodInClass() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInClass.kt"); - doTest(fileName); - } - - @TestMetadata("delegationToDefaultMethodInInterface.kt") - public void testDelegationToDefaultMethodInInterface() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInInterface.kt"); - doTest(fileName); - } - - @TestMetadata("delegationToDefaultMethodInInterface2.kt") - public void testDelegationToDefaultMethodInInterface2() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/delegationToDefaultMethodInInterface2.kt"); - doTest(fileName); - } - @TestMetadata("diamond.kt") public void testDiamond() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/compileKotlinAgainstKotlin/jvm8against6/delegation/diamond.kt"); diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java index 8819ed51911..d83beb835f7 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java @@ -51,22 +51,10 @@ public class WriteFlagsTestGenerated extends AbstractWriteFlagsTest { doTest(fileName); } - @TestMetadata("defaultMethodCompatibility.kt") - public void testDefaultMethodCompatibility() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/writeFlags/defaults/defaultMethodCompatibility.kt"); - doTest(fileName); - } - @TestMetadata("defaultProperty.kt") public void testDefaultProperty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/writeFlags/defaults/defaultProperty.kt"); doTest(fileName); } - - @TestMetadata("defaultPropertyCompatibility.kt") - public void testDefaultPropertyCompatibility() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/java8/writeFlags/defaults/defaultPropertyCompatibility.kt"); - doTest(fileName); - } } }