2b7dee6f8d
+ Fixed #KT-33584
41 lines
1.7 KiB
Kotlin
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)
|
|
}
|
|
} |