diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index 8d369072a63..f4258f7a3a4 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -268,6 +268,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends A runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt"); } + @Test + @TestMetadata("typeParameters.kt") + public void testTypeParameters() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt"); + } + @Test @TestMetadata("varargFunctions.kt") public void testVarargFunctions() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index b4b48a7a8f3..1ceada908e0 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -268,6 +268,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends Ab runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt"); } + @Test + @TestMetadata("typeParameters.kt") + public void testTypeParameters() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt"); + } + @Test @TestMetadata("varargFunctions.kt") public void testVarargFunctions() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java index f721f3e073d..1cc9c5aca4a 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated.java @@ -268,6 +268,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.kt"); } + @Test + @TestMetadata("typeParameters.kt") + public void testTypeParameters() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt"); + } + @Test @TestMetadata("varargFunctions.kt") public void testVarargFunctions() throws Exception { diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.descriptors.txt new file mode 100644 index 00000000000..f7b2bf0fcb1 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.descriptors.txt @@ -0,0 +1,51 @@ +KtTypeParameterSymbol: + annotationsList: [] + isReified: false + name: T + origin: SOURCE + typeParameters: [] + upperBounds: [] + variance: INVARIANT + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtLocalVariableSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + isExtension: false + isVal: true + name: x + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /f + contextReceivers: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: f + origin: SOURCE + receiverType: null + returnType: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt new file mode 100644 index 00000000000..bff053b8102 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.kt @@ -0,0 +1,4 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE +fun f() { + val x:Int = 4 +} diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.pretty.txt new file mode 100644 index 00000000000..6c047b7b98c --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.pretty.txt @@ -0,0 +1 @@ +fun f() \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.txt new file mode 100644 index 00000000000..894d19f6843 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeParameters.txt @@ -0,0 +1,53 @@ +KtTypeParameterSymbol: + annotationsList: [] + isReified: false + name: T + origin: SOURCE + typeParameters: [] + upperBounds: [ + ERROR_TYPE + ] + variance: INVARIANT + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtLocalVariableSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + isExtension: false + isVal: true + name: x + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /f + contextReceivers: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: f + origin: SOURCE + receiverType: null + returnType: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPropertyTypeParametersChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPropertyTypeParametersChecker.kt index c21ce9dbf86..4ea2434a81f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPropertyTypeParametersChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPropertyTypeParametersChecker.kt @@ -32,8 +32,10 @@ object FirPropertyTypeParametersChecker : FirPropertyChecker() { declaration.contextReceivers.forEach { collectAllTypes(it.typeRef.coneType) } val usedNames = usedTypes.filterIsInstance().map { it.lookupTag.name } - declaration.typeParameters.filterNot { usedNames.contains(it.name) }.forEach { danglingParam -> - reporter.reportOn(danglingParam.source, FirErrors.TYPE_PARAMETER_OF_PROPERTY_NOT_USED_IN_RECEIVER, context) + if (!declaration.isLocal) { + declaration.typeParameters.filterNot { usedNames.contains(it.name) }.forEach { danglingParam -> + reporter.reportOn(danglingParam.source, FirErrors.TYPE_PARAMETER_OF_PROPERTY_NOT_USED_IN_RECEIVER, context) + } } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 84906d0c199..a58992d6503 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -1173,6 +1173,7 @@ class DeclarationsConverter( isLateInit = modifiers.hasLateinit() } + typeParameters += firTypeParameters generateAccessorsByDelegate( delegateBuilder, baseModuleData, diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 47e11b2065c..2cde223338d 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -1611,6 +1611,7 @@ open class RawFirBuilder( isLocal = true symbol = FirPropertySymbol(propertyName) + extractTypeParametersTo(this, symbol) backingField = this@toFirProperty.fieldDeclaration.toFirBackingField( this@toFirProperty, propertySymbol = symbol, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index b7989a72f66..4e0278a6d47 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -120,6 +120,9 @@ open class FirDeclarationsResolveTransformer(transformer: FirAbstractBodyResolve property.getter?.let { it.transformStatus(this, it.resolveStatus(containingProperty = property).mode()) } property.setter?.let { it.transformStatus(this, it.resolveStatus(containingProperty = property).mode()) } property.backingField?.let { it.transformStatus(this, it.resolveStatus(containingProperty = property).mode()) } + context.withProperty(property) { + doTransformTypeParameters(property) + } return transformLocalVariable(property) } diff --git a/compiler/testData/diagnostics/tests/annotations/AnnotationsForPropertyTypeParameter.fir.kt b/compiler/testData/diagnostics/tests/annotations/AnnotationsForPropertyTypeParameter.fir.kt index 179fac80469..865fae4ee53 100644 --- a/compiler/testData/diagnostics/tests/annotations/AnnotationsForPropertyTypeParameter.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/AnnotationsForPropertyTypeParameter.fir.kt @@ -9,6 +9,6 @@ class SomeClass { val <@A1 @A2(3) @A2 @A1(12) @A2("Test") T> T.field: Int get() = 12 fun foo() { - val <@A1 @A2(3) @A2 @A1(12) @A2("Test") T> localVal = 12 + val <@A1 @A2(3) @A2 @A1(12) @A2("Test") T> localVal = 12 } } diff --git a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt index f651b1bf0dc..fdb697c6449 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt @@ -5,8 +5,8 @@ import kotlin.reflect.KProperty fun test() { val a0 = 0 - val a1 = "" - val a2 = 0 + val __UNRESOLVED__> a1 = "" + val String> a2 = 0 const val a3 = 0 lateinit val a4 = 0 val a5 by Delegate() diff --git a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt index 1353b8269c4..bb9c4af76cc 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt @@ -5,8 +5,8 @@ import kotlin.reflect.KProperty fun test() { val a0 = 0 - val a1 = "" - val a2 = 0 + val __UNRESOLVED__> a1 = "" + val String> a2 = 0 const val a3 = 0 lateinit val a4 = 0 val a5 by Delegate() diff --git a/compiler/tests-spec/testData/diagnostics/notLinked/local-variables/type-parameters/neg/1.fir.kt b/compiler/tests-spec/testData/diagnostics/notLinked/local-variables/type-parameters/neg/1.fir.kt index 512368e48d3..774cbe9c43f 100644 --- a/compiler/tests-spec/testData/diagnostics/notLinked/local-variables/type-parameters/neg/1.fir.kt +++ b/compiler/tests-spec/testData/diagnostics/notLinked/local-variables/type-parameters/neg/1.fir.kt @@ -27,8 +27,8 @@ fun case_4() { // TESTCASE NUMBER: 5 fun case_5() { - val x1: Map = mapOf(1 to 1) - var x2: Map = mapOf(1 to 1) + val __UNRESOLVED__> x1: Map = mapOf(1 to 1) + var __UNRESOLVED__> x2: Map = mapOf(1 to 1) } /* @@ -77,18 +77,18 @@ fun case_11() { // TESTCASE NUMBER: 12 fun case_12() { - val x: Int - var x: Int + val __UNRESOLVED__> x: Int + var __UNRESOLVED__> x: Int } // TESTCASE NUMBER: 13 fun case_13() { - val x: Int where __UNRESOLVED__: __UNRESOLVED__ - var x: Int where __UNRESOLVED__: __UNRESOLVED__ + val __UNRESOLVED__> x: Int where __UNRESOLVED__: __UNRESOLVED__ + var __UNRESOLVED__> x: Int where __UNRESOLVED__: __UNRESOLVED__ } // TESTCASE NUMBER: 14 fun case_14() { - val x1 = 1 - var x2 = 1 + val <T : T> x1 = 1 + var <T : T> x2 = 1 }