diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolContainingDeclarationProvider.kt index f249dcd9676..d43d78a957a 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolContainingDeclarationProvider.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe1 import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken @@ -68,6 +69,13 @@ internal class KtFe10SymbolContainingDeclarationProvider( // TODO this is a dummy and incorrect implementation just to satisfy some tests override fun getContainingModule(symbol: KtSymbol): KtModule { + // Implicit lambda parameter doesn't have a source PSI. + if ((symbol as? KtValueParameterSymbol)?.isImplicitLambdaParameter == true) { + // Retrieve the module from its containing lambda instead. + getContainingDeclaration(symbol)?.let { parentLambdaSymbol -> + return getContainingModule(parentLambdaSymbol) + } + } return symbol.psi?.getKtModule(analysisSession.analysisContext.resolveSession.project) ?: symbol.getDescriptor()?.getFakeContainingKtModule() ?: TODO(symbol.toString()) @@ -98,4 +106,4 @@ internal class KtFe10SymbolContainingDeclarationProvider( else -> TODO(this.toString()) } } -} \ No newline at end of file +} 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 d55582f656e..8eb76777cc9 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 @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol -import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer @@ -24,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name class KtFe10DescDefaultPropertySetterSymbol( @@ -93,6 +91,9 @@ class KtFe10DescDefaultPropertySetterSymbol( override val isVararg: Boolean get() = withValidityAssertion { false } + override val isImplicitLambdaParameter: Boolean + get() = withValidityAssertion { false } + override val name: Name get() = withValidityAssertion { Name.identifier("value") } @@ -108,11 +109,10 @@ class KtFe10DescDefaultPropertySetterSymbol( override val annotationsList: KtAnnotationsList get() = withValidityAssertion { KtEmptyAnnotationsList(token) } - override fun createPointer(): KtSymbolPointer { withValidityAssertion { return KtFe10NeverRestoringSymbolPointer() } } } -} \ No newline at end of file +} 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 3ac41522a94..61465215a4a 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 @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext -import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.KtFe10DescSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer @@ -16,10 +15,14 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor +import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.SpecialNames +import org.jetbrains.kotlin.psi.KtFunctionLiteral +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.calls.components.isVararg +import org.jetbrains.kotlin.resolve.source.getPsi internal class KtFe10DescValueParameterSymbol( override val descriptor: ValueParameterDescriptor, @@ -39,6 +42,18 @@ internal class KtFe10DescValueParameterSymbol( override val isVararg: Boolean get() = withValidityAssertion { descriptor.isVararg } + override val isImplicitLambdaParameter: Boolean + get() = withValidityAssertion { + descriptor.containingDeclaration is AnonymousFunctionDescriptor && + descriptor.name.identifierOrNullIfSpecial == "it" && + // Implicit lambda parameter doesn't have a source PSI. + descriptor.source.getPsi() == null && + // But, that could be the case for a declaration from Library. Double-check the slice in the binding context + (descriptor.containingDeclaration.source.getPsi() as? KtFunctionLiteral)?.let { parentLambda -> + analysisContext.analyze(parentLambda).get(BindingContext.AUTO_CREATED_IT, descriptor) != null + } == true + } + override val returnType: KtType get() = withValidityAssertion { return (descriptor.varargElementType ?: descriptor.type).toKtType(analysisContext) @@ -47,4 +62,4 @@ internal class KtFe10DescValueParameterSymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() } -} \ No newline at end of file +} diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt index 216126281c3..38a1359ad15 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt @@ -305,6 +305,11 @@ internal fun DeclarationDescriptor.getSymbolOrigin(analysisContext: Fe10Analysis val virtualFile = psi.containingFile.virtualFile return analysisContext.getOrigin(virtualFile) + } else { // psi == null + // Implicit lambda parameter + if (this is ValueParameterDescriptor && this.name.identifierOrNullIfSpecial == "it") { + return KtSymbolOrigin.SOURCE_MEMBER_GENERATED + } } return KtSymbolOrigin.SOURCE @@ -535,4 +540,4 @@ internal fun AnnotationDescriptor.toKtAnnotationApplication(): KtAnnotationAppli internal fun AnnotationDescriptor.getKtNamedAnnotationArguments() = allValueArguments.map { (name, value) -> KtNamedAnnotationValue(name, value.toKtAnnotationValue()) - } \ No newline at end of file + } 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 b347c4cc4f5..7239978a243 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 @@ -32,7 +32,6 @@ import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration @@ -116,6 +115,9 @@ class KtFe10PsiDefaultPropertySetterSymbol( override val isVararg: Boolean get() = withValidityAssertion { false } + override val isImplicitLambdaParameter: Boolean + get() = withValidityAssertion { false } + override val name: Name get() = withValidityAssertion { Name.identifier("value") } @@ -135,4 +137,4 @@ class KtFe10PsiDefaultPropertySetterSymbol( return KtFe10NeverRestoringSymbolPointer() } } -} \ No newline at end of file +} 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 ba6d707b6b9..73ea243aee7 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 @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode -import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer @@ -16,14 +15,12 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.creat import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol -import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.descriptors.VariableDescriptor -import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.resolve.BindingContext @@ -46,6 +43,9 @@ internal class KtFe10PsiDefaultSetterParameterSymbol( override val isVararg: Boolean get() = withValidityAssertion { false } + override val isImplicitLambdaParameter: Boolean + get() = withValidityAssertion { false } + override val returnType: KtType get() = withValidityAssertion { descriptor?.type?.toKtType(analysisContext) ?: createErrorType() } @@ -61,4 +61,4 @@ internal class KtFe10PsiDefaultSetterParameterSymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { return KtFe10NeverRestoringSymbolPointer() } -} \ No newline at end of file +} 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 a6e207566e9..6f05b86d7c9 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 @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode -import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol @@ -39,6 +38,9 @@ internal class KtFe10PsiValueParameterSymbol( override val isVararg: Boolean get() = withValidityAssertion { psi.isVarArg } + override val isImplicitLambdaParameter: Boolean + get() = withValidityAssertion { false } + override val returnType: KtType get() = withValidityAssertion { val type = (descriptor as? ValueParameterDescriptor)?.varargElementType ?: descriptor?.type @@ -51,4 +53,4 @@ internal class KtFe10PsiValueParameterSymbol( override fun createPointer(): KtSymbolPointer = withValidityAssertion { return KtPsiBasedSymbolPointer.createForSymbolFromSource(this) ?: KtFe10NeverRestoringSymbolPointer() } -} \ No newline at end of file +} 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 17471ecf32b..aa210ba0ae5 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 @@ -58,6 +58,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.kt"); } + @Test + @TestMetadata("explicitLambdaParameter.kt") + public void testExplicitLambdaParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.kt"); + } + @Test @TestMetadata("genericFromFunctionInLocalClass.kt") public void testGenericFromFunctionInLocalClass() throws Exception { @@ -70,6 +76,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByReference/genericFromOuterClassInInnerClass.kt"); } + @Test + @TestMetadata("implicitLambdaParameter.kt") + public void testImplicitLambdaParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt"); + } + @Test @TestMetadata("samConstructor.kt") public void testSamConstructor() throws Exception { 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 658a0064e18..c53f60dce2b 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 @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.KtFakeSourceElementKind 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 @@ -33,6 +34,11 @@ internal class KtFirValueParameterSymbol( override val isVararg: Boolean get() = withValidityAssertion { firSymbol.isVararg } + override val isImplicitLambdaParameter: Boolean + get() = withValidityAssertion { + firSymbol.source?.kind == KtFakeSourceElementKind.ItLambdaParameter + } + 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/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java index c5e8493cf2f..ef3e3f38838 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 @@ -58,6 +58,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated exte runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.kt"); } + @Test + @TestMetadata("explicitLambdaParameter.kt") + public void testExplicitLambdaParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.kt"); + } + @Test @TestMetadata("genericFromFunctionInLocalClass.kt") public void testGenericFromFunctionInLocalClass() throws Exception { @@ -70,6 +76,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated exte runTest("analysis/analysis-api/testData/symbols/symbolByReference/genericFromOuterClassInInnerClass.kt"); } + @Test + @TestMetadata("implicitLambdaParameter.kt") + public void testImplicitLambdaParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt"); + } + @Test @TestMetadata("samConstructor.kt") public void testSamConstructor() throws Exception { 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 63e6b2ff5ce..de2c4c19581 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 @@ -58,6 +58,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerat runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.kt"); } + @Test + @TestMetadata("explicitLambdaParameter.kt") + public void testExplicitLambdaParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.kt"); + } + @Test @TestMetadata("genericFromFunctionInLocalClass.kt") public void testGenericFromFunctionInLocalClass() throws Exception { @@ -70,6 +76,12 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerat runTest("analysis/analysis-api/testData/symbols/symbolByReference/genericFromOuterClassInInnerClass.kt"); } + @Test + @TestMetadata("implicitLambdaParameter.kt") + public void testImplicitLambdaParameter() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt"); + } + @Test @TestMetadata("samConstructor.kt") public void testSamConstructor() throws Exception { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbol.kt index d0533714ec5..5764ee6ef9c 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtSymbol.kt @@ -50,11 +50,11 @@ public enum class KtSymbolOrigin { SOURCE, /** - * Declaration which do not have it's PSI source and was generated, they are: + * Declaration which do not have its PSI source and was generated, they are: * For regular classes, implicit default constructor is generated * For data classes the `copy`, `component{N}`, `toString`, `equals`, `hashCode` functions are generated * For enum classes the `valueOf` & `values` functions are generated - * For lambda the `it` property is generated + * For lambda the `it` implicit parameter is generated */ SOURCE_MEMBER_GENERATED, 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 679d64aedd6..d7c158135af 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 @@ -151,9 +151,21 @@ public abstract class KtValueParameterSymbol : KtVariableLikeSymbol(), KtSymbolW final override val isExtension: Boolean get() = false final override val receiverType: KtType? get() = null + /** + * Whether this value parameter has a default value or not. + */ public abstract val hasDefaultValue: Boolean + + /** + * Whether this value parameter represents a variable number of arguments (`vararg`) or not. + */ public abstract val isVararg: Boolean + /** + * Whether this value parameter is an implicitly generated lambda parameter `it` or not. + */ + public abstract val isImplicitLambdaParameter: Boolean + abstract override fun createPointer(): KtSymbolPointer /** diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt index 37b15025b7c..80bca3939a1 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt @@ -3,6 +3,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: param1 origin: SOURCE @@ -17,6 +18,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: param2 origin: SOURCE @@ -120,4 +122,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt index 0aefcbb1218..ce730a0fbcb 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt @@ -22,6 +22,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: value origin: SOURCE @@ -83,4 +84,4 @@ KtKotlinPropertySymbol: getterDeprecationStatus: null javaGetterName: getP javaSetterName: setP - setterDeprecationStatus: null \ No newline at end of file + setterDeprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt index 8d48857259a..21e68086f96 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt @@ -20,6 +20,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: x origin: SOURCE @@ -53,6 +54,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: y origin: SOURCE @@ -67,6 +69,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: z origin: SOURCE @@ -116,4 +119,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt index 5dd2da30594..f44ca9189d4 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt @@ -3,6 +3,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: x origin: SOURCE @@ -17,6 +18,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: y origin: SOURCE @@ -31,6 +33,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: z origin: SOURCE @@ -226,4 +229,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.descriptors.txt index d669c3f04a6..895d189ea2d 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.descriptors.txt @@ -3,6 +3,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: value origin: SOURCE @@ -149,4 +150,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt index 95131c35608..9d44f2c3fad 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt @@ -3,6 +3,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: value origin: SOURCE @@ -148,4 +149,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt index ccdac95ce41..ed8b484c2ba 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt @@ -3,6 +3,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: x origin: SOURCE @@ -37,4 +38,4 @@ KtFunctionSymbol: ] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt index 01b1f7ed2ae..26e55164828 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt @@ -14,6 +14,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: x origin: SOURCE @@ -50,4 +51,4 @@ KtFunctionSymbol: ] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt index 1e8ce8e1ea1..0e2f3e7bd7b 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt @@ -3,6 +3,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: i origin: SOURCE @@ -51,4 +52,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt index c0b3a509228..488dbfee7ee 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt @@ -3,6 +3,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: a origin: SOURCE @@ -55,6 +56,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: a origin: SOURCE @@ -158,6 +160,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: lmbd origin: SOURCE @@ -192,4 +195,4 @@ KtFunctionSymbol: ] visibility: Private getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.descriptors.txt index e9fe0a1974c..c7d6332ccdd 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.descriptors.txt @@ -59,6 +59,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: value origin: SOURCE @@ -147,4 +148,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt index a2201924357..aab4c5dc06a 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt @@ -58,6 +58,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: value origin: SOURCE @@ -145,4 +146,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt index 71a72e6c8b2..57338f732bc 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt @@ -125,6 +125,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: arg origin: SOURCE @@ -228,4 +229,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt index 5b6f96c32dc..5368ca3bd0a 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt @@ -125,6 +125,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: false name: arg origin: SOURCE @@ -227,4 +228,4 @@ KtNamedClassOrObjectSymbol: typeParameters: [] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt index 7483824677b..a52978873ee 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt @@ -3,6 +3,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: true name: a origin: SOURCE @@ -44,6 +45,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: true name: b origin: SOURCE @@ -85,6 +87,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: true name: c origin: SOURCE @@ -126,6 +129,7 @@ KtValueParameterSymbol: callableIdIfNonLocal: null hasDefaultValue: false isExtension: false + isImplicitLambdaParameter: false isVararg: true name: d origin: SOURCE @@ -160,4 +164,4 @@ KtFunctionSymbol: ] visibility: Public getContainingModule: KtSourceModule "Sources of main" - deprecationStatus: null \ No newline at end of file + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.descriptors.txt new file mode 100644 index 00000000000..5f10a5c916a --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.descriptors.txt @@ -0,0 +1,14 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + hasDefaultValue: false + isExtension: false + isImplicitLambdaParameter: false + isVararg: false + name: it + origin: LIBRARY + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.kt new file mode 100644 index 00000000000..adbf2be31a9 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.kt @@ -0,0 +1,11 @@ +// DO_NOT_CHECK_SYMBOL_RESTORE + +inline fun T.use(block: (T) -> R): R { + return block(this) +} + +fun foo() { + 42.use { it -> + it.toString() + } +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.pretty.txt new file mode 100644 index 00000000000..b6ef1d2a2c5 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.pretty.txt @@ -0,0 +1 @@ +it: kotlin.Int diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.txt new file mode 100644 index 00000000000..3708715c7f6 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.txt @@ -0,0 +1,14 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + hasDefaultValue: false + isExtension: false + isImplicitLambdaParameter: false + isVararg: false + name: it + origin: SOURCE + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt new file mode 100644 index 00000000000..448a963681f --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt @@ -0,0 +1,9 @@ +// DO_NOT_CHECK_SYMBOL_RESTORE + +inline fun T.use(block: (T) -> R): R { + return block(this) +} + +fun foo() { + 42.use { it.toString() } +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.pretty.txt new file mode 100644 index 00000000000..b6ef1d2a2c5 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.pretty.txt @@ -0,0 +1 @@ +it: kotlin.Int diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.txt b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.txt new file mode 100644 index 00000000000..e8518d50a30 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.txt @@ -0,0 +1,14 @@ +KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + hasDefaultValue: false + isExtension: false + isImplicitLambdaParameter: true + isVararg: false + name: it + origin: SOURCE_MEMBER_GENERATED + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null