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)
}
}
}
|