[FIR] Remove duplicating diagnostics from error function calls

This commit is contained in:
Dmitriy Novozhilov
2019-11-01 11:26:12 +03:00
parent a3ae629f53
commit 528e538b2a
43 changed files with 142 additions and 135 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.componentArrayAccessor
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirEmptyDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.expressions.FirResolvable
@@ -297,7 +298,7 @@ fun <T : FirResolvable> BodyResolveComponents.typeFromCallee(access: T): FirReso
return when (val newCallee = access.calleeReference) {
is FirErrorNamedReference ->
FirErrorTypeRefImpl(access.source, newCallee.diagnostic)
FirErrorTypeRefImpl(access.source, FirEmptyDiagnostic)
is FirNamedReferenceWithCandidate -> {
typeFromSymbol(newCallee.candidateSymbol, makeNullable)
}
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirEmptyDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.FirSimpleDiagnostic
import org.jetbrains.kotlin.fir.expressions.FirErrorExpression
import org.jetbrains.kotlin.fir.expressions.FirErrorLoop
@@ -56,6 +57,7 @@ class ErrorNodeDiagnosticCollectorComponent(collector: AbstractDiagnosticCollect
is FirAmbiguityError -> FirErrors.AMBIGUITY.onSource(source, diagnostic.candidates)
is FirOperatorAmbiguityError -> FirErrors.ASSIGN_OPERATOR_AMBIGUITY.onSource(source, diagnostic.candidates)
is FirSimpleDiagnostic -> diagnostic.getFactory().onSource(source)
FirEmptyDiagnostic -> null
else -> throw IllegalArgumentException("Unsupported diagnostic type: ${diagnostic.javaClass}")
}
reporter.report(coneDiagnostic)
+4 -4
View File
@@ -8,19 +8,19 @@ fun test() {
foo(1, 2.0, true)
foo(1, third = true)
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(0, 0.0, false, "")<!>
<!INAPPLICABLE_CANDIDATE!>foo<!>()
<!INAPPLICABLE_CANDIDATE!>foo<!>(0, 0.0, false, "")
bar(1, third = true)
bar(1, 2.0, true)
bar(1, 2.0, true, "my")
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>bar<!>(1, true)<!>
<!INAPPLICABLE_CANDIDATE!>bar<!>(1, true)
baz(1)
baz(1, "my", "yours")
baz(1, z = true)
<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>baz<!>(0, "", false)<!>
<!INAPPLICABLE_CANDIDATE!>baz<!>(0, "", false)
}
+7 -7
View File
@@ -8,21 +8,21 @@ fun test() {
foo() {}
foo({})
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(1) {}<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(f = {}) {}<!>
<!INAPPLICABLE_CANDIDATE!>foo<!>(1) {}
<!INAPPLICABLE_CANDIDATE!>foo<!>(f = {}) {}
bar(1) {}
bar(x = 1) {}
bar(1, {})
bar(x = 1, f = {})
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>bar<!> {}<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>bar<!>({})<!>
<!INAPPLICABLE_CANDIDATE!>bar<!> {}
<!INAPPLICABLE_CANDIDATE!>bar<!>({})
baz(other = false, f = {})
baz({}, false)
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>baz<!> {}<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>baz<!>() {}<!>
<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>baz<!>(other = false) {}<!>
<!INAPPLICABLE_CANDIDATE!>baz<!> {}
<!INAPPLICABLE_CANDIDATE!>baz<!>() {}
<!INAPPLICABLE_CANDIDATE!>baz<!>(other = false) {}
}
+7 -7
View File
@@ -7,11 +7,11 @@ fun test() {
foo(1, second = 3.14, third = false, fourth = "!?")
foo(third = false, second = 2.71, fourth = "?!", first = 0)
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(0.0, false, 0, "")<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(1, 2.0, third = true, "")<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(second = 0.0, first = 0, fourth = "")<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(first = 0.0, second = 0, third = "", fourth = false)<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(first = 0, second = 0.0, third = false, fourth = "", first = 1)<!>
<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(0, 0.0, false, foth = "")<!>
<!INAPPLICABLE_CANDIDATE!>foo<!>()
<!INAPPLICABLE_CANDIDATE!>foo<!>(0.0, false, 0, "")
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, 2.0, third = true, "")
<!INAPPLICABLE_CANDIDATE!>foo<!>(second = 0.0, first = 0, fourth = "")
<!INAPPLICABLE_CANDIDATE!>foo<!>(first = 0.0, second = 0, third = "", fourth = false)
<!INAPPLICABLE_CANDIDATE!>foo<!>(first = 0, second = 0.0, third = false, fourth = "", first = 1)
<!INAPPLICABLE_CANDIDATE!>foo<!>(0, 0.0, false, foth = "")
}
+4 -4
View File
@@ -7,11 +7,11 @@ fun test() {
foo(1, "my", "yours")
foo(1, *arrayOf("my", "yours"))
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>("")<!>
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(1, 2)<!>
<!INAPPLICABLE_CANDIDATE!>foo<!>("")
<!INAPPLICABLE_CANDIDATE!>foo<!>(1, 2)
bar(1, z = true, y = *arrayOf("my", "yours"))
<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>bar<!>(0, z = false, y = "", y = "other")<!>
<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>bar<!>(0, "", true)<!>
<!INAPPLICABLE_CANDIDATE!>bar<!>(0, z = false, y = "", y = "other")
<!INAPPLICABLE_CANDIDATE!>bar<!>(0, "", true)
}
+6 -6
View File
@@ -1,15 +1,15 @@
@Throws(<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>IOException<!>::class, <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>ResponseParseException<!>::class)
@Throws(<!UNRESOLVED_REFERENCE!>IOException<!>::class, <!UNRESOLVED_REFERENCE!>ResponseParseException<!>::class)
fun fetchPluginReleaseDate(pluginId: PluginId, version: String, channel: String?): LocalDate? {
val url = "https://plugins.jetbrains.com/api/plugins/${pluginId.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>idString<!>}/updates?version=$version"
val url = "https://plugins.jetbrains.com/api/plugins/${pluginId.<!UNRESOLVED_REFERENCE!>idString<!>}/updates?version=$version"
val pluginDTOs: Array<PluginDTO> = try {
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>HttpRequests<!>.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>request<!>(url)<!>.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>connect<!> {
<!UNRESOLVED_REFERENCE!>HttpRequests<!>.<!UNRESOLVED_REFERENCE!>request<!>(url).<!UNRESOLVED_REFERENCE!>connect<!> {
GsonBuilder().create().fromJson(it.inputStream.reader(), Array<PluginDTO>::class.java)
}<!>
}
} catch (ioException: JsonIOException) {
throw <!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>IOException<!>(ioException)<!>
throw <!UNRESOLVED_REFERENCE!>IOException<!>(ioException)
} catch (syntaxException: JsonSyntaxException) {
throw <!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>ResponseParseException<!>("Can't parse json response", syntaxException)<!>
throw <!UNRESOLVED_REFERENCE!>ResponseParseException<!>("Can't parse json response", syntaxException)
}
}
+1 -1
View File
@@ -13,7 +13,7 @@ fun test_2(x: Int?) {
} else {
x
}
y.<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
y.<!AMBIGUITY!>inc<!>()
}
fun test_3(x: Int?) {
@@ -21,7 +21,7 @@ class Bar {
}
// NB! abc() here is resolved to member Foo.abc(), and not to extension member of Bar
fun Foo.check() = <!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!>abc() <!INAPPLICABLE_CANDIDATE!>+<!> bar()<!>
fun Foo.check() = abc() <!INAPPLICABLE_CANDIDATE!>+<!> bar()
// NB! + here is resolved to member String.plus (not to extension member above)
fun Foo.check2() = "" + bar()
@@ -41,9 +41,9 @@ fun f() {
val a = 10
val b = a
val d = ""
val c = <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>c<!>
val c = <!UNRESOLVED_REFERENCE!>c<!>
<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>abc<!>()<!>
<!UNRESOLVED_REFERENCE!>abc<!>()
fun bcd() {}
@@ -57,7 +57,7 @@ fun f() {
dcb()
}
<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>dcb<!>()<!>
<!UNRESOLVED_REFERENCE!>dcb<!>()
abc()
}
@@ -36,7 +36,7 @@ FILE: access.kt
^plus String()
}
public final fun R|Foo|.check(): <ERROR TYPE REF: Inapplicable(INAPPLICABLE): [kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus]> {
public final fun R|Foo|.check(): <ERROR TYPE REF: Empty diagnostic> {
^check this@R|/Foo|.R|/Foo.abc|().<Inapplicable(INAPPLICABLE): [kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus, kotlin/Int.plus]>#(this@R|/Bar|.R|/Bar.bar|())
}
@@ -57,7 +57,7 @@ FILE: access.kt
lval a: R|kotlin/Int| = Int(10)
lval b: R|kotlin/Int| = R|<local>/a|
lval d: R|kotlin/String| = String()
lval c: <ERROR TYPE REF: Unresolved name: c> = <Unresolved name: c>#
lval c: <ERROR TYPE REF: Empty diagnostic> = <Unresolved name: c>#
<Unresolved name: abc>#()
local final fun bcd(): R|kotlin/Unit| {
}
@@ -22,5 +22,5 @@ fun test() {
B.baz()
val x = A.D
val y = B.C
val z = B.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>D<!>
val z = B.<!UNRESOLVED_REFERENCE!>D<!>
}
@@ -47,5 +47,5 @@ FILE: companion.kt
Q|B|.R|/B.Companion.baz|()
lval x: R|kotlin/String| = Q|A|.R|/A.Companion.D|
lval y: R|kotlin/String| = Q|B|.R|/B.Companion.C|
lval z: <ERROR TYPE REF: Unresolved name: D> = Q|B|.<Unresolved name: D>#
lval z: <ERROR TYPE REF: Empty diagnostic> = Q|B|.<Unresolved name: D>#
}
@@ -7,5 +7,5 @@ fun <T : Foo> foo(t: T) = t
fun main(fooImpl: FooImpl, bar: Bar) {
val a = foo(fooImpl)
val b = <!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>(bar)<!>
val b = <!INAPPLICABLE_CANDIDATE!>foo<!>(bar)
}
@@ -18,5 +18,5 @@ FILE: typeParameters.kt
}
public final fun main(fooImpl: R|FooImpl|, bar: R|Bar|): R|kotlin/Unit| {
lval a: R|FooImpl| = R|/foo|<R|FooImpl|>(R|<local>/fooImpl|)
lval b: <ERROR TYPE REF: Inapplicable(INAPPLICABLE): [/foo]> = <Inapplicable(INAPPLICABLE): [/foo]>#(R|<local>/bar|)
lval b: <ERROR TYPE REF: Empty diagnostic> = <Inapplicable(INAPPLICABLE): [/foo]>#(R|<local>/bar|)
}
@@ -6,6 +6,6 @@ fun <T : Foo> foo(t: T) = t
fun main(fooImpl: FooImpl, fooBarImpl: FooBarImpl) {
val a = <!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!><FooImpl>(fooBarImpl)<!>
val a = <!INAPPLICABLE_CANDIDATE!>foo<!><FooImpl>(fooBarImpl)
val b = foo<Foo>(fooImpl)
}
@@ -17,6 +17,6 @@ FILE: typeParameters2.kt
^foo R|<local>/t|
}
public final fun main(fooImpl: R|FooImpl|, fooBarImpl: R|FooBarImpl|): R|kotlin/Unit| {
lval a: <ERROR TYPE REF: Inapplicable(INAPPLICABLE): [/foo]> = <Inapplicable(INAPPLICABLE): [/foo]>#<R|FooImpl|>(R|<local>/fooBarImpl|)
lval a: <ERROR TYPE REF: Empty diagnostic> = <Inapplicable(INAPPLICABLE): [/foo]>#<R|FooImpl|>(R|<local>/fooBarImpl|)
lval b: R|Foo| = R|/foo|<R|Foo|>(R|<local>/fooImpl|)
}
@@ -12,6 +12,6 @@ class Foo {
val Buz.foobar: Bar get() = Bar()
fun FooBar.chk(buz: Buz) {
buz.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foobar<!>()<!>
buz.<!UNRESOLVED_REFERENCE!>foobar<!>()
}
}
@@ -3,11 +3,11 @@ interface A {
}
fun <T> myWith(receiver: T, block: T.() -> Unit) {
receiver.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>block<!>()<!>
receiver.<!UNRESOLVED_REFERENCE!>block<!>()
}
fun <T> T.myApply(block: T.() -> Unit) {
this.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>block<!>()<!>
this.<!UNRESOLVED_REFERENCE!>block<!>()
}
fun withA(block: A.() -> Unit) {}
@@ -23,6 +23,6 @@ fun test() {
val derived = DerivedLocal()
derived.gau()
derived.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>baz<!>()<!>
derived.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
derived.<!UNRESOLVED_REFERENCE!>baz<!>()
derived.<!UNRESOLVED_REFERENCE!>foo<!>()
}
@@ -7,7 +7,7 @@ class Foo {
fun test_1() {
val f = Foo()
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>f <!UNRESOLVED_REFERENCE!>+<!> f<!>
f <!UNRESOLVED_REFERENCE!>+<!> f
}
fun test_2() {
@@ -6,7 +6,7 @@ class C {
class Nested {
fun test() {
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>err<!>()<!>
<!UNRESOLVED_REFERENCE!>err<!>()
}
}
}
@@ -17,5 +17,5 @@ fun test() {
c.bar()
val err = C()
err.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
err.<!UNRESOLVED_REFERENCE!>foo<!>()
}
+3 -3
View File
@@ -9,17 +9,17 @@ enum class Order {
enum class Planet(val m: Double, internal val r: Double) {
MERCURY(1.0, 2.0) {
override fun sayHello() {
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>println<!>("Hello!!!")<!>
<!UNRESOLVED_REFERENCE!>println<!>("Hello!!!")
}
},
VENERA(3.0, 4.0) {
override fun sayHello() {
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>println<!>("Ola!!!")<!>
<!UNRESOLVED_REFERENCE!>println<!>("Ola!!!")
}
},
EARTH(5.0, 6.0) {
override fun sayHello() {
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>println<!>("Privet!!!")<!>
<!UNRESOLVED_REFERENCE!>println<!>("Privet!!!")
}
};
+1 -1
View File
@@ -4,7 +4,7 @@ fun <T, R> List<T>.simpleMap(f: (T) -> R): R {
}
fun <T> simpleWith(t: T, f: T.() -> Unit): Unit = t.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>f<!>()<!>
fun <T> simpleWith(t: T, f: T.() -> Unit): Unit = t.<!UNRESOLVED_REFERENCE!>f<!>()
interface KMutableProperty1<T, R> : KProperty1<T, R>, KMutableProperty<R>
+3 -3
View File
@@ -23,7 +23,7 @@ class Owner {
o.foo()
foo()
this@Owner.foo()
this.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>err<!>()<!>
this.<!UNRESOLVED_REFERENCE!>err<!>()
}
}
}
@@ -31,8 +31,8 @@ class Owner {
fun test() {
val o = Owner()
o.foo()
val err = Owner.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>Inner<!>()<!>
err.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>baz<!>()<!>
val err = Owner.<!UNRESOLVED_REFERENCE!>Inner<!>()
err.<!UNRESOLVED_REFERENCE!>baz<!>()
val i = o.Inner()
i.gau()
}
+1 -1
View File
@@ -41,7 +41,7 @@ FILE: inner.kt
public final fun test(): R|kotlin/Unit| {
lval o: R|Owner| = R|/Owner.Owner|()
R|<local>/o|.R|/Owner.foo|()
lval err: <ERROR TYPE REF: Unresolved name: Inner> = Q|Owner|.<Unresolved name: Inner>#()
lval err: <ERROR TYPE REF: Empty diagnostic> = Q|Owner|.<Unresolved name: Inner>#()
R|<local>/err|.<Unresolved name: baz>#()
lval i: R|Owner.Inner| = R|<local>/o|.R|/Owner.Inner.Inner|()
R|<local>/i|.R|/Owner.Inner.gau|()
+2 -2
View File
@@ -22,8 +22,8 @@ class Owner {
}
fun err() {
<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
this.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
<!UNRESOLVED_REFERENCE!>foo<!>()
this.<!UNRESOLVED_REFERENCE!>foo<!>()
}
}
}
+1 -1
View File
@@ -14,7 +14,7 @@ class B : A() {
fun test() {
foo()
bar()
<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>buz<!>()<!>
<!INAPPLICABLE_CANDIDATE!>buz<!>()
}
}
@@ -23,8 +23,8 @@ fun test_1(x: Any) {
fun test_2(x: Any) {
if (x is B || x is C) {
x.foo()
x.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>bar<!>()<!>
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>baz<!>()<!>
x.<!UNRESOLVED_REFERENCE!>bar<!>()
x.<!UNRESOLVED_REFERENCE!>baz<!>()
}
}
@@ -36,20 +36,20 @@ fun test_3(x: Any) {
fun test_4(x: Any) {
if (x !is String || x.length == 0) {
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>length<!>
x.<!UNRESOLVED_REFERENCE!>length<!>
}
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>length<!>
x.<!UNRESOLVED_REFERENCE!>length<!>
}
fun test_5(x: A?) {
if (x != null || false) {
x.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
x.<!INAPPLICABLE_CANDIDATE!>foo<!>()
}
}
fun test_6(x: A?) {
if (false || x != null) {
x.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
x.<!INAPPLICABLE_CANDIDATE!>foo<!>()
}
}
@@ -29,7 +29,7 @@ fun test_3(x: Any, y: Any) {
}
z = y
if (y is B) {
z.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>bar<!>()<!>
z.<!UNRESOLVED_REFERENCE!>bar<!>()
}
}
@@ -40,7 +40,7 @@ fun test_4(y: Any) {
x = y
x.inc()
if (y is A) {
x.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
x.<!UNRESOLVED_REFERENCE!>foo<!>()
y.foo()
}
}
+8 -8
View File
@@ -14,31 +14,31 @@ fun test_3(b: Boolean, x: Any?) {
if (b && x as Boolean) {
x.not()
}
x.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>not<!>()<!>
x.<!UNRESOLVED_REFERENCE!>not<!>()
if (b && x as Boolean == true) {
x.not()
}
x.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>not<!>()<!>
x.<!UNRESOLVED_REFERENCE!>not<!>()
if (b || x as Boolean) {
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>not<!>()<!>
x.<!UNRESOLVED_REFERENCE!>not<!>()
}
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>not<!>()<!>
x.<!UNRESOLVED_REFERENCE!>not<!>()
}
fun test_4(b: Any) {
if (b as? Boolean != null) {
b.not()
} else {
b.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>not<!>()<!>
b.<!UNRESOLVED_REFERENCE!>not<!>()
}
b.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>not<!>()<!>
b.<!UNRESOLVED_REFERENCE!>not<!>()
if (b as? Boolean == null) {
b.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>not<!>()<!>
b.<!UNRESOLVED_REFERENCE!>not<!>()
} else {
b.not()
}
b.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>not<!>()<!>
b.<!UNRESOLVED_REFERENCE!>not<!>()
}
@@ -43,7 +43,7 @@ fun test_4(x: Any, b: Boolean) {
}
break
}
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!> // No smartcast
x.<!UNRESOLVED_REFERENCE!>foo<!>() // No smartcast
}
fun test_5(x: Any, b: Boolean) {
@@ -15,12 +15,12 @@ fun test_1(x: A, y: A?) {
fun test_2(x: A?, y: A?) {
if (x == y) {
x.<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
y.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
x.<!INAPPLICABLE_CANDIDATE!>foo<!>()
y.<!INAPPLICABLE_CANDIDATE!>foo<!>()
}
if (x === y) {
x.<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
y.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
x.<!INAPPLICABLE_CANDIDATE!>foo<!>()
y.<!INAPPLICABLE_CANDIDATE!>foo<!>()
}
}
@@ -7,13 +7,13 @@ fun test_1(b: Boolean?) {
if ((b == true) == true) {
b.not() // OK
} else {
b.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>not<!>()<!> // Bad
b.<!INAPPLICABLE_CANDIDATE!>not<!>() // Bad
}
}
fun test_2(b: Boolean?) {
if ((b == true) != true) {
b.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>not<!>()<!> // Bad
b.<!INAPPLICABLE_CANDIDATE!>not<!>() // Bad
} else {
b.not() // OK
}
@@ -21,7 +21,7 @@ fun test_2(b: Boolean?) {
fun test_3(b: Boolean?) {
if ((b == true) == false) {
b.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>not<!>()<!> // Bad
b.<!INAPPLICABLE_CANDIDATE!>not<!>() // Bad
} else {
b.not() // OK
}
@@ -31,13 +31,13 @@ fun test_4(b: Boolean?) {
if ((b == true) != false) {
b.not() // OK
} else {
b.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>not<!>()<!> // Bad
b.<!INAPPLICABLE_CANDIDATE!>not<!>() // Bad
}
}
fun test_5(b: Boolean?) {
if ((b != true) == true) {
b.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>not<!>()<!> // Bad
b.<!INAPPLICABLE_CANDIDATE!>not<!>() // Bad
} else {
b.not() // OK
}
@@ -47,7 +47,7 @@ fun test_6(b: Boolean?) {
if ((b != true) != true) {
b.not() // OK
} else {
b.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>not<!>()<!> // Bad
b.<!INAPPLICABLE_CANDIDATE!>not<!>() // Bad
}
}
@@ -55,13 +55,13 @@ fun test_7(b: Boolean?) {
if ((b != true) == false) {
b.not() // OK
} else {
b.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>not<!>()<!> // Bad
b.<!INAPPLICABLE_CANDIDATE!>not<!>() // Bad
}
}
fun test_8(b: Boolean?) {
if ((b != true) != false) {
b.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>not<!>()<!> // Bad
b.<!INAPPLICABLE_CANDIDATE!>not<!>() // Bad
} else {
b.not() // OK
}
@@ -9,23 +9,23 @@ fun Any?.test_1() {
this.foo()
foo()
} else {
this.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
this.<!UNRESOLVED_REFERENCE!>foo<!>()
<!UNRESOLVED_REFERENCE!>foo<!>()
}
this.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
this.<!UNRESOLVED_REFERENCE!>foo<!>()
<!UNRESOLVED_REFERENCE!>foo<!>()
}
fun Any?.test_2() {
if (this !is A) {
this.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
this.<!UNRESOLVED_REFERENCE!>foo<!>()
<!UNRESOLVED_REFERENCE!>foo<!>()
} else {
this.foo()
foo()
}
this.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
this.<!UNRESOLVED_REFERENCE!>foo<!>()
<!UNRESOLVED_REFERENCE!>foo<!>()
}
@@ -21,18 +21,18 @@ fun test_1(x: A?) {
if (x != null) {
x.foo()
} else {
x.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
x.<!INAPPLICABLE_CANDIDATE!>foo<!>()
}
x.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
x.<!INAPPLICABLE_CANDIDATE!>foo<!>()
}
fun test_2(x: A?) {
if (x == null) {
x.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
x.<!INAPPLICABLE_CANDIDATE!>foo<!>()
} else {
x.foo()
}
x.<!INAPPLICABLE_CANDIDATE, INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>foo<!>()<!>
x.<!INAPPLICABLE_CANDIDATE!>foo<!>()
}
fun test_3(x: A?) {
@@ -63,8 +63,8 @@ fun test_6(q: Q?) {
fun test_7(q: Q?) {
if (q?.fdata()?.fs()?.inc() != null) {
q.fdata() // good
q.fdata().<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>fs<!>()<!> // bad
q.fdata().<!INAPPLICABLE_CANDIDATE!><!INAPPLICABLE_CANDIDATE!>fs<!>()<!>.<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>inc<!>()<!> // bad
q.fdata().<!INAPPLICABLE_CANDIDATE!>fs<!>() // bad
q.fdata().<!INAPPLICABLE_CANDIDATE!>fs<!>().<!AMBIGUITY!>inc<!>() // bad
}
}
@@ -78,42 +78,42 @@ fun test_9(a: Int, b: Int?) {
if (a == b) {
b.inc()
}
b.<!AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
if (a === b) {
b.inc()
}
b.<!AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
if (b == a) {
b.inc()
}
b.<!AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
if (b === a) {
b.inc()
}
b.<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
}
fun test_10(a: Int?, b: Int?) {
if (a == b) {
b.<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
}
b.<!AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
if (a === b) {
b.<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
}
b.<!AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
if (b == a) {
b.<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
}
b.<!AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
if (b === a) {
b.<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
}
b.<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>inc<!>()<!>
b.<!AMBIGUITY!>inc<!>()
}
@@ -4,7 +4,7 @@ fun test_0(x: Any) {
} else {
}
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>length<!>
x.<!UNRESOLVED_REFERENCE!>length<!>
}
fun test_1(x: Any) {
@@ -35,8 +35,8 @@ fun test_2(x: Any) {
else -> return
}
x.foo()
x.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>bar<!>()<!>
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>baz<!>()<!>
x.<!UNRESOLVED_REFERENCE!>bar<!>()
x.<!UNRESOLVED_REFERENCE!>baz<!>()
}
fun test_3(x: Any) {
@@ -44,7 +44,7 @@ fun test_3(x: Any) {
x is B -> x.bar()
x is C -> x.baz()
}
x.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>foo<!>()<!>
x.<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>bar<!>()<!>
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>baz<!>()<!>
x.<!UNRESOLVED_REFERENCE!>foo<!>()
x.<!UNRESOLVED_REFERENCE!>bar<!>()
x.<!UNRESOLVED_REFERENCE!>baz<!>()
}
@@ -2,7 +2,7 @@ fun test_1(x: Any) {
if (x is String) {
x.length
}
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>length<!>
x.<!UNRESOLVED_REFERENCE!>length<!>
}
fun test_2(x: Any) {
@@ -10,7 +10,7 @@ fun test_2(x: Any) {
if (b) {
x.length
}
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>length<!>
x.<!UNRESOLVED_REFERENCE!>length<!>
}
fun test_3(x: Any) {
@@ -24,9 +24,9 @@ fun test_5(x: Any, b: Boolean) {
require(x is String)
x.length
} else {
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>length<!>
x.<!UNRESOLVED_REFERENCE!>length<!>
}
x.<!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>length<!>
x.<!UNRESOLVED_REFERENCE!>length<!>
}
fun test_6(x: Any, b: Boolean) {
+1 -1
View File
@@ -30,5 +30,5 @@ class BC : B, C
fun C.analyze() {}
inline fun <reified T> T.analyze() where T : A, T : B {}
fun testAnalyze() {
BC().<!AMBIGUITY, AMBIGUITY!><!AMBIGUITY!>analyze<!>()<!>
BC().<!AMBIGUITY!>analyze<!>()
}
@@ -7,19 +7,19 @@ FILE: simpleDelegatedToMap.kt
public final val map: R|kotlin/collections/MutableMap<kotlin/String, kotlin/Any>| = R|<local>/map|
public get(): R|kotlin/collections/MutableMap<kotlin/String, kotlin/Any>|
public final var foo: <ERROR TYPE REF: Ambiguity: getValue, [kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]>by R|<local>/map|
public get(): <ERROR TYPE REF: Ambiguity: getValue, [kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]> {
public final var foo: <ERROR TYPE REF: Empty diagnostic>by R|<local>/map|
public get(): <ERROR TYPE REF: Empty diagnostic> {
^ D|/C.foo|.<Ambiguity: getValue, [kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]>#(this@R|/C|, ::R|/C.foo|)
}
public set(<set-?>: <ERROR TYPE REF: Ambiguity: getValue, [kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]>): R|kotlin/Unit| {
public set(<set-?>: <ERROR TYPE REF: Empty diagnostic>): R|kotlin/Unit| {
D|/C.foo|.<Inapplicable(INAPPLICABLE): [kotlin/collections/setValue]>#(this@R|/C|, ::R|/C.foo|, R|<local>/foo|)
}
}
public final var bar: <ERROR TYPE REF: Ambiguity: getValue, [kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]>by R|kotlin/collections/hashMapOf|<R|kotlin/String|, R|kotlin/Any|>()
public get(): <ERROR TYPE REF: Ambiguity: getValue, [kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]> {
public final var bar: <ERROR TYPE REF: Empty diagnostic>by R|kotlin/collections/hashMapOf|<R|kotlin/String|, R|kotlin/Any|>()
public get(): <ERROR TYPE REF: Empty diagnostic> {
^ D|/bar|.<Ambiguity: getValue, [kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]>#(Null(null), ::R|/bar|)
}
public set(<set-?>: <ERROR TYPE REF: Ambiguity: getValue, [kotlin/collections/getValue, kotlin/collections/getValue, kotlin/collections/getValue]>): R|kotlin/Unit| {
public set(<set-?>: <ERROR TYPE REF: Empty diagnostic>): R|kotlin/Unit| {
D|/bar|.<Inapplicable(INAPPLICABLE): [kotlin/collections/setValue]>#(Null(null), ::R|/bar|, R|<local>/bar|)
}
@@ -42,7 +42,7 @@ fun test_2(inv: Inv2<A, B>) {
fun test_3(inv: Inv3<A, B, C>) {
inv.k().foo()
inv.t().<!UNRESOLVED_REFERENCE!><!UNRESOLVED_REFERENCE!>bar<!>()<!>
inv.t().<!UNRESOLVED_REFERENCE!>bar<!>()
inv.t().baz()
}
+1 -1
View File
@@ -1,5 +1,5 @@
fun <T, R> T.also(block: () -> R): R {
return <!UNRESOLVED_REFERENCE, UNRESOLVED_REFERENCE!>null!!<!>
return <!UNRESOLVED_REFERENCE!>null!!<!>
}
fun foo(b: Boolean, a: Int) {
@@ -7,4 +7,8 @@ package org.jetbrains.kotlin.fir.diagnostics
abstract class FirDiagnostic {
abstract val reason: String
}
object FirEmptyDiagnostic : FirDiagnostic() {
override val reason: String get() = "Empty diagnostic"
}