[FIR IDE] Add base support for FIR incomplete types resolve

This commit is contained in:
Igor Yakovlev
2021-01-14 00:31:50 +03:00
parent 704366e531
commit 243f85a4d6
15 changed files with 30 additions and 22 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.realPsi
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.types.FirUserTypeRef
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
@@ -68,9 +69,18 @@ internal open class FirElementsRecorder : FirVisitor<Unit, MutableMap<KtElement,
override fun visitBackingFieldReference(backingFieldReference: FirBackingFieldReference, data: MutableMap<KtElement, FirElement>) {}
override fun visitSuperReference(superReference: FirSuperReference, data: MutableMap<KtElement, FirElement>) {}
override fun visitThisReference(thisReference: FirThisReference, data: MutableMap<KtElement, FirElement>) {}
override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: MutableMap<KtElement, FirElement>) {}
//@formatter:on
override fun visitErrorTypeRef(errorTypeRef: FirErrorTypeRef, data: MutableMap<KtElement, FirElement>) {
super.visitResolvedTypeRef(errorTypeRef, data)
errorTypeRef.delegatedTypeRef?.accept(this, data)
}
override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef, data: MutableMap<KtElement, FirElement>) {
super.visitResolvedTypeRef(resolvedTypeRef, data)
resolvedTypeRef.delegatedTypeRef?.accept(this, data)
}
override fun visitUserTypeRef(userTypeRef: FirUserTypeRef, data: MutableMap<KtElement, FirElement>) {
userTypeRef.acceptChildren(this, data)
}
@@ -388,8 +388,11 @@ internal object FirReferenceResolveHelper {
): ClassId? {
val qualifierToResolve = qualifier.parent as KtUserType
// FIXME make it work with generics in functional types (like () -> AA.BB<CC, AA.DD>)
val wholeType =
(wholeTypeFir.psi as KtTypeReference).typeElement?.unwrapNullable() as? KtUserType ?: return null
val wholeType = when (val psi = wholeTypeFir.psi) {
is KtUserType -> psi
is KtTypeReference -> psi.typeElement?.unwrapNullable() as? KtUserType
else -> null
} ?: return null
val qualifiersToDrop = countQualifiersToDrop(wholeType, qualifierToResolve)
return wholeTypeFir.type.classId?.dropLastNestedClasses(qualifiersToDrop)
@@ -1,4 +1,3 @@
// IGNORE_FIR
val v: UnknownClass<<caret>String>
// REF: (kotlin).String
@@ -1,4 +1,3 @@
// IGNORE_FIR
val v: UnknownClass<<caret>String>()
// REF: (kotlin).String
@@ -1,4 +1,3 @@
// IGNORE_FIR
class Foo<T, V>
class Bar: Foo<<caret>String
@@ -1,5 +1,3 @@
// IGNORE_FIR
package foo
class A
@@ -1,5 +1,3 @@
// IGNORE_FIR
package foo
class A
@@ -1,4 +1,3 @@
// IGNORE_FIR
package foo
class A