From a62c0e8163bd0c9129516e41b6a6b281f7ecb92a Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 4 Jun 2020 12:26:27 +0300 Subject: [PATCH] FIR IDE: introduce fir lower level module --- generators/build.gradle.kts | 1 + .../kotlin/generators/tests/GenerateTests.kt | 4 +- .../checkers/AbstractFirPsiCheckerTest.kt | 1 - .../AbstractFirReferenceResolveTest.kt | 4 +- idea/idea-frontend-fir/build.gradle.kts | 1 + .../idea-fir-low-level-api/build.gradle.kts | 48 +++++++++++++++++++ .../level/api}/FirIdeDiagnosticsCollector.kt | 4 +- .../api}/FirIdeJavaModuleBasedSession.kt | 4 +- .../FirIdeModuleDependenciesSymbolProvider.kt | 4 +- .../idea/fir/low/level/api}/FirIdeProvider.kt | 6 +-- .../level/api}/FirIdeResolveStateService.kt | 6 +-- .../low/level/api}/FirModuleResolveState.kt | 8 ++-- .../idea/fir/low/level/api}/FirResolution.kt | 2 +- .../fir/low/level/api}/FirResolutionApi.kt | 18 +++---- .../fir/low/level/api/LowLevelFirApiFacade.kt | 23 +++++++++ .../level/api}/AbstractFirLazyResolveTest.kt | 2 +- .../api}/AbstractFirMultiModuleResolveTest.kt | 4 +- .../api}/FirLazyResolveTestGenerated.java | 4 +- .../FirMultiModuleResolveTestGenerated.java | 4 +- .../fir/low/level/api}/FirResolveStateTest.kt | 3 +- .../idea/fir/low/level/api}/firTestUtils.kt | 2 +- .../org/jetbrains/kotlin/idea/fir/FirUtils.kt | 23 ++++++++- .../api/fir/AnalysisSessionFirImpl.kt | 26 ++++------ .../idea/highlighter/KotlinFirPsiChecker.kt | 2 +- .../kotlin/idea/references/FirKtReference.kt | 8 +--- .../references/FirReferenceResolveHelper.kt | 14 +++--- .../idea/references/FirSimpleNameReference.kt | 8 +--- ...estructuringDeclarationReferenceFirImpl.kt | 9 ++-- .../idea/references/KtFirReferenceResolver.kt | 8 +--- .../references/KtForLoopInReferenceFirImpl.kt | 14 +++--- .../KtInvokeFunctionReferenceFirImpl.kt | 8 +--- ...opertyDelegationMethodsReferenceFirImpl.kt | 12 ++--- ...arationAndFirDeclarationEqualityChecker.kt | 5 +- idea/resources-fir/META-INF/plugin.xml | 4 +- prepare/idea-plugin/build.gradle.kts | 3 +- settings.gradle | 2 + 36 files changed, 171 insertions(+), 128 deletions(-) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/build.gradle.kts rename idea/idea-frontend-fir/{src/org/jetbrains/kotlin/idea/fir => idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api}/FirIdeDiagnosticsCollector.kt (87%) rename idea/idea-frontend-fir/{src/org/jetbrains/kotlin/idea/fir => idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api}/FirIdeJavaModuleBasedSession.kt (96%) rename idea/idea-frontend-fir/{src/org/jetbrains/kotlin/idea/fir => idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api}/FirIdeModuleDependenciesSymbolProvider.kt (95%) rename idea/idea-frontend-fir/{src/org/jetbrains/kotlin/idea/fir => idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api}/FirIdeProvider.kt (97%) rename idea/idea-frontend-fir/{src/org/jetbrains/kotlin/idea/fir => idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api}/FirIdeResolveStateService.kt (92%) rename idea/idea-frontend-fir/{src/org/jetbrains/kotlin/idea/fir => idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api}/FirModuleResolveState.kt (93%) rename idea/idea-frontend-fir/{src/org/jetbrains/kotlin/idea/fir => idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api}/FirResolution.kt (93%) rename idea/idea-frontend-fir/{src/org/jetbrains/kotlin/idea/fir => idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api}/FirResolutionApi.kt (95%) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/LowLevelFirApiFacade.kt rename idea/{idea-fir/tests/org/jetbrains/kotlin/idea/fir => idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api}/AbstractFirLazyResolveTest.kt (98%) rename idea/{idea-fir/tests/org/jetbrains/kotlin/idea/fir => idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api}/AbstractFirMultiModuleResolveTest.kt (98%) rename idea/{idea-fir/tests/org/jetbrains/kotlin/idea/fir => idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api}/FirLazyResolveTestGenerated.java (97%) rename idea/{idea-fir/tests/org/jetbrains/kotlin/idea/fir => idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api}/FirMultiModuleResolveTestGenerated.java (98%) rename idea/{idea-fir/tests/org/jetbrains/kotlin/idea/fir => idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api}/FirResolveStateTest.kt (84%) rename idea/{idea-fir/tests/org/jetbrains/kotlin/idea/fir => idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api}/firTestUtils.kt (88%) diff --git a/generators/build.gradle.kts b/generators/build.gradle.kts index 38d941c1f9a..e9fa74ceb42 100644 --- a/generators/build.gradle.kts +++ b/generators/build.gradle.kts @@ -39,6 +39,7 @@ dependencies { testCompile(projectTests(":idea:idea-maven")) testCompile(projectTests(":idea:idea-fir")) testCompile(projectTests(":idea:idea-frontend-fir")) + testCompile(projectTests(":idea:idea-frontend-fir:idea-fir-low-level-api")) testCompile(projectTests(":j2k")) testCompile(projectTests(":nj2k")) if (Ide.IJ()) { diff --git a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 1567698f827..cbd9b7a7cb6 100644 --- a/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/tests/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -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.quickDoc.AbstractQuickDocProviderTest import org.jetbrains.kotlin.idea.filters.AbstractKotlinExceptionFilterTest -import org.jetbrains.kotlin.idea.fir.AbstractFirLazyResolveTest -import org.jetbrains.kotlin.idea.fir.AbstractFirMultiModuleResolveTest +import org.jetbrains.kotlin.idea.fir.low.level.api.AbstractFirLazyResolveTest +import org.jetbrains.kotlin.idea.fir.low.level.api.AbstractFirMultiModuleResolveTest import org.jetbrains.kotlin.idea.fir.AbstractKtDeclarationAndFirDeclarationEqualityChecker import org.jetbrains.kotlin.idea.folding.AbstractKotlinFoldingTest import org.jetbrains.kotlin.idea.hierarchy.AbstractHierarchyTest diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/checkers/AbstractFirPsiCheckerTest.kt b/idea/idea-fir/tests/org/jetbrains/kotlin/checkers/AbstractFirPsiCheckerTest.kt index e4bc9bcd7bf..8f5778849fa 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/checkers/AbstractFirPsiCheckerTest.kt +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/checkers/AbstractFirPsiCheckerTest.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.checkers 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.test.InTextDirectivesUtils import java.io.File diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/resolve/AbstractFirReferenceResolveTest.kt b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/resolve/AbstractFirReferenceResolveTest.kt index 96d1941d8e1..e38d13b9d7f 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/resolve/AbstractFirReferenceResolveTest.kt +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/resolve/AbstractFirReferenceResolveTest.kt @@ -5,12 +5,10 @@ package org.jetbrains.kotlin.idea.resolve -import com.intellij.testFramework.LightProjectDescriptor 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.KotlinWithJdkAndRuntimeLightProjectDescriptor -import org.jetbrains.kotlin.idea.test.ProjectDescriptorWithStdlibSources import org.jetbrains.kotlin.test.InTextDirectivesUtils abstract class AbstractFirReferenceResolveTest : AbstractReferenceResolveTest() { diff --git a/idea/idea-frontend-fir/build.gradle.kts b/idea/idea-frontend-fir/build.gradle.kts index eb6cb72bbe2..f9b563f4fb5 100644 --- a/idea/idea-frontend-fir/build.gradle.kts +++ b/idea/idea-frontend-fir/build.gradle.kts @@ -13,6 +13,7 @@ dependencies { compile(project(":compiler:fir:checkers")) compile(project(":compiler:fir:java")) compile(project(":compiler:fir:jvm")) + compile(project(":idea:idea-frontend-fir:idea-fir-low-level-api")) compile(intellijDep()) compile(intellijCoreDep()) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/build.gradle.kts b/idea/idea-frontend-fir/idea-fir-low-level-api/build.gradle.kts new file mode 100644 index 00000000000..eb6cb72bbe2 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/build.gradle.kts @@ -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()) + +// + compile(project(":idea:idea-core")) +// + + 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() + diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeDiagnosticsCollector.kt similarity index 87% rename from idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeDiagnosticsCollector.kt index ca74b167115..95db9663853 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeDiagnosticsCollector.kt @@ -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. */ -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.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.psi.KtElement -class FirIdeDiagnosticsCollector(session: FirSession, private val resolveState: FirModuleResolveState) : AbstractDiagnosticCollector(session) { +internal class FirIdeDiagnosticsCollector(session: FirSession, private val resolveState: FirModuleResolveState) : AbstractDiagnosticCollector(session) { init { registerAllComponents() diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt similarity index 96% rename from idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt index e13945714ed..46b4c1a4a12 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeJavaModuleBasedSession.kt @@ -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. */ -package org.jetbrains.kotlin.idea.fir +package org.jetbrains.kotlin.idea.fir.low.level.api import com.intellij.openapi.project.Project 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 -class FirIdeJavaModuleBasedSession( +internal class FirIdeJavaModuleBasedSession( moduleInfo: ModuleInfo, sessionProvider: FirProjectSessionProvider ) : FirModuleBasedSession(moduleInfo, sessionProvider) { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeModuleDependenciesSymbolProvider.kt similarity index 95% rename from idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeModuleDependenciesSymbolProvider.kt index 1072f06be1b..0c26f5d485f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeModuleDependenciesSymbolProvider.kt @@ -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. */ -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.impl.FirDependenciesSymbolProviderImpl @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.idea.caches.project.isLibraryClasses import org.jetbrains.kotlin.idea.caches.resolve.IDEPackagePartProvider -class FirIdeModuleDependenciesSymbolProvider( +internal class FirIdeModuleDependenciesSymbolProvider( session: FirIdeJavaModuleBasedSession ) : FirDependenciesSymbolProviderImpl(session) { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeProvider.kt similarity index 97% rename from idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeProvider.kt index 86abcf871c2..1d909eb9ae5 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeProvider.kt @@ -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. */ -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.project.Project @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile -class FirIdeProvider( +internal class FirIdeProvider( val project: Project, val scope: GlobalSearchScope, val session: FirSession, @@ -163,4 +163,4 @@ class FirIdeProvider( } } -val FirSession.firIdeProvider: FirIdeProvider by FirSession.sessionComponentAccessor() \ No newline at end of file +internal val FirSession.firIdeProvider: FirIdeProvider by FirSession.sessionComponentAccessor() \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt similarity index 92% rename from idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt index 10da0c0c186..6398c393c34 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt @@ -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. */ -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.project.Project @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.analyzer.TrackableModuleInfo import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo -interface FirIdeResolveStateService { +internal interface FirIdeResolveStateService { companion object { fun getInstance(project: Project): FirIdeResolveStateService = 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() private fun createResolveState(): FirModuleResolveState { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt similarity index 93% rename from idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt index 134a7770664..a4428c5ca7c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirModuleResolveState.kt @@ -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. */ -package org.jetbrains.kotlin.idea.fir +package org.jetbrains.kotlin.idea.fir.low.level.api import com.intellij.openapi.project.Project 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.KtFile -interface FirModuleResolveState { +internal interface FirModuleResolveState { val sessionProvider: FirProjectSessionProvider fun getSession(psi: KtElement): FirSession { @@ -65,7 +65,7 @@ interface FirModuleResolveState { fun setDiagnosticsForFile(file: KtFile, fir: FirFile, diagnostics: Iterable> = emptyList()) } -class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionProvider) : FirModuleResolveState { +internal class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionProvider) : FirModuleResolveState { private val cache = mutableMapOf() private val diagnosticCache = mutableMapOf>() @@ -115,5 +115,5 @@ class FirModuleResolveStateImpl(override val sessionProvider: FirProjectSessionP } } -fun KtElement.firResolveState(): FirModuleResolveState = +internal fun KtElement.firResolveState(): FirModuleResolveState = FirIdeResolveStateService.getInstance(project).getResolveState(getModuleInfo()) \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolution.kt similarity index 93% rename from idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolution.kt index 84620b71d58..a01c1837cf7 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolution.kt @@ -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. */ -package org.jetbrains.kotlin.idea.fir +package org.jetbrains.kotlin.idea.fir.low.level.api import com.intellij.openapi.util.registry.Registry diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolutionApi.kt similarity index 95% rename from idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolutionApi.kt index e88521f9c2f..78e0a8cf236 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolutionApi.kt @@ -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. */ -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.psi.PsiElement import org.jetbrains.kotlin.fir.FirElement @@ -73,7 +72,7 @@ private fun FirFile.findCallableMember( ?: error("Cannot find FIR callable declaration ${CallableId(packageFqName, klassFqName, declName)}") } -fun KtCallableDeclaration.getOrBuildFir( +internal fun KtCallableDeclaration.getOrBuildFir( state: FirModuleResolveState, phase: FirResolvePhase = FirResolvePhase.DECLARATIONS ): FirCallableDeclaration<*> { @@ -97,7 +96,7 @@ fun KtCallableDeclaration.getOrBuildFir( return firMemberDeclaration } -fun KtClassOrObject.getOrBuildFir( +internal fun KtClassOrObject.getOrBuildFir( state: FirModuleResolveState, phase: FirResolvePhase = FirResolvePhase.DECLARATIONS ): FirMemberDeclaration { @@ -131,7 +130,7 @@ private fun KtFile.getOrBuildRawFirFile(state: FirModuleResolveState): Pair KtElement.getOrBuildFirSafe( - state: FirModuleResolveState, - phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE -) = getOrBuildFir(state, phase) as? E - private fun KtElement.getNonLocalContainingDeclarationWithFqName(): KtDeclaration? { var container = parent @@ -247,7 +241,7 @@ private fun KtElement.getNonLocalContainingDeclarationWithFqName(): KtDeclaratio return null } -fun KtElement.getOrBuildFir( +internal fun KtElement.getOrBuildFir( state: FirModuleResolveState, phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE ): FirElement { diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/LowLevelFirApiFacade.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/LowLevelFirApiFacade.kt new file mode 100644 index 00000000000..cc3da64718c --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/LowLevelFirApiFacade.kt @@ -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 { + val file = element.containingKtFile + val state = element.firResolveState() + file.getOrBuildFirWithDiagnostics(state) + return state.getDiagnostics(element) + } +} \ No newline at end of file diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirLazyResolveTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirLazyResolveTest.kt similarity index 98% rename from idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirLazyResolveTest.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirLazyResolveTest.kt index 5791a67c87f..8f56377e527 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirLazyResolveTest.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirLazyResolveTest.kt @@ -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. */ -package org.jetbrains.kotlin.idea.fir +package org.jetbrains.kotlin.idea.fir.low.level.api import com.google.gson.JsonObject import com.google.gson.JsonParser diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirMultiModuleResolveTest.kt similarity index 98% rename from idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirMultiModuleResolveTest.kt index 66630e7c76a..22c2ccc58a6 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractFirMultiModuleResolveTest.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/AbstractFirMultiModuleResolveTest.kt @@ -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. */ -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.ModuleManager -import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiFile import com.intellij.psi.PsiManager diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirLazyResolveTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLazyResolveTestGenerated.java similarity index 97% rename from idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirLazyResolveTestGenerated.java rename to idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLazyResolveTestGenerated.java index 673e26d248b..b9d5f309390 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirLazyResolveTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirLazyResolveTestGenerated.java @@ -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. */ -package org.jetbrains.kotlin.idea.fir; +package org.jetbrains.kotlin.idea.fir.low.level.api; import com.intellij.testFramework.TestDataPath; 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 */ @SuppressWarnings("all") @TestMetadata("idea/testData/fir/lazyResolve") -@TestDataPath("$PROJECT_ROOT") +@TestDataPath("/") @RunWith(JUnit3RunnerWithInners.class) public class FirLazyResolveTestGenerated extends AbstractFirLazyResolveTest { private void runTest(String testDataFilePath) throws Exception { diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirMultiModuleResolveTestGenerated.java similarity index 98% rename from idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java rename to idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirMultiModuleResolveTestGenerated.java index 2a538f22bdd..39a40932b6e 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirMultiModuleResolveTestGenerated.java +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirMultiModuleResolveTestGenerated.java @@ -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. */ -package org.jetbrains.kotlin.idea.fir; +package org.jetbrains.kotlin.idea.fir.low.level.api; import com.intellij.testFramework.TestDataPath; 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 */ @SuppressWarnings("all") @TestMetadata("idea/testData/fir/multiModule") -@TestDataPath("$PROJECT_ROOT") +@TestDataPath("/") @RunWith(JUnit3RunnerWithInners.class) public class FirMultiModuleResolveTestGenerated extends AbstractFirMultiModuleResolveTest { private void runTest(String testDataFilePath) throws Exception { diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirResolveStateTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolveStateTest.kt similarity index 84% rename from idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirResolveStateTest.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolveStateTest.kt index e1194d6326b..d0a432282c5 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/FirResolveStateTest.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/FirResolveStateTest.kt @@ -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. */ -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.fir.low.level.api.firResolveState class FirResolveStateTest : AbstractResolveElementCacheTest() { override fun isFirPlugin(): Boolean = true diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/firTestUtils.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/firTestUtils.kt similarity index 88% rename from idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/firTestUtils.kt rename to idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/firTestUtils.kt index e14af0b4e22..2f37039d23f 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/fir/firTestUtils.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/firTestUtils.kt @@ -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. */ -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.project.Project diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt index bfbc5fa2a34..53834b6b6f6 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirUtils.kt @@ -5,15 +5,36 @@ 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.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.references.FirReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol 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 +fun KtElement.getOrBuildFir( + phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE +) = LowLevelFirApiFacade.getOrBuildFirFor(this, phase) + + +inline fun KtElement.getOrBuildFirSafe( + phase: FirResolvePhase = FirResolvePhase.BODY_RESOLVE +) = LowLevelFirApiFacade.getOrBuildFirFor(this, phase) as? E + + +val KtElement.session + get() = parentOfType()?.getOrBuildFirSafe()?.session + ?: containingKtFile.getOrBuildFirSafe()!!.session + fun FirFunctionCall.isImplicitFunctionCall(): Boolean { if (dispatchReceiver !is FirQualifiedAccessExpression) return false val resolvedCalleeSymbol = (calleeReference as? FirResolvedNamedReference)?.resolvedSymbol diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/AnalysisSessionFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/AnalysisSessionFirImpl.kt index c9fdab87d21..b30c6243b24 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/AnalysisSessionFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/AnalysisSessionFirImpl.kt @@ -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.types.* 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.references.FirReferenceResolveHelper import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper.toTargetPsi import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.types.model.KotlinTypeMarker -class AnalysisSessionFirImpl internal constructor( - private val state: FirModuleResolveState -) : FrontendAnalysisSession() { +class AnalysisSessionFirImpl : FrontendAnalysisSession() { override fun getSmartCastedToTypes(expression: KtExpression): Collection? { // TODO filter out not used smartcasts @@ -41,7 +39,7 @@ class AnalysisSessionFirImpl internal constructor( @OptIn(ExperimentalStdlibApi::class) override fun getImplicitReceiverSmartCasts(expression: KtExpression): Collection { // TODO filter out not used smartcasts - val qualifiedExpression = expression.getOrBuildFir(state) as? FirQualifiedAccessExpression ?: return emptyList() + val qualifiedExpression = expression.getOrBuildFirSafe() ?: return emptyList() if (qualifiedExpression.dispatchReceiver !is FirExpressionWithSmartcast && qualifiedExpression.extensionReceiver !is FirExpressionWithSmartcast ) return emptyList() @@ -67,15 +65,13 @@ class AnalysisSessionFirImpl internal constructor( override fun isSubclassOf(klass: KtClassOrObject, superClassId: ClassId): Boolean { var result = false 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 } - override fun getDiagnosticsForElement(element: KtElement): Collection { - element.containingKtFile.getOrBuildFirWithDiagnostics(state) - return state.getDiagnostics(element) - } + override fun getDiagnosticsForElement(element: KtElement): Collection = + LowLevelFirApiFacade.getDiagnosticsFor(element) override fun resolveCall(call: KtBinaryExpression): CallInfo? { val firCall = call.toFir() ?: return null @@ -88,7 +84,7 @@ class AnalysisSessionFirImpl internal constructor( } private fun resolveCall(firCall: FirFunctionCall, callExpression: KtExpression): CallInfo? { - val session = callExpression.getSession() + val session = callExpression.session val resolvedFunctionPsi = firCall.calleeReference.toTargetPsi(session) val resolvedCalleeSymbol = (firCall.calleeReference as? FirResolvedNamedReference)?.resolvedSymbol return when { @@ -124,10 +120,8 @@ class AnalysisSessionFirImpl internal constructor( else -> null } - private fun KtElement.getSession() = state.getSession(this) - private inline fun 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) { firClass.superTypeRefs.forEach { superType -> @@ -137,9 +131,6 @@ class AnalysisSessionFirImpl internal constructor( } companion object { - fun forElement(element: KtElement): FrontendAnalysisSession = - AnalysisSessionFirImpl(element.firResolveState()) - private fun KotlinTypeMarker.asConeType(): ConeKotlinType = this as? ConeKotlinType ?: error("$this should be ConeKotlinType") @@ -150,5 +141,4 @@ class AnalysisSessionFirImpl internal constructor( ) } } - } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/highlighter/KotlinFirPsiChecker.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/highlighter/KotlinFirPsiChecker.kt index 6e67469d43b..4320950886f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/highlighter/KotlinFirPsiChecker.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/highlighter/KotlinFirPsiChecker.kt @@ -21,7 +21,7 @@ class KotlinFirPsiChecker : AbstractKotlinPsiChecker() { override fun annotateElement(element: PsiElement, containingFile: KtFile, holder: AnnotationHolder) { if (element !is KtElement) return - val analysisSession = AnalysisSessionFirImpl.forElement(element) + val analysisSession = AnalysisSessionFirImpl() highlightDiagnostics(element, analysisSession, holder) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt index e48ffc119b2..702e997d76a 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt @@ -6,16 +6,10 @@ package org.jetbrains.kotlin.idea.references 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 interface FirKtReference : KtReference { - fun getResolvedToPsi( - analysisSession: AnalysisSessionFirImpl, - session: FirSession, - state: FirModuleResolveState - ): Collection + fun getResolvedToPsi(analysisSession: AnalysisSessionFirImpl): Collection override val resolver get() = KtFirReferenceResolver } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index 4c8ed35dcd9..af5079199c2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -74,13 +74,11 @@ object FirReferenceResolveHelper { } } - internal fun resolveSimpleNameReference( - ref: KtSimpleNameReferenceFirImpl, - session: FirSession, - state: FirModuleResolveState - ): Collection { + internal fun resolveSimpleNameReference(ref: KtSimpleNameReferenceFirImpl): Collection { val expression = ref.expression - when (val fir = expression.getOrBuildFir(state)) { + val fir = expression.getOrBuildFir() + val session = expression.session + when (fir) { is FirResolvable -> { val calleeReference = if (fir is FirFunctionCall @@ -109,7 +107,7 @@ object FirReferenceResolveHelper { parent = parent.parent as? KtDotQualifiedExpression continue } - val parentFir = selectorExpression.getOrBuildFir(state) + val parentFir = selectorExpression.getOrBuildFir() if (parentFir is FirQualifiedAccess) { return listOfNotNull(classId.toTargetPsi(session, parentFir.calleeReference)) } @@ -177,7 +175,7 @@ object FirReferenceResolveHelper { parent = parent.parent as? KtDotQualifiedExpression continue } - val parentFir = selectorExpression.getOrBuildFir(state) + val parentFir = selectorExpression.getOrBuildFir() if (parentFir is FirResolvedQualifier) { var classId = parentFir.classId while (unresolvedCounter > 0) { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt index d763ddb1d68..4ca1aed037e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt @@ -6,8 +6,6 @@ package org.jetbrains.kotlin.idea.references 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.name.FqName import org.jetbrains.kotlin.psi.KtImportAlias @@ -16,11 +14,7 @@ import org.jetbrains.kotlin.psi.KtSimpleNameExpression internal class KtSimpleNameReferenceFirImpl( expression: KtSimpleNameExpression ) : KtSimpleNameReference(expression), FirKtReference { - override fun getResolvedToPsi( - analysisSession: AnalysisSessionFirImpl, - session: FirSession, - state: FirModuleResolveState - ) = FirReferenceResolveHelper.resolveSimpleNameReference(this, session, state) + override fun getResolvedToPsi(analysisSession: AnalysisSessionFirImpl) = FirReferenceResolveHelper.resolveSimpleNameReference(this) override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean { return true // TODO diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReferenceFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReferenceFirImpl.kt index 83274d0802b..bb538d86ee1 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReferenceFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtDestructuringDeclarationReferenceFirImpl.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.idea.references import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.expressions.FirComponentCall import org.jetbrains.kotlin.idea.fir.* @@ -19,12 +18,10 @@ class KtDestructuringDeclarationReferenceFirImpl( override fun canRename(): Boolean = false //todo override fun getResolvedToPsi( - analysisSession: AnalysisSessionFirImpl, - session: FirSession, - state: FirModuleResolveState + analysisSession: AnalysisSessionFirImpl ): Collection { - val fir = expression.getOrBuildFirSafe(state) ?: return emptyList() + val fir = expression.getOrBuildFirSafe() ?: return emptyList() val componentFunctionSymbol = (fir.initializer as? FirComponentCall)?.getCalleeSymbol() ?: return emptyList() - return listOfNotNull(componentFunctionSymbol.fir.findPsi(session)) + return listOfNotNull(componentFunctionSymbol.fir.findPsi(element.project)) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt index 7b10e4f5688..ef778a18053 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt @@ -9,7 +9,6 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementResolveResult import com.intellij.psi.ResolveResult import com.intellij.psi.impl.source.resolve.ResolveCache -import org.jetbrains.kotlin.idea.fir.firResolveState import org.jetbrains.kotlin.idea.frontend.api.fir.AnalysisSessionFirImpl object KtFirReferenceResolver : ResolveCache.PolyVariantResolver { @@ -18,11 +17,8 @@ object KtFirReferenceResolver : ResolveCache.PolyVariantResolver { override fun resolve(ref: KtReference, incompleteCode: Boolean): Array { check(ref is FirKtReference) { "reference should be FirKtReference, but was ${ref::class}" } check(ref is AbstractKtReference<*>) { "reference should be AbstractKtReference, but was ${ref::class}" } - val expression = ref.expression - val state = expression.firResolveState() - val session = state.getSession(expression) - val analysisSession = AnalysisSessionFirImpl(state) - val resolveToPsiElements = ref.getResolvedToPsi(analysisSession, session, state) + val analysisSession = AnalysisSessionFirImpl() + val resolveToPsiElements = ref.getResolvedToPsi(analysisSession) return resolveToPsiElements.map { KotlinResolveResult(it) }.toTypedArray() } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtForLoopInReferenceFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtForLoopInReferenceFirImpl.kt index 4303d1de6bc..749306fb477 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtForLoopInReferenceFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtForLoopInReferenceFirImpl.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression 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.getOrBuildFirSafe 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 { override fun getResolvedToPsi( - analysisSession: AnalysisSessionFirImpl, - session: FirSession, - state: FirModuleResolveState + analysisSession: AnalysisSessionFirImpl ): Collection { - val firLoop = expression.getOrBuildFirSafe(state) ?: return emptyList() + val firLoop = expression.getOrBuildFirSafe() ?: return emptyList() val condition = firLoop.condition as? FirFunctionCall val iterator = run { val callee = (condition?.explicitReceiver as? FirQualifiedAccessExpression)?.calleeReference @@ -32,10 +29,11 @@ open class KtForLoopInReferenceFirImpl(expression: KtForExpression) : KtForLoopI } val hasNext = condition?.calleeReference?.getResolvedSymbolOfNameReference() val next = (firLoop.block.statements.firstOrNull() as? FirProperty?)?.getInitializerFunctionCall() + val project = element.project return listOfNotNull( - iterator?.fir?.findPsi(session), - hasNext?.fir?.findPsi(session), - next?.fir?.findPsi(session), + iterator?.fir?.findPsi(project), + hasNext?.fir?.findPsi(project), + next?.fir?.findPsi(project), ) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtInvokeFunctionReferenceFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtInvokeFunctionReferenceFirImpl.kt index d0b5b7e85bf..8b9a33a0ff4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtInvokeFunctionReferenceFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtInvokeFunctionReferenceFirImpl.kt @@ -6,8 +6,6 @@ package org.jetbrains.kotlin.idea.references 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.fir.AnalysisSessionFirImpl import org.jetbrains.kotlin.psi.KtCallExpression @@ -18,11 +16,7 @@ class KtInvokeFunctionReferenceFirImpl(expression: KtCallExpression) : KtInvokeF TODO("Not yet implemented") } - override fun getResolvedToPsi( - analysisSession: AnalysisSessionFirImpl, - session: FirSession, - state: FirModuleResolveState - ): Collection { + override fun getResolvedToPsi(analysisSession: AnalysisSessionFirImpl): Collection { val call = analysisSession.resolveCall(expression) ?: return emptyList() if (call is VariableAsFunctionLikeCallInfo) { return listOf(call.invokeFunction) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtPropertyDelegationMethodsReferenceFirImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtPropertyDelegationMethodsReferenceFirImpl.kt index 656cee68a2a..8d695f746be 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtPropertyDelegationMethodsReferenceFirImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtPropertyDelegationMethodsReferenceFirImpl.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.idea.references import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor import org.jetbrains.kotlin.fir.expressions.FirFunctionCall @@ -21,17 +20,16 @@ class KtPropertyDelegationMethodsReferenceFirImpl( element: KtPropertyDelegate ) : KtPropertyDelegationMethodsReference(element), FirKtReference { override fun getResolvedToPsi( - analysisSession: AnalysisSessionFirImpl, - session: FirSession, - state: FirModuleResolveState + analysisSession: AnalysisSessionFirImpl ): Collection { - val property = (expression.parent as? KtElement)?.getOrBuildFirSafe(state) ?: return emptyList() + val property = (expression.parent as? KtElement)?.getOrBuildFirSafe() ?: return emptyList() if (property.delegate == null) return emptyList() val getValueSymbol = (property.getter?.singleStatementOfType()?.result as? FirFunctionCall)?.getCalleeSymbol() val setValueSymbol = property.setter?.singleStatementOfType()?.getCalleeSymbol() + val project = element.project return listOfNotNull( - getValueSymbol?.fir?.findPsi(session), - setValueSymbol?.fir?.findPsi(session) + getValueSymbol?.fir?.findPsi(project), + setValueSymbol?.fir?.findPsi(project) ) } diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt index 354018cb3f4..9ce7ca5a4c9 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/fir/AbstractKtDeclarationAndFirDeclarationEqualityChecker.kt @@ -7,8 +7,6 @@ package org.jetbrains.kotlin.idea.fir import com.intellij.openapi.util.io.FileUtil 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.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.psi.KtFile @@ -21,9 +19,8 @@ abstract class AbstractKtDeclarationAndFirDeclarationEqualityChecker : KotlinLig val file = File(path) val ktFile = myFixture.configureByText(file.name, FileUtil.loadFile(file)) as KtFile - val resolveState = ktFile.firResolveState() ktFile.forEachDescendantOfType { ktFunction -> - val firFunction = ktFunction.getOrBuildFir(resolveState) as FirFunction<*> + val firFunction = ktFunction.getOrBuildFir() as FirFunction<*> if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) { throw FileComparisonFailure( /* message= */ null, diff --git a/idea/resources-fir/META-INF/plugin.xml b/idea/resources-fir/META-INF/plugin.xml index eac5c9ebca6..6375eea4dc6 100644 --- a/idea/resources-fir/META-INF/plugin.xml +++ b/idea/resources-fir/META-INF/plugin.xml @@ -92,8 +92,8 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu - + diff --git a/prepare/idea-plugin/build.gradle.kts b/prepare/idea-plugin/build.gradle.kts index 9458a057720..6c491745505 100644 --- a/prepare/idea-plugin/build.gradle.kts +++ b/prepare/idea-plugin/build.gradle.kts @@ -95,7 +95,8 @@ val projectsToShadow by extra(listOf( ":idea:idea-jps-common", ":idea:idea-frontend-independent", ":idea:idea-frontend-fir", - ":idea:idea-frontend-api", + ":idea:idea-frontend-fir", + ":idea:idea-frontend-fir:idea-fir-low-level-api", *if (Ide.IJ()) arrayOf( ":idea:idea-maven", diff --git a/settings.gradle b/settings.gradle index fc567baad5d..efaa4c239ae 100644 --- a/settings.gradle +++ b/settings.gradle @@ -313,6 +313,8 @@ include ":kotlin-build-common", ":kotlin-serialization-unshaded", ":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", ":prepare:ide-plugin-dependencies:allopen-compiler-plugin-for-ide", ":prepare:ide-plugin-dependencies:allopen-compiler-plugin-tests-for-ide",