FIR checker: report unresolved reference in imports

Compared to FE1.0, instead of using UNRESOLVED_REFERENCE, a new
UNRESOLVED_IMPORT diagnostic is introduced. This is so that we can use a
different positioning strategy to highlight the last part of the import
if the entire import is passed.

Also, this change fixed some incorrectly rejected imports in FIR. Such
cases are covered the newly added test file staticFunAndPropertyImport.kt
This commit is contained in:
Tianyu Geng
2021-10-25 17:37:38 -07:00
committed by teamcityserver
parent f51b108821
commit 18f7a760bb
33 changed files with 470 additions and 95 deletions
+6 -6
View File
@@ -7,15 +7,15 @@ import b.ext //extension function
import b.value //property
import b.C.Companion.bar //function from companion object
import b.C.Companion.cValue //property from companion object
import b.constant.fff //function from val
import b.constant.dValue //property from val
import b.<!UNRESOLVED_IMPORT!>constant<!>.fff //function from val
import b.<!UNRESOLVED_IMPORT!>constant<!>.dValue //property from val
import b.constant
import b.E.Companion.f //val from companion object
import smth.illegal
import b.C.smth.illegal
import b.bar.smth
import b.bar.*
import b.unr.unr.unr
import b.C.<!UNRESOLVED_IMPORT!>smth<!>.illegal
import b.<!UNRESOLVED_IMPORT!>bar<!>.smth
import b.<!UNRESOLVED_IMPORT!>bar<!>.*
import b.<!UNRESOLVED_IMPORT!>unr<!>.unr.unr
import unr.unr.unr
fun test(arg: B) {
@@ -52,27 +52,27 @@ import <!PACKAGE_CANNOT_BE_IMPORTED!>a<!>
import a.<!PACKAGE_CANNOT_BE_IMPORTED!>b<!>
import a.foo
import a.foo.bar
import a.<!UNRESOLVED_IMPORT!>foo<!>.bar
import a.bar
import a.bar.foo
import a.<!UNRESOLVED_IMPORT!>bar<!>.foo
import a.B.<!CANNOT_BE_IMPORTED!>foo<!>
import a.B.foo.bar
import a.B.<!UNRESOLVED_IMPORT!>foo<!>.bar
import a.B.<!CANNOT_BE_IMPORTED!>bar<!>
import a.B.bar.foo
import a.B.<!UNRESOLVED_IMPORT!>bar<!>.foo
import a.C.foo
import a.C.foo.bar
import a.C.<!UNRESOLVED_IMPORT!>foo<!>.bar
import a.C.bar
import a.C.bar.foo
import a.C.<!UNRESOLVED_IMPORT!>bar<!>.foo
import a.C.Nested
import a.D.foo
import a.D.foo.bar
import a.D.bar
import a.D.bar.foo
import a.D.<!UNRESOLVED_IMPORT!>foo<!>
import a.D.<!UNRESOLVED_IMPORT!>foo<!>.bar
import a.D.<!UNRESOLVED_IMPORT!>bar<!>
import a.D.<!UNRESOLVED_IMPORT!>bar<!>.foo
import a.D.Companion.foo
import a.D.Companion.foo.bar
import a.D.Companion.<!UNRESOLVED_IMPORT!>foo<!>.bar
import a.D.Companion.bar
import a.D.Companion.bar.foo
import a.D.Companion.<!UNRESOLVED_IMPORT!>bar<!>.foo
+2 -2
View File
@@ -18,7 +18,7 @@ interface IInterfaceOutput<out T> {
package mypackage.nestedpackage
import mypackage.nestedpackage.Bar.Baz
import mypackage.nestedpackage.Bar.<!UNRESOLVED_IMPORT!>Baz<!>
import anotherpackage.IInterfaceInput
import anotherpackage.IInterfaceOutput
@@ -43,4 +43,4 @@ class Bar() : IInterfaceInput<Baz>, IInterfaceOutput<Baz> {
}
data class Baz(val myField: Int)
data class Baz(val myField: Int)
@@ -8,15 +8,15 @@ import b.ext //extension function
import b.value //property
import b.C.Companion.bar //function from companion object
import b.C.Companion.cValue //property from companion object
import b.constant.fff //function from val
import b.constant.dValue //property from val
import b.<!UNRESOLVED_IMPORT!>constant<!>.fff //function from val
import b.<!UNRESOLVED_IMPORT!>constant<!>.dValue //property from val
import smth.illegal
import b.C.smth.illegal
import b.C.<!UNRESOLVED_IMPORT!>smth<!>.illegal
<!SYNTAX!><<!><!SYNTAX!><<!><!SYNTAX!><<!><!SYNTAX!>HEAD<!><!SYNTAX!><!>
import b.bar.smth
import b.bar.*
import b.unr.unr.unr
import b.<!UNRESOLVED_IMPORT!>bar<!>.smth
import b.<!UNRESOLVED_IMPORT!>bar<!>.*
import b.<!UNRESOLVED_IMPORT!>unr<!>.unr.unr
import unr.unr.unr
import b.constant
import b.E.Companion.f //val from companion object
@@ -1,4 +1,4 @@
//KT-762 Wrong highlighting in imports (No errors reported on unresolved imports)
import aaa // must be an error
import <!UNRESOLVED_IMPORT!>aaa<!> // must be an error
fun main() {}
@@ -0,0 +1,45 @@
// FIR_IDENTICAL
// !DIAGNOSTICS: -UNUSED_VARIABLE
// FILE: A.java
public class A {
static void foo() {}
int foo;
static void foo2() {}
int foo2;
static int bar;
int bar() {return 1;}
static int bar2;
int bar2() {return 1;}
static class quux {}
void quux() {}
int quux;
static class quux2 {}
void quux2() {}
int quux2;
static void baz() {}
}
// FILE: B.java
public class B extends A {
void baz(int i) {}
}
// FILE: 1.kt
// Below should be all good because there is always a static function, property, or class with the requested name.
import A.foo
import A.bar
import A.quux
import B.foo2
import B.bar2
import A.baz
import B.baz
// class cannot be imported by subclass
import B.<!CANNOT_BE_IMPORTED!>quux2<!>
@@ -0,0 +1,61 @@
package
public open class A {
public constructor A()
public/*package*/ final var foo: kotlin.Int
public/*package*/ final var foo2: kotlin.Int
public/*package*/ final var quux: kotlin.Int
public/*package*/ final var quux2: kotlin.Int
public/*package*/ open fun bar(): kotlin.Int
public/*package*/ open fun bar2(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public/*package*/ open fun quux(): kotlin.Unit
public/*package*/ open fun quux2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public/*package*/ open class quux {
public/*package*/ constructor quux()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public/*package*/ open class quux2 {
public/*package*/ constructor quux2()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// Static members
public/*package*/ final var bar: kotlin.Int
public/*package*/ final var bar2: kotlin.Int
public/*package*/ open fun baz(): kotlin.Unit
public/*package*/ open fun foo(): kotlin.Unit
public/*package*/ open fun foo2(): kotlin.Unit
}
public open class B : A {
public constructor B()
public/*package*/ final override /*1*/ /*fake_override*/ var foo: kotlin.Int
public/*package*/ final override /*1*/ /*fake_override*/ var foo2: kotlin.Int
public/*package*/ final override /*1*/ /*fake_override*/ var quux: kotlin.Int
public/*package*/ final override /*1*/ /*fake_override*/ var quux2: kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun bar(): kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun bar2(): kotlin.Int
public/*package*/ open fun baz(/*0*/ i: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun quux(): kotlin.Unit
public/*package*/ open override /*1*/ /*fake_override*/ fun quux2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public/*package*/ final override /*1*/ /*fake_override*/ var bar: kotlin.Int
public/*package*/ final override /*1*/ /*fake_override*/ var bar2: kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun baz(): kotlin.Unit
public/*package*/ open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public/*package*/ open override /*1*/ /*fake_override*/ fun foo2(): kotlin.Unit
}
@@ -4,6 +4,8 @@
public class A {
static void foo() {}
static int bar() {return 1;}
void nonStatic1() {}
void nonStatic2() {}
}
// FILE: B.java
@@ -17,6 +19,8 @@ public class C {
// FILE: 1.kt
import A.foo
import B.bar
import A.<!CANNOT_BE_IMPORTED!>nonStatic1<!>
import B.<!CANNOT_BE_IMPORTED!>nonStatic2<!>
class E: A() {
init {
@@ -4,6 +4,8 @@ public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public/*package*/ open fun nonStatic1(): kotlin.Unit
public/*package*/ open fun nonStatic2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
@@ -15,6 +17,8 @@ public open class B : A {
public constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic1(): kotlin.Unit
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
@@ -36,6 +40,8 @@ public final class E : A {
public constructor E()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic1(): kotlin.Unit
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -43,6 +49,8 @@ public final class F : B {
public constructor F()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic1(): kotlin.Unit
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -50,6 +58,8 @@ public final class Q : A {
public constructor Q()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic1(): kotlin.Unit
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -57,5 +67,8 @@ public final class Z : A {
public constructor Z()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic1(): kotlin.Unit
public/*package*/ open override /*1*/ /*fake_override*/ fun nonStatic2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
+1 -1
View File
@@ -6,7 +6,7 @@ package kt1080
import reflect.Constructor
import b.*
import d
import <!UNRESOLVED_IMPORT!>d<!>
import d.Test
import b.<!PACKAGE_CANNOT_BE_IMPORTED!>d<!>
@@ -28,19 +28,19 @@ import test.ClassAlias
import test.ClassAlias.Nested1
import test.ClassSample.Nested1.*
import test.ClassAlias.Nested1.*
import test.ClassAlias.<!UNRESOLVED_IMPORT!>Nested1<!>.*
import test.ObjectAlias
import test.ObjectAlias.Nested2
import test.ObjectSample.Nested2.*
import test.ObjectAlias.Nested2.*
import test.ObjectAlias.<!UNRESOLVED_IMPORT!>Nested2<!>.*
import test.EnumAlias
import test.EnumAlias.Nested3
import test.EnumSample.Nested3.*
import test.EnumAlias.Nested3.*
import test.EnumAlias.<!UNRESOLVED_IMPORT!>Nested3<!>.*
import test.EnumAlias.Entry