[FIR] Don't report duplicated errors in function calls typeRefs
This commit is contained in:
+22
-4
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.fir.analysis.collectors.components.*
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirBreakExpression
|
import org.jetbrains.kotlin.fir.expressions.*
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirContinueExpression
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
|
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirLoopJump
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||||
import org.jetbrains.kotlin.fir.resolve.SessionHolder
|
import org.jetbrains.kotlin.fir.resolve.SessionHolder
|
||||||
import org.jetbrains.kotlin.fir.resolve.collectImplicitReceivers
|
import org.jetbrains.kotlin.fir.resolve.collectImplicitReceivers
|
||||||
@@ -71,6 +68,27 @@ abstract class AbstractDiagnosticCollector(
|
|||||||
element.acceptChildren(this)
|
element.acceptChildren(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitFunctionCall(functionCall: FirFunctionCall) {
|
||||||
|
functionCall.runComponents()
|
||||||
|
// no need to visit typeRef because if there's
|
||||||
|
// an error it should've been reported at the
|
||||||
|
// corresponding declaration
|
||||||
|
functionCall.annotations.forEach { it.accept(visitor) }
|
||||||
|
functionCall.typeArguments.forEach { it.accept(visitor) }
|
||||||
|
functionCall.explicitReceiver?.accept(visitor)
|
||||||
|
if (functionCall.dispatchReceiver !== functionCall.explicitReceiver) {
|
||||||
|
functionCall.dispatchReceiver.accept(visitor)
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
functionCall.extensionReceiver !== functionCall.explicitReceiver &&
|
||||||
|
functionCall.extensionReceiver !== functionCall.dispatchReceiver
|
||||||
|
) {
|
||||||
|
functionCall.extensionReceiver.accept(visitor)
|
||||||
|
}
|
||||||
|
functionCall.argumentList.accept(visitor)
|
||||||
|
functionCall.calleeReference.accept(visitor)
|
||||||
|
}
|
||||||
|
|
||||||
private fun visitJump(loopJump: FirLoopJump) {
|
private fun visitJump(loopJump: FirLoopJump) {
|
||||||
loopJump.runComponents()
|
loopJump.runComponents()
|
||||||
loopJump.acceptChildren(this)
|
loopJump.acceptChildren(this)
|
||||||
|
|||||||
+1
-1
@@ -20,7 +20,7 @@ val x = object<T, K: Comparable<K>> {
|
|||||||
|
|
||||||
fun case_4() {
|
fun case_4() {
|
||||||
val x = object<T> {
|
val x = object<T> {
|
||||||
fun test() = 10 as <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>T<!>
|
fun test() = 10 as <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>T<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
val y = x.test() // type y is T
|
val y = x.test() // type y is T
|
||||||
|
|||||||
Vendored
+1
-1
@@ -20,7 +20,7 @@ val x = object<T, K: Comparable<K>> {
|
|||||||
|
|
||||||
fun case_4() {
|
fun case_4() {
|
||||||
val x = object<T> {
|
val x = object<T> {
|
||||||
fun test() = 10 as <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>T<!>
|
fun test() = 10 as <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>T<!>
|
||||||
}
|
}
|
||||||
|
|
||||||
val y = x.test() // type y is T
|
val y = x.test() // type y is T
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ object DefaultHttpClientWithFun : HttpClient by fClient() {
|
|||||||
|
|
||||||
private fun fClient() = HttpClientImpl()
|
private fun fClient() = HttpClientImpl()
|
||||||
|
|
||||||
private fun <T> lazy(init: () -> T): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>kotlin.Lazy<T><!> {
|
private fun <T> lazy(init: () -> T): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>kotlin.Lazy<T><!> {
|
||||||
init()
|
init()
|
||||||
null!!
|
null!!
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||||
data class A(val i: Int, val j: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>G<!>)
|
data class A(val i: Int, val j: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>G<!>)
|
||||||
data class B(val i: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>G<!>, val j: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>G<!>)
|
data class B(val i: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>G<!>, val j: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>G<!>)
|
||||||
|
|
||||||
|
|
||||||
fun fa(a: A) {
|
fun fa(a: A) {
|
||||||
|
|||||||
Vendored
+2
-2
@@ -7,14 +7,14 @@ open class Outer<X, Y> {
|
|||||||
|
|
||||||
class Derived : Outer<String, Int>() {
|
class Derived : Outer<String, Int>() {
|
||||||
fun foo(): Inner<Char> = null!!
|
fun foo(): Inner<Char> = null!!
|
||||||
fun baz(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>Alias<Char><!> = null!!
|
fun baz(): <!UNRESOLVED_REFERENCE!>Alias<Char><!> = null!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class A : Outer<Double, Short>() {
|
class A : Outer<Double, Short>() {
|
||||||
class B : Outer<Float, Long>() {
|
class B : Outer<Float, Long>() {
|
||||||
fun bar(): Inner<String> = null!!
|
fun bar(): Inner<String> = null!!
|
||||||
fun x(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>Alias<String><!> = null!!
|
fun x(): <!UNRESOLVED_REFERENCE!>Alias<String><!> = null!!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -15,7 +15,7 @@ private fun <E> foobar() = {
|
|||||||
|
|
||||||
class Derived : LocalOuter<Double, Short>() {
|
class Derived : LocalOuter<Double, Short>() {
|
||||||
fun foo(): LocalInner<Long> = null!!
|
fun foo(): LocalInner<Long> = null!!
|
||||||
fun bar(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LocalAlias<Char><!> = null!!
|
fun bar(): <!UNRESOLVED_REFERENCE!>LocalAlias<Char><!> = null!!
|
||||||
}
|
}
|
||||||
|
|
||||||
Derived()
|
Derived()
|
||||||
@@ -32,7 +32,7 @@ private fun noParameters() = {
|
|||||||
|
|
||||||
class Derived2 : LocalOuter2<Double, Short>() {
|
class Derived2 : LocalOuter2<Double, Short>() {
|
||||||
fun foo(): LocalInner2<Long> = null!!
|
fun foo(): LocalInner2<Long> = null!!
|
||||||
fun bar(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LocalAlias2<Char><!> = null!!
|
fun bar(): <!UNRESOLVED_REFERENCE!>LocalAlias2<Char><!> = null!!
|
||||||
}
|
}
|
||||||
|
|
||||||
Derived2()
|
Derived2()
|
||||||
|
|||||||
+2
-2
@@ -17,7 +17,7 @@ class Outer<T> {
|
|||||||
|
|
||||||
class Derived : LocalOuter<Double, Short>() {
|
class Derived : LocalOuter<Double, Short>() {
|
||||||
fun foo(): LocalInner<Long> = null!!
|
fun foo(): LocalInner<Long> = null!!
|
||||||
fun bar(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LocalAlias<Char><!> = null!!
|
fun bar(): <!UNRESOLVED_REFERENCE!>LocalAlias<Char><!> = null!!
|
||||||
}
|
}
|
||||||
|
|
||||||
Derived()
|
Derived()
|
||||||
@@ -34,7 +34,7 @@ class Outer<T> {
|
|||||||
|
|
||||||
class Derived2 : LocalOuter2<Double, Short>() {
|
class Derived2 : LocalOuter2<Double, Short>() {
|
||||||
fun foo(): LocalInner2<Long> = null!!
|
fun foo(): LocalInner2<Long> = null!!
|
||||||
fun bar(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LocalAlias2<Char><!> = null!!
|
fun bar(): <!UNRESOLVED_REFERENCE!>LocalAlias2<Char><!> = null!!
|
||||||
}
|
}
|
||||||
Derived2()
|
Derived2()
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ open class BaseDerived2<X> : BaseDerived1<String, X>()
|
|||||||
|
|
||||||
class Derived : BaseDerived2<Int>() {
|
class Derived : BaseDerived2<Int>() {
|
||||||
fun foo(): Inner<Char> = null!!
|
fun foo(): Inner<Char> = null!!
|
||||||
fun baz(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>Alias<Char><!> = null!!
|
fun baz(): <!UNRESOLVED_REFERENCE!>Alias<Char><!> = null!!
|
||||||
}
|
}
|
||||||
|
|
||||||
fun foo() {
|
fun foo() {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ fun <T> foo() {
|
|||||||
|
|
||||||
val a: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LT<!> = emptyList()
|
val a: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LT<!> = emptyList()
|
||||||
|
|
||||||
fun localFun(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LT<!> {
|
fun localFun(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LT<!> {
|
||||||
typealias LLT = List<T>
|
typealias LLT = List<T>
|
||||||
|
|
||||||
val b: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LLT<!> = a
|
val b: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LLT<!> = a
|
||||||
|
|||||||
Reference in New Issue
Block a user