FIR IDE: Add static implementation of KotlinAnnotationsResolver
This commit is contained in:
+65
@@ -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)
|
||||
}
|
||||
}
|
||||
+8
@@ -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,
|
||||
|
||||
+3
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user