From 44f74888e0d65246ed2839142ad972cbfee3e3d8 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Tue, 18 May 2021 15:50:17 +0300 Subject: [PATCH] FIR IDE: Add tests for resolving compiled declarations Also, use correct index to find source for properties in `FirIdeDeserializedDeclarationSourceProvider` - this bug was revealed by the tests --- .../generators/tests/idea/GenerateTests.kt | 3 + .../_library/kotlinLibraryFile.kt | 18 +++++ .../memberFunctionNoArgs.kt | 7 ++ .../memberFunctionNoArgs.txt | 1 + .../memberFunctionWithArgs.kt | 7 ++ .../memberFunctionWithArgs.txt | 1 + .../libraryModuleResolve/memberProperty.kt | 7 ++ .../libraryModuleResolve/memberProperty.txt | 2 + .../libraryModuleResolve/topLevelClass.kt | 7 ++ .../libraryModuleResolve/topLevelClass.txt | 13 ++++ .../topLevelClassPrimaryConstructor.kt | 7 ++ .../topLevelClassPrimaryConstructor.txt | 1 + .../topLevelClassSecondaryConstructor.kt | 7 ++ .../topLevelClassSecondaryConstructor.txt | 1 + .../topLevelFunctionNoArgs.kt | 7 ++ .../topLevelFunctionNoArgs.txt | 1 + .../topLevelFunctionWithArgs.kt | 7 ++ .../topLevelFunctionWithArgs.txt | 1 + .../libraryModuleResolve/topLevelProperty.kt | 7 ++ .../libraryModuleResolve/topLevelProperty.txt | 2 + ...tFirLibraryModuleDeclarationResolveTest.kt | 58 ++++++++++++++ ...ModuleDeclarationResolveTestGenerated.java | 76 +++++++++++++++++++ ...deDeserializedDeclarationSourceProvider.kt | 3 +- 23 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/_library/kotlinLibraryFile.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.txt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirLibraryModuleDeclarationResolveTest.kt create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLibraryModuleDeclarationResolveTestGenerated.java diff --git a/generators/idea-generator/tests/org/jetbrains/kotlin/generators/tests/idea/GenerateTests.kt b/generators/idea-generator/tests/org/jetbrains/kotlin/generators/tests/idea/GenerateTests.kt index b546879c680..f3f601c3646 100644 --- a/generators/idea-generator/tests/org/jetbrains/kotlin/generators/tests/idea/GenerateTests.kt +++ b/generators/idea-generator/tests/org/jetbrains/kotlin/generators/tests/idea/GenerateTests.kt @@ -1072,6 +1072,9 @@ fun main(args: Array) { testClass { model("lazyResolve") } + testClass { + model("libraryModuleResolve", recursive = false) + } testClass { model("outOfBlockProjectWide") } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/_library/kotlinLibraryFile.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/_library/kotlinLibraryFile.kt new file mode 100644 index 00000000000..d578a0bc5af --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/_library/kotlinLibraryFile.kt @@ -0,0 +1,18 @@ +package library + +fun topLevelFunction() {} + +fun topLevelFunction(s: String) {} + +val topLevelProperty: Int = 0 + +class TopLevelClass() { + + constructor(s: String) : this() {} + + fun memberFunction() {} + + fun memberFunction(s: String) {} + + val memberProperty: Int = 0 +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.kt new file mode 100644 index 00000000000..07ff7bfc6b6 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.kt @@ -0,0 +1,7 @@ +package test + +import library.TopLevelClass + +fun usage() { + TopLevelClass().memberFunction() +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.txt new file mode 100644 index 00000000000..eaf302d1af9 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.txt @@ -0,0 +1 @@ +public final [BODY_RESOLVE] fun memberFunction(): R|kotlin/Unit| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.kt new file mode 100644 index 00000000000..37faa05245d --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.kt @@ -0,0 +1,7 @@ +package test + +import library.TopLevelClass + +fun usage() { + TopLevelClass().memberFunction("") +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.txt new file mode 100644 index 00000000000..2ac50489d78 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.txt @@ -0,0 +1 @@ +public final [BODY_RESOLVE] fun memberFunction([BODY_RESOLVE] s: R|kotlin/String|): R|kotlin/Unit| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.kt new file mode 100644 index 00000000000..e985585077f --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.kt @@ -0,0 +1,7 @@ +package test + +import library.TopLevelClass + +fun usage() { + val a = TopLevelClass().memberProperty +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.txt new file mode 100644 index 00000000000..4fe4a0d2731 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.txt @@ -0,0 +1,2 @@ +public final [BODY_RESOLVE] val memberProperty: R|kotlin/Int| + [BODY_RESOLVE] public get(): R|kotlin/Int| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.kt new file mode 100644 index 00000000000..ac778ce1ba4 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.kt @@ -0,0 +1,7 @@ +package test + +import library.TopLevelClass + +fun usage() { + val a: TopLevelClass +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.txt new file mode 100644 index 00000000000..3351ec4f90d --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.txt @@ -0,0 +1,13 @@ +public final [BODY_RESOLVE] class TopLevelClass : R|kotlin/Any| { + public final [BODY_RESOLVE] fun memberFunction(): R|kotlin/Unit| + + public final [BODY_RESOLVE] fun memberFunction([BODY_RESOLVE] s: R|kotlin/String|): R|kotlin/Unit| + + public final [BODY_RESOLVE] val memberProperty: R|kotlin/Int| + [BODY_RESOLVE] public get(): R|kotlin/Int| + + public [BODY_RESOLVE] constructor([BODY_RESOLVE] s: R|kotlin/String|): R|library/TopLevelClass| + + public [BODY_RESOLVE] constructor(): R|library/TopLevelClass| + +} diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.kt new file mode 100644 index 00000000000..a2c25e82e1f --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.kt @@ -0,0 +1,7 @@ +package test + +import library.TopLevelClass + +fun usage() { + val a = TopLevelClass() +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.txt new file mode 100644 index 00000000000..b8dd7a7a519 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.txt @@ -0,0 +1 @@ +public [BODY_RESOLVE] constructor(): R|library/TopLevelClass| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.kt new file mode 100644 index 00000000000..a02e1ea928e --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.kt @@ -0,0 +1,7 @@ +package test + +import library.TopLevelClass + +fun usage() { + val a = TopLevelClass("arg") +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.txt new file mode 100644 index 00000000000..5854b209e8d --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.txt @@ -0,0 +1 @@ +public [BODY_RESOLVE] constructor([BODY_RESOLVE] s: R|kotlin/String|): R|library/TopLevelClass| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.kt new file mode 100644 index 00000000000..e21b8e03eb9 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.kt @@ -0,0 +1,7 @@ +package test + +import library.topLevelFunction + +fun usage() { + topLevelFunction() +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.txt new file mode 100644 index 00000000000..bca73017c74 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.txt @@ -0,0 +1 @@ +public final [BODY_RESOLVE] fun topLevelFunction(): R|kotlin/Unit| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.kt new file mode 100644 index 00000000000..e60f7d8aa8c --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.kt @@ -0,0 +1,7 @@ +package test + +import library.topLevelFunction + +fun usage() { + topLevelFunction("") +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.txt new file mode 100644 index 00000000000..dffa8c64fcf --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.txt @@ -0,0 +1 @@ +public final [BODY_RESOLVE] fun topLevelFunction([BODY_RESOLVE] s: R|kotlin/String|): R|kotlin/Unit| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.kt new file mode 100644 index 00000000000..8d5bc40f532 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.kt @@ -0,0 +1,7 @@ +package test + +import library.topLevelProperty + +fun usage() { + val a = topLevelProperty +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.txt b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.txt new file mode 100644 index 00000000000..c98bd204fce --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.txt @@ -0,0 +1,2 @@ +public final [BODY_RESOLVE] val topLevelProperty: R|kotlin/Int| + [BODY_RESOLVE] public get(): R|kotlin/Int| diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirLibraryModuleDeclarationResolveTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirLibraryModuleDeclarationResolveTest.kt new file mode 100644 index 00000000000..2fe3fb911e4 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirLibraryModuleDeclarationResolveTest.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2010-2021 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.idea.fir.low.level.api + +import com.intellij.testFramework.LightProjectDescriptor +import org.jetbrains.kotlin.fir.FirRenderer +import org.jetbrains.kotlin.fir.render +import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclaration +import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase +import org.jetbrains.kotlin.idea.test.SdkAndMockLibraryProjectDescriptor +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.KotlinTestUtils +import java.io.File + +abstract class AbstractFirLibraryModuleDeclarationResolveTest : KotlinLightCodeInsightFixtureTestCase() { + override fun isFirPlugin(): Boolean = true + + override fun getProjectDescriptor(): LightProjectDescriptor { + val pathToLibraryFiles = File(testDataPath).resolve("_library") + assertExists(pathToLibraryFiles) + + return SdkAndMockLibraryProjectDescriptor(pathToLibraryFiles.toString(), true) + } + + /** + * We want to check that resolving 'compiled' PSI-elements (i.e. elements from libraries) + * works as expected. + * + * Compiled PSI-elements might come from indices, for example, and we need to be able to work with them + * and to resolve them to FIR declarations. + */ + fun doTest(path: String) { + val testDataFile = File(path) + val expectedFile = File(path.removeSuffix(".kt") + ".txt") + + val ktFile = myFixture.configureByFile(testDataFile.name) as KtFile + + val caretResolutionTarget = myFixture.elementAtCaret + + require(caretResolutionTarget is KtDeclaration) { + "Element at caret should be referencing some declaration, but referenced ${caretResolutionTarget::class} instead" + } + + // We intentionally use ktFile here as a context element, because resolving + // from compiled PSI-elements (e.g. caretResolutionTarget) is not yet supported + resolveWithClearCaches(ktFile) { resolveState -> + val renderedDeclaration = caretResolutionTarget.withFirDeclaration(resolveState) { firDeclaration -> + firDeclaration.render(FirRenderer.RenderMode.WithResolvePhases) + } + + KotlinTestUtils.assertEqualsToFile(expectedFile, renderedDeclaration) + } + } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLibraryModuleDeclarationResolveTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLibraryModuleDeclarationResolveTestGenerated.java new file mode 100644 index 00000000000..e368efe9f9d --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLibraryModuleDeclarationResolveTestGenerated.java @@ -0,0 +1,76 @@ +/* + * Copyright 2010-2021 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.idea.fir.low.level.api; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; +import org.jetbrains.kotlin.test.KotlinTestUtils; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.runner.RunWith; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve") +@TestDataPath("$PROJECT_ROOT") +@RunWith(JUnit3RunnerWithInners.class) +public class FirLibraryModuleDeclarationResolveTestGenerated extends AbstractFirLibraryModuleDeclarationResolveTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInLibraryModuleResolve() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve"), Pattern.compile("^(.+)\\.kt$"), null, false); + } + + @TestMetadata("memberFunctionNoArgs.kt") + public void testMemberFunctionNoArgs() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionNoArgs.kt"); + } + + @TestMetadata("memberFunctionWithArgs.kt") + public void testMemberFunctionWithArgs() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberFunctionWithArgs.kt"); + } + + @TestMetadata("memberProperty.kt") + public void testMemberProperty() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/memberProperty.kt"); + } + + @TestMetadata("topLevelClass.kt") + public void testTopLevelClass() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClass.kt"); + } + + @TestMetadata("topLevelClassPrimaryConstructor.kt") + public void testTopLevelClassPrimaryConstructor() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassPrimaryConstructor.kt"); + } + + @TestMetadata("topLevelClassSecondaryConstructor.kt") + public void testTopLevelClassSecondaryConstructor() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelClassSecondaryConstructor.kt"); + } + + @TestMetadata("topLevelFunctionNoArgs.kt") + public void testTopLevelFunctionNoArgs() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionNoArgs.kt"); + } + + @TestMetadata("topLevelFunctionWithArgs.kt") + public void testTopLevelFunctionWithArgs() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelFunctionWithArgs.kt"); + } + + @TestMetadata("topLevelProperty.kt") + public void testTopLevelProperty() throws Exception { + runTest("idea/idea-frontend-fir/idea-fir-low-level-api/testdata/libraryModuleResolve/topLevelProperty.kt"); + } +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt index 8cdf4c8b3c9..2797f2ba72d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDeserializedDeclarationSourceProvider.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSession import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelFunctionFqnNameIndex +import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelPropertyFqnNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTopLevelTypeAliasFqNameIndex import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtClassOrObject @@ -55,7 +56,7 @@ object FirIdeDeserializedDeclarationSourceProvider { private fun provideSourceForProperty(property: FirProperty, project: Project): PsiElement? { val candidates = if (property.isTopLevel) { - KotlinTopLevelFunctionFqnNameIndex.getInstance().get( + KotlinTopLevelPropertyFqnNameIndex.getInstance().get( property.symbol.callableId.asSingleFqName().asString(), project, property.scope(project)