Files
kotlin-fork/plugins/annotation-based-compiler-plugins-ide-support/src/CachedAnnotationNames.kt
T
2019-09-11 15:29:12 +03:00

41 lines
1.7 KiB
Kotlin

/*
* 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.annotation.plugin.ide
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleUtilCore
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootModificationTracker
import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.util.containers.ContainerUtil
import org.jetbrains.kotlin.psi.KtElement
import java.util.concurrent.ConcurrentMap
fun CachedAnnotationNames.getAnnotationNames(element: KtElement?): List<String> {
if (element === null) return emptyList()
val module = ModuleUtilCore.findModuleForPsiElement(element) ?: return emptyList()
return getNamesForModule(module)
}
class CachedAnnotationNames(project: Project, private val annotationOptionPrefix: String) {
private val cache: CachedValue<ConcurrentMap<Module, List<String>>> = cachedValue(project) {
CachedValueProvider.Result.create(
ContainerUtil.createConcurrentWeakMap<Module, List<String>>(),
ProjectRootModificationTracker.getInstance(project)
)
}
fun getNamesForModule(module: Module): List<String> {
return cache.value.getOrPut(module) { module.getSpecialAnnotations(annotationOptionPrefix) }
}
private fun <T> cachedValue(project: Project, result: () -> CachedValueProvider.Result<T>): CachedValue<T> {
return CachedValuesManager.getManager(project).createCachedValue(result, false)
}
}