summaryrefslogtreecommitdiff
path: root/plugins/kotlin/fir-low-level-api-ide-impl/test/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirLibraryModuleDeclarationResolveTest.kt
blob: 25f9edb9b20c0a11aa993179bc89ce0167caf202 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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.analysis.low.level.api.fir.api.withFirDeclaration
import org.jetbrains.kotlin.fir.FirRenderer
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.idea.test.KotlinTestUtils
import org.jetbrains.kotlin.idea.test.SdkAndMockLibraryProjectDescriptor
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtFile
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, FirResolvePhase.TYPES) { firDeclaration ->
                firDeclaration.render(FirRenderer.RenderMode.WithResolvePhases)
            }

            KotlinTestUtils.assertEqualsToFile(expectedFile, renderedDeclaration)
        }
    }
}