From 91136ada2730dcb38086ca09cf338d6125e171c3 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 3 Jun 2014 14:00:17 +0400 Subject: [PATCH] Filtering duplicate diagnostics for package facades and package parts --- .../jet/asJava/duplicateJvmSignatureUtil.kt | 68 ++++++++++++++++--- .../functionAndProperty/trait.kt | 8 +++ .../checkers/JetPsiCheckerTestGenerated.java | 5 ++ 3 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt 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 e4ae2d6c692..b385a337d94 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 @@ -23,19 +23,25 @@ import org.jetbrains.jet.lang.psi.JetClassBody import org.jetbrains.jet.lang.psi.JetClassOrObject import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.jet.lang.psi.JetPropertyAccessor +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.* public fun getJvmSignatureDiagnostics(element: PsiElement): Diagnostics? { - var parent = element.getParent() - if (parent is JetFile) { - if (element is JetClassOrObject) { - return getDiagnosticsForNonLocalClass(element) - } - return getDiagnosticsForPackage(parent as JetFile) - } - else - if (element is JetPropertyAccessor) { - parent = parent?.getParent() + fun doGetDiagnostics(): Diagnostics? { + var parent = element.getParent() + if (parent is JetFile) { + if (element is JetClassOrObject) { + return getDiagnosticsForNonLocalClass(element) + } + return getDiagnosticsForPackage(parent as JetFile) } + else + if (element is JetPropertyAccessor) { + parent = parent?.getParent() + } + if (parent is JetClassBody) { val parentsParent = parent?.getParent() @@ -43,7 +49,47 @@ public fun getJvmSignatureDiagnostics(element: PsiElement): Diagnostics? { return getDiagnosticsForNonLocalClass(parentsParent) } } - return null + return null + } + + val result = doGetDiagnostics() + if (result == null) return null + + return object : Diagnostics by result { + + override fun forElement(psiElement: PsiElement): Collection { + + val (conflicting, other) = result.forElement(element).partition { it.getFactory() == CONFLICTING_JVM_DECLARATIONS } + + val filtered = arrayListOf() + conflicting.groupBy { + CONFLICTING_JVM_DECLARATIONS.cast(it).getA().signature + }.forEach { + val diagnostics = it.getValue() + if (diagnostics.size <= 1) { + filtered.addAll(diagnostics) + } + else { + filtered.addAll( + diagnostics.filter { + me -> + diagnostics.none { + other -> + me != other && + CONFLICTING_JVM_DECLARATIONS.cast(other).getA() higherThan CONFLICTING_JVM_DECLARATIONS.cast(me).getA() + } + } + ) + } + } + + return filtered + other + } + } +} + +private fun ConflictingJvmDeclarationsData.higherThan(other: ConflictingJvmDeclarationsData): Boolean { + return this.classOrigin.originKind == PACKAGE_FACADE && other.classOrigin.originKind == PACKAGE_PART } private fun getDiagnosticsForPackage(file: JetFile): Diagnostics? { diff --git a/idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt b/idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt new file mode 100644 index 00000000000..d4f0adf7fcf --- /dev/null +++ b/idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt @@ -0,0 +1,8 @@ +trait T { + fun foo(l: List) {} + fun foo(l: List) {} +} diff --git a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java index 31b457e8c35..35fd5b7267d 100644 --- a/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/checkers/JetPsiCheckerTestGenerated.java @@ -469,6 +469,11 @@ public class JetPsiCheckerTestGenerated extends AbstractJetPsiCheckerTest { doTest("idea/testData/checker/duplicateJvmSignature/functionAndProperty/topLevel.kt"); } + @TestMetadata("trait.kt") + public void testTrait() throws Exception { + doTest("idea/testData/checker/duplicateJvmSignature/functionAndProperty/trait.kt"); + } + } @TestMetadata("idea/testData/checker/duplicateJvmSignature/traitImpl")