FIR IDE: introduce fir lower level module
This commit is contained in:
@@ -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
|
||||||
|
|||||||
+1
-3
@@ -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() {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
+2
-2
@@ -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()
|
||||||
+2
-2
@@ -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) {
|
||||||
+2
-2
@@ -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
-3
@@ -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
-3
@@ -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 {
|
||||||
+4
-4
@@ -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())
|
||||||
+1
-1
@@ -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
|
||||||
|
|
||||||
+6
-12
@@ -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 {
|
||||||
+23
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -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
|
||||||
+1
-3
@@ -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
|
||||||
+2
-2
@@ -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 {
|
||||||
+2
-2
@@ -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 {
|
||||||
+2
-1
@@ -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
|
||||||
+1
-1
@@ -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
|
||||||
|
|||||||
+8
-18
@@ -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(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+1
-1
@@ -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
|
||||||
}
|
}
|
||||||
+6
-8
@@ -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) {
|
||||||
|
|||||||
+1
-7
@@ -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
|
||||||
|
|||||||
+3
-6
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-6
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+6
-8
@@ -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),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-7
@@ -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)
|
||||||
|
|||||||
+5
-7
@@ -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)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user