From 55cfa161c78920114c17df6416f9a7507c4508ec Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 5 Jun 2014 14:26:23 +0400 Subject: [PATCH] Report conflicting signatures that are purely inherited from traits When all signatures are inherited from traits, the origin elements lie outside of the class in question --- .../jet/codegen/state/GenerationState.java | 14 +++++++++++++- .../erasure/inheritFromTwoTraits.kt | 2 +- .../erasure/twoTraitsAndOwnFunction.kt | 13 +++++++++++++ .../duplicateJvmSignature/traitImpl/twoTraits.kt | 2 +- .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 5 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java index 9a36657ba00..cb212173320 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/GenerationState.java @@ -18,6 +18,8 @@ package org.jetbrains.jet.codegen.state; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; +import kotlin.Function1; +import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.codegen.*; @@ -37,6 +39,7 @@ import org.jetbrains.jet.lang.resolve.java.diagnostics.ConflictingJvmDeclaration import org.jetbrains.jet.lang.resolve.java.diagnostics.ErrorsJvm; import org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOrigin; import org.jetbrains.jet.lang.resolve.name.FqName; +import org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOriginKind; import java.util.Collection; import java.util.Collections; @@ -287,9 +290,18 @@ public class GenerationState { ) { Collection elements = new LinkedHashSet(); + boolean allDelegatedToTraitImpls = KotlinPackage.all( + data.getSignatureOrigins(), + new Function1() { + @Override + public Boolean invoke(JvmDeclarationOrigin origin) { + return origin.getOriginKind() == JvmDeclarationOriginKind.DELEGATION_TO_TRAIT_IMPL; + } + } + ); for (JvmDeclarationOrigin origin : data.getSignatureOrigins()) { PsiElement element = origin.getElement(); - if (element == null) { + if (element == null || allDelegatedToTraitImpls) { element = data.getClassOrigin().getElement(); } if (element != null) { diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/inheritFromTwoTraits.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/inheritFromTwoTraits.kt index 3fbb73bd8e4..8ea037951ba 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/inheritFromTwoTraits.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/inheritFromTwoTraits.kt @@ -8,5 +8,5 @@ trait Bar { fun foo(l: List) {} } -class Baz(): Foo, Bar { +class Baz(): Foo, Bar { } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt new file mode 100644 index 00000000000..fe09bc45cdf --- /dev/null +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt @@ -0,0 +1,13 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER + +trait Foo { + fun foo(l: List) {} +} + +trait Bar { + fun foo(l: List) {} +} + +class Baz(): Foo, Bar { + fun foo(l: List) {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/twoTraits.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/twoTraits.kt index 8d7b75be4bd..7f9179d9924 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/twoTraits.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/traitImpl/twoTraits.kt @@ -7,5 +7,5 @@ trait T2 { get() = 1 } -class C : T1, T2 { +class C : T1, T2 { } \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 01d9e61ecf4..b7947f3f801 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -2626,6 +2626,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/nullableType.kt"); } + @TestMetadata("twoTraitsAndOwnFunction.kt") + public void testTwoTraitsAndOwnFunction() throws Exception { + doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/twoTraitsAndOwnFunction.kt"); + } + @TestMetadata("typeMappedToJava.kt") public void testTypeMappedToJava() throws Exception { doTest("compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeMappedToJava.kt");