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:
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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> {
|
||||
}
|
||||
+13
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user