[Analysis API] Rewrite PsiMember.callableSymbol for constructors Before that change, the method returned null for constructors. This is because NamedClassSymbol.combinedDeclaredMemberScope.callables doesn't contain constructor symbols. ^KT-70243 fixed
diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirJavaInteroperabilityComponent.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirJavaInteroperabilityComponent.kt index 3f20415..a8f673e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirJavaInteroperabilityComponent.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KaFirJavaInteroperabilityComponent.kt
@@ -316,11 +316,16 @@ override val PsiMember.callableSymbol: KaCallableSymbol? get() = withValidityAssertion { if (this !is PsiMethod && this !is PsiField) return null - val name = name?.let(Name::identifier) ?: return null val containingClass = containingClass ?: return null val classSymbol = containingClass.namedClassSymbol ?: return null return with(analysisSession) { - classSymbol.combinedDeclaredMemberScope.callables(name).firstOrNull { it.psi == this@callableSymbol } + val combinedMemberScope = classSymbol.combinedDeclaredMemberScope + if ((this@callableSymbol as? PsiMethod)?.isConstructor == true) { + combinedMemberScope.constructors.firstOrNull { it.psi == this@callableSymbol } + } else { + val name = name?.let(Name::identifier) ?: return null + combinedMemberScope.callables(name).firstOrNull { it.psi == this@callableSymbol } + } } }
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByJavaPsiTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByJavaPsiTestGenerated.java index 554cb45..655031b 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByJavaPsiTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByJavaPsiTestGenerated.java
@@ -46,6 +46,12 @@ } @Test + @TestMetadata("javaConstructor.kt") + public void testJavaConstructor() { + runTest("analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.kt"); + } + + @Test @TestMetadata("javaField.kt") public void testJavaField() { runTest("analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaField.kt");
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByJavaPsiTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByJavaPsiTestGenerated.java index 553bba2..f3116fd 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByJavaPsiTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByJavaPsiTestGenerated.java
@@ -46,6 +46,12 @@ } @Test + @TestMetadata("javaConstructor.kt") + public void testJavaConstructor() { + runTest("analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.kt"); + } + + @Test @TestMetadata("javaField.kt") public void testJavaField() { runTest("analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaField.kt");
diff --git a/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.kt b/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.kt new file mode 100644 index 0000000..8dd31c8 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.kt
@@ -0,0 +1,13 @@ +// FILE: main.kt +fun some() { + JavaCla<caret>ss(5) +} + +// FILE: JavaClass.java +public class JavaClass { + public Integer count = 0; + + JavaClass(int _count) { + count = _count; + } +}
diff --git a/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.pretty.txt new file mode 100644 index 0000000..64cd4af --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.pretty.txt
@@ -0,0 +1 @@ +constructor(_count: kotlin.Int)
diff --git a/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.txt b/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.txt new file mode 100644 index 0000000..c4c1d94 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByJavaPsi/javaConstructor.txt
@@ -0,0 +1,56 @@ +KaConstructorSymbol: + annotations: [] + callableId: null + compilerVisibility: PackageVisibility + containingClassId: JavaClass + contextReceivers: [] + hasStableParameterNames: false + isActual: false + isExpect: false + isExtension: false + isPrimary: false + location: CLASS + modality: FINAL + origin: JAVA_SOURCE + receiverParameter: null + returnType: KaUsualClassType: + annotations: [] + typeArguments: [] + type: JavaClass + typeParameters: [] + valueParameters: [ + KaValueParameterSymbol: + annotations: [] + callableId: null + compilerVisibility: Public + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isActual: false + isCrossinline: false + isExpect: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVal: true + isVararg: false + location: LOCAL + modality: FINAL + name: _count + origin: JAVA_SOURCE + receiverParameter: null + returnType: KaUsualClassType: + annotations: [] + typeArguments: [] + type: kotlin/Int + visibility: PUBLIC + getContainingFileSymbol: null + getContainingJvmClassName: JavaClass + getContainingModule: KaSourceModule "Sources of main" + deprecationStatus: null + ] + visibility: PACKAGE_PRIVATE + getContainingFileSymbol: null + getContainingJvmClassName: JavaClass + getContainingModule: KaSourceModule "Sources of main" + deprecationStatus: null