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-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
|
||||
|
||||
+1
-3
@@ -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() {
|
||||
|
||||
@@ -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()
|
||||
|
||||
+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.
|
||||
*/
|
||||
|
||||
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()
|
||||
+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.
|
||||
*/
|
||||
|
||||
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) {
|
||||
+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.
|
||||
*/
|
||||
|
||||
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
-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.
|
||||
*/
|
||||
|
||||
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
-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.
|
||||
*/
|
||||
|
||||
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 {
|
||||
+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.
|
||||
*/
|
||||
|
||||
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())
|
||||
+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.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.fir
|
||||
package org.jetbrains.kotlin.idea.fir.low.level.api
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
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 {
|
||||
+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.
|
||||
*/
|
||||
|
||||
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
|
||||
+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.
|
||||
*/
|
||||
|
||||
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
|
||||
+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.
|
||||
*/
|
||||
|
||||
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 {
|
||||
+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.
|
||||
*/
|
||||
|
||||
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 {
|
||||
+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.
|
||||
*/
|
||||
|
||||
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
|
||||
+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.
|
||||
*/
|
||||
|
||||
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
|
||||
|
||||
+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.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(
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
+6
-8
@@ -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) {
|
||||
|
||||
+1
-7
@@ -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
|
||||
|
||||
+3
-6
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
+2
-6
@@ -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()
|
||||
}
|
||||
}
|
||||
+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.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),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+1
-7
@@ -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)
|
||||
|
||||
+5
-7
@@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+1
-4
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user