FIR: Add KotlinAnnotationsResolver service
This commit is contained in:
+54
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright 2010-2021 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.analysis.providers
|
||||
|
||||
import com.intellij.openapi.components.ServiceManager
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtAnnotated
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
|
||||
/**
|
||||
* A service to match declarations with their annotations and vice versa.
|
||||
*
|
||||
* N.B. This service can produce both false positives and false negatives from time to time, since it might not be allowed to use
|
||||
* full-blown resolve to understand the true FqName of used annotation.
|
||||
*
|
||||
* The next statement should be `true` for any `annotation`:
|
||||
* ```
|
||||
* declarationsByAnnotation(annotation).all { declaration ->
|
||||
* annotation in annotationsOnDeclaration(declaration)
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
public interface KotlinAnnotationsResolver {
|
||||
/**
|
||||
* @param queriedAnnotation A qualified name of the annotation in question.
|
||||
* @return A set of PSI declarations which have [queriedAnnotation] declared directly on them.
|
||||
* Might contain both false positives and false negatives.
|
||||
*/
|
||||
public fun declarationsByAnnotation(queriedAnnotation: ClassId): Set<KtAnnotated>
|
||||
|
||||
/**
|
||||
* @param declaration A [org.jetbrains.kotlin.psi.KtDeclaration] or [org.jetbrains.kotlin.psi.KtFile] to resolve annotations on. Other
|
||||
* [KtElement]s are not supported.
|
||||
* @return A set of annotations declared directly on the [declaration]. Might contain both false positives and false negatives.
|
||||
*/
|
||||
public fun annotationsOnDeclaration(declaration: KtAnnotated): Set<ClassId>
|
||||
}
|
||||
|
||||
public interface KotlinAnnotationsResolverFactory {
|
||||
/**
|
||||
* @param searchScope A scope in which the created [KotlinAnnotationsResolver] will operate. Make sure that this scope contains all
|
||||
* the annotations that you might want to resolve.
|
||||
*/
|
||||
public fun createAnnotationResolver(searchScope: GlobalSearchScope): KotlinAnnotationsResolver
|
||||
}
|
||||
|
||||
public fun Project.createAnnotationResolver(searchScope: GlobalSearchScope): KotlinAnnotationsResolver =
|
||||
ServiceManager.getService(this, KotlinAnnotationsResolverFactory::class.java)
|
||||
.createAnnotationResolver(searchScope)
|
||||
Reference in New Issue
Block a user