From f3c46341e5371862c36e962fc83b1dc6c23b33e2 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 4 Jun 2014 17:53:41 +0400 Subject: [PATCH] Filtering out duplicate signature diagnostics if CONFLICTING_OVERLOADS or REDECLARATION is present --- .../jet/asJava/duplicateJvmSignatureUtil.kt | 13 +++++++++++-- .../erasure/typeParameterWithBound.kt | 4 ++-- .../jetbrains/jet/checkers/BaseDiagnosticsTest.java | 2 +- .../highlighter/DuplicateJvmSignatureAnnotator.java | 5 ++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/duplicateJvmSignatureUtil.kt b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/duplicateJvmSignatureUtil.kt index 882fd14c1d3..cbde3b64364 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/duplicateJvmSignatureUtil.kt +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/duplicateJvmSignatureUtil.kt @@ -27,8 +27,9 @@ import org.jetbrains.jet.lang.diagnostics.Diagnostic import org.jetbrains.jet.lang.resolve.java.diagnostics.ErrorsJvm.* import org.jetbrains.jet.lang.resolve.java.diagnostics.ConflictingJvmDeclarationsData import org.jetbrains.jet.lang.resolve.java.diagnostics.JvmDeclarationOriginKind.* +import org.jetbrains.jet.lang.diagnostics.Errors.* -public fun getJvmSignatureDiagnostics(element: PsiElement): Diagnostics? { +public fun getJvmSignatureDiagnostics(element: PsiElement, otherDiagnostics: Diagnostics): Diagnostics? { fun doGetDiagnostics(): Diagnostics? { var parent = element.getParent() if (parent is JetFile) { @@ -57,9 +58,17 @@ public fun getJvmSignatureDiagnostics(element: PsiElement): Diagnostics? { return object : Diagnostics by result { - override fun forElement(psiElement: PsiElement): Collection { + private fun alreadyReported(psiElement: PsiElement): Boolean { + return otherDiagnostics.forElement(psiElement).any { it.getFactory() in setOf(CONFLICTING_OVERLOADS, REDECLARATION) } + || psiElement is JetPropertyAccessor && alreadyReported(psiElement.getParent()!!) + } + override fun forElement(psiElement: PsiElement): Collection { val (conflicting, other) = result.forElement(element).partition { it.getFactory() == CONFLICTING_JVM_DECLARATIONS } + if (alreadyReported(psiElement)) { + // CONFLICTING_OVERLOADS already reported, no need to duplicate it + return other + } val filtered = arrayListOf() conflicting.groupBy { diff --git a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeParameterWithBound.kt b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeParameterWithBound.kt index cc1d3d204dc..d66ab7c93ba 100644 --- a/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeParameterWithBound.kt +++ b/compiler/testData/diagnostics/tests/duplicateJvmSignature/erasure/typeParameterWithBound.kt @@ -2,5 +2,5 @@ trait Foo -fun foo(x: T): T {null!!} -fun foo(x: Foo): Foo {null!!} \ No newline at end of file +fun foo(x: T): T {null!!} +fun foo(x: Foo): Foo {null!!} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/BaseDiagnosticsTest.java b/compiler/tests/org/jetbrains/jet/checkers/BaseDiagnosticsTest.java index ec5e468fd2e..0a391c2be64 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/BaseDiagnosticsTest.java +++ b/compiler/tests/org/jetbrains/jet/checkers/BaseDiagnosticsTest.java @@ -317,7 +317,7 @@ public abstract class BaseDiagnosticsTest extends JetLiteFixture { Set jvmSignatureDiagnostics = new HashSet(); Collection declarations = PsiTreeUtil.findChildrenOfType(jetFile, JetDeclaration.class); for (JetDeclaration declaration : declarations) { - Diagnostics diagnostics = AsJavaPackage.getJvmSignatureDiagnostics(declaration); + Diagnostics diagnostics = AsJavaPackage.getJvmSignatureDiagnostics(declaration, bindingContext.getDiagnostics()); if (diagnostics == null) continue; jvmSignatureDiagnostics.addAll(diagnostics.forElement(declaration)); } diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/DuplicateJvmSignatureAnnotator.java b/idea/src/org/jetbrains/jet/plugin/highlighter/DuplicateJvmSignatureAnnotator.java index 448f51fcde6..df0b9dbda57 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/DuplicateJvmSignatureAnnotator.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/DuplicateJvmSignatureAnnotator.java @@ -23,8 +23,10 @@ import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.asJava.AsJavaPackage; import org.jetbrains.jet.lang.psi.JetDeclaration; +import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.Diagnostics; +import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import org.jetbrains.jet.plugin.project.TargetPlatform; import org.jetbrains.jet.plugin.project.TargetPlatformDetector; @@ -36,7 +38,8 @@ public class DuplicateJvmSignatureAnnotator implements Annotator { PsiFile file = element.getContainingFile(); if (!(file instanceof JetFile) || TargetPlatformDetector.getPlatform((JetFile) file) != TargetPlatform.JVM) return; - Diagnostics diagnostics = AsJavaPackage.getJvmSignatureDiagnostics(element); + Diagnostics otherDiagnostics = ResolvePackage.getBindingContext((JetElement) element).getDiagnostics(); + Diagnostics diagnostics = AsJavaPackage.getJvmSignatureDiagnostics(element, otherDiagnostics); if (diagnostics == null) return; JetPsiChecker.annotateElement(element, holder, diagnostics);