KT IDE: fix fully-qualified type resolving
This commit is contained in:
Generated
+15
@@ -308,6 +308,21 @@ public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolv
|
|||||||
runTest("idea/testData/resolve/references/ResolvePackageInProperty.kt");
|
runTest("idea/testData/resolve/references/ResolvePackageInProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ResolvePackageInTheEndInProperty.kt")
|
||||||
|
public void testResolvePackageInTheEndInProperty() throws Exception {
|
||||||
|
runTest("idea/testData/resolve/references/ResolvePackageInTheEndInProperty.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ResolvePackageInTheMiddleInProperty.kt")
|
||||||
|
public void testResolvePackageInTheMiddleInProperty() throws Exception {
|
||||||
|
runTest("idea/testData/resolve/references/ResolvePackageInTheMiddleInProperty.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ResolvePackageInTheTypeNameInProperty.kt")
|
||||||
|
public void testResolvePackageInTheTypeNameInProperty() throws Exception {
|
||||||
|
runTest("idea/testData/resolve/references/ResolvePackageInTheTypeNameInProperty.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("SamAdapter.kt")
|
@TestMetadata("SamAdapter.kt")
|
||||||
public void testSamAdapter() throws Exception {
|
public void testSamAdapter() throws Exception {
|
||||||
runTest("idea/testData/resolve/references/SamAdapter.kt");
|
runTest("idea/testData/resolve/references/SamAdapter.kt");
|
||||||
|
|||||||
+35
-12
@@ -86,8 +86,16 @@ internal object FirReferenceResolveHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getPackageSymbolFor(expression: KtSimpleNameExpression, symbolBuilder: KtSymbolByFirBuilder): KtFirPackageSymbol? {
|
private fun getPackageSymbolFor(
|
||||||
val fqName = when (val qualified = expression.getQualifiedExpressionForSelector()) {
|
expression: KtSimpleNameExpression,
|
||||||
|
symbolBuilder: KtSymbolByFirBuilder,
|
||||||
|
forQualifiedType: Boolean
|
||||||
|
): KtFirPackageSymbol? {
|
||||||
|
val qualified = when {
|
||||||
|
forQualifiedType -> expression.parent?.takeIf { it is KtUserType && it.referenceExpression === expression }
|
||||||
|
else -> expression.getQualifiedExpressionForSelector()
|
||||||
|
}
|
||||||
|
val fqName = when (qualified) {
|
||||||
null -> FqName(expression.getReferencedName())
|
null -> FqName(expression.getReferencedName())
|
||||||
else -> {
|
else -> {
|
||||||
qualified
|
qualified
|
||||||
@@ -96,10 +104,28 @@ internal object FirReferenceResolveHelper {
|
|||||||
.let(::FqName)
|
.let(::FqName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return symbolBuilder.createPackageSymbolIfOneExists(fqName)
|
return symbolBuilder.createPackageSymbolIfOneExists(fqName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtSimpleNameExpression.isPartOfQualifiedExpression(): Boolean {
|
||||||
|
var parent = parent
|
||||||
|
while (parent is KtDotQualifiedExpression) {
|
||||||
|
if (parent.selectorExpression !== this) return true
|
||||||
|
parent = parent.parent
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtSimpleNameExpression.isPartOfUserTypeRefQualifier(): Boolean {
|
||||||
|
var parent = parent
|
||||||
|
while (parent is KtUserType) {
|
||||||
|
if (parent.referenceExpression !== this) return true
|
||||||
|
parent = parent.parent
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
internal fun resolveSimpleNameReference(
|
internal fun resolveSimpleNameReference(
|
||||||
ref: KtFirSimpleNameReference,
|
ref: KtFirSimpleNameReference,
|
||||||
analysisSession: KtFirAnalysisSession
|
analysisSession: KtFirAnalysisSession
|
||||||
@@ -124,6 +150,9 @@ internal object FirReferenceResolveHelper {
|
|||||||
return listOfNotNull(calleeReference.toTargetSymbol(session, symbolBuilder))
|
return listOfNotNull(calleeReference.toTargetSymbol(session, symbolBuilder))
|
||||||
}
|
}
|
||||||
is FirResolvedTypeRef -> {
|
is FirResolvedTypeRef -> {
|
||||||
|
if (expression.isPartOfUserTypeRefQualifier()) {
|
||||||
|
return listOfNotNull(getPackageSymbolFor(expression, symbolBuilder, forQualifiedType = true))
|
||||||
|
}
|
||||||
return listOfNotNull(fir.toTargetSymbol(session, symbolBuilder))
|
return listOfNotNull(fir.toTargetSymbol(session, symbolBuilder))
|
||||||
}
|
}
|
||||||
is FirResolvedQualifier -> {
|
is FirResolvedQualifier -> {
|
||||||
@@ -150,14 +179,8 @@ internal object FirReferenceResolveHelper {
|
|||||||
return listOfNotNull(type.toTargetSymbol(session, symbolBuilder))
|
return listOfNotNull(type.toTargetSymbol(session, symbolBuilder))
|
||||||
}
|
}
|
||||||
is FirResolvedImport -> {
|
is FirResolvedImport -> {
|
||||||
var parent = expression.parent
|
if (expression.isPartOfQualifiedExpression()) {
|
||||||
while (parent is KtDotQualifiedExpression) {
|
return listOfNotNull(getPackageSymbolFor(expression, symbolBuilder, forQualifiedType = false))
|
||||||
if (parent.selectorExpression !== expression) {
|
|
||||||
// Special: package reference in the middle of import directive
|
|
||||||
// import a.<caret>b.c.SomeClass
|
|
||||||
return listOfNotNull(getPackageSymbolFor(expression, symbolBuilder)?.let { return listOf(it) })
|
|
||||||
}
|
|
||||||
parent = parent.parent
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val classId = fir.resolvedClassId
|
val classId = fir.resolvedClassId
|
||||||
@@ -181,7 +204,7 @@ internal object FirReferenceResolveHelper {
|
|||||||
is FirFile -> {
|
is FirFile -> {
|
||||||
if (expression.getNonStrictParentOfType<KtPackageDirective>() != null) {
|
if (expression.getNonStrictParentOfType<KtPackageDirective>() != null) {
|
||||||
// Special: package reference in the middle of package directive
|
// Special: package reference in the middle of package directive
|
||||||
return listOfNotNull(getPackageSymbolFor(expression, symbolBuilder))
|
return listOfNotNull(getPackageSymbolFor(expression, symbolBuilder, forQualifiedType = false))
|
||||||
}
|
}
|
||||||
return listOf(symbolBuilder.buildSymbol(fir))
|
return listOf(symbolBuilder.buildSymbol(fir))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_FIR
|
|
||||||
|
|
||||||
package test1.test2
|
package test1.test2
|
||||||
|
|
||||||
class Some()
|
class Some()
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test1.test2.test3
|
||||||
|
|
||||||
|
class Some()
|
||||||
|
|
||||||
|
val test : test1.test2.<caret>test3.Some = Some()
|
||||||
|
|
||||||
|
// REF: test3
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test1.test2.test3
|
||||||
|
|
||||||
|
class Some()
|
||||||
|
|
||||||
|
val test : test1.<caret>test2.test3.Some = Some()
|
||||||
|
|
||||||
|
// REF: test2
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test1.test2.test3
|
||||||
|
|
||||||
|
class Some()
|
||||||
|
|
||||||
|
val test : test1.test2.test3.<caret>Some = Some()
|
||||||
|
|
||||||
|
// REF: (test1.test2.test3).Some
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
// IGNORE_FIR
|
|
||||||
|
|
||||||
class Foo {
|
class Foo {
|
||||||
operator fun invoke(a: Any) {}
|
operator fun invoke(a: Any) {}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
@@ -308,6 +308,21 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest
|
|||||||
runTest("idea/testData/resolve/references/ResolvePackageInProperty.kt");
|
runTest("idea/testData/resolve/references/ResolvePackageInProperty.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ResolvePackageInTheEndInProperty.kt")
|
||||||
|
public void testResolvePackageInTheEndInProperty() throws Exception {
|
||||||
|
runTest("idea/testData/resolve/references/ResolvePackageInTheEndInProperty.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ResolvePackageInTheMiddleInProperty.kt")
|
||||||
|
public void testResolvePackageInTheMiddleInProperty() throws Exception {
|
||||||
|
runTest("idea/testData/resolve/references/ResolvePackageInTheMiddleInProperty.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ResolvePackageInTheTypeNameInProperty.kt")
|
||||||
|
public void testResolvePackageInTheTypeNameInProperty() throws Exception {
|
||||||
|
runTest("idea/testData/resolve/references/ResolvePackageInTheTypeNameInProperty.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("SamAdapter.kt")
|
@TestMetadata("SamAdapter.kt")
|
||||||
public void testSamAdapter() throws Exception {
|
public void testSamAdapter() throws Exception {
|
||||||
runTest("idea/testData/resolve/references/SamAdapter.kt");
|
runTest("idea/testData/resolve/references/SamAdapter.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user