/* * 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 { 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>> = cachedValue(project) { CachedValueProvider.Result.create( ContainerUtil.createConcurrentWeakMap>(), ProjectRootModificationTracker.getInstance(project) ) } fun getNamesForModule(module: Module): List { return cache.value.getOrPut(module) { module.getSpecialAnnotations(annotationOptionPrefix) } } private fun cachedValue(project: Project, result: () -> CachedValueProvider.Result): CachedValue { return CachedValuesManager.getManager(project).createCachedValue(result, false) } }