diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 1ba19847e7d..fcf16c051e8 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -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 diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index 576151905b7..2441b303a80 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt @@ -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 { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt index 4ecfa02ac11..2012473c695 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt @@ -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 { + return listOf(symbolBuilder.buildSymbol(fir.symbol)) + } + private fun getSymbolsByResolvedImport( expression: KtSimpleNameExpression, builder: KtSymbolByFirBuilder, diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java index 78c1806d042..7318a5b1496 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -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 diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java index 54ac15807b2..4c644745fd5 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java @@ -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"); + } } } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index a7a1d2cb396..352104ad5d2 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -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 diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 271ffaa0aa7..26aec167b03 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -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 diff --git a/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.kt b/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.kt new file mode 100644 index 00000000000..480624947b6 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.kt @@ -0,0 +1,2 @@ +fun copyNotNull(from: List, to: List) where From : To, To : Any { +} diff --git a/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.txt b/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.txt new file mode 100644 index 00000000000..5e9a78bde75 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause1.txt @@ -0,0 +1,2 @@ +Resolved to: +0: From diff --git a/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.kt b/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.kt new file mode 100644 index 00000000000..415d9db77c0 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.kt @@ -0,0 +1,2 @@ +fun copyNotNull(from: List, to: List) where From : To, To : Any { +} diff --git a/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.txt b/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.txt new file mode 100644 index 00000000000..b99fda8be99 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/typeParameter/whereClause2.txt @@ -0,0 +1,2 @@ +Resolved to: +0: To diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt index e372fe377de..c6a29dc85e2 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/file/structure/FirElementsRecorder.kt @@ -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) { + 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) { // For the LHS of the assignment, record the assignment itself (variableAssignment.lValue.source?.psi as? KtElement)?.let { cache(it, variableAssignment, data) } diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause1.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause1.kt new file mode 100644 index 00000000000..bc69dc518de --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause1.kt @@ -0,0 +1,3 @@ +// WITH_STDLIB +fun copyNotNull(from: List, to: List) where From : To, To : Any { +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause1.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause1.txt new file mode 100644 index 00000000000..6869e1d9f2d --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause1.txt @@ -0,0 +1,6 @@ +KT element: KtNameReferenceExpression +FIR element: FirTypeParameterImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: +[ResolvedTo(BODY_RESOLVE)] From : R|To| diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause2.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause2.kt new file mode 100644 index 00000000000..35f865e02e6 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause2.kt @@ -0,0 +1,3 @@ +// WITH_STDLIB +fun copyNotNull(from: List, to: List) where From : To, To : Any { +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause2.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause2.txt new file mode 100644 index 00000000000..6073f3d4075 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/declarations/whereClause2.txt @@ -0,0 +1,6 @@ +KT element: KtNameReferenceExpression +FIR element: FirTypeParameterImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: +[ResolvedTo(BODY_RESOLVE)] To : R|kotlin/Any| diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java index 37057519617..485b5cbb2e3 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java @@ -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 diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java index 937e3c17cd0..ff585c2dcf1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java @@ -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 diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.kt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.kt index e267b1ada73..08f2e3e18af 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.kt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.kt @@ -14,3 +14,6 @@ class SomeList : AbstractList() { override fun concat(other: List): List = this } + +fun copyNotNull(from: List, to: List) where From : To, To : Any { +} diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.lazyBodies.txt index f0b774ba5d3..6bca19814bd 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.lazyBodies.txt @@ -23,3 +23,4 @@ FILE: typeParameters.kt public? open? override fun concat(other: List): List { LAZY_BLOCK } } + public? final? fun copyNotNull(from: List, to: List): R|kotlin/Unit| { LAZY_BLOCK } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.txt index a9d418bc71a..b1ed7493202 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/typeParameters.txt @@ -27,3 +27,5 @@ FILE: typeParameters.kt } } + public? final? fun copyNotNull(from: List, to: List): R|kotlin/Unit| { + }