diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/AbstractDiagnostic.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/AbstractDiagnostic.java index 7c47a636f69..8beb8866ff5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/AbstractDiagnostic.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/AbstractDiagnostic.java @@ -22,6 +22,7 @@ import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Objects; public abstract class AbstractDiagnostic implements ParametrizedDiagnostic { private final E psiElement; @@ -71,4 +72,19 @@ public abstract class AbstractDiagnostic implements Parame if (!getFactory().isValid(this)) return false; return true; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractDiagnostic that = (AbstractDiagnostic) o; + return Objects.equals(psiElement, that.psiElement) && + Objects.equals(factory, that.factory) && + severity == that.severity; + } + + @Override + public int hashCode() { + return Objects.hash(psiElement, factory, severity); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters1.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters1.java index 83a606e7a7b..2bdea063b8f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters1.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters1.java @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + public class DiagnosticWithParameters1 extends AbstractDiagnostic { private final A a; @@ -48,4 +50,18 @@ public class DiagnosticWithParameters1 extends Abstract public String toString() { return getFactory() + "(a = " + a + ")"; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DiagnosticWithParameters1 that = (DiagnosticWithParameters1) o; + return Objects.equals(a, that.a); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), a); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters2.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters2.java index 0adfa0f139b..bb4c4713e5f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters2.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters2.java @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + public class DiagnosticWithParameters2 extends AbstractDiagnostic { private final A a; private final B b; @@ -56,4 +58,19 @@ public class DiagnosticWithParameters2 extends Abstr public String toString() { return getFactory() + "(a = " + a + ", b = " + b + ")"; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DiagnosticWithParameters2 that = (DiagnosticWithParameters2) o; + return Objects.equals(a, that.a) && + Objects.equals(b, that.b); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), a, b); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters3.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters3.java index 9e9ba8b6da5..021da0e06bf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters3.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticWithParameters3.java @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.diagnostics; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + public class DiagnosticWithParameters3 extends AbstractDiagnostic { private final A a; private final B b; @@ -64,4 +66,20 @@ public class DiagnosticWithParameters3 extends Ab public String toString() { return getFactory() + "(a = " + a + ", b = " + b + ", c = " + c + ")"; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + DiagnosticWithParameters3 that = (DiagnosticWithParameters3) o; + return Objects.equals(a, that.a) && + Objects.equals(b, that.b) && + Objects.equals(c, that.c); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), a, b, c); + } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/7.kt b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/7.kt index b5291aa5550..a54e9cb03ae 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/7.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/contracts/analysis/smartcasts/neg/7.kt @@ -247,7 +247,7 @@ fun case_4(value_1: Any?) { case_4_2(value_1) value_1.toByte() case_4_3(value_1) - value_1.inv() + value_1.inv() } // TESTCASE NUMBER: 5 @@ -340,28 +340,28 @@ fun case_8(value_1: Any?) { value_1?.toByte() if (case_8_2(value_1)) { value_1.toByte() - if (case_8_3(value_1)) value_1.inv() + if (case_8_3(value_1)) value_1.inv() } } if (!case_8_4(value_1)) { value_1?.toByte() if (!case_8_5(value_1)) { value_1.toByte() - if (!case_8_6(value_1)) value_1.inv() + if (!case_8_6(value_1)) value_1.inv() } } if (case_8_7(value_1) == null) { value_1?.toByte() if (case_8_8(value_1) != null) { value_1.toByte() - if (case_8_9(value_1) != null) value_1.inv() + if (case_8_9(value_1) != null) value_1.inv() } } if (case_8_10(value_1) != null) { value_1?.toByte() if (case_8_11(value_1) == null) { value_1.toByte() - if (case_8_12(value_1) == null) value_1.inv() + if (case_8_12(value_1) == null) value_1.inv() } } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/16.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/16.kt index fe62b05113a..9acb43794ff 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/16.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/16.kt @@ -20,7 +20,7 @@ fun case_1(x: ClassWithCustomEquals) { val y = null if (x == y) { x - x.inv() + x.inv() } } @@ -28,7 +28,7 @@ fun case_1(x: ClassWithCustomEquals) { fun case_2(x: ClassWithCustomEquals) { if (x == null) { x - x.inv() + x.inv() } } @@ -40,7 +40,7 @@ fun case_2(x: ClassWithCustomEquals) { fun case_3(x: ClassWithCustomEquals, y: Nothing?) { if (x == y) { x - x.inv() + x.inv() } } @@ -53,7 +53,7 @@ fun case_4(x: ClassWithCustomEquals) { val y = null if (y == x) { x - x.inv() + x.inv() } } @@ -65,7 +65,7 @@ fun case_4(x: ClassWithCustomEquals) { fun case_5(x: ClassWithCustomEquals, y: Nothing?) { if (y == x) { x - x.inv() + x.inv() } } @@ -78,7 +78,7 @@ fun case_6(x: ClassWithCustomEquals) { val y = null if (x == y == true) { x - x.inv() + x.inv() } } @@ -86,7 +86,7 @@ fun case_6(x: ClassWithCustomEquals) { fun case_7(x: ClassWithCustomEquals) { if ((x != null) == false) { x - x.inv() + x.inv() } } @@ -98,7 +98,7 @@ fun case_7(x: ClassWithCustomEquals) { fun case_8(x: ClassWithCustomEquals, y: Nothing?) { if (!(y == x) == false) { x - x.inv() + x.inv() } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/2.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/2.kt index bada49abf4c..0017710c915 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/2.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/2.kt @@ -14,7 +14,7 @@ fun case_1(x: Any?) { if (x is Nothing) { x - x.inv() + x.inv() } } @@ -22,7 +22,7 @@ fun case_1(x: Any?) { fun case_2(x: Any) { if (x is Nothing) { x - x.inv() + x.inv() } } @@ -30,7 +30,7 @@ fun case_2(x: Any) { fun case_3(x: Any?) { if (x !is Nothing) else { x - x.inv() + x.inv() } } @@ -38,7 +38,7 @@ fun case_3(x: Any?) { fun case_4(x: Any) { if (x !is Nothing) else { x - x.inv() + x.inv() } } @@ -46,7 +46,7 @@ fun case_4(x: Any) { fun case_5(x: Any?) { if (!(x !is Nothing?)) { x - x?.inv() + x?.inv() } } @@ -54,7 +54,7 @@ fun case_5(x: Any?) { fun case_6(x: Any?) { if (!(x !is Nothing)) { x - x.inv() + x.inv() } } @@ -62,7 +62,7 @@ fun case_6(x: Any?) { fun case_7(x: Any) { if (!(x is Nothing)) else { x - x.inv() + x.inv() } } @@ -70,7 +70,7 @@ fun case_7(x: Any) { fun case_8(x: Any?) { if (!(x is Nothing?)) else { x - x?.inv() + x?.inv() } } @@ -78,7 +78,7 @@ fun case_8(x: Any?) { fun case_9(x: Any?) { if (!!(x !is Nothing?)) else { x - x?.inv() + x?.inv() } } @@ -86,7 +86,7 @@ fun case_9(x: Any?) { fun case_10(x: Any?) { if (!!(x !is Nothing)) else { x - x.inv() + x.inv() } } @@ -94,6 +94,6 @@ fun case_10(x: Any?) { fun case_11(x: Any?) { if (x is Nothing?) { x - x?.inv() + x?.inv() } } \ No newline at end of file diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/3.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/3.kt index 0555d75c14e..1dd67eb6210 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/3.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/neg/3.kt @@ -23,7 +23,7 @@ fun case_1(x: Nothing?) { fun case_2(x: Nothing) { if (x is Unit) { x - x.inv() + x.inv() } } @@ -71,7 +71,7 @@ fun case_7(x: Nothing) { fun case_8(x: Nothing?) { if (!(x is Int?)) else { x - x?.inv() + x?.inv() } } diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/68.kt b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/68.kt index 41d6499ef27..bd455460119 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/68.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/dfa/pos/68.kt @@ -25,7 +25,7 @@ fun case_1(x: Any?) { fun case_2(x: Any?) { (x as Nothing?)!! x - x.inv() + x.inv() } // TESTCASE NUMBER: 3 @@ -48,7 +48,7 @@ fun case_4(x: Any?) { fun case_5(x: Any?) { if (x as Nothing? is Nothing) { x - x.inv() + x.inv() } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt index 239ce479b1f..c4b90c2050a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt @@ -113,7 +113,7 @@ open class KotlinPsiChecker : Annotator, HighlightRangeExtension { protected open fun shouldSuppressUnusedParameter(parameter: KtParameter): Boolean = false fun annotateElement(element: PsiElement, holder: AnnotationHolder, diagnostics: Diagnostics) { - val diagnosticsForElement = diagnostics.forElement(element) + val diagnosticsForElement = diagnostics.forElement(element).toSet() if (element is KtNameReferenceExpression) { val unresolved = diagnostics.any { it.factory == Errors.UNRESOLVED_REFERENCE } diff --git a/idea/testData/codeInsight/outOfBlock/PropNullType_Initializer_If_Fun.kt b/idea/testData/codeInsight/outOfBlock/PropNullType_Initializer_If_Fun.kt index add933ff75a..fc8227b2a14 100644 --- a/idea/testData/codeInsight/outOfBlock/PropNullType_Initializer_If_Fun.kt +++ b/idea/testData/codeInsight/outOfBlock/PropNullType_Initializer_If_Fun.kt @@ -1,7 +1,6 @@ // OUT_OF_CODE_BLOCK: FALSE // ERROR: This variable must either have a type annotation or be initialized // ERROR: Type mismatch: inferred type is Unit but Int? was expected -// ERROR: Type mismatch: inferred type is Unit but Int? was expected val test: Int? = if (true) { fun test() {