From 2429d09edd1a052b78b21e75d9c69cb34144c07a Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Fri, 19 Jan 2024 14:28:32 -0800 Subject: [PATCH] AA: use explicit qualifier type if available ...when computing receiver type for double colon expression ^KT-65150 fixed --- ...leDoubleColonReceiverTypeTestGenerated.java | 6 ++++++ .../api/fir/components/KtFirTypeProvider.kt | 18 ++++++++++++------ ...leDoubleColonReceiverTypeTestGenerated.java | 6 ++++++ ...leDoubleColonReceiverTypeTestGenerated.java | 6 ++++++ ...leDoubleColonReceiverTypeTestGenerated.java | 6 ++++++ .../methodReference_java.kt | 15 +++++++++++++++ .../methodReference_java.txt | 2 ++ 7 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.kt create mode 100644 analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/typeInfoProvider/Fe10IdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/typeInfoProvider/Fe10IdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java index a12189509d6..96d599cddea 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/typeInfoProvider/Fe10IdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/typeInfoProvider/Fe10IdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java @@ -64,6 +64,12 @@ public class Fe10IdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerat runTest("analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/getClass_variable.kt"); } + @Test + @TestMetadata("methodReference_java.kt") + public void testMethodReference_java() throws Exception { + runTest("analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.kt"); + } + @Test @TestMetadata("methodReference_type.kt") public void testMethodReference_type() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt index b0142b431d6..1bb51afd8a3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.fir.components import org.jetbrains.kotlin.analysis.api.components.KtBuiltinTypes import org.jetbrains.kotlin.analysis.api.components.KtTypeProvider +import org.jetbrains.kotlin.analysis.api.components.buildClassType import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol @@ -34,10 +35,7 @@ import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.fullyExpandedClass -import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess -import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall -import org.jetbrains.kotlin.fir.expressions.FirGetClassCall -import org.jetbrains.kotlin.fir.expressions.FirPropertyAccessExpression +import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.java.enhancement.EnhancedForWarningConeSubstitutor import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.renderer.FirRenderer @@ -195,8 +193,16 @@ internal class KtFirTypeProvider( } is FirCallableReferenceAccess -> { when (val explicitReceiver = fir.explicitReceiver) { - is FirPropertyAccessExpression -> explicitReceiver.resolvedType.asKtType() - else -> fir.resolvedType.getReceiverOfReflectionType()?.asKtType() + is FirPropertyAccessExpression -> { + explicitReceiver.resolvedType.asKtType() + } + is FirResolvedQualifier -> { + explicitReceiver.classId?.let { analysisSession.buildClassType(it) } + ?: fir.resolvedType.getReceiverOfReflectionType()?.asKtType() + } + else -> { + fir.resolvedType.getReceiverOfReflectionType()?.asKtType() + } } } else -> { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeInfoProvider/FirIdeDependentAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeInfoProvider/FirIdeDependentAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java index e1573e5e9de..859ce92d295 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeInfoProvider/FirIdeDependentAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeInfoProvider/FirIdeDependentAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java @@ -64,6 +64,12 @@ public class FirIdeDependentAnalysisSourceModuleDoubleColonReceiverTypeTestGener runTest("analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/getClass_variable.kt"); } + @Test + @TestMetadata("methodReference_java.kt") + public void testMethodReference_java() throws Exception { + runTest("analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.kt"); + } + @Test @TestMetadata("methodReference_type.kt") public void testMethodReference_type() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeInfoProvider/FirIdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeInfoProvider/FirIdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java index 0e3c687664e..cd0afd34563 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeInfoProvider/FirIdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/typeInfoProvider/FirIdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java @@ -64,6 +64,12 @@ public class FirIdeNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerate runTest("analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/getClass_variable.kt"); } + @Test + @TestMetadata("methodReference_java.kt") + public void testMethodReference_java() throws Exception { + runTest("analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.kt"); + } + @Test @TestMetadata("methodReference_type.kt") public void testMethodReference_type() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/typeInfoProvider/FirStandaloneNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/typeInfoProvider/FirStandaloneNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java index 341b60a634a..f5e58b76786 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/typeInfoProvider/FirStandaloneNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/typeInfoProvider/FirStandaloneNormalAnalysisSourceModuleDoubleColonReceiverTypeTestGenerated.java @@ -64,6 +64,12 @@ public class FirStandaloneNormalAnalysisSourceModuleDoubleColonReceiverTypeTestG runTest("analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/getClass_variable.kt"); } + @Test + @TestMetadata("methodReference_java.kt") + public void testMethodReference_java() throws Exception { + runTest("analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.kt"); + } + @Test @TestMetadata("methodReference_type.kt") public void testMethodReference_type() throws Exception { diff --git a/analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.kt b/analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.kt new file mode 100644 index 00000000000..0af7b9a4d8c --- /dev/null +++ b/analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.kt @@ -0,0 +1,15 @@ +// FILE: IntMath.java + +package my.math; + +public final class IntMath { + public static int factorial(int n) { + return 42; + } +} + +// FILE: main.kt + +import my.math.IntMath + +fun test() = IntMath::factorial diff --git a/analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.txt b/analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.txt new file mode 100644 index 00000000000..4b263dd31a1 --- /dev/null +++ b/analysis/analysis-api/testData/components/typeInfoProvider/doubleColonReceiverType/methodReference_java.txt @@ -0,0 +1,2 @@ +expression: IntMath::factorial +receiver:: type: my.math.IntMath