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 97e0f6d1299..172982714bf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -230,10 +230,10 @@ public interface Errors { DiagnosticFactory2 PROPERTY_TYPE_MISMATCH_ON_OVERRIDE = DiagnosticFactory2.create(ERROR, DECLARATION_RETURN_TYPE); - DiagnosticFactory2 ABSTRACT_MEMBER_NOT_IMPLEMENTED = - DiagnosticFactory2.create(ERROR); - DiagnosticFactory2 MANY_IMPL_MEMBER_NOT_IMPLEMENTED = - DiagnosticFactory2.create(ERROR); + DiagnosticFactory2 ABSTRACT_MEMBER_NOT_IMPLEMENTED = + DiagnosticFactory2.create(ERROR, NAME_IDENTIFIER); + DiagnosticFactory2 MANY_IMPL_MEMBER_NOT_IMPLEMENTED = + DiagnosticFactory2.create(ERROR, NAME_IDENTIFIER); DiagnosticFactory1> AMBIGUOUS_ANONYMOUS_TYPE_INFERRED = DiagnosticFactory1.create(ERROR, NAMED_ELEMENT); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java index e34e6c32fe0..932fd4a4ddd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/PositioningStrategies.java @@ -98,6 +98,9 @@ public class PositioningStrategies { if (nameIdentifier != null) { return markElement(nameIdentifier); } + if (element instanceof JetObjectDeclaration) { + return markElement(((JetObjectDeclaration) element).getObjectKeyword()); + } return markElement(element); } }; @@ -157,11 +160,7 @@ public class PositioningStrategies { nameAsDeclaration.getTextRange().getStartOffset(), primaryConstructorParameterList.getTextRange().getEndOffset())); } else if (element instanceof JetObjectDeclaration) { - PsiElement nameAsDeclaration = element.getNameIdentifier(); - if (nameAsDeclaration == null) { - return markElement(((JetObjectDeclaration) element).getObjectKeyword()); - } - return markRange(nameAsDeclaration.getTextRange()); + return NAME_IDENTIFIER.mark(element); } return super.mark(element); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java index 65fd28c7898..481fba30e65 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DelegationResolver.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.Collections2; -import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; @@ -181,16 +180,11 @@ public final class DelegationResolver { return false; } - private boolean checkClashWithOtherDelegatedMember( - @NotNull Collection delegatedMembers, - @NotNull T candidate - ) { + private boolean checkClashWithOtherDelegatedMember(@NotNull Collection delegatedMembers, @NotNull T candidate) { for (CallableMemberDescriptor alreadyDelegatedMember : delegatedMembers) { if (haveSameSignatures(alreadyDelegatedMember, candidate)) { //trying to delegate to many traits with the same methods - PsiElement nameIdentifier = classOrObject.getNameIdentifier(); - PsiElement element = nameIdentifier != null ? nameIdentifier : classOrObject; - trace.report(MANY_IMPL_MEMBER_NOT_IMPLEMENTED.on(element, classOrObject, alreadyDelegatedMember)); + trace.report(MANY_IMPL_MEMBER_NOT_IMPLEMENTED.on(classOrObject, classOrObject, alreadyDelegatedMember)); return true; } } 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 3133b7f320c..81b9d63593f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/OverrideResolver.java @@ -326,24 +326,12 @@ public class OverrideResolver { Set manyImpl = Sets.newLinkedHashSet(); collectMissingImplementations(classDescriptor, abstractNoImpl, manyImpl); - PsiElement nameIdentifier = null; - if (klass instanceof JetClass) { - nameIdentifier = klass.getNameIdentifier(); - } - else if (klass instanceof JetObjectDeclaration) { - nameIdentifier = klass.getNameIdentifier(); - if (nameIdentifier == null) { - nameIdentifier = ((JetObjectDeclaration) klass).getObjectKeyword(); - } - } - if (nameIdentifier == null) return; - if (!manyImpl.isEmpty()) { - trace.report(MANY_IMPL_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, klass, manyImpl.iterator().next())); + trace.report(MANY_IMPL_MEMBER_NOT_IMPLEMENTED.on(klass, klass, manyImpl.iterator().next())); } if (classDescriptor.getModality() != Modality.ABSTRACT && !abstractNoImpl.isEmpty()) { - trace.report(ABSTRACT_MEMBER_NOT_IMPLEMENTED.on(nameIdentifier, klass, abstractNoImpl.iterator().next())); + trace.report(ABSTRACT_MEMBER_NOT_IMPLEMENTED.on(klass, klass, abstractNoImpl.iterator().next())); } } diff --git a/compiler/testData/diagnostics/tests/incompleteCode/diagnosticWithSyntaxError/funcitonTypes.kt b/compiler/testData/diagnostics/tests/incompleteCode/diagnosticWithSyntaxError/funcitonTypes.kt index a46f2233519..ab4c0f646b1 100644 --- a/compiler/testData/diagnostics/tests/incompleteCode/diagnosticWithSyntaxError/funcitonTypes.kt +++ b/compiler/testData/diagnostics/tests/incompleteCode/diagnosticWithSyntaxError/funcitonTypes.kt @@ -1 +1 @@ -class A : (categoryName: ) { \ No newline at end of file +class A : (categoryName: ) { \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/ObjectDelegationManyImpl.kt b/compiler/testData/diagnostics/tests/override/ObjectDelegationManyImpl.kt new file mode 100644 index 00000000000..8967df9c046 --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/ObjectDelegationManyImpl.kt @@ -0,0 +1,13 @@ +trait D { + fun foo() +} + +trait E { + fun foo() {} +} + +object Impl : D, E { + override fun foo() {} +} + +val obj: D = object : D by Impl, E by Impl {} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 32bd4539aa0..80c7ed55937 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -5429,6 +5429,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/override/NonGenerics.kt"); } + @TestMetadata("ObjectDelegationManyImpl.kt") + public void testObjectDelegationManyImpl() throws Exception { + doTest("compiler/testData/diagnostics/tests/override/ObjectDelegationManyImpl.kt"); + } + @TestMetadata("OverridingFinalMember.kt") public void testOverridingFinalMember() throws Exception { doTest("compiler/testData/diagnostics/tests/override/OverridingFinalMember.kt");