diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
index 395d44a1735..90e92acb696 100644
--- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
+++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
@@ -301,4 +301,146 @@ public class Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated exte
runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt");
}
}
+
+ @Nested
+ @TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference")
+ @TestDataPath("$PROJECT_ROOT")
+ public class NameReference {
+ @Test
+ public void testAllFilesPresentInNameReference() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("assignment.kt")
+ public void testAssignment() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.kt");
+ }
+
+ @Test
+ @TestMetadata("assignment_qualified.kt")
+ public void testAssignment_qualified() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.kt");
+ }
+
+ @Test
+ @TestMetadata("callableReference.kt")
+ public void testCallableReference() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.kt");
+ }
+
+ @Test
+ @TestMetadata("capturedBoundType.kt")
+ public void testCapturedBoundType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall.kt")
+ public void testFunctionCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall_invalid.kt")
+ public void testFunctionCall_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall_safeAccess.kt")
+ public void testFunctionCall_safeAccess() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType.kt")
+ public void testFunctionalType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_parens_1.kt")
+ public void testFunctionalType_parens_1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_parens_2.kt")
+ public void testFunctionalType_parens_2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_withReceiver.kt")
+ public void testFunctionalType_withReceiver() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.kt");
+ }
+
+ @Test
+ @TestMetadata("innerType_constructor.kt")
+ public void testInnerType_constructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.kt");
+ }
+
+ @Test
+ @TestMetadata("innerType_constructor_invalid.kt")
+ public void testInnerType_constructor_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("invokeCallOnObject1.kt")
+ public void testInvokeCallOnObject1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.kt");
+ }
+
+ @Test
+ @TestMetadata("invokeCallOnObject2.kt")
+ public void testInvokeCallOnObject2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_constructor.kt")
+ public void testNestedType_constructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_constructor_invalid.kt")
+ public void testNestedType_constructor_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_object.kt")
+ public void testNestedType_object() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_object_extensionInvoke.kt")
+ public void testNestedType_object_extensionInvoke() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall.kt")
+ public void testPropertyCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall_genericExtension.kt")
+ public void testPropertyCall_genericExtension() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall_safeAccess.kt")
+ public void testPropertyCall_safeAccess() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.kt");
+ }
+ }
}
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt
index 0e1ee6426ec..6577a447d7c 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.analysis.api.fir.components
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.components.KtExpressionTypeProvider
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
-import org.jetbrains.kotlin.analysis.api.fir.utils.getReferencedElementType
import org.jetbrains.kotlin.analysis.api.fir.utils.unwrap
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
import org.jetbrains.kotlin.analysis.api.types.KtErrorType
@@ -33,7 +32,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
-import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
+import org.jetbrains.kotlin.psi.psiUtil.getOutermostParenthesizerOrThis
internal class KtFirExpressionTypeProvider(
override val analysisSession: KtFirAnalysisSession,
@@ -71,7 +70,7 @@ internal class KtFirExpressionTypeProvider(
}
}
is FirExpression -> fir.typeRef.coneType.asKtType()
- is FirNamedReference -> fir.getReferencedElementType().asKtType()
+ is FirNamedReference -> fir.getCorrespondingTypeIfPossible()?.asKtType()
is FirStatement -> with(analysisSession) { builtinTypes.UNIT }
is FirTypeRef, is FirImport, is FirPackageDirective, is FirLabel, is FirTypeParameterRef -> null
@@ -95,6 +94,49 @@ internal class KtFirExpressionTypeProvider(
}
}
+ /**
+ * It only makes sense to provide type for the references which reference some actual properties/variables.
+ *
+ * In cases when the name reference references a function (a REAL function, not a functional type variable), it does not
+ * make sense to provide any type for it.
+ *
+ * ---
+ *
+ * Why not just always provide null for name references? In such case, the following case would be a problem:
+ *
+ * ```kt
+ * fun usage(action: String.(Int) -> String) {
+ * "hello".action(10)
+ * }
+ * ```
+ *
+ * The user might want to know the type of the `action` callback. If we always return null for the named references,
+ * we won't be able to handle this request, and just return null. So the user will only be able to see the type
+ * of the whole expression instead, and that is not what he wants.
+ */
+ private fun FirNamedReference.getCorrespondingTypeIfPossible(): ConeKotlinType? =
+ findOuterPropertyAccessExpression()?.typeRef?.coneType
+
+ /**
+ * Finds an outer expression for [this] named reference in cases when it is a part of a property access.
+ *
+ * Otherwise, return null.
+ */
+ private fun FirNamedReference.findOuterPropertyAccessExpression(): FirExpression? {
+ val referenceExpression = psi as? KtExpression ?: return null
+ val outerExpression = referenceExpression.getOutermostParenthesizerOrThis().parent as? KtElement ?: return null
+
+ return when (val outerFirElement = outerExpression.getOrBuildFir(firResolveSession)) {
+ is FirVariableAssignment -> outerFirElement.lValue
+ is FirPropertyAccessExpression -> outerFirElement
+ is FirImplicitInvokeCall -> outerFirElement.explicitReceiver
+ is FirSafeCallExpression -> {
+ if (outerFirElement.selector is FirPropertyAccessExpression) outerFirElement else null
+ }
+ else -> null
+ }
+ }
+
private fun getReturnTypeForArrayStyleAssignmentTarget(
expression: KtExpression,
fir: FirFunctionCall
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt
index d985d3ef276..d1dba2a6c3e 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt
@@ -12,24 +12,16 @@ import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue
import org.jetbrains.kotlin.analysis.api.components.KtConstantEvaluationMode
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
-import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.classKind
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
-import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.psi
-import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
-import org.jetbrains.kotlin.fir.references.FirNamedReference
-import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
-import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
-import org.jetbrains.kotlin.fir.types.ConeErrorType
-import org.jetbrains.kotlin.fir.types.ConeKotlinType
import org.jetbrains.kotlin.fir.types.ConeNullability
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.*
@@ -50,18 +42,6 @@ internal fun KtExpression.unwrap(): KtExpression {
} ?: this
}
-internal fun FirNamedReference.getReferencedElementType(): ConeKotlinType {
- val symbols = when (this) {
- is FirResolvedNamedReference -> listOf(resolvedSymbol)
- is FirErrorNamedReference -> getCandidateSymbols()
- else -> error("Unexpected ${this::class}")
- }
- val firCallableDeclaration = symbols.singleOrNull()?.fir as? FirCallableDeclaration
- ?: return ConeErrorType(ConeUnresolvedNameError(name))
-
- return firCallableDeclaration.symbol.resolvedReturnType
-}
-
internal fun KtTypeNullability.toConeNullability() = when (this) {
KtTypeNullability.NULLABLE -> ConeNullability.NULLABLE
KtTypeNullability.NON_NULLABLE -> ConeNullability.NOT_NULL
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java
index 923d3614721..56d84cc6888 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java
@@ -301,4 +301,146 @@ public class FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated ex
runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt");
}
}
+
+ @Nested
+ @TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference")
+ @TestDataPath("$PROJECT_ROOT")
+ public class NameReference {
+ @Test
+ public void testAllFilesPresentInNameReference() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("assignment.kt")
+ public void testAssignment() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.kt");
+ }
+
+ @Test
+ @TestMetadata("assignment_qualified.kt")
+ public void testAssignment_qualified() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.kt");
+ }
+
+ @Test
+ @TestMetadata("callableReference.kt")
+ public void testCallableReference() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.kt");
+ }
+
+ @Test
+ @TestMetadata("capturedBoundType.kt")
+ public void testCapturedBoundType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall.kt")
+ public void testFunctionCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall_invalid.kt")
+ public void testFunctionCall_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall_safeAccess.kt")
+ public void testFunctionCall_safeAccess() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType.kt")
+ public void testFunctionalType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_parens_1.kt")
+ public void testFunctionalType_parens_1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_parens_2.kt")
+ public void testFunctionalType_parens_2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_withReceiver.kt")
+ public void testFunctionalType_withReceiver() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.kt");
+ }
+
+ @Test
+ @TestMetadata("innerType_constructor.kt")
+ public void testInnerType_constructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.kt");
+ }
+
+ @Test
+ @TestMetadata("innerType_constructor_invalid.kt")
+ public void testInnerType_constructor_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("invokeCallOnObject1.kt")
+ public void testInvokeCallOnObject1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.kt");
+ }
+
+ @Test
+ @TestMetadata("invokeCallOnObject2.kt")
+ public void testInvokeCallOnObject2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_constructor.kt")
+ public void testNestedType_constructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_constructor_invalid.kt")
+ public void testNestedType_constructor_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_object.kt")
+ public void testNestedType_object() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_object_extensionInvoke.kt")
+ public void testNestedType_object_extensionInvoke() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall.kt")
+ public void testPropertyCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall_genericExtension.kt")
+ public void testPropertyCall_genericExtension() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall_safeAccess.kt")
+ public void testPropertyCall_safeAccess() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.kt");
+ }
+ }
}
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
index e68ed219441..ce092638792 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
@@ -301,4 +301,146 @@ public class FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated exten
runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt");
}
}
+
+ @Nested
+ @TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference")
+ @TestDataPath("$PROJECT_ROOT")
+ public class NameReference {
+ @Test
+ public void testAllFilesPresentInNameReference() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("assignment.kt")
+ public void testAssignment() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.kt");
+ }
+
+ @Test
+ @TestMetadata("assignment_qualified.kt")
+ public void testAssignment_qualified() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.kt");
+ }
+
+ @Test
+ @TestMetadata("callableReference.kt")
+ public void testCallableReference() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.kt");
+ }
+
+ @Test
+ @TestMetadata("capturedBoundType.kt")
+ public void testCapturedBoundType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall.kt")
+ public void testFunctionCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall_invalid.kt")
+ public void testFunctionCall_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall_safeAccess.kt")
+ public void testFunctionCall_safeAccess() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType.kt")
+ public void testFunctionalType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_parens_1.kt")
+ public void testFunctionalType_parens_1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_parens_2.kt")
+ public void testFunctionalType_parens_2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_withReceiver.kt")
+ public void testFunctionalType_withReceiver() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.kt");
+ }
+
+ @Test
+ @TestMetadata("innerType_constructor.kt")
+ public void testInnerType_constructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.kt");
+ }
+
+ @Test
+ @TestMetadata("innerType_constructor_invalid.kt")
+ public void testInnerType_constructor_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("invokeCallOnObject1.kt")
+ public void testInvokeCallOnObject1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.kt");
+ }
+
+ @Test
+ @TestMetadata("invokeCallOnObject2.kt")
+ public void testInvokeCallOnObject2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_constructor.kt")
+ public void testNestedType_constructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_constructor_invalid.kt")
+ public void testNestedType_constructor_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_object.kt")
+ public void testNestedType_object() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_object_extensionInvoke.kt")
+ public void testNestedType_object_extensionInvoke() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall.kt")
+ public void testPropertyCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall_genericExtension.kt")
+ public void testPropertyCall_genericExtension() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall_safeAccess.kt")
+ public void testPropertyCall_safeAccess() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.kt");
+ }
+ }
}
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
index ecafad0d61f..76e583eefdc 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
@@ -46,6 +46,12 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProv
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
+ @Test
+ @TestMetadata("capturedBoundType.kt")
+ public void testCapturedBoundType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.kt");
+ }
+
@Test
@TestMetadata("class_object_call.kt")
public void testClass_object_call() throws Exception {
@@ -58,6 +64,12 @@ public class FirIdeDependentAnalysisSourceModuleAnalysisApiExpressionPsiTypeProv
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/class_object_constructor.kt");
}
+ @Test
+ @TestMetadata("KTIJ25461.kt")
+ public void testKTIJ25461() throws Exception {
+ runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.kt");
+ }
+
@Test
@TestMetadata("localClassWithUnresolvedSuperType.kt")
public void testLocalClassWithUnresolvedSuperType() throws Exception {
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
index 64776992ff2..f602b63fb12 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/psiTypeProvider/FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
@@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProvide
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
+ @Test
+ @TestMetadata("capturedBoundType.kt")
+ public void testCapturedBoundType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.kt");
+ }
+
@Test
@TestMetadata("class_object_call.kt")
public void testClass_object_call() throws Exception {
@@ -58,6 +64,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProvide
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/class_object_constructor.kt");
}
+ @Test
+ @TestMetadata("KTIJ25461.kt")
+ public void testKTIJ25461() throws Exception {
+ runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.kt");
+ }
+
@Test
@TestMetadata("localClassWithUnresolvedSuperType.kt")
public void testLocalClassWithUnresolvedSuperType() throws Exception {
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt
index 1675c043660..7ddc05d6266 100644
--- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/components/psiTypeProvider/AbstractAnalysisApiExpressionPsiTypeProviderTest.kt
@@ -34,11 +34,14 @@ abstract class AbstractAnalysisApiExpressionPsiTypeProviderTest : AbstractAnalys
?: error("Can't find psi context for $containingDeclaration")
val actual = analyze(ktFile) {
val returnType = declarationAtCaret.getKtType()
- ?: error("Not a typable expression ${declarationAtCaret::class} ${declarationAtCaret.text}")
- val psiType = returnType.asPsiType(psiContext, allowErrorTypes = false)
- buildString {
- appendLine("KtType: ${returnType.render(position = Variance.INVARIANT)}")
- appendLine("PsiType: $psiType")
+ if (returnType != null) {
+ val psiType = returnType.asPsiType(psiContext, allowErrorTypes = false)
+ buildString {
+ appendLine("KtType: ${returnType.render(position = Variance.INVARIANT)}")
+ appendLine("PsiType: $psiType")
+ }
+ } else {
+ "null"
}
}
testServices.assertions.assertEqualsToTestDataFileSibling(actual)
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
index 50212443fa3..f68aa76683d 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java
@@ -301,4 +301,146 @@ public class FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerate
runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt");
}
}
+
+ @Nested
+ @TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference")
+ @TestDataPath("$PROJECT_ROOT")
+ public class NameReference {
+ @Test
+ public void testAllFilesPresentInNameReference() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("assignment.kt")
+ public void testAssignment() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.kt");
+ }
+
+ @Test
+ @TestMetadata("assignment_qualified.kt")
+ public void testAssignment_qualified() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.kt");
+ }
+
+ @Test
+ @TestMetadata("callableReference.kt")
+ public void testCallableReference() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.kt");
+ }
+
+ @Test
+ @TestMetadata("capturedBoundType.kt")
+ public void testCapturedBoundType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall.kt")
+ public void testFunctionCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall_invalid.kt")
+ public void testFunctionCall_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("functionCall_safeAccess.kt")
+ public void testFunctionCall_safeAccess() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType.kt")
+ public void testFunctionalType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_parens_1.kt")
+ public void testFunctionalType_parens_1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_parens_2.kt")
+ public void testFunctionalType_parens_2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.kt");
+ }
+
+ @Test
+ @TestMetadata("functionalType_withReceiver.kt")
+ public void testFunctionalType_withReceiver() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.kt");
+ }
+
+ @Test
+ @TestMetadata("innerType_constructor.kt")
+ public void testInnerType_constructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.kt");
+ }
+
+ @Test
+ @TestMetadata("innerType_constructor_invalid.kt")
+ public void testInnerType_constructor_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("invokeCallOnObject1.kt")
+ public void testInvokeCallOnObject1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.kt");
+ }
+
+ @Test
+ @TestMetadata("invokeCallOnObject2.kt")
+ public void testInvokeCallOnObject2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_constructor.kt")
+ public void testNestedType_constructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_constructor_invalid.kt")
+ public void testNestedType_constructor_invalid() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_object.kt")
+ public void testNestedType_object() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.kt");
+ }
+
+ @Test
+ @TestMetadata("nestedType_object_extensionInvoke.kt")
+ public void testNestedType_object_extensionInvoke() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall.kt")
+ public void testPropertyCall() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall_genericExtension.kt")
+ public void testPropertyCall_genericExtension() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyCall_safeAccess.kt")
+ public void testPropertyCall_safeAccess() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.kt");
+ }
+ }
}
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
index 5b91aa324eb..eb98259fc4e 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/psiTypeProvider/FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiTypeProviderTestGenerated.java
@@ -46,6 +46,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiType
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
+ @Test
+ @TestMetadata("capturedBoundType.kt")
+ public void testCapturedBoundType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.kt");
+ }
+
@Test
@TestMetadata("class_object_call.kt")
public void testClass_object_call() throws Exception {
@@ -58,6 +64,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiExpressionPsiType
runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/class_object_constructor.kt");
}
+ @Test
+ @TestMetadata("KTIJ25461.kt")
+ public void testKTIJ25461() throws Exception {
+ runTest("analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.kt");
+ }
+
@Test
@TestMetadata("localClassWithUnresolvedSuperType.kt")
public void testLocalClassWithUnresolvedSuperType() throws Exception {
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.kt
new file mode 100644
index 00000000000..96dece9fe5d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.kt
@@ -0,0 +1,5 @@
+fun test() {
+ val foo = 10
+
+ foo = 20
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.txt
new file mode 100644
index 00000000000..0cf25137ab7
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment.txt
@@ -0,0 +1,2 @@
+expression: foo
+type: kotlin.Int
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.kt
new file mode 100644
index 00000000000..4d6e733c606
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.kt
@@ -0,0 +1,6 @@
+class Foo {
+ var bar: Int = 0
+}
+fun test(foo: Foo) {
+ foo.bar = 20
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.txt
new file mode 100644
index 00000000000..c5675d1c9cd
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/assignment_qualified.txt
@@ -0,0 +1,2 @@
+expression: bar
+type: kotlin.Int
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.descriptors.txt
new file mode 100644
index 00000000000..07d76aa40d7
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.descriptors.txt
@@ -0,0 +1,2 @@
+expression: myFun
+type: kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.kt
new file mode 100644
index 00000000000..3cd788acb8a
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.kt
@@ -0,0 +1,5 @@
+fun myFun(i: Int): String = i.toString()
+
+fun test() {
+ ::myFun
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.txt
new file mode 100644
index 00000000000..484da6ac788
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/callableReference.txt
@@ -0,0 +1,2 @@
+expression: myFun
+type: null
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.descriptors.txt
new file mode 100644
index 00000000000..71efc1ae4a0
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.descriptors.txt
@@ -0,0 +1,2 @@
+expression: functionWithGeneric
+type: kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.kt
new file mode 100644
index 00000000000..1606bdf7b27
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.kt
@@ -0,0 +1,10 @@
+interface WithGeneric {
+ fun functionWithGeneric(t: T): T
+
+ fun prop(): S
+}
+
+fun take(w: WithGeneric<*>) {
+ // this is an error on purpose!
+ w.functionWithGeneric
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.txt
new file mode 100644
index 00000000000..f3a0e07ad55
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/capturedBoundType.txt
@@ -0,0 +1,2 @@
+expression: functionWithGeneric
+type: ERROR(Cannot infer argument for type parameter T)
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.descriptors.txt
new file mode 100644
index 00000000000..180fd963bc3
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.descriptors.txt
@@ -0,0 +1,2 @@
+expression: foo
+type: kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.kt
new file mode 100644
index 00000000000..31c80b281eb
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.kt
@@ -0,0 +1,5 @@
+fun String.foo(i: Int): String = ""
+
+fun take(s: String) {
+ s.foo(10)
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.txt
new file mode 100644
index 00000000000..3ad25406d11
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall.txt
@@ -0,0 +1,2 @@
+expression: foo
+type: null
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.kt
new file mode 100644
index 00000000000..82be5bdf4cb
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.kt
@@ -0,0 +1,5 @@
+fun String.foo(i: Int): String = ""
+
+fun take(s: String) {
+ s.foo
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.txt
new file mode 100644
index 00000000000..90764bbaa94
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_invalid.txt
@@ -0,0 +1,2 @@
+expression: foo
+type: kotlin.String
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.descriptors.txt
new file mode 100644
index 00000000000..180fd963bc3
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.descriptors.txt
@@ -0,0 +1,2 @@
+expression: foo
+type: kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.kt
new file mode 100644
index 00000000000..50f17825bfb
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.kt
@@ -0,0 +1,5 @@
+fun String.foo(i: Int): String = ""
+
+fun take(s: String?) {
+ s?.foo(10)
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.txt
new file mode 100644
index 00000000000..3ad25406d11
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionCall_safeAccess.txt
@@ -0,0 +1,2 @@
+expression: foo
+type: null
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.kt
new file mode 100644
index 00000000000..12c3e833846
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.kt
@@ -0,0 +1,3 @@
+fun take(lambda: (Int) -> String) {
+ lambda(10)
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.txt
new file mode 100644
index 00000000000..64827164ad5
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType.txt
@@ -0,0 +1,2 @@
+expression: lambda
+type: (kotlin.Int) -> kotlin.String
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.kt
new file mode 100644
index 00000000000..2f7e5eba891
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.kt
@@ -0,0 +1,3 @@
+fun take(lambda: (Int) -> String) {
+ (lambda)(10)
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.txt
new file mode 100644
index 00000000000..64827164ad5
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_1.txt
@@ -0,0 +1,2 @@
+expression: lambda
+type: (kotlin.Int) -> kotlin.String
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.kt
new file mode 100644
index 00000000000..1176abb417b
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.kt
@@ -0,0 +1,3 @@
+fun take(lambda: (Int) -> String) {
+ (lambda)(10)
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.txt
new file mode 100644
index 00000000000..239be877356
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_parens_2.txt
@@ -0,0 +1,2 @@
+expression: (lambda)
+type: (kotlin.Int) -> kotlin.String
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.kt
new file mode 100644
index 00000000000..6138359ec5d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.kt
@@ -0,0 +1,3 @@
+fun take(lambda: String.(Int) -> String) {
+ "hello".lambda(10)
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.txt
new file mode 100644
index 00000000000..33b5adeb97e
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/functionalType_withReceiver.txt
@@ -0,0 +1,2 @@
+expression: lambda
+type: kotlin.String.(kotlin.Int) -> kotlin.String
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.descriptors.txt
new file mode 100644
index 00000000000..e1cef4e589f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.descriptors.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.kt
new file mode 100644
index 00000000000..416784249b1
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.kt
@@ -0,0 +1,7 @@
+class Foo {
+ inner class Bar
+}
+
+fun foo(foo: Foo) {
+ foo.Bar()
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.txt
new file mode 100644
index 00000000000..43d158e1888
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: null
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.descriptors.txt
new file mode 100644
index 00000000000..e1cef4e589f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.descriptors.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.kt
new file mode 100644
index 00000000000..bed042447a7
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.kt
@@ -0,0 +1,7 @@
+class Foo {
+ inner class Bar
+}
+
+fun foo(foo: Foo) {
+ foo.Bar
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.txt
new file mode 100644
index 00000000000..ee0f8930926
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/innerType_constructor_invalid.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: Foo.Bar
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.kt
new file mode 100644
index 00000000000..5c8be0f8321
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.kt
@@ -0,0 +1,7 @@
+object Foo {
+ operator fun invoke(i: Int): String {}
+}
+
+fun take() {
+ Foo(10)
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.txt
new file mode 100644
index 00000000000..d11e2feaf78
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject1.txt
@@ -0,0 +1,2 @@
+expression: Foo
+type: Foo
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.kt
new file mode 100644
index 00000000000..30416e7af0c
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.kt
@@ -0,0 +1,9 @@
+class Foo {
+ companion object {
+ operator fun invoke(i: Int): String {}
+ }
+}
+
+fun take() {
+ Foo(10)
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.txt
new file mode 100644
index 00000000000..df17c946f2d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/invokeCallOnObject2.txt
@@ -0,0 +1,2 @@
+expression: Foo
+type: Foo.Companion
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.descriptors.txt
new file mode 100644
index 00000000000..e1cef4e589f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.descriptors.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.kt
new file mode 100644
index 00000000000..c80d8033ac0
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.kt
@@ -0,0 +1,7 @@
+class Foo {
+ class Bar
+}
+
+fun foo() {
+ Foo.Bar()
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.txt
new file mode 100644
index 00000000000..43d158e1888
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: null
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.kt
new file mode 100644
index 00000000000..1ee70adf784
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.kt
@@ -0,0 +1,7 @@
+class Foo {
+ class Bar
+}
+
+fun foo() {
+ Foo.Bar
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.txt
new file mode 100644
index 00000000000..e1cef4e589f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_constructor_invalid.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.kt
new file mode 100644
index 00000000000..d1dbdf6274b
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.kt
@@ -0,0 +1,7 @@
+class Foo {
+ object Bar
+}
+
+fun foo() {
+ Foo.Bar
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.txt
new file mode 100644
index 00000000000..ee0f8930926
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: Foo.Bar
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.kt
new file mode 100644
index 00000000000..d6a34869ecb
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.kt
@@ -0,0 +1,9 @@
+class Foo {
+ object Bar
+}
+
+operator fun Bar.invoke() {}
+
+fun foo() {
+ Foo.Bar()
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.txt
new file mode 100644
index 00000000000..ee0f8930926
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/nestedType_object_extensionInvoke.txt
@@ -0,0 +1,2 @@
+expression: Bar
+type: Foo.Bar
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.kt
new file mode 100644
index 00000000000..41335ff09e4
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.kt
@@ -0,0 +1,5 @@
+val String.foo: String get() = ""
+
+fun take(s: String) {
+ s.foo
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.txt
new file mode 100644
index 00000000000..90764bbaa94
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall.txt
@@ -0,0 +1,2 @@
+expression: foo
+type: kotlin.String
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.kt
new file mode 100644
index 00000000000..40c93a464e1
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.kt
@@ -0,0 +1,11 @@
+interface WithGeneric
+
+interface Foo {
+ val foo: WithGeneric
+}
+
+val Foo.fooExt: WithGeneric get() = foo
+
+fun take(s: Foo) {
+ s.fooExt
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.txt
new file mode 100644
index 00000000000..3bd15fadfcc
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_genericExtension.txt
@@ -0,0 +1,2 @@
+expression: fooExt
+type: WithGeneric
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.kt
new file mode 100644
index 00000000000..6f8bdcc5920
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.kt
@@ -0,0 +1,5 @@
+val String.foo: String get() = ""
+
+fun take(s: String?) {
+ s?.foo
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.txt
new file mode 100644
index 00000000000..d8850287f8f
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/nameReference/propertyCall_safeAccess.txt
@@ -0,0 +1,2 @@
+expression: foo
+type: kotlin.String?
diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.kt
new file mode 100644
index 00000000000..90a30be8436
--- /dev/null
+++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.kt
@@ -0,0 +1,7 @@
+interface BodySpec> {
+ fun isEqualTo(expected: B) : T
+}
+
+fun test(b: BodySpec) {
+ b.isEqualTo("")
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.txt
new file mode 100644
index 00000000000..ec747fa47dd
--- /dev/null
+++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/KTIJ25461.txt
@@ -0,0 +1 @@
+null
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.kt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.kt
new file mode 100644
index 00000000000..1606bdf7b27
--- /dev/null
+++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.kt
@@ -0,0 +1,10 @@
+interface WithGeneric {
+ fun functionWithGeneric(t: T): T
+
+ fun prop(): S
+}
+
+fun take(w: WithGeneric<*>) {
+ // this is an error on purpose!
+ w.functionWithGeneric
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.txt
new file mode 100644
index 00000000000..9f66a0bf5b6
--- /dev/null
+++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/capturedBoundType.txt
@@ -0,0 +1,2 @@
+KtType: T
+PsiType: null
diff --git a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/typeParamFlexibleUpperBound.txt b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/typeParamFlexibleUpperBound.txt
index 5692e434f25..ec747fa47dd 100644
--- a/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/typeParamFlexibleUpperBound.txt
+++ b/analysis/analysis-api/testData/components/psiTypeProvider/psiType/forExpression/typeParamFlexibleUpperBound.txt
@@ -1,2 +1 @@
-KtType: T & kotlin.Any
-PsiType: PsiType:T
+null
\ No newline at end of file