AA: indicate whether a value parameter is an implicit lambda parameter

^KTIJ-18800 In progress
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 f249dcd..d43d78a 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.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 @@
 
     // 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 @@
             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 d55582f..8eb7677 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.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.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 @@
         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 @@
         override val annotationsList: KtAnnotationsList
             get() = withValidityAssertion { KtEmptyAnnotationsList(token) }
 
-
         override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> {
             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 3ac4152..6146521 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.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 @@
     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 @@
     override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> = 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 2161262..38a1359 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 @@
 
         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.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 b347c4c..7239978 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.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 @@
         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 @@
             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 ba6d707..73ea243 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 @@
 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.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 @@
     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 @@
     override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> = 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 a6e2075..6f05b86 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 @@
 
 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 @@
     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 @@
     override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> = 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 17471ec..aa210ba 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
@@ -59,6 +59,12 @@
     }
 
     @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 {
         runTest("analysis/analysis-api/testData/symbols/symbolByReference/genericFromFunctionInLocalClass.kt");
@@ -71,6 +77,12 @@
     }
 
     @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 {
         runTest("analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.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 658a006..c53f60d 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 @@
 
     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 c5e8493..ef3e3f3 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
@@ -59,6 +59,12 @@
     }
 
     @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 {
         runTest("analysis/analysis-api/testData/symbols/symbolByReference/genericFromFunctionInLocalClass.kt");
@@ -71,6 +77,12 @@
     }
 
     @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 {
         runTest("analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.kt");
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 63e6b2f..de2c4c1 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
@@ -59,6 +59,12 @@
     }
 
     @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 {
         runTest("analysis/analysis-api/testData/symbols/symbolByReference/genericFromFunctionInLocalClass.kt");
@@ -71,6 +77,12 @@
     }
 
     @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 {
         runTest("analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.kt");
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 d053371..5764ee6 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 @@
     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 679d64a..d7c1581 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 @@
     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<KtValueParameterSymbol>
 
     /**
diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt
index 37b1502..80bca39 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/annotations.txt
@@ -3,6 +3,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: param1
   origin: SOURCE
@@ -17,6 +18,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: param2
   origin: SOURCE
@@ -120,4 +122,4 @@
   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 0aefcbb..ce730a0 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/backingField.txt
@@ -22,6 +22,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: value
   origin: SOURCE
@@ -83,4 +84,4 @@
   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 8d48857..21e6808 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/classSecondaryConstructors.txt
@@ -20,6 +20,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: x
   origin: SOURCE
@@ -53,6 +54,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: y
   origin: SOURCE
@@ -67,6 +69,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: z
   origin: SOURCE
@@ -116,4 +119,4 @@
   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 5dd2da3..f44ca91 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/delegateField.txt
@@ -3,6 +3,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: x
   origin: SOURCE
@@ -17,6 +18,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: y
   origin: SOURCE
@@ -31,6 +33,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: z
   origin: SOURCE
@@ -226,4 +229,4 @@
   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 d669c3f..895d189 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 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: value
   origin: SOURCE
@@ -149,4 +150,4 @@
   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 95131c3..9d44f2c 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/enumValueMember.txt
@@ -3,6 +3,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: value
   origin: SOURCE
@@ -148,4 +149,4 @@
   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 ccdac95..ed8b484 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/function.txt
@@ -3,6 +3,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: x
   origin: SOURCE
@@ -37,4 +38,4 @@
   ]
   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 01b1f7e..26e5516 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/functionWithTypeParams.txt
@@ -14,6 +14,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: x
   origin: SOURCE
@@ -50,4 +51,4 @@
   ]
   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 1e8ce8e..0e2f3e7 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitConstructorDelegationCall.txt
@@ -3,6 +3,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: i
   origin: SOURCE
@@ -51,4 +52,4 @@
   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 c0b3a50..488dbfe 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/implicitReturnInLambda.txt
@@ -3,6 +3,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: a
   origin: SOURCE
@@ -55,6 +56,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: a
   origin: SOURCE
@@ -158,6 +160,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: lmbd
   origin: SOURCE
@@ -192,4 +195,4 @@
   ]
   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 e9fe0a1..c7d6332 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 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: value
   origin: SOURCE
@@ -147,4 +148,4 @@
   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 a220192..aab4c5d 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/jvmName.txt
@@ -58,6 +58,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: value
   origin: SOURCE
@@ -145,4 +146,4 @@
   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 71a72e6..57338f7 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 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: arg
   origin: SOURCE
@@ -228,4 +229,4 @@
   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 5b6f96c..5368ca3 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.txt
@@ -125,6 +125,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: false
   name: arg
   origin: SOURCE
@@ -227,4 +228,4 @@
   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 7483824..a529788 100644
--- a/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt
+++ b/analysis/analysis-api/testData/symbols/symbolByPsi/varargFunctions.txt
@@ -3,6 +3,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: true
   name: a
   origin: SOURCE
@@ -44,6 +45,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: true
   name: b
   origin: SOURCE
@@ -85,6 +87,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: true
   name: c
   origin: SOURCE
@@ -126,6 +129,7 @@
   callableIdIfNonLocal: null
   hasDefaultValue: false
   isExtension: false
+  isImplicitLambdaParameter: false
   isVararg: true
   name: d
   origin: SOURCE
@@ -160,4 +164,4 @@
   ]
   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 0000000..5f10a5c
--- /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 0000000..adbf2be
--- /dev/null
+++ b/analysis/analysis-api/testData/symbols/symbolByReference/explicitLambdaParameter.kt
@@ -0,0 +1,11 @@
+// DO_NOT_CHECK_SYMBOL_RESTORE
+
+inline fun <T, R> T.use(block: (T) -> R): R {
+    return block(this)
+}
+
+fun foo() {
+    42.use { it ->
+        i<caret>t.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 0000000..b6ef1d2
--- /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 0000000..3708715
--- /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 0000000..448a963
--- /dev/null
+++ b/analysis/analysis-api/testData/symbols/symbolByReference/implicitLambdaParameter.kt
@@ -0,0 +1,9 @@
+// DO_NOT_CHECK_SYMBOL_RESTORE
+
+inline fun <T, R> T.use(block: (T) -> R): R {
+    return block(this)
+}
+
+fun foo() {
+    42.use { i<caret>t.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 0000000..b6ef1d2
--- /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 0000000..e8518d5
--- /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