From db89c3fc3f71ed56a25f11323ae84e93c63017fb Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Jul 2016 13:05:22 +0300 Subject: [PATCH] Refactoring: extract ResolutionFacadeImpl to separate file --- .../caches/resolve/ProjectResolutionFacade.kt | 62 +------------- .../caches/resolve/ResolutionFacadeImpl.kt | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+), 61 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeImpl.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt index c899a0c708c..428a8183eba 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt @@ -17,26 +17,16 @@ package org.jetbrains.kotlin.idea.caches.resolve import com.intellij.openapi.project.Project -import com.intellij.psi.PsiElement import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.containers.SLRUCache import org.jetbrains.kotlin.analyzer.AnalysisResult -import org.jetbrains.kotlin.container.get -import org.jetbrains.kotlin.container.getService import org.jetbrains.kotlin.context.GlobalContextImpl -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.idea.project.ResolveElementCache -import org.jetbrains.kotlin.idea.resolve.ResolutionFacade -import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.CompositeBindingContext -import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -import org.jetbrains.kotlin.resolve.lazy.ResolveSession internal class ProjectResolutionFacade( val debugString: String, @@ -93,54 +83,4 @@ internal class ProjectResolutionFacade( override fun toString(): String { return "$debugString@${Integer.toHexString(hashCode())}" } -} - -internal class ResolutionFacadeImpl( - private val projectFacade: ProjectResolutionFacade, - private val moduleInfo: IdeaModuleInfo -) : ResolutionFacade { - override val project: Project - get() = projectFacade.project - - //TODO: ideally we would like to store moduleDescriptor once and for all - // but there are some usages that use resolutionFacade and mutate the psi leading to recomputation of underlying structures - override val moduleDescriptor: ModuleDescriptor - get() = findModuleDescriptor(moduleInfo) - - fun findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo) = projectFacade.findModuleDescriptor(ideaModuleInfo) - - override fun analyze(element: KtElement, bodyResolveMode: BodyResolveMode): BindingContext { - val resolveElementCache = getFrontendService(element, ResolveElementCache::class.java) - return resolveElementCache.resolveToElement(element, bodyResolveMode) - } - - override fun analyzeFullyAndGetResult(elements: Collection): AnalysisResult - = projectFacade.getAnalysisResultsForElements(elements) - - override fun resolveToDescriptor(declaration: KtDeclaration): DeclarationDescriptor { - val resolveSession = projectFacade.resolverForModuleInfo(declaration.getModuleInfo()).componentProvider.get() - return resolveSession.resolveToDescriptor(declaration) - } - - override fun getFrontendService(serviceClass: Class): T = getFrontendService(moduleInfo, serviceClass) - - override fun getIdeService(serviceClass: Class): T { - return projectFacade.resolverForModuleInfo(moduleInfo).componentProvider.create(serviceClass) - } - - override fun getFrontendService(element: PsiElement, serviceClass: Class): T { - return getFrontendService(element.getModuleInfo(), serviceClass) - } - - fun getFrontendService(ideaModuleInfo: IdeaModuleInfo, serviceClass: Class): T { - return projectFacade.resolverForModuleInfo(ideaModuleInfo).componentProvider.getService(serviceClass) - } - - override fun getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class): T { - return projectFacade.resolverForDescriptor(moduleDescriptor).componentProvider.getService(serviceClass) - } -} - -fun ResolutionFacade.findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo): ModuleDescriptor? { - return (this as? ResolutionFacadeImpl)?.findModuleDescriptor(ideaModuleInfo) -} +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeImpl.kt new file mode 100644 index 00000000000..0a2a768b5a3 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ResolutionFacadeImpl.kt @@ -0,0 +1,82 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.idea.caches.resolve + +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analyzer.AnalysisResult +import org.jetbrains.kotlin.container.get +import org.jetbrains.kotlin.container.getService +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.project.ResolveElementCache +import org.jetbrains.kotlin.idea.resolve.ResolutionFacade +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode +import org.jetbrains.kotlin.resolve.lazy.ResolveSession + +internal class ResolutionFacadeImpl( + private val projectFacade: ProjectResolutionFacade, + private val moduleInfo: IdeaModuleInfo +) : ResolutionFacade { + override val project: Project + get() = projectFacade.project + + //TODO: ideally we would like to store moduleDescriptor once and for all + // but there are some usages that use resolutionFacade and mutate the psi leading to recomputation of underlying structures + override val moduleDescriptor: ModuleDescriptor + get() = findModuleDescriptor(moduleInfo) + + fun findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo) = projectFacade.findModuleDescriptor(ideaModuleInfo) + + override fun analyze(element: KtElement, bodyResolveMode: BodyResolveMode): BindingContext { + val resolveElementCache = getFrontendService(element, ResolveElementCache::class.java) + return resolveElementCache.resolveToElement(element, bodyResolveMode) + } + + override fun analyzeFullyAndGetResult(elements: Collection): AnalysisResult + = projectFacade.getAnalysisResultsForElements(elements) + + override fun resolveToDescriptor(declaration: KtDeclaration): DeclarationDescriptor { + val resolveSession = projectFacade.resolverForModuleInfo(declaration.getModuleInfo()).componentProvider.get() + return resolveSession.resolveToDescriptor(declaration) + } + + override fun getFrontendService(serviceClass: Class): T = getFrontendService(moduleInfo, serviceClass) + + override fun getIdeService(serviceClass: Class): T { + return projectFacade.resolverForModuleInfo(moduleInfo).componentProvider.create(serviceClass) + } + + override fun getFrontendService(element: PsiElement, serviceClass: Class): T { + return getFrontendService(element.getModuleInfo(), serviceClass) + } + + fun getFrontendService(ideaModuleInfo: IdeaModuleInfo, serviceClass: Class): T { + return projectFacade.resolverForModuleInfo(ideaModuleInfo).componentProvider.getService(serviceClass) + } + + override fun getFrontendService(moduleDescriptor: ModuleDescriptor, serviceClass: Class): T { + return projectFacade.resolverForDescriptor(moduleDescriptor).componentProvider.getService(serviceClass) + } +} + +fun ResolutionFacade.findModuleDescriptor(ideaModuleInfo: IdeaModuleInfo): ModuleDescriptor? { + return (this as? ResolutionFacadeImpl)?.findModuleDescriptor(ideaModuleInfo) +}