[FIR] Don't report duplicated errors in implicit properties / parameters
This commit is contained in:
+10
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticFactory0
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
|
import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.*
|
import org.jetbrains.kotlin.fir.diagnostics.*
|
||||||
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind.*
|
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind.*
|
||||||
@@ -41,6 +43,14 @@ class ErrorNodeDiagnosticCollectorComponent(collector: AbstractDiagnosticCollect
|
|||||||
// Implicit primary constructor uses the same type ref as the corresponding property
|
// Implicit primary constructor uses the same type ref as the corresponding property
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
is FirValueParameter -> if (lastContainingDeclaration.source?.kind is FirFakeSourceElementKind) {
|
||||||
|
// Value parameter of default setter uses the same type ref as the corresponding property
|
||||||
|
return
|
||||||
|
}
|
||||||
|
is FirProperty -> if (lastContainingDeclaration.source?.kind is FirFakeSourceElementKind) {
|
||||||
|
// Properties of implicit primary constructor uses the same type ref as the corresponding value parameter
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val source = errorTypeRef.source ?: return
|
val source = errorTypeRef.source ?: return
|
||||||
runCheck { reportFirDiagnostic(errorTypeRef.diagnostic, source, it) }
|
runCheck { reportFirDiagnostic(errorTypeRef.diagnostic, source, it) }
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ enum class Color {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MyColor(val x: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>Color.RED<!>, y: <!OTHER_ERROR!>Color.RED<!>) : <!OTHER_ERROR!>Color.RED<!> {
|
class MyColor(val x: <!OTHER_ERROR!>Color.RED<!>, y: <!OTHER_ERROR!>Color.RED<!>) : <!OTHER_ERROR!>Color.RED<!> {
|
||||||
|
|
||||||
var z: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>Color.RED<!> = Color.RED
|
var z: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>Color.RED<!> = Color.RED
|
||||||
set(arg: Color.RED) { z = arg }
|
set(arg: Color.RED) { z = arg }
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ annotation class Ann8(val p1: Array<String>,
|
|||||||
val p4: Array<Ann1>)
|
val p4: Array<Ann1>)
|
||||||
|
|
||||||
annotation class Ann9(
|
annotation class Ann9(
|
||||||
val error: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>Unresolved<!> = <!UNRESOLVED_REFERENCE!>Unresolved<!>.<!UNRESOLVED_REFERENCE!>VALUE<!>
|
val error: <!OTHER_ERROR!>Unresolved<!> = <!UNRESOLVED_REFERENCE!>Unresolved<!>.<!UNRESOLVED_REFERENCE!>VALUE<!>
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||||
data class A(val i: Int, val j: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>G<!>)
|
data class A(val i: Int, val j: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>G<!>)
|
||||||
data class B(val i: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>G<!>, val j: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>G<!>)
|
data class B(val i: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>G<!>, val j: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>G<!>)
|
||||||
|
|
||||||
|
|
||||||
fun fa(a: A) {
|
fun fa(a: A) {
|
||||||
|
|||||||
Vendored
+5
-5
@@ -12,10 +12,10 @@ inline class ULong(private val l: Long)
|
|||||||
|
|
||||||
// FILE: test.kt
|
// FILE: test.kt
|
||||||
|
|
||||||
annotation class AnnoUB(val ub0: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UByte<!>, val ub1: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UByte<!>)
|
annotation class AnnoUB(val ub0: <!OTHER_ERROR!>UByte<!>, val ub1: <!OTHER_ERROR!>UByte<!>)
|
||||||
annotation class AnnoUS(val us0: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UShort<!>, val us1: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UShort<!>)
|
annotation class AnnoUS(val us0: <!OTHER_ERROR!>UShort<!>, val us1: <!OTHER_ERROR!>UShort<!>)
|
||||||
annotation class AnnoUI(val ui0: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UInt<!>, val ui1: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UInt<!>, val ui2: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UInt<!>, val ui3: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UInt<!>)
|
annotation class AnnoUI(val ui0: <!OTHER_ERROR!>UInt<!>, val ui1: <!OTHER_ERROR!>UInt<!>, val ui2: <!OTHER_ERROR!>UInt<!>, val ui3: <!OTHER_ERROR!>UInt<!>)
|
||||||
annotation class AnnoUL(val ul0: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>ULong<!>, val ul1: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>ULong<!>)
|
annotation class AnnoUL(val ul0: <!OTHER_ERROR!>ULong<!>, val ul1: <!OTHER_ERROR!>ULong<!>)
|
||||||
|
|
||||||
const val ub0 = <!UNRESOLVED_REFERENCE!>UByte<!>(1)
|
const val ub0 = <!UNRESOLVED_REFERENCE!>UByte<!>(1)
|
||||||
const val us0 = <!UNRESOLVED_REFERENCE!>UShort<!>(2)
|
const val us0 = <!UNRESOLVED_REFERENCE!>UShort<!>(2)
|
||||||
@@ -41,4 +41,4 @@ const val explicit: <!OTHER_ERROR!>UInt<!> = <!UNRESOLVED_REFERENCE!>UInt<!>(2)
|
|||||||
|
|
||||||
const val nullable: <!OTHER_ERROR!>UInt?<!> = <!UNRESOLVED_REFERENCE!>UInt<!>(3)
|
const val nullable: <!OTHER_ERROR!>UInt?<!> = <!UNRESOLVED_REFERENCE!>UInt<!>(3)
|
||||||
|
|
||||||
annotation class NullableAnno(val u: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>UInt?<!>)
|
annotation class NullableAnno(val u: <!OTHER_ERROR!>UInt?<!>)
|
||||||
+1
-1
@@ -4,7 +4,7 @@ class Cell<TC>(val x: TC)
|
|||||||
|
|
||||||
fun <T> id(x: T): T {
|
fun <T> id(x: T): T {
|
||||||
typealias C = Cell<T>
|
typealias C = Cell<T>
|
||||||
class Local(val cell: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>C<!>)
|
class Local(val cell: <!OTHER_ERROR, OTHER_ERROR!>C<!>)
|
||||||
val cx = <!UNRESOLVED_REFERENCE!>C<!>(x)
|
val cx = <!UNRESOLVED_REFERENCE!>C<!>(x)
|
||||||
val c: <!OTHER_ERROR, OTHER_ERROR!>C<!> = Local(cx).cell
|
val c: <!OTHER_ERROR, OTHER_ERROR!>C<!> = Local(cx).cell
|
||||||
return c.<!UNRESOLVED_REFERENCE!>x<!>
|
return c.<!UNRESOLVED_REFERENCE!>x<!>
|
||||||
|
|||||||
@@ -38,10 +38,10 @@ interface Test<in I, out O, P> {
|
|||||||
var neOk22: Inv<out O>
|
var neOk22: Inv<out O>
|
||||||
var neOk23: Inv<out I>
|
var neOk23: Inv<out I>
|
||||||
|
|
||||||
var neOk30: <!OTHER_ERROR, OTHER_ERROR!>Pair<I, ><!>
|
var neOk30: <!OTHER_ERROR!>Pair<I, ><!>
|
||||||
var neOk31: <!OTHER_ERROR, OTHER_ERROR!>Pair<I, Inv><!>
|
var neOk31: <!OTHER_ERROR!>Pair<I, Inv><!>
|
||||||
var neOk32: <!OTHER_ERROR, OTHER_ERROR!>Inv<!>
|
var neOk32: <!OTHER_ERROR!>Inv<!>
|
||||||
var neOk33: Inv<<!SYNTAX!><!>>
|
var neOk33: Inv<<!SYNTAX!><!>>
|
||||||
var neOk34: <!OTHER_ERROR, OTHER_ERROR!>Inv<C><!>
|
var neOk34: <!OTHER_ERROR!>Inv<C><!>
|
||||||
var neOk35: <!WRONG_NUMBER_OF_TYPE_ARGUMENTS, WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<P, P><!>
|
var neOk35: <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<P, P><!>
|
||||||
}
|
}
|
||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
interface Inv
|
interface Inv
|
||||||
class Impl : Inv
|
class Impl : Inv
|
||||||
|
|
||||||
class Scope<InterfaceT, ImplementationT : InterfaceT>(private val implClass: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>j.Class<ImplementationT><!>) {
|
class Scope<InterfaceT, ImplementationT : InterfaceT>(private val implClass: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>j.Class<ImplementationT><!>) {
|
||||||
fun foo(c: Collection<InterfaceT>) {
|
fun foo(c: Collection<InterfaceT>) {
|
||||||
val hm = c.asSequence()
|
val hm = c.asSequence()
|
||||||
.<!INAPPLICABLE_CANDIDATE!>filter<!>(<!UNRESOLVED_REFERENCE!>implClass::isInstance<!>)
|
.<!INAPPLICABLE_CANDIDATE!>filter<!>(<!UNRESOLVED_REFERENCE!>implClass::isInstance<!>)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
data class A(val x: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>Set<CLassNotFound><!> = setOf()) {
|
data class A(val x: <!OTHER_ERROR, OTHER_ERROR, OTHER_ERROR!>Set<CLassNotFound><!> = setOf()) {
|
||||||
fun with(x: <!OTHER_ERROR, OTHER_ERROR!>Set<CLassNotFound>?<!> = null) {
|
fun with(x: <!OTHER_ERROR, OTHER_ERROR!>Set<CLassNotFound>?<!> = null) {
|
||||||
A(x ?: this.x)
|
A(x ?: this.x)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user