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