diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java index ba9439dd4bf..00762f2bdeb 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java @@ -52,6 +52,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated ext KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByReference"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("constructorValueParameter.kt") + public void testConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.kt"); + } + @Test @TestMetadata("constructorViaTypeAlias.kt") public void testConstructorViaTypeAlias() throws Exception { @@ -94,6 +100,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaField.kt"); } + @Test + @TestMetadata("primaryConstructorValueParameter.kt") + public void testPrimaryConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.kt"); + } + @Test @TestMetadata("propertyReceiverParameter.kt") public void testPropertyReceiverParameter() throws Exception { @@ -106,6 +118,18 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.kt"); } + @Test + @TestMetadata("setterValueParameter.kt") + public void testSetterValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.kt"); + } + + @Test + @TestMetadata("valueParameter.kt") + public void testValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/symbols/symbolByReference/withTestCompilerPluginEnabled") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt index 390b4039091..fe92bea1429 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -7,18 +7,23 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.KtFakeSourceElementKind +import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirValueParameterSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol +import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken +import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion +import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer -import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken -import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion -import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LLFirResolveSession import org.jetbrains.kotlin.fir.correspondingProperty +import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.types.arrayElementType @@ -72,7 +77,17 @@ internal class KtFirValueParameterSymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } - TODO("Creating pointers for functions parameters from library is not supported yet") + + analyze(firResolveSession.useSiteKtModule) { + val owner = getContainingSymbol() as KtFunctionLikeSymbol + val firFunction = owner.firSymbol.fir as FirFunction + + KtFirValueParameterSymbolPointer( + owner.createPointer(), + name, + firFunction.valueParameters.indexOf(firSymbol.fir), + ) + } } override fun equals(other: Any?): Boolean = symbolEquals(other) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirValueParameterSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirValueParameterSymbolPointer.kt new file mode 100644 index 00000000000..220dca8c0e5 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirValueParameterSymbolPointer.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol +import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.fir.declarations.FirFunction +import org.jetbrains.kotlin.name.Name + +internal class KtFirValueParameterSymbolPointer( + private val ownerPointer: KtSymbolPointer, + private val name: Name, + private val index: Int, +) : KtSymbolPointer() { + @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") + override fun restoreSymbol(analysisSession: KtAnalysisSession): KtValueParameterSymbol? { + require(analysisSession is KtFirAnalysisSession) + val ownerSymbol = with(analysisSession) { + ownerPointer.restoreSymbol() ?: return null + } + + val function = ownerSymbol.firSymbol.fir as? FirFunction ?: return null + val firValueParameterSymbol = function.valueParameters.getOrNull(index)?.takeIf { it.name == name } ?: return null + return analysisSession.firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(firValueParameterSymbol.symbol) + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java index 33c4fe51702..4eeec957ea4 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java @@ -52,6 +52,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated exte KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByReference"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("constructorValueParameter.kt") + public void testConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.kt"); + } + @Test @TestMetadata("constructorViaTypeAlias.kt") public void testConstructorViaTypeAlias() throws Exception { @@ -94,6 +100,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated exte runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaField.kt"); } + @Test + @TestMetadata("primaryConstructorValueParameter.kt") + public void testPrimaryConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.kt"); + } + @Test @TestMetadata("propertyReceiverParameter.kt") public void testPropertyReceiverParameter() throws Exception { @@ -106,6 +118,18 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated exte runTest("analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.kt"); } + @Test + @TestMetadata("setterValueParameter.kt") + public void testSetterValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.kt"); + } + + @Test + @TestMetadata("valueParameter.kt") + public void testValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/symbols/symbolByReference/withTestCompilerPluginEnabled") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java index f94effa16e1..86e928d3a63 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java @@ -52,6 +52,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerat KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByReference"), Pattern.compile("^(.+)\\.kt$"), null, true, "withTestCompilerPluginEnabled"); } + @Test + @TestMetadata("constructorValueParameter.kt") + public void testConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.kt"); + } + @Test @TestMetadata("constructorViaTypeAlias.kt") public void testConstructorViaTypeAlias() throws Exception { @@ -94,6 +100,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerat runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaField.kt"); } + @Test + @TestMetadata("primaryConstructorValueParameter.kt") + public void testPrimaryConstructorValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.kt"); + } + @Test @TestMetadata("propertyReceiverParameter.kt") public void testPropertyReceiverParameter() throws Exception { @@ -105,4 +117,16 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerat public void testSamConstructor() throws Exception { runTest("analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.kt"); } + + @Test + @TestMetadata("setterValueParameter.kt") + public void testSetterValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.kt"); + } + + @Test + @TestMetadata("valueParameter.kt") + public void testValueParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.kt"); + } } diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.kt new file mode 100644 index 00000000000..ac457fed9c7 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.kt @@ -0,0 +1,7 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 + +class A { + constructor(abc: Int) { + abc + } +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.pretty.txt new file mode 100644 index 00000000000..6c5e72580e5 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.pretty.txt @@ -0,0 +1 @@ +abc: kotlin.Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.txt new file mode 100644 index 00000000000..8cbc139ac95 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/constructorValueParameter.txt @@ -0,0 +1,19 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: abc + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt index 448a963681f..557c5c2bad3 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt @@ -1,4 +1,5 @@ -// DO_NOT_CHECK_SYMBOL_RESTORE +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE inline fun T.use(block: (T) -> R): R { return block(this) diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.kt new file mode 100644 index 00000000000..bd2b2a034e7 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.kt @@ -0,0 +1,7 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 + +class A(abc: Int) { + init { + abc + } +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.pretty.txt new file mode 100644 index 00000000000..6c5e72580e5 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.pretty.txt @@ -0,0 +1 @@ +abc: kotlin.Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.txt new file mode 100644 index 00000000000..8cbc139ac95 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/primaryConstructorValueParameter.txt @@ -0,0 +1,19 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: abc + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.kt new file mode 100644 index 00000000000..71bc10f14d4 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.kt @@ -0,0 +1,6 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE + +var i: Int + set(value) { + value + } diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.pretty.txt new file mode 100644 index 00000000000..a7fb8197b03 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.pretty.txt @@ -0,0 +1 @@ +value: kotlin.Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.txt new file mode 100644 index 00000000000..603c5e33d22 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/setterValueParameter.txt @@ -0,0 +1,19 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: value + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.kt new file mode 100644 index 00000000000..7828242986b --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.kt @@ -0,0 +1,5 @@ +// DO_NOT_CHECK_NON_PSI_SYMBOL_RESTORE_K1 + +fun check(abc: Int) { + abc +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.pretty.txt new file mode 100644 index 00000000000..6c5e72580e5 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.pretty.txt @@ -0,0 +1 @@ +abc: kotlin.Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.txt new file mode 100644 index 00000000000..8cbc139ac95 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.txt @@ -0,0 +1,19 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: abc + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file