diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index aa725daf281..ba8bb02c4e3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -327,12 +327,12 @@ public class DescriptorResolver { return defaultVisibility; } - public static Modality getDefaultModality(DeclarationDescriptor containingDescriptor, boolean isBodyPresent) { + public static Modality getDefaultModality(DeclarationDescriptor containingDescriptor, Visibility visibility, boolean isBodyPresent) { Modality defaultModality; if (containingDescriptor instanceof ClassDescriptor) { boolean isTrait = ((ClassDescriptor) containingDescriptor).getKind() == ClassKind.TRAIT; boolean isDefinitelyAbstract = isTrait && !isBodyPresent; - Modality basicModality = isTrait ? Modality.OPEN : Modality.FINAL; + Modality basicModality = isTrait && !Visibilities.isPrivate(visibility) ? Modality.OPEN : Modality.FINAL; defaultModality = isDefinitelyAbstract ? Modality.ABSTRACT : basicModality; } else { @@ -710,10 +710,10 @@ public class DescriptorResolver { boolean isVar = property.isVar(); boolean hasBody = hasBody(property); - Modality modality = containingDeclaration instanceof ClassDescriptor - ? resolveModalityFromModifiers(property, getDefaultModality(containingDeclaration, hasBody)) - : Modality.FINAL; Visibility visibility = resolveVisibilityFromModifiers(property, getDefaultVisibility(property, containingDeclaration)); + Modality modality = containingDeclaration instanceof ClassDescriptor + ? resolveModalityFromModifiers(property, getDefaultModality(containingDeclaration, visibility, hasBody)) + : Modality.FINAL; PropertyDescriptorImpl propertyDescriptor = PropertyDescriptorImpl.create( containingDeclaration, annotationResolver.resolveAnnotationsWithoutArguments(scope, modifierList, trace), diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index b9da901ad08..8803f82e696 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -155,8 +155,8 @@ class FunctionDescriptorResolver( val returnType = function.getTypeReference()?.let { typeResolver.resolveType(innerScope, it, trace, true) } - val modality = resolveModalityFromModifiers(function, getDefaultModality(containingDescriptor, function.hasBody())) val visibility = resolveVisibilityFromModifiers(function, getDefaultVisibility(function, containingDescriptor)) + val modality = resolveModalityFromModifiers(function, getDefaultModality(containingDescriptor, visibility, function.hasBody())) functionDescriptor.initialize( receiverType, getDispatchReceiverParameterIfNeeded(containingDescriptor), diff --git a/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.txt b/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.txt index 32813664b2f..089d7936b81 100644 --- a/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.txt +++ b/compiler/testData/diagnostics/tests/delegation/Delegation_MultipleDelegates.txt @@ -1,7 +1,7 @@ package internal trait One { - private open fun boo(): kotlin.Int + private final fun boo(): kotlin.Int public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public abstract fun foo(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int @@ -9,7 +9,7 @@ internal trait One { } internal trait OneImpl : One { - invisible_fake open override /*1*/ /*fake_override*/ fun boo(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun boo(): kotlin.Int public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ fun foo(): kotlin.Int public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int @@ -18,7 +18,7 @@ internal trait OneImpl : One { internal final class Test1 : TwoImpl, OneImpl { public constructor Test1() - invisible_fake open override /*1*/ /*fake_override*/ fun boo(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun boo(): kotlin.Int public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*2*/ /*fake_override*/ fun foo(): kotlin.Int public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int @@ -27,7 +27,7 @@ internal final class Test1 : TwoImpl, OneImpl { internal final class Test2 : One, Two { public constructor Test2(/*0*/ a: One) - internal open /*delegation*/ fun boo(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun boo(): kotlin.Int public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*2*/ /*delegation*/ fun foo(): kotlin.Int public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int @@ -36,7 +36,7 @@ internal final class Test2 : One, Two { internal final class Test3 : Two, One { public constructor Test3(/*0*/ a: One, /*1*/ b: Two) - internal open /*delegation*/ fun boo(): kotlin.Int + invisible_fake final override /*1*/ /*fake_override*/ fun boo(): kotlin.Int public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*2*/ /*delegation*/ fun foo(): kotlin.Int public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int diff --git a/compiler/testData/diagnostics/tests/inline/nonVirtualMembersWithInline.txt b/compiler/testData/diagnostics/tests/inline/nonVirtualMembersWithInline.txt index 202ad8f77b7..2c8f525c1e2 100644 --- a/compiler/testData/diagnostics/tests/inline/nonVirtualMembersWithInline.txt +++ b/compiler/testData/diagnostics/tests/inline/nonVirtualMembersWithInline.txt @@ -23,7 +23,7 @@ internal abstract class A { internal trait B { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - kotlin.inline() private open fun good1(): kotlin.Unit + kotlin.inline() private final fun good1(): kotlin.Unit kotlin.inline() public final fun good2(): kotlin.Unit kotlin.inline() protected final fun good3(): kotlin.Unit kotlin.inline() internal final fun good4(): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/override/AllPrivateFromSuperTypes.txt b/compiler/testData/diagnostics/tests/override/AllPrivateFromSuperTypes.txt index 71044a94e0b..0a95adc970c 100644 --- a/compiler/testData/diagnostics/tests/override/AllPrivateFromSuperTypes.txt +++ b/compiler/testData/diagnostics/tests/override/AllPrivateFromSuperTypes.txt @@ -3,7 +3,7 @@ package package test { internal trait A { - private open val a: kotlin.String + private final val a: kotlin.String public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String