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
This commit is contained in:
Andrey Breslav
2014-06-05 14:26:23 +04:00
parent 1343e59eb9
commit 55cfa161c7
5 changed files with 33 additions and 3 deletions
@@ -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<PsiElement> elements = new LinkedHashSet<PsiElement>();
boolean allDelegatedToTraitImpls = KotlinPackage.all(
data.getSignatureOrigins(),
new Function1<JvmDeclarationOrigin, Boolean>() {
@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) {
@@ -8,5 +8,5 @@ trait Bar<T> {
fun foo(l: List<T>) {}
}
<!CONFLICTING_JVM_DECLARATIONS!>class Baz()<!>: Foo<String>, Bar<Int> {
class <!CONFLICTING_JVM_DECLARATIONS!>Baz()<!>: Foo<String>, Bar<Int> {
}
@@ -0,0 +1,13 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
trait Foo<T> {
fun foo(l: List<T>) {}
}
trait Bar<T> {
fun foo(l: List<T>) {}
}
class Baz(): Foo<String>, Bar<Int> {
<!CONFLICTING_JVM_DECLARATIONS!>fun foo(l: List<Long>)<!> {}
}
@@ -7,5 +7,5 @@ trait T2 {
get() = 1
}
<!CONFLICTING_JVM_DECLARATIONS!>class C : T1, T2<!> {
class <!CONFLICTING_JVM_DECLARATIONS!>C<!> : T1, T2 {
}
@@ -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");