From fc8bc52ea2710d25cd1cccbaf503e1daede5db34 Mon Sep 17 00:00:00 2001 From: svtk Date: Thu, 26 Jan 2012 15:22:16 +0400 Subject: [PATCH] KT-1141 No check that object in 'object expression' implements all abstract members of supertype --- .../jet/lang/diagnostics/Errors.java | 8 +++++-- .../jet/lang/psi/JetObjectDeclaration.java | 6 +++++ .../jet/lang/resolve/OverrideResolver.java | 3 +++ .../testData/codegen/regressions/kt940.kt | 2 ++ .../tests/declarationChecks/kt1141.jet | 22 +++++++++++++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/declarationChecks/kt1141.jet diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index aeef041bfc3..7c73081a3de 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -401,10 +401,14 @@ public interface Errors { ParameterizedDiagnosticFactory2 VAR_OVERRIDDEN_BY_VAL = new ParameterizedDiagnosticFactory2(ERROR, "Var-property {0} cannot be overridden by val-property {1}", DescriptorRenderer.TEXT); - ParameterizedDiagnosticFactory2 ABSTRACT_MEMBER_NOT_IMPLEMENTED = new ParameterizedDiagnosticFactory2(ERROR, "Class ''{0}'' must be declared abstract or implement abstract member {1}") { + ParameterizedDiagnosticFactory2 ABSTRACT_MEMBER_NOT_IMPLEMENTED = new ParameterizedDiagnosticFactory2(ERROR, "{0} must be declared abstract or implement abstract member {1}") { @Override protected String makeMessageForA(@NotNull JetClassOrObject jetClassOrObject) { - return JetPsiUtil.safeName(jetClassOrObject.getName()); + String name = jetClassOrObject.getName() != null ? " '" + jetClassOrObject.getName() + "'" : ""; + if (jetClassOrObject instanceof JetClass) { + return "Class" + name; + } + return "Object" + name; } @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java index 7c3d58de4c8..44622d90c09 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetObjectDeclaration.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lexer.JetTokens; import java.util.Collections; import java.util.List; @@ -96,4 +97,9 @@ public class JetObjectDeclaration extends JetNamedDeclaration implements JetClas public boolean isObjectLiteral() { return getNameAsDeclaration() == null; } + + @NotNull + public PsiElement getObjectKeyword() { + return findChildByType(JetTokens.OBJECT_KEYWORD); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java index 01f808db71e..0cf691552af 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -121,6 +121,9 @@ public class OverrideResolver { } else if (klass instanceof JetObjectDeclaration) { nameIdentifier = ((JetObjectDeclaration) klass).getNameIdentifier(); + if (nameIdentifier == null) { + nameIdentifier = ((JetObjectDeclaration) klass).getObjectKeyword(); + } } if (nameIdentifier == null) return; diff --git a/compiler/testData/codegen/regressions/kt940.kt b/compiler/testData/codegen/regressions/kt940.kt index 8fb239af506..a81d971ffba 100644 --- a/compiler/testData/codegen/regressions/kt940.kt +++ b/compiler/testData/codegen/regressions/kt940.kt @@ -8,6 +8,8 @@ fun box() : String { val l2 = o2?.length ?: 0 return l1 - l2 } + + override fun equals(obj: Any?): Boolean = obj === this } w.compare("aaa", "bbb") diff --git a/compiler/testData/diagnostics/tests/declarationChecks/kt1141.jet b/compiler/testData/diagnostics/tests/declarationChecks/kt1141.jet new file mode 100644 index 00000000000..21fff65631c --- /dev/null +++ b/compiler/testData/diagnostics/tests/declarationChecks/kt1141.jet @@ -0,0 +1,22 @@ +//KT-1141 No check that object in 'object expression' implements all abstract members of supertype +//+JDK + +package kt1141 + +public trait SomeTrait { + fun foo() +} + +fun foo() { + val x = object : SomeTrait { + } + x.foo() +} + +object Rr : SomeTrait {} + +class C : SomeTrait {} + +fun foo2() { + val r = object : Runnable {} //no error +} \ No newline at end of file