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-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()) {
@@ -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
@@ -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
@@ -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() {
+1
View File
@@ -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())
@@ -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.
*/
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()
@@ -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) {
@@ -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) {
@@ -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()
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.
*/
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<IdeaModuleInfo, FirModuleData>()
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.
*/
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<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 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())
@@ -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
@@ -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<FirI
return firProvider to firProvider.getOrBuildFile(this)
}
fun KtFile.getOrBuildFir(
internal fun KtFile.getOrBuildFir(
state: FirModuleResolveState,
phase: FirResolvePhase = FirResolvePhase.DECLARATIONS
): FirFile {
@@ -145,7 +144,7 @@ fun KtFile.getOrBuildFir(
return firFile
}
fun KtFile.getOrBuildFirWithDiagnostics(state: FirModuleResolveState): FirFile {
internal fun KtFile.getOrBuildFirWithDiagnostics(state: FirModuleResolveState): FirFile {
val (_, firFile) = getOrBuildRawFirFile(state)
val currentResolvePhase = firFile.resolvePhase
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? {
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 {
@@ -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.
*/
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
@@ -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
@@ -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 {
@@ -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 {
@@ -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
@@ -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
@@ -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 <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 {
if (dispatchReceiver !is FirQualifiedAccessExpression) return false
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.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<KotlinTypeMarker>? {
// TODO filter out not used smartcasts
@@ -41,7 +39,7 @@ class AnalysisSessionFirImpl internal constructor(
@OptIn(ExperimentalStdlibApi::class)
override fun getImplicitReceiverSmartCasts(expression: KtExpression): Collection<ImplicitReceiverSmartCast> {
// 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
&& 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<Diagnostic> {
element.containingKtFile.getOrBuildFirWithDiagnostics(state)
return state.getDiagnostics(element)
}
override fun getDiagnosticsForElement(element: KtElement): Collection<Diagnostic> =
LowLevelFirApiFacade.getDiagnosticsFor(element)
override fun resolveCall(call: KtBinaryExpression): CallInfo? {
val firCall = call.toFir<FirFunctionCall>() ?: 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 <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) {
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(
)
}
}
}
@@ -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)
@@ -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<PsiElement>
fun getResolvedToPsi(analysisSession: AnalysisSessionFirImpl): Collection<PsiElement>
override val resolver get() = KtFirReferenceResolver
}
@@ -74,13 +74,11 @@ object FirReferenceResolveHelper {
}
}
internal fun resolveSimpleNameReference(
ref: KtSimpleNameReferenceFirImpl,
session: FirSession,
state: FirModuleResolveState
): Collection<PsiElement> {
internal fun resolveSimpleNameReference(ref: KtSimpleNameReferenceFirImpl): Collection<PsiElement> {
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) {
@@ -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
@@ -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<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()
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.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<KtReference> {
@@ -18,11 +17,8 @@ object KtFirReferenceResolver : ResolveCache.PolyVariantResolver<KtReference> {
override fun resolve(ref: KtReference, incompleteCode: Boolean): Array<ResolveResult> {
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()
}
}
@@ -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<PsiElement> {
val firLoop = expression.getOrBuildFirSafe<FirWhileLoop>(state) ?: return emptyList()
val firLoop = expression.getOrBuildFirSafe<FirWhileLoop>() ?: 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),
)
}
@@ -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<PsiElement> {
override fun getResolvedToPsi(analysisSession: AnalysisSessionFirImpl): Collection<PsiElement> {
val call = analysisSession.resolveCall(expression) ?: return emptyList()
if (call is VariableAsFunctionLikeCallInfo) {
return listOf(call.invokeFunction)
@@ -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<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()
val getValueSymbol = (property.getter?.singleStatementOfType<FirReturnExpression>()?.result as? FirFunctionCall)?.getCalleeSymbol()
val setValueSymbol = property.setter?.singleStatementOfType<FirFunctionCall>()?.getCalleeSymbol()
val project = element.project
return listOfNotNull(
getValueSymbol?.fir?.findPsi(session),
setValueSymbol?.fir?.findPsi(session)
getValueSymbol?.fir?.findPsi(project),
setValueSymbol?.fir?.findPsi(project)
)
}
@@ -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> { ktFunction ->
val firFunction = ktFunction.getOrBuildFir(resolveState) as FirFunction<*>
val firFunction = ktFunction.getOrBuildFir() as FirFunction<*>
if (!KtDeclarationAndFirDeclarationEqualityChecker.representsTheSameDeclaration(ktFunction, firFunction)) {
throw FileComparisonFailure(
/* 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"/>
<highlightRangeExtension implementation="org.jetbrains.kotlin.idea.highlighter.KotlinFirPsiChecker"/>
<annotator language="kotlin" implementationClass="org.jetbrains.kotlin.idea.highlighter.KotlinFirPsiChecker"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.fir.FirIdeResolveStateService"
serviceImplementation="org.jetbrains.kotlin.idea.fir.FirIdeResolveStateServiceImpl"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeResolveStateService"
serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.FirIdeResolveStateServiceImpl"/>
<projectService serviceImplementation="org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade"/>
</extensions>
+2 -1
View File
@@ -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",
+2
View File
@@ -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",