diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index eec62225678..edf52ac2e5b 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -898,6 +898,12 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A public void testGetterAssignment() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.kt"); } + + @Test + @TestMetadata("typeParameterAsValue.kt") + public void testTypeParameterAsValue() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.kt"); + } } @Nested diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt index d34df3c025e..d2e52d37266 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt @@ -168,10 +168,20 @@ internal class KtFirCallResolver( return when (this) { is FirResolvable -> { when (val calleeReference = calleeReference) { - is FirResolvedNamedReference -> { - val call = createKtCall(psi, this, null, resolveFragmentOfCall) - ?: errorWithFirSpecificEntries("expect `createKtCall` to succeed for resolvable case", fir = this, psi = psi) - KtSuccessCallInfo(call) + is FirResolvedNamedReference -> when (calleeReference.resolvedSymbol) { + // `calleeReference.resolvedSymbol` isn't guaranteed to be callable. For example, function type parameters used in + // expression positions (e.g. `T` in `println(T)`) are parsed as `KtSimpleNameExpression` and built into + // `FirPropertyAccessExpression` (which is `FirResolvable`). + is FirCallableSymbol<*> -> { + val call = createKtCall(psi, this, null, resolveFragmentOfCall) + ?: errorWithFirSpecificEntries( + "expect `createKtCall` to succeed for resolvable case with callable symbol", + fir = this, + psi = psi + ) + KtSuccessCallInfo(call) + } + else -> null } is FirErrorNamedReference -> { val diagnostic = calleeReference.diagnostic diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index 60005ee1fef..d5016885a05 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -898,6 +898,12 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab public void testGetterAssignment() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.kt"); } + + @Test + @TestMetadata("typeParameterAsValue.kt") + public void testTypeParameterAsValue() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.kt"); + } } @Nested diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java index 81d81ff311d..74c8bd0f8ab 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/importOptimizer/FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java @@ -127,6 +127,12 @@ public class FirIdeNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGener KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("unusedTypeHiddenByTypeParameter_invalidAsArgument.kt") + public void testUnusedTypeHiddenByTypeParameter_invalidAsArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors/unusedTypeHiddenByTypeParameter_invalidAsArgument.kt"); + } + @Test @TestMetadata("usedConstructor_invalidArguments.kt") public void testUsedConstructor_invalidArguments() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java index 3ec1aa64ad6..dbf05a90f05 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -898,6 +898,12 @@ public class FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated ext public void testGetterAssignment() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.kt"); } + + @Test + @TestMetadata("typeParameterAsValue.kt") + public void testTypeParameterAsValue() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.kt"); + } } @Nested diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java index dd390e7f695..8ec6aa316d0 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/importOptimizer/FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTestGenerated.java @@ -127,6 +127,12 @@ public class FirStandaloneNormalAnalysisSourceModuleAnalysisApiImportOptimizerTe KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("unusedTypeHiddenByTypeParameter_invalidAsArgument.kt") + public void testUnusedTypeHiddenByTypeParameter_invalidAsArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors/unusedTypeHiddenByTypeParameter_invalidAsArgument.kt"); + } + @Test @TestMetadata("usedConstructor_invalidArguments.kt") public void testUsedConstructor_invalidArguments() throws Exception { diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.kt new file mode 100644 index 00000000000..01cf80b3ba1 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.kt @@ -0,0 +1,5 @@ +// See: KTIJ-23003 (KotlinExceptionWithAttachments) + +fun test(x: Any) { + println(T) +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.txt new file mode 100644 index 00000000000..ec747fa47dd --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/typeParameterAsValue.txt @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors/unusedTypeHiddenByTypeParameter_invalidAsArgument.imports b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors/unusedTypeHiddenByTypeParameter_invalidAsArgument.imports new file mode 100644 index 00000000000..792173d02fb --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors/unusedTypeHiddenByTypeParameter_invalidAsArgument.imports @@ -0,0 +1 @@ +dependency.T \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors/unusedTypeHiddenByTypeParameter_invalidAsArgument.kt b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors/unusedTypeHiddenByTypeParameter_invalidAsArgument.kt new file mode 100644 index 00000000000..6d15b2ca700 --- /dev/null +++ b/analysis/analysis-api/testData/components/importOptimizer/analyseImports/referencesWithErrors/unusedTypeHiddenByTypeParameter_invalidAsArgument.kt @@ -0,0 +1,15 @@ +// See: KTIJ-23003 (ClassCastException) + +// FILE: main.kt +package test + +import dependency.T + +fun usage() { + println(T) +} + +// FILE: dependency.kt +package dependency + +class T(i: Int) \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt index 87d95495b75..00b99d5e9de 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/expressions/FirExpressionUtil.kt @@ -74,7 +74,7 @@ fun FirExpression.toReference(): FirReference? { } fun FirExpression.toResolvedCallableSymbol(): FirCallableSymbol<*>? { - return toResolvedCallableReference()?.resolvedSymbol as FirCallableSymbol<*>? + return toResolvedCallableReference()?.resolvedSymbol as? FirCallableSymbol<*>? } fun FirReference.toResolvedCallableSymbol(): FirCallableSymbol<*>? {