From 45ef0e1b50d14db22233e5f7b94b07e6d2741886 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sun, 24 May 2020 15:01:37 +0300 Subject: [PATCH] FIR IDE: Move fir resolving functionality from idea module to idea-frontend-fir --- .../idea/highlighter/KotlinPsiChecker.kt | 16 +---- .../kotlin/idea/references/KtReference.kt | 7 --- .../idea/references/KtSimpleNameReference.kt | 3 + idea/idea-fir/build.gradle.kts | 4 +- .../idea/fir/FirIdeDiagnosticsCollector.kt | 2 +- .../idea/fir/FirIdeJavaModuleBasedSession.kt | 2 +- .../FirIdeModuleDependenciesSymbolProvider.kt | 2 +- .../kotlin/idea/fir/FirIdeProvider.kt | 2 +- .../idea/fir/FirIdeResolveStateService.kt | 5 +- .../kotlin/idea/fir/FirModuleResolveState.kt | 2 +- .../kotlin/idea/fir/FirResolution.kt | 2 +- .../kotlin/idea/fir/FirResolutionApi.kt | 4 +- .../kotlin/idea/references/FirKtReference.kt | 12 ++++ .../references/FirReferenceResolveHelper.kt | 2 +- .../idea/references/FirSimpleNameReference.kt | 42 +++++++++++++ .../KotlinFirReferenceContributor.kt | 14 +++++ .../idea/references/KtFirReferenceResolver.kt | 21 +++++++ .../build.gradle.kts | 5 +- .../kotlin/caches/project/cacheUtil.kt | 62 +++++++++++++++++++ .../KotlinCodeBlockModificationListener.kt | 0 ...KotlinCodeBlockModificationListener.kt.201 | 0 ...tlinCodeBlockModificationListenerCompat.kt | 2 +- .../KotlinIDEModificationTrackerService.kt | 6 +- ...ModuleOutOfCodeBlockModificationTracker.kt | 2 +- .../trackers/psiModificationTrackerCompat.kt | 0 .../idea/references/KtSimpleNameReference.kt | 3 +- 26 files changed, 181 insertions(+), 41 deletions(-) rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt (95%) rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt (97%) rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt (97%) rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt (99%) rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt (91%) rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt (98%) rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt (91%) rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt (98%) create mode 100644 idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt rename idea/{idea-analysis => idea-frontend-fir}/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt (98%) create mode 100644 idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt create mode 100644 idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KotlinFirReferenceContributor.kt create mode 100644 idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/caches/project/cacheUtil.kt rename idea/{idea-analysis => idea-frontend-independent}/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt (100%) rename idea/{idea-analysis => idea-frontend-independent}/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 (100%) rename idea/{idea-analysis => idea-frontend-independent}/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListenerCompat.kt (99%) rename idea/{idea-analysis => idea-frontend-independent}/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinIDEModificationTrackerService.kt (83%) rename idea/{idea-analysis => idea-frontend-independent}/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinModuleOutOfCodeBlockModificationTracker.kt (98%) create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/psiModificationTrackerCompat.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt index d098e0a51af..d1bcfdf084b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/highlighter/KotlinPsiChecker.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * 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.highlighter @@ -59,6 +48,7 @@ open class KotlinPsiChecker : Annotator, HighlightRangeExtension { if (!KotlinHighlightingUtil.shouldHighlight(file)) return + //todo move all fir stuff to fir plugin if (FirResolution.enabled) { annotateElementUsingFrontendIR(element, file, holder) } else { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtReference.kt index 8de59d86da6..21af5247229 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtReference.kt @@ -24,9 +24,6 @@ import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde -import org.jetbrains.kotlin.idea.fir.FirResolution -import org.jetbrains.kotlin.idea.fir.firResolveState -import org.jetbrains.kotlin.idea.fir.getOrBuildFir import org.jetbrains.kotlin.idea.util.application.runWithCancellationCheck import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -66,10 +63,6 @@ object KotlinDescriptorsBasedReferenceResolver : ResolveCache.PolyVariantResolve class KotlinResolveResult(element: PsiElement) : PsiElementResolveResult(element) private fun resolveToPsiElements(ref: KtDescriptorsBasedReference): Collection { - if (FirResolution.enabled) { - @Suppress("UNCHECKED_CAST") - return FirReferenceResolveHelper.resolveToPsiElements(ref as AbstractKtReference) - } val bindingContext = ref.element.analyze(BodyResolveMode.PARTIAL) return resolveToPsiElements(ref, bindingContext, ref.getTargetDescriptors(bindingContext)) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt index 8170053fc13..8129ba0d0e0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt @@ -45,6 +45,9 @@ class KtSimpleNameReferenceDescriptorsImpl( override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean = canBeReferenceTo(candidateTarget) + override fun isReferenceToWithoutExtensionChecking(candidateTarget: PsiElement): Boolean = + matchesTarget(candidateTarget) + override fun getTargetDescriptors(context: BindingContext): Collection { return SmartList().apply { // Replace Java property with its accessor(s) diff --git a/idea/idea-fir/build.gradle.kts b/idea/idea-fir/build.gradle.kts index 7a48002d59c..5e3d8f5155a 100644 --- a/idea/idea-fir/build.gradle.kts +++ b/idea/idea-fir/build.gradle.kts @@ -4,6 +4,8 @@ plugins { } dependencies { + compile(project(":idea:idea-frontend-fir")) + testCompileOnly(toolsJar()) testRuntimeOnly(toolsJar()) @@ -54,7 +56,7 @@ sourceSets { "test" { projectDefault() } } -projectTest(parallel = true) { +projectTest(parallel = false) { dependsOn(":dist") workingDir = rootDir } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt similarity index 95% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt index 46ae2547937..ca74b167115 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeDiagnosticsCollector.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt similarity index 97% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt index 741a6305d33..e13945714ed 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt similarity index 97% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt index 6135dcbc036..1072f06be1b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeModuleDependenciesSymbolProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt similarity index 99% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt index 6e1d562124c..86abcf871c2 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt similarity index 91% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt index 3c8d212faa6..10da0c0c186 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirIdeResolveStateService.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.fir import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project import com.intellij.openapi.util.ModificationTracker -import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService import org.jetbrains.kotlin.analyzer.TrackableModuleInfo import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo @@ -60,5 +59,5 @@ class FirIdeResolveStateServiceImpl(val project: Project) : FirIdeResolveStateSe } override val fallbackModificationTracker: ModificationTracker? = - KotlinModificationTrackerService.getInstance(project).outOfBlockModificationTracker + org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService.getInstance(project).outOfBlockModificationTracker } \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt similarity index 98% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt index 6caeaa3900a..ed1122e83ec 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirModuleResolveState.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt similarity index 91% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt index 4872e4e970d..84620b71d58 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolution.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt similarity index 98% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt index aa972fec259..8d25a071913 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/fir/FirResolutionApi.kt @@ -1,6 +1,6 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. + * 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 diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt new file mode 100644 index 00000000000..e5056e0f86a --- /dev/null +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirKtReference.kt @@ -0,0 +1,12 @@ +/* + * 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.references + +import com.intellij.psi.impl.source.resolve.ResolveCache + +interface FirKtReference : KtReference { + override val resolver get() = KtFirReferenceResolver +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt similarity index 98% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt rename to idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index ec81c482fbe..c89d790134a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -65,7 +65,7 @@ object FirReferenceResolveHelper { } } - fun resolveToPsiElements(ref: AbstractKtReference): Collection { + fun resolveToPsiElements(ref: AbstractKtReference<*>): Collection { val expression = ref.expression val state = expression.firResolveState() val session = state.getSession(expression) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt new file mode 100644 index 00000000000..247010308cf --- /dev/null +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirSimpleNameReference.kt @@ -0,0 +1,42 @@ +/* + * 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.references + +import com.intellij.psi.PsiElement +import com.intellij.psi.impl.source.resolve.ResolveCache +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtImportAlias +import org.jetbrains.kotlin.psi.KtSimpleNameExpression + +internal class KtSimpleNameReferenceFirImpl( + expression: KtSimpleNameExpression +) : KtSimpleNameReference(expression), FirKtReference { + override fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean { + return true // TODO + } + + override fun isReferenceToWithoutExtensionChecking(candidateTarget: PsiElement): Boolean { + return resolve() == candidateTarget + } + + override fun handleElementRename(newElementName: String): PsiElement? { + TODO("Not yet implemented") + } + + override fun bindToElement(element: PsiElement, shorteningMode: ShorteningMode): PsiElement { + TODO("Not yet implemented") + } + + override fun bindToFqName(fqName: FqName, shorteningMode: ShorteningMode, targetElement: PsiElement?): PsiElement { + TODO("Not yet implemented") + } + + override fun getImportAlias(): KtImportAlias? { + TODO("Not yet implemented") + } + + override val resolver get() = KtFirReferenceResolver +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KotlinFirReferenceContributor.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KotlinFirReferenceContributor.kt new file mode 100644 index 00000000000..612b3b52405 --- /dev/null +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KotlinFirReferenceContributor.kt @@ -0,0 +1,14 @@ +/* + * 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.references + +class KotlinFirReferenceContributor : KotlinReferenceProviderContributor { + override fun registerReferenceProviders(registrar: KotlinPsiReferenceRegistrar) { + with(registrar) { + registerProvider(factory = ::KtSimpleNameReferenceFirImpl) + } + } +} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt new file mode 100644 index 00000000000..18f204e80f7 --- /dev/null +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/KtFirReferenceResolver.kt @@ -0,0 +1,21 @@ +/* + * 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.references + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiElementResolveResult +import com.intellij.psi.ResolveResult +import com.intellij.psi.impl.source.resolve.ResolveCache + +object KtFirReferenceResolver : ResolveCache.PolyVariantResolver { + class KotlinResolveResult(element: PsiElement) : PsiElementResolveResult(element) + + override fun resolve(ref: KtReference, incompleteCode: Boolean): Array { + check(ref is AbstractKtReference<*>) { "reference should be AbstractKtReference, but was ${ref::class}" } + val resolveToPsiElements = FirReferenceResolveHelper.resolveToPsiElements(ref) + return resolveToPsiElements.map { KotlinResolveResult(it) }.toTypedArray() + } +} \ No newline at end of file diff --git a/idea/idea-frontend-independent/build.gradle.kts b/idea/idea-frontend-independent/build.gradle.kts index 655ac891f35..57504acbb41 100644 --- a/idea/idea-frontend-independent/build.gradle.kts +++ b/idea/idea-frontend-independent/build.gradle.kts @@ -5,11 +5,14 @@ plugins { dependencies { /* - This module should not depend on compiler scpecific functionality + This module should not depend on compiler specific functionality No dependencies on descriptors (for now we still have transitive one by psi module), fir and similar modules, but may be dependencies on frontend independent one like psi & type-system This module is needed for smooth migration from descriptor frontend based IJ plugin to interlayer based one */ + + compileOnly(project(":compiler:frontend")) // we need caches form here to work with ModuleInfo :( + compileOnly(project(":compiler:psi")) compileOnly(project(":kotlin-reflect-api")) compileOnly(intellijCoreDep()) diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/caches/project/cacheUtil.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/caches/project/cacheUtil.kt new file mode 100644 index 00000000000..3bf4def12ff --- /dev/null +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/caches/project/cacheUtil.kt @@ -0,0 +1,62 @@ +/* + * 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.caches.project + +import com.intellij.openapi.module.Module +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ProjectRootModificationTracker +import com.intellij.openapi.util.UserDataHolder +import com.intellij.psi.util.CachedValueProvider +import com.intellij.psi.util.CachedValuesManager + +fun Module.cacheByClass(classForKey: Class<*>, vararg dependencies: Any, provider: () -> T): T { + return CachedValuesManager.getManager(project).cache(this, dependencies, classForKey, provider) +} + +fun Module.cacheByClassInvalidatingOnRootModifications(classForKey: Class<*>, provider: () -> T): T { + return cacheByClass(classForKey, ProjectRootModificationTracker.getInstance(project), provider = provider) +} + +/** + * Note that it uses lambda's class for caching (essentially, anonymous class), which means that all invocations will be cached + * by the one and the same key. + * It is encouraged to use explicit class, just for the sake of readability. + */ +fun Module.cacheInvalidatingOnRootModifications(provider: () -> T): T { + return cacheByClassInvalidatingOnRootModifications(provider::class.java, provider) +} + +fun Project.cacheByClass(classForKey: Class<*>, vararg dependencies: Any, provider: () -> T): T { + return CachedValuesManager.getManager(this).cache(this, dependencies, classForKey, provider) +} + +fun Project.cacheByClassInvalidatingOnRootModifications(classForKey: Class<*>, provider: () -> T): T { + return cacheByClass(classForKey, ProjectRootModificationTracker.getInstance(this), provider = provider) +} + +/** + * Note that it uses lambda's class for caching (essentially, anonymous class), which means that all invocations will be cached + * by the one and the same key. + * It is encouraged to use explicit class, just for the sake of readability. + */ +fun Project.cacheInvalidatingOnRootModifications(provider: () -> T): T { + return cacheByClassInvalidatingOnRootModifications(provider::class.java, provider) +} + +private fun CachedValuesManager.cache( + holder: UserDataHolder, + dependencies: Array, + classForKey: Class<*>, + provider: () -> T +): T { + return getCachedValue( + holder, + getKeyForClass(classForKey), + { CachedValueProvider.Result.create(provider(), dependencies) }, + false + ) +} + diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt similarity index 100% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt rename to idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 similarity index 100% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 rename to idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListener.kt.201 diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListenerCompat.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListenerCompat.kt similarity index 99% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListenerCompat.kt rename to idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListenerCompat.kt index bf2429cd740..cae3ce5b597 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListenerCompat.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinCodeBlockModificationListenerCompat.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinIDEModificationTrackerService.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinIDEModificationTrackerService.kt similarity index 83% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinIDEModificationTrackerService.kt rename to idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinIDEModificationTrackerService.kt index 6f392a217ea..4673e32cfb8 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinIDEModificationTrackerService.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinIDEModificationTrackerService.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ @@ -11,9 +11,7 @@ import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService import org.jetbrains.kotlin.psi.KtFile -class KotlinIDEModificationTrackerService(project: Project) : - KotlinModificationTrackerService() { - +class KotlinIDEModificationTrackerService(project: Project) : KotlinModificationTrackerService() { override val modificationTracker: ModificationTracker = PsiModificationTracker.SERVICE.getInstance(project) override val outOfBlockModificationTracker: ModificationTracker = diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinModuleOutOfCodeBlockModificationTracker.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinModuleOutOfCodeBlockModificationTracker.kt similarity index 98% rename from idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinModuleOutOfCodeBlockModificationTracker.kt rename to idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinModuleOutOfCodeBlockModificationTracker.kt index 59d5480b491..44d4b6e0e21 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinModuleOutOfCodeBlockModificationTracker.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/KotlinModuleOutOfCodeBlockModificationTracker.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * 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. */ diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/psiModificationTrackerCompat.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/caches/trackers/psiModificationTrackerCompat.kt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt index 39cc4c7ab6e..66d7d31a863 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt @@ -28,10 +28,11 @@ abstract class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSim if (extension.isReferenceTo(this, element)) return true } - return super.isReferenceTo(element) + return isReferenceToWithoutExtensionChecking(element) } protected abstract fun doCanBeReferenceTo(candidateTarget: PsiElement): Boolean + protected abstract fun isReferenceToWithoutExtensionChecking(candidateTarget: PsiElement): Boolean override fun getRangeInElement(): TextRange { val element = element.getReferencedNameElement()