[FIR] Don't report duplicated errors in function calls typeRefs

This commit is contained in:
Nick
2020-07-29 15:19:36 +03:00
committed by Mikhail Glukhikh
parent 6f85a07290
commit 4ceae8dc5e
10 changed files with 35 additions and 17 deletions
@@ -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.FirDiagnostic
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirBreakExpression
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.expressions.*
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.SessionHolder
import org.jetbrains.kotlin.fir.resolve.collectImplicitReceivers
@@ -71,6 +68,27 @@ abstract class AbstractDiagnosticCollector(
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) {
loopJump.runComponents()
loopJump.acceptChildren(this)
@@ -20,7 +20,7 @@ val x = object<T, K: Comparable<K>> {
fun case_4() {
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
@@ -20,7 +20,7 @@ val x = object<T, K: Comparable<K>> {
fun case_4() {
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
@@ -23,7 +23,7 @@ object DefaultHttpClientWithFun : HttpClient by fClient() {
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()
null!!
}
@@ -1,6 +1,6 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
data class A(val i: Int, val j: <!UNRESOLVED_REFERENCE, 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 A(val i: Int, val j: <!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) {
@@ -7,14 +7,14 @@ open class Outer<X, Y> {
class Derived : Outer<String, Int>() {
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 B : Outer<Float, Long>() {
fun bar(): Inner<String> = null!!
fun x(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>Alias<String><!> = null!!
fun x(): <!UNRESOLVED_REFERENCE!>Alias<String><!> = null!!
}
}
@@ -15,7 +15,7 @@ private fun <E> foobar() = {
class Derived : LocalOuter<Double, Short>() {
fun foo(): LocalInner<Long> = null!!
fun bar(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LocalAlias<Char><!> = null!!
fun bar(): <!UNRESOLVED_REFERENCE!>LocalAlias<Char><!> = null!!
}
Derived()
@@ -32,7 +32,7 @@ private fun noParameters() = {
class Derived2 : LocalOuter2<Double, Short>() {
fun foo(): LocalInner2<Long> = null!!
fun bar(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LocalAlias2<Char><!> = null!!
fun bar(): <!UNRESOLVED_REFERENCE!>LocalAlias2<Char><!> = null!!
}
Derived2()
@@ -17,7 +17,7 @@ class Outer<T> {
class Derived : LocalOuter<Double, Short>() {
fun foo(): LocalInner<Long> = null!!
fun bar(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LocalAlias<Char><!> = null!!
fun bar(): <!UNRESOLVED_REFERENCE!>LocalAlias<Char><!> = null!!
}
Derived()
@@ -34,7 +34,7 @@ class Outer<T> {
class Derived2 : LocalOuter2<Double, Short>() {
fun foo(): LocalInner2<Long> = null!!
fun bar(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LocalAlias2<Char><!> = null!!
fun bar(): <!UNRESOLVED_REFERENCE!>LocalAlias2<Char><!> = null!!
}
Derived2()
}
@@ -10,7 +10,7 @@ open class BaseDerived2<X> : BaseDerived1<String, X>()
class Derived : BaseDerived2<Int>() {
fun foo(): Inner<Char> = null!!
fun baz(): <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>Alias<Char><!> = null!!
fun baz(): <!UNRESOLVED_REFERENCE!>Alias<Char><!> = null!!
}
fun foo() {
@@ -8,7 +8,7 @@ fun <T> foo() {
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>
val b: <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>LLT<!> = a