From 184478858c38a299269b7afcffb3151e20274306 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 30 Jun 2022 20:02:06 +0200 Subject: [PATCH] [Analysis API] add isNoinline/isCrossinline to the KtValueParameterSymbol --- .../KtFe10DescDefaultPropertySetterSymbol.kt | 6 ++ .../KtFe10DescValueParameterSymbol.kt | 6 ++ .../KtFe10PsiDefaultPropertySetterSymbol.kt | 6 ++ .../KtFe10PsiDefaultSetterParameterSymbol.kt | 6 ++ .../psiBased/KtFe10PsiValueParameterSymbol.kt | 7 ++ ...sSourceModuleSymbolByPsiTestGenerated.java | 16 ++++ .../fir/symbols/KtFirValueParameterSymbol.kt | 4 + ...sSourceModuleSymbolByPsiTestGenerated.java | 16 ++++ ...sSourceModuleSymbolByPsiTestGenerated.java | 16 ++++ .../api/symbols/KtVariableLikeSymbol.kt | 16 +++- .../valueParameters/parameterInlining.kt | 5 ++ .../parameterInlining.pretty.txt | 1 + .../valueParameters/parameterInlining.txt | 89 +++++++++++++++++++ 13 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.txt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertySetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertySetterSymbol.kt index bf77545db6b..3533a8b713b 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertySetterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescDefaultPropertySetterSymbol.kt @@ -94,6 +94,12 @@ class KtFe10DescDefaultPropertySetterSymbol( override val isImplicitLambdaParameter: Boolean get() = withValidityAssertion { false } + override val isCrossinline: Boolean + get() = withValidityAssertion { false } + + override val isNoinline: Boolean + get() = withValidityAssertion { false } + override val name: Name get() = withValidityAssertion { Name.identifier("value") } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescValueParameterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescValueParameterSymbol.kt index 2d12ce41ede..b8b79c3af45 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescValueParameterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescValueParameterSymbol.kt @@ -42,6 +42,12 @@ internal class KtFe10DescValueParameterSymbol( override val isVararg: Boolean get() = withValidityAssertion { descriptor.isVararg } + override val isCrossinline: Boolean + get() = withValidityAssertion { descriptor.isCrossinline } + + override val isNoinline: Boolean + get() = withValidityAssertion { descriptor.isNoinline } + override val isImplicitLambdaParameter: Boolean get() = withValidityAssertion { descriptor.containingDeclaration is AnonymousFunctionDescriptor && diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt index 04bf741c9e5..8e878e465de 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultPropertySetterSymbol.kt @@ -118,6 +118,12 @@ class KtFe10PsiDefaultPropertySetterSymbol( override val isImplicitLambdaParameter: Boolean get() = withValidityAssertion { false } + override val isCrossinline: Boolean + get() = withValidityAssertion { false } + + override val isNoinline: Boolean + get() = withValidityAssertion { false } + override val name: Name get() = withValidityAssertion { Name.identifier("value") } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt index 2ff1b538c3b..780712a7d89 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiDefaultSetterParameterSymbol.kt @@ -43,6 +43,12 @@ internal class KtFe10PsiDefaultSetterParameterSymbol( override val isVararg: Boolean get() = withValidityAssertion { false } + override val isCrossinline: Boolean + get() = withValidityAssertion { false } + + override val isNoinline: Boolean + get() = withValidityAssertion { false } + override val isImplicitLambdaParameter: Boolean get() = withValidityAssertion { false } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiValueParameterSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiValueParameterSymbol.kt index f0c902839ea..b83572b9d99 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiValueParameterSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiValueParameterSymbol.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.resolve.BindingContext @@ -48,6 +49,12 @@ internal class KtFe10PsiValueParameterSymbol( override val isVararg: Boolean get() = withValidityAssertion { psi.isVarArg } + override val isCrossinline: Boolean + get() = withValidityAssertion { psi.hasModifier(KtTokens.CROSSINLINE_KEYWORD) } + + override val isNoinline: Boolean + get() = withValidityAssertion { psi.hasModifier(KtTokens.NOINLINE_KEYWORD) } + override val isImplicitLambdaParameter: Boolean get() = withValidityAssertion { false } 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 084f9ffa2c5..10c75a535c6 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 @@ -271,4 +271,20 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends A runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt"); } } + + @Nested + @TestMetadata("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters") + @TestDataPath("$PROJECT_ROOT") + public class ValueParameters { + @Test + public void testAllFilesPresentInValueParameters() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("parameterInlining.kt") + public void testParameterInlining() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.kt"); + } + } } 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 38e18ee00c3..390b4039091 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 @@ -41,6 +41,10 @@ internal class KtFirValueParameterSymbol( firSymbol.source?.kind == KtFakeSourceElementKind.ItLambdaParameter } + override val isCrossinline: Boolean get() = withValidityAssertion { firSymbol.isCrossinline} + + override val isNoinline: Boolean get() = withValidityAssertion { firSymbol.isNoinline} + override val returnType by cached { val returnType = firSymbol.resolvedReturnType return@cached if (firSymbol.isVararg) { 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 bc941a36104..d7937e6d10a 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 @@ -271,4 +271,20 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByPsiTestGenerated extends Ab runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt"); } } + + @Nested + @TestMetadata("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters") + @TestDataPath("$PROJECT_ROOT") + public class ValueParameters { + @Test + public void testAllFilesPresentInValueParameters() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("parameterInlining.kt") + public void testParameterInlining() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.kt"); + } + } } 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 760e236e7a5..29821fc8764 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 @@ -271,4 +271,20 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByPsiTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.kt"); } } + + @Nested + @TestMetadata("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters") + @TestDataPath("$PROJECT_ROOT") + public class ValueParameters { + @Test + public void testAllFilesPresentInValueParameters() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("parameterInlining.kt") + public void testParameterInlining() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.kt"); + } + } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt index 30198a004b1..36f1e1fa69d 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt @@ -6,13 +6,15 @@ package org.jetbrains.kotlin.analysis.api.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.analysis.api.* +import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue +import org.jetbrains.kotlin.analysis.api.KtInitializerValue +import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion -import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.analysis.api.symbols.markers.* import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -171,6 +173,16 @@ public abstract class KtValueParameterSymbol : KtVariableLikeSymbol(), KtSymbolW final override val receiverType: KtType? get() = withValidityAssertion { null } final override val contextReceivers: List get() = withValidityAssertion { emptyList() } + /** + * Returns true if the function parameter is marked with `noinline` modifier + */ + public abstract val isNoinline: Boolean + + /** + * Returns true if the function parameter is marked with `crossinline` modifier + */ + public abstract val isCrossinline: Boolean + final override val typeParameters: List get() = withValidityAssertion { emptyList() } diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.kt b/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.kt new file mode 100644 index 00000000000..99381cff2c1 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.kt @@ -0,0 +1,5 @@ +inline fun foo( + inlineParameter: () -> Int, + crossinline crossinlineParameter: () -> Int, + noinline noinlineParameter: () -> Int, +) {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.pretty.txt new file mode 100644 index 00000000000..11289c816c9 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.pretty.txt @@ -0,0 +1 @@ +inline fun foo(inlineParameter: () -> kotlin.Int, crossinline crossinlineParameter: () -> kotlin.Int, noinline noinlineParameter: () -> kotlin.Int) diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.txt new file mode 100644 index 00000000000..de819a8a060 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/valueParameters/parameterInlining.txt @@ -0,0 +1,89 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: inlineParameter + origin: SOURCE + receiverType: null + returnType: kotlin/Function0 + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: true + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: crossinlineParameter + origin: SOURCE + receiverType: null + returnType: kotlin/Function0 + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: true + isVararg: false + name: noinlineParameter + origin: SOURCE + receiverType: null + returnType: kotlin/Function0 + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + contextReceivers: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: true + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: foo + origin: SOURCE + receiverType: null + returnType: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol(inlineParameter) + KtValueParameterSymbol(crossinlineParameter) + KtValueParameterSymbol(noinlineParameter) + ] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null