FIR IDE: Add static implementation of KotlinAnnotationsResolver

This commit is contained in:
Roman Golyshev
2022-02-22 00:32:07 +03:00
parent f700b87f6c
commit 1a77643ad0
3 changed files with 76 additions and 0 deletions
@@ -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<KtFile>,
scope: GlobalSearchScope
) : KotlinAnnotationsResolver {
private val filesInScope = ktFiles.filter { scope.contains(it.virtualFile) }
private val allDeclarations: List<KtDeclaration> by lazy {
val result = mutableListOf<KtDeclaration>()
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<KtAnnotated> {
return allDeclarations.asSequence()
.filter { queriedAnnotation in annotationsOnDeclaration(it) }
.toSet()
}
override fun annotationsOnDeclaration(declaration: KtAnnotated): Set<ClassId> {
return declaration.annotationEntries.asSequence()
.mapNotNull { it.typeReference?.text }
.map { ClassId.topLevel(FqName(it)) }
.toSet()
}
}
public class KotlinStaticAnnotationsResolverFactory(private val files: Collection<KtFile>) : KotlinAnnotationsResolverFactory {
override fun createAnnotationResolver(searchScope: GlobalSearchScope): KotlinAnnotationsResolver {
return KotlinStaticAnnotationsResolver(files, searchScope)
}
}
@@ -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,
@@ -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)