diff --git a/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticAnnotationsResolver.kt b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticAnnotationsResolver.kt new file mode 100644 index 00000000000..d0d19c374ea --- /dev/null +++ b/analysis/analysis-api-providers/src/org/jetbrains/kotlin/analysis/providers/impl/KotlinStaticAnnotationsResolver.kt @@ -0,0 +1,65 @@ +/* + * Copyright 2010-2022 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.impl + +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.analysis.providers.KotlinAnnotationsResolver +import org.jetbrains.kotlin.analysis.providers.KotlinAnnotationsResolverFactory +import org.jetbrains.kotlin.name.ClassId +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.* + +/** + * This implementation works only for fully-qualified annotations usages, and does not check if they resolve somewhere. + * + * Required for the test infrastructure. + */ +private class KotlinStaticAnnotationsResolver( + ktFiles: Collection, + scope: GlobalSearchScope +) : KotlinAnnotationsResolver { + private val filesInScope = ktFiles.filter { scope.contains(it.virtualFile) } + + private val allDeclarations: List by lazy { + val result = mutableListOf() + + val visitor = declarationRecursiveVisitor visit@{ + val isLocal = when (it) { + is KtClassOrObject -> it.isLocal + is KtFunction -> it.isLocal + is KtProperty -> it.isLocal + else -> return@visit + } + + if (!isLocal) { + result += it + } + } + + filesInScope.forEach { it.accept(visitor) } + + result + } + + override fun declarationsByAnnotation(queriedAnnotation: ClassId): Set { + return allDeclarations.asSequence() + .filter { queriedAnnotation in annotationsOnDeclaration(it) } + .toSet() + } + + override fun annotationsOnDeclaration(declaration: KtAnnotated): Set { + return declaration.annotationEntries.asSequence() + .mapNotNull { it.typeReference?.text } + .map { ClassId.topLevel(FqName(it)) } + .toSet() + } +} + +public class KotlinStaticAnnotationsResolverFactory(private val files: Collection) : KotlinAnnotationsResolverFactory { + override fun createAnnotationResolver(searchScope: GlobalSearchScope): KotlinAnnotationsResolver { + return KotlinStaticAnnotationsResolver(files, searchScope) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeUtils.kt b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeUtils.kt index de9d33ace6c..e77f1c63654 100644 --- a/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeUtils.kt +++ b/analysis/analysis-api-standalone/src/org/jetbrains/kotlin/analysis/api/standalone/StandaloneModeUtils.kt @@ -21,9 +21,11 @@ import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProvider import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProviderImpl import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider import org.jetbrains.kotlin.analysis.project.structure.impl.ProjectStructureProviderByCompilerConfiguration +import org.jetbrains.kotlin.analysis.providers.KotlinAnnotationsResolverFactory import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProviderFactory import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory import org.jetbrains.kotlin.analysis.providers.KotlinPackageProviderFactory +import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticAnnotationsResolverFactory import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticDeclarationProviderFactory import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticModificationTrackerFactory import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticPackageProviderFactory @@ -104,6 +106,12 @@ public fun configureProjectEnvironment( KotlinModificationTrackerFactory::class.qualifiedName, KotlinStaticModificationTrackerFactory() ) + + project.registerService( + KotlinAnnotationsResolverFactory::class.java, + KotlinStaticAnnotationsResolverFactory(ktFiles) + ) + RegisterComponentService.registerLLFirResolveStateService(project) project.picoContainer.registerComponentInstance( FirSealedClassInheritorsProcessorFactory::class.qualifiedName, diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/testServices.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/testServices.kt index 7ca1d2f0521..c496da38a1c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/testServices.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/testServices.kt @@ -18,9 +18,11 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.PackagePartP import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProvider import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProviderImpl import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider +import org.jetbrains.kotlin.analysis.providers.KotlinAnnotationsResolverFactory import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProviderFactory import org.jetbrains.kotlin.analysis.providers.KotlinModificationTrackerFactory import org.jetbrains.kotlin.analysis.providers.KotlinPackageProviderFactory +import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticAnnotationsResolverFactory import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticDeclarationProviderFactory import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticModificationTrackerFactory import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticPackageProviderFactory @@ -52,6 +54,7 @@ fun MockProject.registerTestServices( KotlinModificationTrackerFactory::class.java, KotlinStaticModificationTrackerFactory::class.java ) + registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(allKtFiles)) registerService(KotlinDeclarationProviderFactory::class.java, KotlinStaticDeclarationProviderFactory(allKtFiles)) registerService(KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(allKtFiles)) registerService(ProjectStructureProvider::class.java, projectStructureProvider)