diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java new file mode 100644 index 00000000000..9a5916f0a7b --- /dev/null +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fe10.test.cases.generated.cases.symbols; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fe10.test.configurator.AnalysisApiFe10TestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolRestoreFromDifferentModuleTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule") +@TestDataPath("$PROJECT_ROOT") +public class Fe10IdeNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated extends AbstractSymbolRestoreFromDifferentModuleTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fe10, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolRestoreFromDifferentModule() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("noDependency.kt") + public void testNoDependency() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.kt"); + } + + @Test + @TestMetadata("withDependency.kt") + public void testWithDependency() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.kt"); + } +} diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java new file mode 100644 index 00000000000..8ce2a8b05ed --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.fir.test.cases.generated.cases.symbols; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolRestoreFromDifferentModuleTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated extends AbstractSymbolRestoreFromDifferentModuleTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolRestoreFromDifferentModule() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("noDependency.kt") + public void testNoDependency() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.kt"); + } + + @Test + @TestMetadata("withDependency.kt") + public void testWithDependency() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.kt"); + } +} diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolRestoreFromDifferentModuleTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolRestoreFromDifferentModuleTest.kt new file mode 100644 index 00000000000..5b9308b8fff --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSymbolRestoreFromDifferentModuleTest.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols + +import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer +import org.jetbrains.kotlin.analysis.api.renderer.declarations.impl.KtDeclarationRendererForDebug +import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.assertions +import org.jetbrains.kotlin.analysis.project.structure.getKtModule +import org.jetbrains.kotlin.analysis.test.framework.base.AbstractAnalysisApiBasedTest +import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.test.services.TestModuleStructure + +abstract class AbstractSymbolRestoreFromDifferentModuleTest : AbstractAnalysisApiBasedTest() { + private val defaultRenderer = KtDeclarationRendererForDebug.WITH_QUALIFIED_NAMES + + override fun doTestByModuleStructure(moduleStructure: TestModuleStructure, testServices: TestServices) { + val declaration = + testServices.expressionMarkerProvider.getElementsOfTypeAtCarets(moduleStructure, testServices).single().first + + val restoreAt = + testServices.expressionMarkerProvider.getElementsOfTypeAtCarets( + moduleStructure, + testServices, + caretTag = "restoreAt" + ).single().first + + val (debugRendered, prettyRendered, pointer) = analyseForTest(declaration) { + val symbol = declaration.getSymbol() + val pointer = symbol.createPointer() + Triple(DebugSymbolRenderer().render(symbol), symbol.render(defaultRenderer), pointer) + } + configurator.doOutOfBlockModification(declaration.containingKtFile) + + val (debugRenderedRestored, prettyRenderedRestored) = analyseForTest(restoreAt) { + val symbol = pointer.restoreSymbol() as? KtDeclarationSymbol + symbol?.let { DebugSymbolRenderer().render(it) } to symbol?.render(defaultRenderer) + } + + val actualDebug = prettyPrint { + appendLine("Inital from ${declaration.getKtModule().moduleDescription}:") + appendLine(debugRendered) + appendLine() + appendLine("Restored in ${restoreAt.getKtModule().moduleDescription}:") + appendLine(debugRenderedRestored ?: NOT_RESTORED) + } + testServices.assertions.assertEqualsToTestDataFileSibling(actualDebug) + + val actualPretty = prettyPrint { + appendLine("Inital from ${declaration.getKtModule().moduleDescription}:") + appendLine(prettyRendered) + appendLine() + appendLine("Restored in ${restoreAt.getKtModule().moduleDescription}:") + appendLine(prettyRenderedRestored ?: NOT_RESTORED) + } + testServices.assertions.assertEqualsToTestDataFileSibling(actualPretty, extension = ".pretty.txt") + } + + companion object { + private const val NOT_RESTORED = "" + } +} + diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java new file mode 100644 index 00000000000..102172fed61 --- /dev/null +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated.java @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.generated.cases.symbols; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.standalone.fir.test.AnalysisApiFirStandaloneModeTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolRestoreFromDifferentModuleTest; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule") +@TestDataPath("$PROJECT_ROOT") +public class FirStandaloneNormalAnalysisSourceModuleSymbolRestoreFromDifferentModuleTestGenerated extends AbstractSymbolRestoreFromDifferentModuleTest { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Standalone + ) + ); + } + + @Test + public void testAllFilesPresentInSymbolRestoreFromDifferentModule() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("noDependency.kt") + public void testNoDependency() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.kt"); + } + + @Test + @TestMetadata("withDependency.kt") + public void testWithDependency() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.kt"); + } +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt index 5270789af8d..3e6a669b426 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/pointers/KtPsiBasedSymbolPointer.kt @@ -22,6 +22,7 @@ public class KtPsiBasedSymbolPointer private constructor( val psi = psiPointer.element ?: return null val symbol: KtSymbol = with(analysisSession) { + if (!psi.canBeAnalysed()) return null when (psi) { is KtDeclaration -> psi.getSymbol() is KtFile -> psi.getFileSymbol() diff --git a/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.kt b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.kt new file mode 100644 index 00000000000..b33df1a1b03 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.kt @@ -0,0 +1,9 @@ +// MODULE: main + +fun foo(){} + +// MODULE: restoreInContextOf + +fun restoreInContextOf() { + +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.pretty.txt b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.pretty.txt new file mode 100644 index 00000000000..f9db7629e0b --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.pretty.txt @@ -0,0 +1,5 @@ +Inital from Sources of main: +fun foo() + +Restored in Sources of restoreInContextOf: + diff --git a/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.txt b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.txt new file mode 100644 index 00000000000..9149e90ad83 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/noDependency.txt @@ -0,0 +1,31 @@ +Inital from Sources of main: +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + 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: foo + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + +Restored in Sources of restoreInContextOf: + diff --git a/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.kt b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.kt new file mode 100644 index 00000000000..a82cdd54909 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.kt @@ -0,0 +1,9 @@ +// MODULE: main + +fun foo(){} + +// MODULE: restoreInContextOf(main) + +fun restoreInContextOf() { + +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.pretty.txt b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.pretty.txt new file mode 100644 index 00000000000..dd90db0d079 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.pretty.txt @@ -0,0 +1,5 @@ +Inital from Sources of main: +fun foo() + +Restored in Sources of restoreInContextOf: +fun foo() diff --git a/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.txt b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.txt new file mode 100644 index 00000000000..995465af09d --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolRestoreFromDifferentModule/withDependency.txt @@ -0,0 +1,57 @@ +Inital from Sources of main: +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + 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: foo + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public + +Restored in Sources of restoreInContextOf: +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: /foo + 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: foo + origin: SOURCE + receiverParameter: null + returnType: KtUsualClassType: + annotationsList: [] + ownTypeArguments: [] + type: kotlin/Unit + symbolKind: TOP_LEVEL + typeParameters: [] + valueParameters: [] + visibility: Public diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt index 6683a7eaf9f..7218768027e 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt @@ -50,6 +50,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSi import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByFqNameTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByPsiTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByReferenceTest +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolRestoreFromDifferentModuleTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.types.AbstractAnalysisApiSubstitutorsTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.types.AbstractTypeByDeclarationReturnTypeTest import org.jetbrains.kotlin.analysis.api.standalone.fir.test.cases.components.psiDeclarationProvider.AbstractPsiDeclarationProviderTest @@ -126,6 +127,10 @@ private fun AnalysisApiTestGroup.generateAnalysisApiNonComponentsTests() { model("singleSymbolByPsi") } + test(AbstractSymbolRestoreFromDifferentModuleTest::class) { + model("symbolRestoreFromDifferentModule") + } + test( AbstractSymbolByFqNameTest::class ) {