Warning for open members in objects

This commit is contained in:
Mikhail Glukhikh
2016-01-25 17:56:16 +03:00
parent 1b8f938260
commit d94930149b
9 changed files with 44 additions and 5 deletions
@@ -301,6 +301,9 @@ public interface Errors {
DiagnosticFactory0<KtNamedDeclaration> NON_FINAL_MEMBER_IN_FINAL_CLASS = DiagnosticFactory0.create(WARNING, modifierSetPosition(
KtTokens.OPEN_KEYWORD));
DiagnosticFactory0<KtNamedDeclaration> NON_FINAL_MEMBER_IN_OBJECT = DiagnosticFactory0.create(WARNING, modifierSetPosition(
KtTokens.OPEN_KEYWORD));
DiagnosticFactory1<KtModifierListOwner, CallableMemberDescriptor> NOTHING_TO_OVERRIDE = DiagnosticFactory1.create(ERROR, OVERRIDE_MODIFIER);
DiagnosticFactory3<KtNamedDeclaration, CallableMemberDescriptor, CallableMemberDescriptor, DeclarationDescriptor> VIRTUAL_MEMBER_HIDDEN =
@@ -249,6 +249,7 @@ public class DefaultErrorMessages {
MAP.put(FUNCTION_DECLARATION_WITH_NO_NAME, "Function declaration must have a name");
MAP.put(ANONYMOUS_FUNCTION_WITH_NAME, "Anonymous functions with names are prohibited");
MAP.put(NON_FINAL_MEMBER_IN_FINAL_CLASS, "\"open\" has no effect in a final class");
MAP.put(NON_FINAL_MEMBER_IN_OBJECT, "\"open\" has no effect in an object");
MAP.put(ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE, "An anonymous function is not allowed to specify default values for its parameters");
MAP.put(USELESS_VARARG_ON_PARAMETER, "Vararg on this parameter is useless");
@@ -310,7 +310,8 @@ class DeclarationsChecker(
}
}
private fun checkObject(declaration: KtObjectDeclaration, classDescriptor: ClassDescriptor) {
private fun checkObject(declaration: KtObjectDeclaration, classDescriptor: ClassDescriptorWithResolutionScopes) {
checkOpenMembers(classDescriptor)
if (declaration.isLocal() && !declaration.isCompanion() && !declaration.isObjectLiteral()) {
trace.report(LOCAL_OBJECT_NOT_ALLOWED.on(declaration, classDescriptor))
}
@@ -433,7 +434,12 @@ class DeclarationsChecker(
if (memberDescriptor.kind != CallableMemberDescriptor.Kind.DECLARATION) continue
val member = DescriptorToSourceUtils.descriptorToDeclaration(memberDescriptor) as? KtNamedDeclaration
if (member != null && member.hasModifier(KtTokens.OPEN_KEYWORD)) {
trace.report(NON_FINAL_MEMBER_IN_FINAL_CLASS.on(member))
if (classDescriptor.kind == ClassKind.OBJECT) {
trace.report(NON_FINAL_MEMBER_IN_OBJECT.on(member))
}
else {
trace.report(NON_FINAL_MEMBER_IN_FINAL_CLASS.on(member))
}
}
}
}
@@ -0,0 +1,9 @@
object Obj {
fun foo() {}
<!NON_FINAL_MEMBER_IN_OBJECT!>open<!> fun bar() {}
var x: Int = 0
<!NON_FINAL_MEMBER_IN_OBJECT!>open<!> var y: Int = 1
}
@@ -0,0 +1,12 @@
package
public object Obj {
private constructor Obj()
public final var x: kotlin.Int
public open var y: kotlin.Int
public open fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -18,7 +18,7 @@ object B: A() {
<!OVERRIDE_CANNOT_BE_STATIC!>@JvmStatic final override fun c()<!> {}
@JvmStatic open fun d() {}
@JvmStatic <!NON_FINAL_MEMBER_IN_OBJECT!>open<!> fun d() {}
}
class C {
@@ -30,6 +30,6 @@ class C {
@JvmStatic final override fun c() {}
@JvmStatic open fun d() {}
@JvmStatic <!NON_FINAL_MEMBER_IN_OBJECT!>open<!> fun d() {}
}
}
@@ -31,7 +31,7 @@ class A {
<!OVERRIDE_CANNOT_BE_STATIC!>@JvmStatic override val base1: Int<!> = 0
@JvmStatic open fun f() {}
@JvmStatic <!NON_FINAL_MEMBER_IN_OBJECT!>open<!> fun f() {}
override val base2: Int = 0
<!OVERRIDE_CANNOT_BE_STATIC!>@JvmStatic get<!>
@@ -11349,6 +11349,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("OpenInObject.kt")
public void testOpenInObject() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/objects/OpenInObject.kt");
doTest(fileName);
}
@TestMetadata("upperBoundViolated.kt")
public void testUpperBoundViolated() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/objects/upperBoundViolated.kt");
@@ -111,6 +111,8 @@ class QuickFixRegistrar : QuickFixContributor {
val removeOpenModifierFactory = RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OPEN_KEYWORD)
NON_FINAL_MEMBER_IN_FINAL_CLASS.registerFactory(AddModifierFix.createFactory(OPEN_KEYWORD, KtClass::class.java),
removeOpenModifierFactory)
NON_FINAL_MEMBER_IN_OBJECT.registerFactory(AddModifierFix.createFactory(OPEN_KEYWORD, KtClass::class.java),
removeOpenModifierFactory)
val removeModifierFactory = RemoveModifierFix.createRemoveModifierFactory()
GETTER_VISIBILITY_DIFFERS_FROM_PROPERTY_VISIBILITY.registerFactory(removeModifierFactory)