Create project service with Kotlin trackers (KT-32364)

This commit is contained in:
Nikolay Krasko
2019-05-31 19:27:55 +03:00
parent 263d8eea16
commit 4f678c8289
7 changed files with 67 additions and 10 deletions
@@ -20,7 +20,6 @@ import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ModificationTracker
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.PsiModificationTracker
import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -264,7 +263,7 @@ class ResolverForProjectImpl<M : ModuleInfo>(
moduleInfoByDescriptor[moduleDescriptor] = module
setupModuleDescriptor(module, moduleDescriptor)
val modificationTracker = (module as? TrackableModuleInfo)?.createModificationTracker() ?: if (invalidateOnOOCB) {
PsiModificationTracker.SERVICE.getInstance(projectContext.project).outOfCodeBlockModificationTracker
KotlinModificationTrackerService.getInstance(projectContext.project).outOfBlockModificationTracker
} else {
null
}
@@ -0,0 +1,24 @@
/*
* Copyright 2010-2019 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.analyzer
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ModificationTracker
open class KotlinModificationTrackerService {
open val modificationTracker: ModificationTracker = ModificationTracker.NEVER_CHANGED
open val outOfBlockModificationTracker: ModificationTracker = ModificationTracker.NEVER_CHANGED
companion object {
private val NEVER_CHANGE_TRACKER_SERVICE = KotlinModificationTrackerService()
@JvmStatic
fun getInstance(project: Project): KotlinModificationTrackerService {
return ServiceManager.getService(project, KotlinModificationTrackerService::class.java) ?: NEVER_CHANGE_TRACKER_SERVICE
}
}
}
@@ -21,8 +21,8 @@ import com.intellij.psi.PsiFile
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.PsiModificationTracker
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
import org.jetbrains.kotlin.asJava.classes.getOutermostClassOrObject
@@ -58,7 +58,11 @@ class LightClassDataProviderForClassOrObject(
override fun compute(): CachedValueProvider.Result<LightClassDataHolder.ForClass>? {
return CachedValueProvider.Result.create(
computeLightClassData(),
if (classOrObject.isLocal()) PsiModificationTracker.MODIFICATION_COUNT else PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
if (classOrObject.isLocal()) {
KotlinModificationTrackerService.getInstance(classOrObject.project).modificationTracker
} else {
KotlinModificationTrackerService.getInstance(classOrObject.project).outOfBlockModificationTracker
}
)
}
@@ -99,7 +103,7 @@ sealed class LightClassDataProviderForFileFacade constructor(
return CachedValueProvider.Result.create(
computeLightClassData(files),
PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
KotlinModificationTrackerService.getInstance(project).outOfBlockModificationTracker
)
}
@@ -147,7 +151,10 @@ class LightClassDataProviderForScript(private val script: KtScript) : CachedValu
}
override fun compute(): CachedValueProvider.Result<LightClassDataHolder.ForScript>? =
CachedValueProvider.Result.create(computeLightClassData(), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT)
CachedValueProvider.Result.create(
computeLightClassData(),
KotlinModificationTrackerService.getInstance(script.project).outOfBlockModificationTracker
)
override fun toString(): String = this::class.java.name + " for ${script.fqName}"
}
@@ -11,8 +11,8 @@ import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.CachedValue
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.KotlinModificationTrackerService
import org.jetbrains.kotlin.name.FqName
private data class FacadeCacheKey(val fqName: FqName, val searchScope: GlobalSearchScope)
@@ -34,7 +34,12 @@ class FacadeCache(private val project: Project) {
}
private val cachedValue: CachedValue<FacadeCacheData> = CachedValuesManager.getManager(project).createCachedValue(
{ CachedValueProvider.Result.create(FacadeCacheData(), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT) }, false
{
CachedValueProvider.Result.create(
FacadeCacheData(),
KotlinModificationTrackerService.getInstance(project).outOfBlockModificationTracker
)
}, false
)
operator fun get(qualifiedName: FqName, searchScope: GlobalSearchScope): KtLightClassForFacade? {
@@ -24,10 +24,10 @@ import com.intellij.psi.stubs.StubElement
import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
import com.intellij.psi.util.PsiUtilCore
import com.intellij.util.IncorrectOperationException
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
import org.jetbrains.kotlin.asJava.ImpreciseResolveResult
import org.jetbrains.kotlin.asJava.ImpreciseResolveResult.UNSURE
import org.jetbrains.kotlin.asJava.LightClassGenerationSupport
@@ -319,7 +319,7 @@ abstract class KtLightClassForSourceDeclaration(
CachedValueProvider.Result
.create(
createNoCache(classOrObject, KtUltraLightSupport.forceUsingOldLightClasses),
OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
KotlinModificationTrackerService.getInstance(classOrObject.project).outOfBlockModificationTracker
)
}
@@ -0,0 +1,19 @@
/*
* Copyright 2010-2019 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.caches.trackers
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ModificationTracker
import com.intellij.psi.util.PsiModificationTracker
import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService
class KotlinIDEModificationTrackerService(project: Project, psiModificationTracker: PsiModificationTracker) :
KotlinModificationTrackerService() {
override val modificationTracker: ModificationTracker = psiModificationTracker
override val outOfBlockModificationTracker: ModificationTracker =
KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker
}
@@ -248,6 +248,9 @@
<applicationService serviceInterface="org.jetbrains.kotlin.psi.KotlinDeclarationNavigationPolicy"
serviceImplementation="org.jetbrains.kotlin.idea.decompiler.navigation.KotlinDeclarationNavigationPolicyImpl"/>
<projectService serviceInterface="org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService"
serviceImplementation="org.jetbrains.kotlin.idea.caches.trackers.KotlinIDEModificationTrackerService"/>
<projectService serviceInterface="org.jetbrains.kotlin.caches.resolve.KotlinCacheService"
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.KotlinCacheServiceImpl"/>