[FIR] Resolve where subjects to corresponding type argument

^KTIJ-25295 fixed

Merge-request: KT-MR-10044
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2023-05-17 15:28:02 +00:00
committed by Space Team
parent bcefa1cd66
commit bff1520c9e
21 changed files with 135 additions and 1 deletions
@@ -1950,6 +1950,18 @@ public class Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exte
public void testTypeParameterInFunctionLiteral() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/TypeParameterInFunctionLiteral.kt");
}
@Test
@TestMetadata("whereClause1.kt")
public void testWhereClause1() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.kt");
}
@Test
@TestMetadata("whereClause2.kt")
public void testWhereClause2() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.kt");
}
}
@Nested
@@ -73,7 +73,7 @@ internal class KtFirExpressionTypeProvider(
is FirExpression -> fir.typeRef.coneType.asKtType()
is FirNamedReference -> fir.getReferencedElementType().asKtType()
is FirStatement -> with(analysisSession) { builtinTypes.UNIT }
is FirTypeRef, is FirImport, is FirPackageDirective, is FirLabel -> null
is FirTypeRef, is FirImport, is FirPackageDirective, is FirLabel, is FirTypeParameterRef -> null
// For invalid code like the following,
// ```
// when {
@@ -218,6 +218,7 @@ internal object FirReferenceResolveHelper {
is FirResolvable -> getSymbolsByResolvable(fir, expression, session, symbolBuilder)
is FirNamedArgumentExpression -> getSymbolsByNameArgumentExpression(expression, analysisSession, symbolBuilder)
is FirEqualityOperatorCall -> getSymbolsByEqualsName(fir, session, analysisSession, symbolBuilder)
is FirTypeParameter -> getSybmolsByTypeParameter(symbolBuilder, fir)
else -> handleUnknownFirElement(expression, analysisSession, session, symbolBuilder)
}
}
@@ -430,6 +431,13 @@ internal object FirReferenceResolveHelper {
return listOf(symbolBuilder.buildSymbol(fir.symbol))
}
private fun getSybmolsByTypeParameter(
symbolBuilder: KtSymbolByFirBuilder,
fir: FirTypeParameter
): List<KtSymbol> {
return listOf(symbolBuilder.buildSymbol(fir.symbol))
}
private fun getSymbolsByResolvedImport(
expression: KtSimpleNameExpression,
builder: KtSymbolByFirBuilder,
@@ -1950,6 +1950,18 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex
public void testTypeParameterInFunctionLiteral() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/TypeParameterInFunctionLiteral.kt");
}
@Test
@TestMetadata("whereClause1.kt")
public void testWhereClause1() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.kt");
}
@Test
@TestMetadata("whereClause2.kt")
public void testWhereClause2() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.kt");
}
}
@Nested
@@ -1834,5 +1834,17 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate
public void testTypeParameterInFunctionLiteral() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/TypeParameterInFunctionLiteral.kt");
}
@Test
@TestMetadata("whereClause1.kt")
public void testWhereClause1() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.kt");
}
@Test
@TestMetadata("whereClause2.kt")
public void testWhereClause2() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.kt");
}
}
}
@@ -1950,6 +1950,18 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten
public void testTypeParameterInFunctionLiteral() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/TypeParameterInFunctionLiteral.kt");
}
@Test
@TestMetadata("whereClause1.kt")
public void testWhereClause1() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.kt");
}
@Test
@TestMetadata("whereClause2.kt")
public void testWhereClause2() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.kt");
}
}
@Nested
@@ -1950,6 +1950,18 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerate
public void testTypeParameterInFunctionLiteral() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/TypeParameterInFunctionLiteral.kt");
}
@Test
@TestMetadata("whereClause1.kt")
public void testWhereClause1() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.kt");
}
@Test
@TestMetadata("whereClause2.kt")
public void testWhereClause2() throws Exception {
runTest("analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.kt");
}
}
@Nested
@@ -0,0 +1,2 @@
fun <From, To> copyNotNull(from: List<From>, to: List<To>) where <caret>From : To, To : Any {
}
@@ -0,0 +1,2 @@
Resolved to:
0: From
@@ -0,0 +1,2 @@
fun <From, To> copyNotNull(from: List<From>, to: List<To>) where From : To, <caret>To : Any {
}
@@ -0,0 +1,2 @@
Resolved to:
0: To
@@ -10,8 +10,10 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.element.builder.Duplicate
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.isErrorElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.builder.toFirOperationOrNull
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.expressions.*
import org.jetbrains.kotlin.fir.expressions.builder.buildConstExpression
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.references.*
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
@@ -64,6 +66,14 @@ internal open class FirElementsRecorder : FirVisitor<Unit, MutableMap<KtElement,
element.acceptChildren(this, data)
}
override fun visitTypeParameter(typeParameter: FirTypeParameter, data: MutableMap<KtElement, FirElement>) {
for (bound in typeParameter.bounds) {
val constraintSubject = (bound.psi?.parent as? KtTypeConstraint)?.subjectTypeParameterName ?: continue
cache(constraintSubject, typeParameter, data)
}
super.visitTypeParameter(typeParameter, data)
}
override fun visitVariableAssignment(variableAssignment: FirVariableAssignment, data: MutableMap<KtElement, FirElement>) {
// For the LHS of the assignment, record the assignment itself
(variableAssignment.lValue.source?.psi as? KtElement)?.let { cache(it, variableAssignment, data) }
@@ -0,0 +1,3 @@
// WITH_STDLIB
fun <From, To> copyNotNull(from: List<From>, to: List<To>) where <expr>From</expr> : To, To : Any {
}
@@ -0,0 +1,6 @@
KT element: KtNameReferenceExpression
FIR element: FirTypeParameterImpl
FIR source kind: KtRealSourceElementKind
FIR element rendered:
[ResolvedTo(BODY_RESOLVE)] From : R|To|
@@ -0,0 +1,3 @@
// WITH_STDLIB
fun <From, To> copyNotNull(from: List<From>, to: List<To>) where From : To, <expr>To</expr> : Any {
}
@@ -0,0 +1,6 @@
KT element: KtNameReferenceExpression
FIR element: FirTypeParameterImpl
FIR source kind: KtRealSourceElementKind
FIR element rendered:
[ResolvedTo(BODY_RESOLVE)] To : R|kotlin/Any|
@@ -470,6 +470,18 @@ public class OutOfContentRootGetOrBuildFirTestGenerated extends AbstractOutOfCon
public void testPropertyDelegateExpression() throws Exception {
runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/propertyDelegateExpression.kt");
}
@Test
@TestMetadata("whereClause1.kt")
public void testWhereClause1() throws Exception {
runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause1.kt");
}
@Test
@TestMetadata("whereClause2.kt")
public void testWhereClause2() throws Exception {
runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause2.kt");
}
}
@Nested
@@ -470,6 +470,18 @@ public class SourceGetOrBuildFirTestGenerated extends AbstractSourceGetOrBuildFi
public void testPropertyDelegateExpression() throws Exception {
runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/propertyDelegateExpression.kt");
}
@Test
@TestMetadata("whereClause1.kt")
public void testWhereClause1() throws Exception {
runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause1.kt");
}
@Test
@TestMetadata("whereClause2.kt")
public void testWhereClause2() throws Exception {
runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause2.kt");
}
}
@Nested
@@ -14,3 +14,6 @@ class SomeList : AbstractList<Int>() {
override fun concat(other: List<Int>): List<Int> = this
}
fun <From, To> copyNotNull(from: List<From>, to: List<To>) where From : To, To : Any {
}
@@ -23,3 +23,4 @@ FILE: typeParameters.kt
public? open? override fun concat(other: List<Int>): List<Int> { LAZY_BLOCK }
}
public? final? fun <From : To, To : Any> copyNotNull(from: List<From>, to: List<To>): R|kotlin/Unit| { LAZY_BLOCK }
@@ -27,3 +27,5 @@ FILE: typeParameters.kt
}
}
public? final? fun <From : To, To : Any> copyNotNull(from: List<From>, to: List<To>): R|kotlin/Unit| {
}