From e47615002549b18ab4da2035265ac5638e7af84c Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Wed, 14 Dec 2022 23:33:36 +0100 Subject: [PATCH] [AA FIR] support symbol restoring for static members ^KT-55487 Fixed --- ...eModuleSymbolByReferenceTestGenerated.java | 36 ++++++++++ .../api/fir/symbols/KtFirFunctionSymbol.kt | 1 + .../api/fir/symbols/KtFirJavaFieldSymbol.kt | 2 +- .../KtFirSyntheticJavaPropertySymbol.kt | 7 +- .../pointers/KtFirJavaFieldSymbolPointer.kt | 3 +- ...KtFirJavaSyntheticPropertySymbolPointer.kt | 19 ++++++ .../KtFirMemberFunctionSymbolPointer.kt | 3 +- .../pointers/KtFirMemberSymbolPointer.kt | 38 +++++++---- ...eModuleSymbolByReferenceTestGenerated.java | 36 ++++++++++ ...eModuleSymbolByReferenceTestGenerated.java | 36 ++++++++++ .../enumValueOf.descriptors.txt | 46 +++++++++++++ .../symbols/symbolByReference/enumValueOf.kt | 9 +++ .../symbolByReference/enumValueOf.pretty.txt | 1 + .../symbols/symbolByReference/enumValueOf.txt | 46 +++++++++++++ .../enumValues.descriptors.txt | 26 +++++++ .../symbols/symbolByReference/enumValues.kt | 9 +++ .../symbolByReference/enumValues.pretty.txt | 1 + .../symbols/symbolByReference/enumValues.txt | 26 +++++++ .../symbols/symbolByReference/javaMethod.kt | 9 +++ .../symbolByReference/javaMethod.pretty.txt | 1 + .../symbols/symbolByReference/javaMethod.txt | 27 ++++++++ .../javaStaticField.descriptors.pretty.txt | 1 + .../javaStaticField.descriptors.txt | 17 +++++ .../symbolByReference/javaStaticField.kt | 10 +++ .../javaStaticField.pretty.txt | 1 + .../symbolByReference/javaStaticField.txt | 17 +++++ .../symbolByReference/javaStaticMethod.kt | 10 +++ .../javaStaticMethod.pretty.txt | 1 + .../symbolByReference/javaStaticMethod.txt | 26 +++++++ ...vaSyntheticAccessor.descriptors.pretty.txt | 2 + .../javaSyntheticAccessor.descriptors.txt | 67 +++++++++++++++++++ .../javaSyntheticAccessor.kt | 10 +++ .../javaSyntheticAccessor.pretty.txt | 2 + .../javaSyntheticAccessor.txt | 53 +++++++++++++++ 34 files changed, 581 insertions(+), 18 deletions(-) create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/enumValues.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/enumValues.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/enumValues.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/enumValues.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.descriptors.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.descriptors.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.kt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.pretty.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java index 8e66b750f87..dc5f9bf3600 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java @@ -64,6 +64,18 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.kt"); } + @Test + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.kt"); + } + + @Test + @TestMetadata("enumValues.kt") + public void testEnumValues() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/enumValues.kt"); + } + @Test @TestMetadata("explicitLambdaParameter.kt") public void testExplicitLambdaParameter() throws Exception { @@ -106,6 +118,30 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated ext runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaField.kt"); } + @Test + @TestMetadata("javaMethod.kt") + public void testJavaMethod() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.kt"); + } + + @Test + @TestMetadata("javaStaticField.kt") + public void testJavaStaticField() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.kt"); + } + + @Test + @TestMetadata("javaStaticMethod.kt") + public void testJavaStaticMethod() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.kt"); + } + + @Test + @TestMetadata("javaSyntheticAccessor.kt") + public void testJavaSyntheticAccessor() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.kt"); + } + @Test @TestMetadata("primaryConstructorValueParameter.kt") public void testPrimaryConstructorValueParameter() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt index 97891cb0890..8b7b8ad56e1 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt @@ -117,6 +117,7 @@ internal class KtFirFunctionSymbol( requireOwnerPointer(), firSymbol.name, FirCallableSignature.createSignature(firSymbol), + isStatic = firSymbol.isStatic, ) KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt index 8506ae2c045..69b34c80096 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt @@ -55,7 +55,7 @@ internal class KtFirJavaFieldSymbol( context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer = withValidityAssertion { - KtFirJavaFieldSymbolPointer(requireOwnerPointer(), name) + KtFirJavaFieldSymbolPointer(requireOwnerPointer(), name, firSymbol.isStatic) } override fun equals(other: Any?): Boolean = symbolEquals(other) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index 5c723e0e315..b33a123a5d7 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isOverride import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.visibility +import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol import org.jetbrains.kotlin.fir.symbols.impl.isExtension import org.jetbrains.kotlin.name.CallableId @@ -97,7 +98,11 @@ internal class KtFirSyntheticJavaPropertySymbol( context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer = withValidityAssertion { - KtFirJavaSyntheticPropertySymbolPointer(requireOwnerPointer(), name) + KtFirJavaSyntheticPropertySymbolPointer( + ownerPointer = requireOwnerPointer(), + propertyName = name, + isSynthetic = firSymbol is SyntheticSymbol, + ) } override fun equals(other: Any?): Boolean = symbolEquals(other) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt index 9c97c95687b..3fffd2d3b2f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt @@ -18,7 +18,8 @@ import org.jetbrains.kotlin.name.Name internal class KtFirJavaFieldSymbolPointer( ownerPointer: KtSymbolPointer, private val fieldName: Name, -) : KtFirMemberSymbolPointer(ownerPointer) { + isStatic: Boolean, +) : KtFirMemberSymbolPointer(ownerPointer, isStatic) { override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( candidates: FirScope, firSession: FirSession, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt index adf2aba433d..2d2fce41dad 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt @@ -11,13 +11,18 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty +import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope +import org.jetbrains.kotlin.fir.resolve.defaultType import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.FirTypeScope import org.jetbrains.kotlin.fir.scopes.getProperties +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.name.Name internal class KtFirJavaSyntheticPropertySymbolPointer( ownerPointer: KtSymbolPointer, private val propertyName: Name, + private val isSynthetic: Boolean, ) : KtFirMemberSymbolPointer(ownerPointer) { override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( candidates: FirScope, @@ -30,4 +35,18 @@ internal class KtFirJavaSyntheticPropertySymbolPointer( return firSymbolBuilder.variableLikeBuilder.buildSyntheticJavaPropertySymbol(syntheticProperty.symbol) } + + context(KtFirAnalysisSession) + override fun getSearchScope(owner: FirClassSymbol<*>): FirScope? { + val baseScope = super.getSearchScope(owner) as? FirTypeScope ?: return null + return if (isSynthetic) { + FirSyntheticPropertiesScope.createIfSyntheticNamesProviderIsDefined( + session = useSiteSession, + dispatchReceiverType = owner.defaultType(), + baseScope = baseScope, + ) + } else { + baseScope + } + } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt index 810595b6185..53dce67f06c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt @@ -18,7 +18,8 @@ internal class KtFirMemberFunctionSymbolPointer( ownerPointer: KtSymbolPointer, private val name: Name, private val signature: FirCallableSignature, -) : KtFirMemberSymbolPointer(ownerPointer) { + isStatic: Boolean, +) : KtFirMemberSymbolPointer(ownerPointer, isStatic) { override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol( candidates: FirScope, firSession: FirSession diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt index 3399c27d479..3168776e65b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt @@ -6,41 +6,51 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.analyze import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.analysis.api.fir.utils.firSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.utils.errors.requireIsInstance import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol internal abstract class KtFirMemberSymbolPointer( private val ownerPointer: KtSymbolPointer, + private val isStatic: Boolean = false, ) : KtSymbolPointer() { @Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol") final override fun restoreSymbol(analysisSession: KtAnalysisSession): S? { require(analysisSession is KtFirAnalysisSession) - val ownerSymbol = with(analysisSession) { - ownerPointer.restoreSymbol() - } + val scope = with(analysisSession) { + val ownerSymbol = ownerPointer.restoreSymbol() ?: return null + val owner = ownerSymbol.firSymbol as? FirClassSymbol ?: return null + getSearchScope(owner) + } ?: return null - val owner = ownerSymbol?.firSymbol as? FirClassSymbol ?: return null - val firSession = analysisSession.useSiteSession - val scope = owner.unsubstitutedScope( - firSession, - analysisSession.getScopeSessionFor(firSession), - withForcedTypeCalculator = false, - ) - - return analysisSession.chooseCandidateAndCreateSymbol(scope, firSession) + return analysisSession.chooseCandidateAndCreateSymbol(scope, analysisSession.useSiteSession) } protected abstract fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(candidates: FirScope, firSession: FirSession): S? + + context(KtFirAnalysisSession) + protected open fun getSearchScope(owner: FirClassSymbol<*>): FirScope? { + val firSession = useSiteSession + val scopeSession = getScopeSessionFor(firSession) + return if (isStatic) { + val firClass = owner.fir as? FirClass ?: return null + firClass.scopeProvider.getStaticMemberScopeForCallables(firClass, firSession, scopeSession) + } else { + owner.unsubstitutedScope( + useSiteSession = firSession, + scopeSession = scopeSession, + withForcedTypeCalculator = false, + ) + } + } } context(KtAnalysisSession) diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java index a77f3704310..7d3676e785e 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java @@ -64,6 +64,18 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated exte runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.kt"); } + @Test + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.kt"); + } + + @Test + @TestMetadata("enumValues.kt") + public void testEnumValues() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/enumValues.kt"); + } + @Test @TestMetadata("explicitLambdaParameter.kt") public void testExplicitLambdaParameter() throws Exception { @@ -106,6 +118,30 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated exte runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaField.kt"); } + @Test + @TestMetadata("javaMethod.kt") + public void testJavaMethod() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.kt"); + } + + @Test + @TestMetadata("javaStaticField.kt") + public void testJavaStaticField() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.kt"); + } + + @Test + @TestMetadata("javaStaticMethod.kt") + public void testJavaStaticMethod() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.kt"); + } + + @Test + @TestMetadata("javaSyntheticAccessor.kt") + public void testJavaSyntheticAccessor() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.kt"); + } + @Test @TestMetadata("primaryConstructorValueParameter.kt") public void testPrimaryConstructorValueParameter() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java index 8d128cff88a..50060917293 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerated.java @@ -64,6 +64,18 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerat runTest("analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.kt"); } + @Test + @TestMetadata("enumValueOf.kt") + public void testEnumValueOf() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.kt"); + } + + @Test + @TestMetadata("enumValues.kt") + public void testEnumValues() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/enumValues.kt"); + } + @Test @TestMetadata("explicitLambdaParameter.kt") public void testExplicitLambdaParameter() throws Exception { @@ -106,6 +118,30 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByReferenceTestGenerat runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaField.kt"); } + @Test + @TestMetadata("javaMethod.kt") + public void testJavaMethod() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.kt"); + } + + @Test + @TestMetadata("javaStaticField.kt") + public void testJavaStaticField() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.kt"); + } + + @Test + @TestMetadata("javaStaticMethod.kt") + public void testJavaStaticMethod() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.kt"); + } + + @Test + @TestMetadata("javaSyntheticAccessor.kt") + public void testJavaSyntheticAccessor() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.kt"); + } + @Test @TestMetadata("primaryConstructorValueParameter.kt") public void testPrimaryConstructorValueParameter() throws Exception { diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.descriptors.txt new file mode 100644 index 00000000000..3fea1dc3cd8 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.descriptors.txt @@ -0,0 +1,46 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /MyKotlinEnum.valueOf + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: valueOf + origin: SOURCE_MEMBER_GENERATED + receiverParameter: null + returnType: MyKotlinEnum + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: value + origin: SOURCE + receiverParameter: null + returnType: kotlin/String + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + ] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.kt b/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.kt new file mode 100644 index 00000000000..1df022b2ec0 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.kt @@ -0,0 +1,9 @@ +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 + +enum class MyKotlinEnum { + FirstEntry, SecondEntry; +} + +fun test() { + MyKotlinEnum.valueOf("") +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.pretty.txt new file mode 100644 index 00000000000..71a2f58293c --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.pretty.txt @@ -0,0 +1 @@ +fun valueOf(value: kotlin.String): MyKotlinEnum \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.txt b/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.txt new file mode 100644 index 00000000000..9648cc390c0 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/enumValueOf.txt @@ -0,0 +1,46 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /MyKotlinEnum.valueOf + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: true + isSuspend: false + modality: FINAL + name: valueOf + origin: SOURCE_MEMBER_GENERATED + receiverParameter: null + returnType: MyKotlinEnum + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol: + annotationsList: [] + callableIdIfNonLocal: null + contextReceivers: [] + generatedPrimaryConstructorProperty: null + hasDefaultValue: false + isCrossinline: false + isExtension: false + isImplicitLambdaParameter: false + isNoinline: false + isVararg: false + name: value + origin: SOURCE_MEMBER_GENERATED + receiverParameter: null + returnType: kotlin/String + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + ] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.descriptors.txt new file mode 100644 index 00000000000..4f0b027b87c --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.descriptors.txt @@ -0,0 +1,26 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /MyKotlinEnum.values + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: FINAL + name: values + origin: SOURCE_MEMBER_GENERATED + receiverParameter: null + returnType: kotlin/Array + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.kt b/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.kt new file mode 100644 index 00000000000..3f2117923a3 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.kt @@ -0,0 +1,9 @@ +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 + +enum class MyKotlinEnum { + FirstEntry, SecondEntry; +} + +fun test() { + MyKotlinEnum.values() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.pretty.txt new file mode 100644 index 00000000000..cc44c43ee86 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.pretty.txt @@ -0,0 +1 @@ +fun values(): kotlin.Array \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.txt b/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.txt new file mode 100644 index 00000000000..22c7398c177 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/enumValues.txt @@ -0,0 +1,26 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /MyKotlinEnum.values + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: true + isSuspend: false + modality: FINAL + name: values + origin: SOURCE_MEMBER_GENERATED + receiverParameter: null + returnType: kotlin/Array + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.kt b/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.kt new file mode 100644 index 00000000000..f3e8ec9dd6b --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.kt @@ -0,0 +1,9 @@ +// FILE: main.kt +fun some() { + JavaClass().foo(); +} + +// FILE: JavaClass.java +public class JavaClass { + public void foo() {}; +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.pretty.txt new file mode 100644 index 00000000000..00bb9b9a886 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.pretty.txt @@ -0,0 +1 @@ +open fun foo() \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.txt new file mode 100644 index 00000000000..ce225333e68 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaMethod.txt @@ -0,0 +1,27 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /JavaClass.foo + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: false + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: OPEN + name: foo + origin: JAVA + receiverParameter: null + returnType: kotlin/Unit + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [] + visibility: Public + getDispatchReceiver(): JavaClass + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.descriptors.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.descriptors.pretty.txt new file mode 100644 index 00000000000..e54bb282da5 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.descriptors.pretty.txt @@ -0,0 +1 @@ +var field: kotlin.Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.descriptors.txt new file mode 100644 index 00000000000..69295d4be6a --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.descriptors.txt @@ -0,0 +1,17 @@ +KtJavaFieldSymbol: + annotationsList: [] + callableIdIfNonLocal: /JavaClass.field + contextReceivers: [] + isExtension: false + isStatic: true + isVal: false + modality: FINAL + name: field + origin: JAVA + receiverParameter: null + returnType: kotlin/Int + symbolKind: CLASS_MEMBER + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.kt b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.kt new file mode 100644 index 00000000000..d13ac68b0ac --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.kt @@ -0,0 +1,10 @@ +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 +// FILE: main.kt +fun some() { + JavaClass.field; +} + +// FILE: JavaClass.java +public class JavaClass { + public static int field = 1; +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.pretty.txt new file mode 100644 index 00000000000..8366924abf4 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.pretty.txt @@ -0,0 +1 @@ +open var field: kotlin.Int \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.txt new file mode 100644 index 00000000000..38eca9b727f --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticField.txt @@ -0,0 +1,17 @@ +KtJavaFieldSymbol: + annotationsList: [] + callableIdIfNonLocal: /JavaClass.field + contextReceivers: [] + isExtension: false + isStatic: true + isVal: false + modality: OPEN + name: field + origin: JAVA + receiverParameter: null + returnType: kotlin/Int + symbolKind: CLASS_MEMBER + typeParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.kt b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.kt new file mode 100644 index 00000000000..ddc7c6caa19 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.kt @@ -0,0 +1,10 @@ +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 +// FILE: main.kt +fun some() { + JavaClass.foo(); +} + +// FILE: JavaClass.java +public class JavaClass { + public static void foo() {}; +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.pretty.txt new file mode 100644 index 00000000000..00bb9b9a886 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.pretty.txt @@ -0,0 +1 @@ +open fun foo() \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.txt new file mode 100644 index 00000000000..fbf16133b5c --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaStaticMethod.txt @@ -0,0 +1,26 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /JavaClass.foo + contextReceivers: [] + contractEffects: [] + hasStableParameterNames: false + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: true + isSuspend: false + modality: OPEN + name: foo + origin: JAVA + receiverParameter: null + returnType: kotlin/Unit + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.descriptors.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.descriptors.pretty.txt new file mode 100644 index 00000000000..6640948bf5e --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.descriptors.pretty.txt @@ -0,0 +1,2 @@ +val JavaClass.foo: kotlin.Int + get() \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.descriptors.txt new file mode 100644 index 00000000000..b0598cc5dd0 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.descriptors.txt @@ -0,0 +1,67 @@ +KtSyntheticJavaPropertySymbol: + annotationsList: [] + callableIdIfNonLocal: /JavaClass.foo + contextReceivers: [] + getter: KtPropertyGetterSymbol: + annotationsList: [] + callableIdIfNonLocal: /JavaClass.getFoo + contextReceivers: [] + hasBody: false + hasStableParameterNames: true + isDefault: false + isExtension: false + isInline: false + isOverride: false + modality: FINAL + origin: SOURCE_MEMBER_GENERATED + receiverParameter: KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtSyntheticJavaPropertySymbol(/JavaClass.foo) + type: JavaClass + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10ReceiverParameterSymbol + + deprecationStatus: null + returnType: kotlin/Int + symbolKind: ACCESSOR + typeParameters: [] + valueParameters: [] + visibility: Public + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescPropertyGetterSymbol + + deprecationStatus: null + hasBackingField: true + hasGetter: true + hasSetter: false + initializer: null + isDelegatedProperty: false + isExtension: true + isFromPrimaryConstructor: false + isOverride: false + isStatic: false + isVal: true + javaGetterSymbol: KtFunctionSymbol(/JavaClass.getFoo) + javaSetterSymbol: null + modality: FINAL + name: foo + origin: JAVA_SYNTHETIC_PROPERTY + receiverParameter: KtReceiverParameterSymbol: + annotationsList: [] + origin: SOURCE + owningCallableSymbol: KtSyntheticJavaPropertySymbol(/JavaClass.foo) + type: JavaClass + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10ReceiverParameterSymbol + + deprecationStatus: null + returnType: kotlin/Int + setter: null + symbolKind: CLASS_MEMBER + typeParameters: [] + visibility: Public + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DescSyntheticJavaPropertySymbol + + deprecationStatus: null + getterDeprecationStatus: null + javaGetterName: getFoo + javaSetterName: null + setterDeprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.kt b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.kt new file mode 100644 index 00000000000..ede1e6b6c4b --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.kt @@ -0,0 +1,10 @@ +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 +// FILE: main.kt +fun some() { + JavaClass().foo; +} + +// FILE: JavaClass.java +public class JavaClass { + public int getFoo() { return 1; }; +} diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.pretty.txt new file mode 100644 index 00000000000..0102e46cffc --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.pretty.txt @@ -0,0 +1,2 @@ +open val foo: kotlin.Int + get() \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.txt new file mode 100644 index 00000000000..0d559117a74 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaSyntheticAccessor.txt @@ -0,0 +1,53 @@ +KtSyntheticJavaPropertySymbol: + annotationsList: [] + callableIdIfNonLocal: /JavaClass.foo + contextReceivers: [] + getter: KtPropertyGetterSymbol: + annotationsList: [] + callableIdIfNonLocal: /JavaClass.getFoo + contextReceivers: [] + hasBody: false + hasStableParameterNames: true + isDefault: false + isExtension: false + isInline: false + isOverride: false + modality: OPEN + origin: JAVA_SYNTHETIC_PROPERTY + receiverParameter: null + returnType: kotlin/Int + symbolKind: ACCESSOR + typeParameters: [] + valueParameters: [] + visibility: Public + getDispatchReceiver(): JavaClass + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + hasBackingField: true + hasGetter: true + hasSetter: false + initializer: null + isDelegatedProperty: false + isExtension: false + isFromPrimaryConstructor: false + isOverride: false + isStatic: false + isVal: true + javaGetterSymbol: KtFunctionSymbol(/JavaClass.getFoo) + javaSetterSymbol: null + modality: OPEN + name: foo + origin: JAVA_SYNTHETIC_PROPERTY + receiverParameter: null + returnType: kotlin/Int + setter: null + symbolKind: CLASS_MEMBER + typeParameters: [] + visibility: Public + getDispatchReceiver(): JavaClass + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null + getterDeprecationStatus: null + javaGetterName: getFoo + javaSetterName: null + setterDeprecationStatus: null \ No newline at end of file