From 581e163031bcd49d4d1661709301ddd4da9c7649 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Fri, 6 Mar 2015 18:37:08 +0300 Subject: [PATCH] Report warning on 'class object' --- .../org/jetbrains/kotlin/diagnostics/Errors.java | 2 ++ .../rendering/DefaultErrorMessages.java | 3 +++ .../kotlin/resolve/DeclarationsChecker.java | 7 +++++++ .../classObjects/deprecatedClassObjectSyntax.kt | 8 ++++++-- .../classObjects/deprecatedClassObjectSyntax.txt | 14 ++++++++++++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 78639a42e48..c536c082aed 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -191,6 +191,8 @@ public interface Errors { DiagnosticFactory0 MANY_DEFAULT_OBJECTS = DiagnosticFactory0.create(ERROR, DEFAULT_OBJECT); DiagnosticFactory0 DEFAULT_OBJECT_NOT_ALLOWED = DiagnosticFactory0.create(ERROR, DEFAULT_OBJECT); + DiagnosticFactory0 DEPRECATED_CLASS_OBJECT_SYNTAX = DiagnosticFactory0.create(WARNING); + // Objects DiagnosticFactory1 LOCAL_OBJECT_NOT_ALLOWED = DiagnosticFactory1.create(ERROR, DECLARATION_NAME); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index be184bceafc..35d2f3f1904 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -272,6 +272,9 @@ public class DefaultErrorMessages { MAP.put(MANY_DEFAULT_OBJECTS, "Only one default object is allowed per class"); MAP.put(DEFAULT_OBJECT_NOT_ALLOWED, "A default object is not allowed here"); + + MAP.put(DEPRECATED_CLASS_OBJECT_SYNTAX, "'class object' syntax for default objects was deprecated. Use 'default' modifier instead"); + MAP.put(LOCAL_OBJECT_NOT_ALLOWED, "Named object ''{0}'' is a singleton and cannot be local. Try to use anonymous object instead", NAME); MAP.put(LOCAL_ENUM_NOT_ALLOWED, "Enum class ''{0}'' cannot be local", NAME); MAP.put(DELEGATION_IN_TRAIT, "Traits cannot use delegation"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java index d55086688b4..47440bd99a8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.java @@ -256,12 +256,19 @@ public class DeclarationsChecker { } private void checkObject(JetObjectDeclaration declaration, ClassDescriptor classDescriptor) { + checkDeprecatedClassObjectSyntax(declaration); reportErrorIfHasIllegalModifier(declaration); if (declaration.isLocal() && !declaration.isDefault() && !declaration.isObjectLiteral()) { trace.report(LOCAL_OBJECT_NOT_ALLOWED.on(declaration, classDescriptor)); } } + private void checkDeprecatedClassObjectSyntax(@NotNull JetObjectDeclaration declaration) { + if (declaration.getClassKeyword() != null) { + trace.report(DEPRECATED_CLASS_OBJECT_SYNTAX.on(declaration)); + } + } + private void checkClass(BodiesResolveContext c, JetClass aClass, ClassDescriptorWithResolutionScopes classDescriptor) { checkOpenMembers(classDescriptor); checkConstructorParameters(aClass); diff --git a/compiler/testData/diagnostics/tests/classObjects/deprecatedClassObjectSyntax.kt b/compiler/testData/diagnostics/tests/classObjects/deprecatedClassObjectSyntax.kt index 30549742c0e..26b0f0e690c 100644 --- a/compiler/testData/diagnostics/tests/classObjects/deprecatedClassObjectSyntax.kt +++ b/compiler/testData/diagnostics/tests/classObjects/deprecatedClassObjectSyntax.kt @@ -1,17 +1,21 @@ trait G class A { - class object A { + class object A { } } trait B { - class object : G { + class object : G { } } +class C { + default class object +} + fun main() { A A.A diff --git a/compiler/testData/diagnostics/tests/classObjects/deprecatedClassObjectSyntax.txt b/compiler/testData/diagnostics/tests/classObjects/deprecatedClassObjectSyntax.txt index 11837eb49cb..72b5659c112 100644 --- a/compiler/testData/diagnostics/tests/classObjects/deprecatedClassObjectSyntax.txt +++ b/compiler/testData/diagnostics/tests/classObjects/deprecatedClassObjectSyntax.txt @@ -31,6 +31,20 @@ internal trait B { } } +internal final class C { + public constructor C() + 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 + + internal default object Default { + private constructor Default() + 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 + } +} + internal trait G { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int