FIR IDE: introduce fir lower level module

This commit is contained in:
Ilya Kirillov
2020-06-04 12:26:27 +03:00
parent c1a62e2f05
commit a62c0e8163
36 changed files with 171 additions and 128 deletions
+1
View File
@@ -39,6 +39,7 @@ dependencies {
testCompile(projectTests(":idea:idea-maven")) testCompile(projectTests(":idea:idea-maven"))
testCompile(projectTests(":idea:idea-fir")) testCompile(projectTests(":idea:idea-fir"))
testCompile(projectTests(":idea:idea-frontend-fir")) testCompile(projectTests(":idea:idea-frontend-fir"))
testCompile(projectTests(":idea:idea-frontend-fir:idea-fir-low-level-api"))
testCompile(projectTests(":j2k")) testCompile(projectTests(":j2k"))
testCompile(projectTests(":nj2k")) testCompile(projectTests(":nj2k"))
if (Ide.IJ()) { if (Ide.IJ()) {
@@ -83,8 +83,8 @@ import org.jetbrains.kotlin.idea.editor.AbstractMultiLineStringIndentTest
import org.jetbrains.kotlin.idea.editor.backspaceHandler.AbstractBackspaceHandlerTest import org.jetbrains.kotlin.idea.editor.backspaceHandler.AbstractBackspaceHandlerTest
import org.jetbrains.kotlin.idea.editor.quickDoc.AbstractQuickDocProviderTest import org.jetbrains.kotlin.idea.editor.quickDoc.AbstractQuickDocProviderTest
import org.jetbrains.kotlin.idea.filters.AbstractKotlinExceptionFilterTest import org.jetbrains.kotlin.idea.filters.AbstractKotlinExceptionFilterTest
import org.jetbrains.kotlin.idea.fir.AbstractFirLazyResolveTest import org.jetbrains.kotlin.idea.fir.low.level.api.AbstractFirLazyResolveTest
import org.jetbrains.kotlin.idea.fir.AbstractFirMultiModuleResolveTest import org.jetbrains.kotlin.idea.fir.low.level.api.AbstractFirMultiModuleResolveTest
import org.jetbrains.kotlin.idea.fir.AbstractKtDeclarationAndFirDeclarationEqualityChecker import org.jetbrains.kotlin.idea.fir.AbstractKtDeclarationAndFirDeclarationEqualityChecker
import org.jetbrains.kotlin.idea.folding.AbstractKotlinFoldingTest import org.jetbrains.kotlin.idea.folding.AbstractKotlinFoldingTest
import org.jetbrains.kotlin.idea.hierarchy.AbstractHierarchyTest import org.jetbrains.kotlin.idea.hierarchy.AbstractHierarchyTest
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.checkers package org.jetbrains.kotlin.checkers
import com.intellij.rt.execution.junit.FileComparisonFailure import com.intellij.rt.execution.junit.FileComparisonFailure
import org.jetbrains.kotlin.idea.fir.FirResolution
import org.jetbrains.kotlin.idea.test.withCustomCompilerOptions import org.jetbrains.kotlin.idea.test.withCustomCompilerOptions
import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.InTextDirectivesUtils
import java.io.File import java.io.File
@@ -5,12 +5,10 @@
package org.jetbrains.kotlin.idea.resolve package org.jetbrains.kotlin.idea.resolve
import com.intellij.testFramework.LightProjectDescriptor
import org.jetbrains.kotlin.idea.completion.test.configureWithExtraFile import org.jetbrains.kotlin.idea.completion.test.configureWithExtraFile
import org.jetbrains.kotlin.idea.fir.FirResolution import org.jetbrains.kotlin.idea.fir.low.level.api.FirResolution
import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinLightProjectDescriptor
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor
import org.jetbrains.kotlin.idea.test.ProjectDescriptorWithStdlibSources
import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.InTextDirectivesUtils
abstract class AbstractFirReferenceResolveTest : AbstractReferenceResolveTest() { abstract class AbstractFirReferenceResolveTest : AbstractReferenceResolveTest() {
+1
View File
@@ -13,6 +13,7 @@ dependencies {
compile(project(":compiler:fir:checkers")) compile(project(":compiler:fir:checkers"))
compile(project(":compiler:fir:java")) compile(project(":compiler:fir:java"))
compile(project(":compiler:fir:jvm")) compile(project(":compiler:fir:jvm"))
compile(project(":idea:idea-frontend-fir:idea-fir-low-level-api"))
compile(intellijDep()) compile(intellijDep())
compile(intellijCoreDep()) compile(intellijCoreDep())
@@ -0,0 +1,48 @@
plugins {
kotlin("jvm")
id("jps-compatible")
}
dependencies {
compile(project(":compiler:psi"))
compile(project(":idea:idea-frontend-independent"))
compile(project(":idea:idea-frontend-api"))
compile(project(":idea:idea-core"))
compile(project(":compiler:fir:fir2ir"))
compile(project(":compiler:fir:resolve"))
compile(project(":compiler:fir:checkers"))
compile(project(":compiler:fir:java"))
compile(project(":compiler:fir:jvm"))
compile(intellijDep())
compile(intellijCoreDep())
// <temp>
compile(project(":idea:idea-core"))
// </temp>
testCompile(toolsJar())
testCompile(projectTests(":idea"))
testCompile(projectTests(":compiler:tests-common"))
testCompile(projectTests(":idea:idea-test-framework"))
testCompile(project(":kotlin-test:kotlin-test-junit"))
testCompile(commonDep("junit:junit"))
Platform[192].orHigher {
compile(intellijPluginDep("java"))
}
}
sourceSets {
"main" { projectDefault() }
"test" { projectDefault() }
}
if (rootProject.findProperty("idea.fir.plugin") == "true") {
projectTest {
dependsOn(":dist")
workingDir = rootDir
}
}
testsJar()
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector import org.jetbrains.kotlin.fir.analysis.collectors.AbstractDiagnosticCollector
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic import org.jetbrains.kotlin.fir.analysis.diagnostics.FirPsiDiagnostic
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
class FirIdeDiagnosticsCollector(session: FirSession, private val resolveState: FirModuleResolveState) : AbstractDiagnosticCollector(session) { internal class FirIdeDiagnosticsCollector(session: FirSession, private val resolveState: FirModuleResolveState) : AbstractDiagnosticCollector(session) {
init { init {
registerAllComponents() registerAllComponents()
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.fir.resolve.scopes.wrapScopeWithJvmMapped
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
class FirIdeJavaModuleBasedSession( internal class FirIdeJavaModuleBasedSession(
moduleInfo: ModuleInfo, moduleInfo: ModuleInfo,
sessionProvider: FirProjectSessionProvider sessionProvider: FirProjectSessionProvider
) : FirModuleBasedSession(moduleInfo, sessionProvider) { ) : FirModuleBasedSession(moduleInfo, sessionProvider) {
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirDependenciesSymbolProviderImpl import org.jetbrains.kotlin.fir.resolve.providers.impl.FirDependenciesSymbolProviderImpl
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.idea.caches.project.isLibraryClasses
import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider
class FirIdeModuleDependenciesSymbolProvider( internal class FirIdeModuleDependenciesSymbolProvider(
session: FirIdeJavaModuleBasedSession session: FirIdeJavaModuleBasedSession
) : FirDependenciesSymbolProviderImpl(session) { ) : FirDependenciesSymbolProviderImpl(session) {
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
class FirIdeProvider( internal class FirIdeProvider(
val project: Project, val project: Project,
val scope: GlobalSearchScope, val scope: GlobalSearchScope,
val session: FirSession, val session: FirSession,
@@ -163,4 +163,4 @@ class FirIdeProvider(
} }
} }
val FirSession.firIdeProvider: FirIdeProvider by FirSession.sessionComponentAccessor() internal val FirSession.firIdeProvider: FirIdeProvider by FirSession.sessionComponentAccessor()
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.analyzer.TrackableModuleInfo
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo
interface FirIdeResolveStateService { internal interface FirIdeResolveStateService {
companion object { companion object {
fun getInstance(project: Project): FirIdeResolveStateService = fun getInstance(project: Project): FirIdeResolveStateService =
ServiceManager.getService(project, FirIdeResolveStateService::class.java)!! ServiceManager.getService(project, FirIdeResolveStateService::class.java)!!
@@ -32,7 +32,7 @@ private class FirModuleData(val state: FirModuleResolveState, val modificationTr
} }
} }
class FirIdeResolveStateServiceImpl(val project: Project) : FirIdeResolveStateService { internal class FirIdeResolveStateServiceImpl(val project: Project) : FirIdeResolveStateService {
private val stateCache = mutableMapOf<IdeaModuleInfo, FirModuleData>() private val stateCache = mutableMapOf<IdeaModuleInfo, FirModuleData>()
private fun createResolveState(): FirModuleResolveState { private fun createResolveState(): FirModuleResolveState {
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
interface FirModuleResolveState { internal interface FirModuleResolveState {
val sessionProvider: FirProjectSessionProvider val sessionProvider: FirProjectSessionProvider
fun getSession(psi: KtElement): FirSession { fun getSession(psi: KtElement): FirSession {
@@ -65,7 +65,7 @@ interface FirModuleResolveState {
fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable<FirDiagnostic<*>> = emptyList()) fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable<FirDiagnostic<*>> = emptyList())
} }
class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionProvider) : FirModuleResolveState { internal class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionProvider) : FirModuleResolveState {
private val cache = mutableMapOf<KtElement, FirElement>() private val cache = mutableMapOf<KtElement, FirElement>()
private val diagnosticCache = mutableMapOf<KtElement, MutableList<Diagnostic>>() private val diagnosticCache = mutableMapOf<KtElement, MutableList<Diagnostic>>()
@@ -115,5 +115,5 @@ class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionP
} }
} }
fun KtElement.firResolveState(): FirModuleResolveState = internal fun KtElement.firResolveState(): FirModuleResolveState =
FirIdeResolveStateService.getInstance(project).getResolveState(getModuleInfo()) FirIdeResolveStateService.getInstance(project).getResolveState(getModuleInfo())
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.util.registry.Registry import com.intellij.openapi.util.registry.Registry
@@ -3,9 +3,8 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.openapi.progress.ProgressIndicatorProvider import com.intellij.openapi.progress.ProgressIndicatorProvider
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
@@ -73,7 +72,7 @@ private fun FirFile.findCallableMember(
?: error("Cannot find FIR callable declaration ${CallableId(packageFqName, klassFqName, declName)}") ?: error("Cannot find FIR callable declaration ${CallableId(packageFqName, klassFqName, declName)}")
} }
fun KtCallableDeclaration.getOrBuildFir( internal fun KtCallableDeclaration.getOrBuildFir(
state: FirModuleResolveState, state: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.DECLARATIONS phase: FirResolvePhase = FirResolvePhase.DECLARATIONS
): FirCallableDeclaration<*> { ): FirCallableDeclaration<*> {
@@ -97,7 +96,7 @@ fun KtCallableDeclaration.getOrBuildFir(
return firMemberDeclaration return firMemberDeclaration
} }
fun KtClassOrObject.getOrBuildFir( internal fun KtClassOrObject.getOrBuildFir(
state: FirModuleResolveState, state: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.DECLARATIONS phase: FirResolvePhase = FirResolvePhase.DECLARATIONS
): FirMemberDeclaration { ): FirMemberDeclaration {
@@ -131,7 +130,7 @@ private fun KtFile.getOrBuildRawFirFile(state: FirModuleResolveState): Pair<FirI
return firProvider to firProvider.getOrBuildFile(this) return firProvider to firProvider.getOrBuildFile(this)
} }
fun KtFile.getOrBuildFir( internal fun KtFile.getOrBuildFir(
state: FirModuleResolveState, state: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.DECLARATIONS phase: FirResolvePhase = FirResolvePhase.DECLARATIONS
): FirFile { ): FirFile {
@@ -145,7 +144,7 @@ fun KtFile.getOrBuildFir(
return firFile return firFile
} }
fun KtFile.getOrBuildFirWithDiagnostics(state: FirModuleResolveState): FirFile { internal fun KtFile.getOrBuildFirWithDiagnostics(state: FirModuleResolveState): FirFile {
val (_, firFile) = getOrBuildRawFirFile(state) val (_, firFile) = getOrBuildRawFirFile(state)
val currentResolvePhase = firFile.resolvePhase val currentResolvePhase = firFile.resolvePhase
if (currentResolvePhase < FirResolvePhase.BODY_RESOLVE) { if (currentResolvePhase < FirResolvePhase.BODY_RESOLVE) {
@@ -224,11 +223,6 @@ private class FirDesignatedBodyResolveTransformerForIDE(
} }
} }
inline fun <reified E : FirElement> KtElement.getOrBuildFirSafe(
state: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE
) = getOrBuildFir(state, phase) as? E
private fun KtElement.getNonLocalContainingDeclarationWithFqName(): KtDeclaration? { private fun KtElement.getNonLocalContainingDeclarationWithFqName(): KtDeclaration? {
var container = parent var container = parent
@@ -247,7 +241,7 @@ private fun KtElement.getNonLocalContainingDeclarationWithFqName(): KtDeclaratio
return null return null
} }
fun KtElement.getOrBuildFir( internal fun KtElement.getOrBuildFir(
state: FirModuleResolveState, state: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE
): FirElement { ): FirElement {
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2020 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 org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.psi.KtElement
object LowLevelFirApiFacade {
fun getOrBuildFirFor(element: KtElement, phase: FirResolvePhase): FirElement =
element.getOrBuildFir(element.firResolveState(), phase)
fun getDiagnosticsFor(element: KtElement): Collection<Diagnostic> {
val file = element.containingKtFile
val state = element.firResolveState()
file.getOrBuildFirWithDiagnostics(state)
return state.getDiagnostics(element)
}
}
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.google.gson.JsonObject import com.google.gson.JsonObject
import com.google.gson.JsonParser import com.google.gson.JsonParser
@@ -3,11 +3,9 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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; package org.jetbrains.kotlin.idea.fir.low.level.api;
import com.intellij.testFramework.TestDataPath; import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
@@ -17,7 +17,7 @@ import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ /** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all") @SuppressWarnings("all")
@TestMetadata("idea/testData/fir/lazyResolve") @TestMetadata("idea/testData/fir/lazyResolve")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("/")
@RunWith(JUnit3RunnerWithInners.class) @RunWith(JUnit3RunnerWithInners.class)
public class FirLazyResolveTestGenerated extends AbstractFirLazyResolveTest { public class FirLazyResolveTestGenerated extends AbstractFirLazyResolveTest {
private void runTest(String testDataFilePath) throws Exception { private void runTest(String testDataFilePath) throws Exception {
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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; package org.jetbrains.kotlin.idea.fir.low.level.api;
import com.intellij.testFramework.TestDataPath; import com.intellij.testFramework.TestDataPath;
import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; import org.jetbrains.kotlin.test.JUnit3RunnerWithInners;
@@ -17,7 +17,7 @@ import java.util.regex.Pattern;
/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ /** This class is generated by {@link org.jetbrains.kotlin.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
@SuppressWarnings("all") @SuppressWarnings("all")
@TestMetadata("idea/testData/fir/multiModule") @TestMetadata("idea/testData/fir/multiModule")
@TestDataPath("$PROJECT_ROOT") @TestDataPath("/")
@RunWith(JUnit3RunnerWithInners.class) @RunWith(JUnit3RunnerWithInners.class)
public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleResolveTest { public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleResolveTest {
private void runTest(String testDataFilePath) throws Exception { private void runTest(String testDataFilePath) throws Exception {
@@ -3,9 +3,10 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import org.jetbrains.kotlin.idea.AbstractResolveElementCacheTest import org.jetbrains.kotlin.idea.AbstractResolveElementCacheTest
import org.jetbrains.kotlin.idea.fir.low.level.api.firResolveState
class FirResolveStateTest : AbstractResolveElementCacheTest() { class FirResolveStateTest : AbstractResolveElementCacheTest() {
override fun isFirPlugin(): Boolean = true override fun isFirPlugin(): Boolean = true
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * 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 package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
@@ -5,15 +5,36 @@
package org.jetbrains.kotlin.idea.fir package org.jetbrains.kotlin.idea.fir
import com.intellij.psi.util.parentOfType
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.idea.references.KtReference import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
fun KtElement.getOrBuildFir(
phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE
) = LowLevelFirApiFacade.getOrBuildFirFor(this, phase)
inline fun <reified E : FirElement> KtElement.getOrBuildFirSafe(
phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE
) = LowLevelFirApiFacade.getOrBuildFirFor(this, phase) as? E
val KtElement.session
get() = parentOfType<KtDeclaration>()?.getOrBuildFirSafe<FirDeclaration>()?.session
?: containingKtFile.getOrBuildFirSafe<FirFile>()!!.session
fun FirFunctionCall.isImplicitFunctionCall(): Boolean { fun FirFunctionCall.isImplicitFunctionCall(): Boolean {
if (dispatchReceiver !is FirQualifiedAccessExpression) return false if (dispatchReceiver !is FirQualifiedAccessExpression) return false
val resolvedCalleeSymbol = (calleeReference as? FirResolvedNamedReference)?.resolvedSymbol val resolvedCalleeSymbol = (calleeReference as? FirResolvedNamedReference)?.resolvedSymbol
@@ -20,18 +20,16 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.idea.fir.* import org.jetbrains.kotlin.idea.fir.*
import org.jetbrains.kotlin.idea.fir.low.level.api.LowLevelFirApiFacade
import org.jetbrains.kotlin.idea.frontend.api.* import org.jetbrains.kotlin.idea.frontend.api.*
import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper
import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper.toTargetPsi import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper.toTargetPsi
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.types.model.KotlinTypeMarker import org.jetbrains.kotlin.types.model.KotlinTypeMarker
class AnalysisSessionFirImpl internal constructor( class AnalysisSessionFirImpl : FrontendAnalysisSession() {
private val state: FirModuleResolveState
) : FrontendAnalysisSession() {
override fun getSmartCastedToTypes(expression: KtExpression): Collection<KotlinTypeMarker>? { override fun getSmartCastedToTypes(expression: KtExpression): Collection<KotlinTypeMarker>? {
// TODO filter out not used smartcasts // TODO filter out not used smartcasts
@@ -41,7 +39,7 @@ class AnalysisSessionFirImpl internal constructor(
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
override fun getImplicitReceiverSmartCasts(expression: KtExpression): Collection<ImplicitReceiverSmartCast> { override fun getImplicitReceiverSmartCasts(expression: KtExpression): Collection<ImplicitReceiverSmartCast> {
// TODO filter out not used smartcasts // TODO filter out not used smartcasts
val qualifiedExpression = expression.getOrBuildFir(state) as? FirQualifiedAccessExpression ?: return emptyList() val qualifiedExpression = expression.getOrBuildFirSafe<FirQualifiedAccessExpression>() ?: return emptyList()
if (qualifiedExpression.dispatchReceiver !is FirExpressionWithSmartcast if (qualifiedExpression.dispatchReceiver !is FirExpressionWithSmartcast
&& qualifiedExpression.extensionReceiver !is FirExpressionWithSmartcast && qualifiedExpression.extensionReceiver !is FirExpressionWithSmartcast
) return emptyList() ) return emptyList()
@@ -67,15 +65,13 @@ class AnalysisSessionFirImpl internal constructor(
override fun isSubclassOf(klass: KtClassOrObject, superClassId: ClassId): Boolean { override fun isSubclassOf(klass: KtClassOrObject, superClassId: ClassId): Boolean {
var result = false var result = false
forEachSubClass(klass.toFir() ?: return false) { type -> forEachSubClass(klass.toFir() ?: return false) { type ->
result = result || type.firClassLike(state.getSession(klass))?.symbol?.classId == superClassId result = result || type.firClassLike(klass.session)?.symbol?.classId == superClassId
} }
return result return result
} }
override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> { override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> =
element.containingKtFile.getOrBuildFirWithDiagnostics(state) LowLevelFirApiFacade.getDiagnosticsFor(element)
return state.getDiagnostics(element)
}
override fun resolveCall(call: KtBinaryExpression): CallInfo? { override fun resolveCall(call: KtBinaryExpression): CallInfo? {
val firCall = call.toFir<FirFunctionCall>() ?: return null val firCall = call.toFir<FirFunctionCall>() ?: return null
@@ -88,7 +84,7 @@ class AnalysisSessionFirImpl internal constructor(
} }
private fun resolveCall(firCall: FirFunctionCall, callExpression: KtExpression): CallInfo? { private fun resolveCall(firCall: FirFunctionCall, callExpression: KtExpression): CallInfo? {
val session = callExpression.getSession() val session = callExpression.session
val resolvedFunctionPsi = firCall.calleeReference.toTargetPsi(session) val resolvedFunctionPsi = firCall.calleeReference.toTargetPsi(session)
val resolvedCalleeSymbol = (firCall.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol val resolvedCalleeSymbol = (firCall.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol
return when { return when {
@@ -124,10 +120,8 @@ class AnalysisSessionFirImpl internal constructor(
else -> null else -> null
} }
private fun KtElement.getSession() = state.getSession(this)
private inline fun <reified F : FirElement> KtElement.toFir(phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE): F? = private inline fun <reified F : FirElement> KtElement.toFir(phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE): F? =
getOrBuildFir(state, phase) as? F getOrBuildFir(phase) as? F
private fun forEachSubClass(firClass: FirClass<*>, action: (FirResolvedTypeRef) -> Unit) { private fun forEachSubClass(firClass: FirClass<*>, action: (FirResolvedTypeRef) -> Unit) {
firClass.superTypeRefs.forEach { superType -> firClass.superTypeRefs.forEach { superType ->
@@ -137,9 +131,6 @@ class AnalysisSessionFirImpl internal constructor(
} }
companion object { companion object {
fun forElement(element: KtElement): FrontendAnalysisSession =
AnalysisSessionFirImpl(element.firResolveState())
private fun KotlinTypeMarker.asConeType(): ConeKotlinType = private fun KotlinTypeMarker.asConeType(): ConeKotlinType =
this as? ConeKotlinType ?: error("$this should be ConeKotlinType") this as? ConeKotlinType ?: error("$this should be ConeKotlinType")
@@ -150,5 +141,4 @@ class AnalysisSessionFirImpl internal constructor(
) )
} }
} }
} }
@@ -21,7 +21,7 @@ class KotlinFirPsiChecker : AbstractKotlinPsiChecker() {
override fun annotateElement(element: PsiElement, containingFile: KtFile, holder: AnnotationHolder) { override fun annotateElement(element: PsiElement, containingFile: KtFile, holder: AnnotationHolder) {
if (element !is KtElement) return if (element !is KtElement) return
val analysisSession = AnalysisSessionFirImpl.forElement(element) val analysisSession = AnalysisSessionFirImpl()
highlightDiagnostics(element, analysisSession, holder) highlightDiagnostics(element, analysisSession, holder)
@@ -6,16 +6,10 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.idea.fir.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl
interface FirKtReference : KtReference { interface FirKtReference : KtReference {
fun getResolvedToPsi( fun getResolvedToPsi(analysisSession: AnalysisSessionFirImpl): Collection<PsiElement>
analysisSession: AnalysisSessionFirImpl,
session: FirSession,
state: FirModuleResolveState
): Collection<PsiElement>
override val resolver get() = KtFirReferenceResolver override val resolver get() = KtFirReferenceResolver
} }
@@ -74,13 +74,11 @@ object FirReferenceResolveHelper {
} }
} }
internal fun resolveSimpleNameReference( internal fun resolveSimpleNameReference(ref: KtSimpleNameReferenceFirImpl): Collection<PsiElement> {
ref: KtSimpleNameReferenceFirImpl,
session: FirSession,
state: FirModuleResolveState
): Collection<PsiElement> {
val expression = ref.expression val expression = ref.expression
when (val fir = expression.getOrBuildFir(state)) { val fir = expression.getOrBuildFir()
val session = expression.session
when (fir) {
is FirResolvable -> { is FirResolvable -> {
val calleeReference = val calleeReference =
if (fir is FirFunctionCall if (fir is FirFunctionCall
@@ -109,7 +107,7 @@ object FirReferenceResolveHelper {
parent = parent.parent as? KtDotQualifiedExpression parent = parent.parent as? KtDotQualifiedExpression
continue continue
} }
val parentFir = selectorExpression.getOrBuildFir(state) val parentFir = selectorExpression.getOrBuildFir()
if (parentFir is FirQualifiedAccess) { if (parentFir is FirQualifiedAccess) {
return listOfNotNull(classId.toTargetPsi(session, parentFir.calleeReference)) return listOfNotNull(classId.toTargetPsi(session, parentFir.calleeReference))
} }
@@ -177,7 +175,7 @@ object FirReferenceResolveHelper {
parent = parent.parent as? KtDotQualifiedExpression parent = parent.parent as? KtDotQualifiedExpression
continue continue
} }
val parentFir = selectorExpression.getOrBuildFir(state) val parentFir = selectorExpression.getOrBuildFir()
if (parentFir is FirResolvedQualifier) { if (parentFir is FirResolvedQualifier) {
var classId = parentFir.classId var classId = parentFir.classId
while (unresolvedCounter > 0) { while (unresolvedCounter > 0) {
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.idea.fir.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtImportAlias import org.jetbrains.kotlin.psi.KtImportAlias
@@ -16,11 +14,7 @@ import org.jetbrains.kotlin.psi.KtSimpleNameExpression
internal class KtSimpleNameReferenceFirImpl( internal class KtSimpleNameReferenceFirImpl(
expression: KtSimpleNameExpression expression: KtSimpleNameExpression
) : KtSimpleNameReference(expression), FirKtReference { ) : KtSimpleNameReference(expression), FirKtReference {
override fun getResolvedToPsi( override fun getResolvedToPsi(analysisSession: AnalysisSessionFirImpl) = FirReferenceResolveHelper.resolveSimpleNameReference(this)
analysisSession: AnalysisSessionFirImpl,
session: FirSession,
state: FirModuleResolveState
) = FirReferenceResolveHelper.resolveSimpleNameReference(this, session, state)
override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean { override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean {
return true // TODO return true // TODO
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.idea.fir.* import org.jetbrains.kotlin.idea.fir.*
@@ -19,12 +18,10 @@ class KtDestructuringDeclarationReferenceFirImpl(
override fun canRename(): Boolean = false //todo override fun canRename(): Boolean = false //todo
override fun getResolvedToPsi( override fun getResolvedToPsi(
analysisSession: AnalysisSessionFirImpl, analysisSession: AnalysisSessionFirImpl
session: FirSession,
state: FirModuleResolveState
): Collection<PsiElement> { ): Collection<PsiElement> {
val fir = expression.getOrBuildFirSafe<FirProperty>(state) ?: return emptyList() val fir = expression.getOrBuildFirSafe<FirProperty>() ?: return emptyList()
val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return emptyList() val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return emptyList()
return listOfNotNull(componentFunctionSymbol.fir.findPsi(session)) return listOfNotNull(componentFunctionSymbol.fir.findPsi(element.project))
} }
} }
@@ -9,7 +9,6 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementResolveResult import com.intellij.psi.PsiElementResolveResult
import com.intellij.psi.ResolveResult import com.intellij.psi.ResolveResult
import com.intellij.psi.impl.source.resolve.ResolveCache import com.intellij.psi.impl.source.resolve.ResolveCache
import org.jetbrains.kotlin.idea.fir.firResolveState
import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl
object KtFirReferenceResolver : ResolveCache.PolyVariantResolver<KtReference> { object KtFirReferenceResolver : ResolveCache.PolyVariantResolver<KtReference> {
@@ -18,11 +17,8 @@ object KtFirReferenceResolver : ResolveCache.PolyVariantResolver<KtReference> {
override fun resolve(ref: KtReference, incompleteCode: Boolean): Array<ResolveResult> { override fun resolve(ref: KtReference, incompleteCode: Boolean): Array<ResolveResult> {
check(ref is FirKtReference) { "reference should be FirKtReference, but was ${ref::class}" } check(ref is FirKtReference) { "reference should be FirKtReference, but was ${ref::class}" }
check(ref is AbstractKtReference<*>) { "reference should be AbstractKtReference, but was ${ref::class}" } check(ref is AbstractKtReference<*>) { "reference should be AbstractKtReference, but was ${ref::class}" }
val expression = ref.expression val analysisSession = AnalysisSessionFirImpl()
val state = expression.firResolveState() val resolveToPsiElements = ref.getResolvedToPsi(analysisSession)
val session = state.getSession(expression)
val analysisSession = AnalysisSessionFirImpl(state)
val resolveToPsiElements = ref.getResolvedToPsi(analysisSession, session, state)
return resolveToPsiElements.map { KotlinResolveResult(it) }.toTypedArray() return resolveToPsiElements.map { KotlinResolveResult(it) }.toTypedArray()
} }
} }
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.idea.fir.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.findPsi import org.jetbrains.kotlin.idea.fir.findPsi
import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe import org.jetbrains.kotlin.idea.fir.getOrBuildFirSafe
import org.jetbrains.kotlin.idea.fir.getResolvedSymbolOfNameReference import org.jetbrains.kotlin.idea.fir.getResolvedSymbolOfNameReference
@@ -20,11 +19,9 @@ import org.jetbrains.kotlin.psi.KtForExpression
open class KtForLoopInReferenceFirImpl(expression: KtForExpression) : KtForLoopInReference(expression), FirKtReference { open class KtForLoopInReferenceFirImpl(expression: KtForExpression) : KtForLoopInReference(expression), FirKtReference {
override fun getResolvedToPsi( override fun getResolvedToPsi(
analysisSession: AnalysisSessionFirImpl, analysisSession: AnalysisSessionFirImpl
session: FirSession,
state: FirModuleResolveState
): Collection<PsiElement> { ): Collection<PsiElement> {
val firLoop = expression.getOrBuildFirSafe<FirWhileLoop>(state) ?: return emptyList() val firLoop = expression.getOrBuildFirSafe<FirWhileLoop>() ?: return emptyList()
val condition = firLoop.condition as? FirFunctionCall val condition = firLoop.condition as? FirFunctionCall
val iterator = run { val iterator = run {
val callee = (condition?.explicitReceiver as? FirQualifiedAccessExpression)?.calleeReference val callee = (condition?.explicitReceiver as? FirQualifiedAccessExpression)?.calleeReference
@@ -32,10 +29,11 @@ open class KtForLoopInReferenceFirImpl(expression: KtForExpression) : KtForLoopI
} }
val hasNext = condition?.calleeReference?.getResolvedSymbolOfNameReference() val hasNext = condition?.calleeReference?.getResolvedSymbolOfNameReference()
val next = (firLoop.block.statements.firstOrNull() as? FirProperty?)?.getInitializerFunctionCall() val next = (firLoop.block.statements.firstOrNull() as? FirProperty?)?.getInitializerFunctionCall()
val project = element.project
return listOfNotNull( return listOfNotNull(
iterator?.fir?.findPsi(session), iterator?.fir?.findPsi(project),
hasNext?.fir?.findPsi(session), hasNext?.fir?.findPsi(project),
next?.fir?.findPsi(session), next?.fir?.findPsi(project),
) )
} }
@@ -6,8 +6,6 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.idea.fir.FirModuleResolveState
import org.jetbrains.kotlin.idea.frontend.api.VariableAsFunctionLikeCallInfo import org.jetbrains.kotlin.idea.frontend.api.VariableAsFunctionLikeCallInfo
import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl
import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtCallExpression
@@ -18,11 +16,7 @@ class KtInvokeFunctionReferenceFirImpl(expression: KtCallExpression) : KtInvokeF
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getResolvedToPsi( override fun getResolvedToPsi(analysisSession: AnalysisSessionFirImpl): Collection<PsiElement> {
analysisSession: AnalysisSessionFirImpl,
session: FirSession,
state: FirModuleResolveState
): Collection<PsiElement> {
val call = analysisSession.resolveCall(expression) ?: return emptyList() val call = analysisSession.resolveCall(expression) ?: return emptyList()
if (call is VariableAsFunctionLikeCallInfo) { if (call is VariableAsFunctionLikeCallInfo) {
return listOf(call.invokeFunction) return listOf(call.invokeFunction)
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
@@ -21,17 +20,16 @@ class KtPropertyDelegationMethodsReferenceFirImpl(
element: KtPropertyDelegate element: KtPropertyDelegate
) : KtPropertyDelegationMethodsReference(element), FirKtReference { ) : KtPropertyDelegationMethodsReference(element), FirKtReference {
override fun getResolvedToPsi( override fun getResolvedToPsi(
analysisSession: AnalysisSessionFirImpl, analysisSession: AnalysisSessionFirImpl
session: FirSession,
state: FirModuleResolveState
): Collection<PsiElement> { ): Collection<PsiElement> {
val property = (expression.parent as? KtElement)?.getOrBuildFirSafe<FirProperty>(state) ?: return emptyList() val property = (expression.parent as? KtElement)?.getOrBuildFirSafe<FirProperty>() ?: return emptyList()
if (property.delegate == null) return emptyList() if (property.delegate == null) return emptyList()
val getValueSymbol = (property.getter?.singleStatementOfType<FirReturnExpression>()?.result as? FirFunctionCall)?.getCalleeSymbol() val getValueSymbol = (property.getter?.singleStatementOfType<FirReturnExpression>()?.result as? FirFunctionCall)?.getCalleeSymbol()
val setValueSymbol = property.setter?.singleStatementOfType<FirFunctionCall>()?.getCalleeSymbol() val setValueSymbol = property.setter?.singleStatementOfType<FirFunctionCall>()?.getCalleeSymbol()
val project = element.project
return listOfNotNull( return listOfNotNull(
getValueSymbol?.fir?.findPsi(session), getValueSymbol?.fir?.findPsi(project),
setValueSymbol?.fir?.findPsi(session) setValueSymbol?.fir?.findPsi(project)
) )
} }
@@ -7,8 +7,6 @@ package org.jetbrains.kotlin.idea.fir
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import com.intellij.rt.execution.junit.FileComparisonFailure import com.intellij.rt.execution.junit.FileComparisonFailure
import junit.framework.Assert
import junit.framework.ComparisonFailure
import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -21,9 +19,8 @@ abstract class AbstractKtDeclarationAndFirDeclarationEqualityChecker : KotlinLig
val file = File(path) val file = File(path)
val ktFile = myFixture.configureByText(file.name, FileUtil.loadFile(file)) as KtFile val ktFile = myFixture.configureByText(file.name, FileUtil.loadFile(file)) as KtFile
val resolveState = ktFile.firResolveState()
ktFile.forEachDescendantOfType<KtFunction> { ktFunction -> ktFile.forEachDescendantOfType<KtFunction> { ktFunction ->
val firFunction = ktFunction.getOrBuildFir(resolveState) as FirFunction<*> val firFunction = ktFunction.getOrBuildFir() as FirFunction<*>
if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) { if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) {
throw FileComparisonFailure( throw FileComparisonFailure(
/* message= */ null, /* message= */ null,
+2 -2
View File
@@ -92,8 +92,8 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu
<applicationService serviceImplementation="org.jetbrains.kotlin.idea.PluginStartupService"/> <applicationService serviceImplementation="org.jetbrains.kotlin.idea.PluginStartupService"/>
<highlightRangeExtension implementation="org.jetbrains.kotlin.idea.highlighter.KotlinFirPsiChecker"/> <highlightRangeExtension implementation="org.jetbrains.kotlin.idea.highlighter.KotlinFirPsiChecker"/>
<annotator language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinFirPsiChecker"/> <annotator language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinFirPsiChecker"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.fir.FirIdeResolveStateService" <projectService serviceInterface="org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeResolveStateService"
serviceImplementation="org.jetbrains.kotlin.idea.fir.FirIdeResolveStateServiceImpl"/> serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeResolveStateServiceImpl"/>
<projectService serviceImplementation="org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade"/> <projectService serviceImplementation="org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade"/>
</extensions> </extensions>
+2 -1
View File
@@ -95,7 +95,8 @@ val projectsToShadow by extra(listOf(
":idea:idea-jps-common", ":idea:idea-jps-common",
":idea:idea-frontend-independent", ":idea:idea-frontend-independent",
":idea:idea-frontend-fir", ":idea:idea-frontend-fir",
":idea:idea-frontend-api", ":idea:idea-frontend-fir",
":idea:idea-frontend-fir:idea-fir-low-level-api",
*if (Ide.IJ()) *if (Ide.IJ())
arrayOf( arrayOf(
":idea:idea-maven", ":idea:idea-maven",
+2
View File
@@ -313,6 +313,8 @@ include ":kotlin-build-common",
":kotlin-serialization-unshaded", ":kotlin-serialization-unshaded",
":kotlin-serialization:plugin-marker" ":kotlin-serialization:plugin-marker"
include ":idea:idea-frontend-fir:idea-fir-low-level-api"
include ":prepare:ide-plugin-dependencies:android-extensions-compiler-plugin-for-ide", include ":prepare:ide-plugin-dependencies:android-extensions-compiler-plugin-for-ide",
":prepare:ide-plugin-dependencies:allopen-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:allopen-compiler-plugin-for-ide",
":prepare:ide-plugin-dependencies:allopen-compiler-plugin-tests-for-ide", ":prepare:ide-plugin-dependencies:allopen-compiler-plugin-tests-for-ide",