diff options
author | Jinseong Jeon <jsjeon@google.com> | 2022-02-24 23:33:16 -0800 |
---|---|---|
committer | Jiaxiang Chen <roaringacw@gmail.com> | 2022-03-10 15:09:18 -0800 |
commit | decab20f1698020abedae7a142263e3261cfdbb3 (patch) | |
tree | 5b2ea52a34b0e10b8d16fa8850a0766a0275407f /kotlin-analysis-api | |
parent | b375b48ec423246706c4359f5b592e4179c0db53 (diff) | |
download | ksp-decab20f1698020abedae7a142263e3261cfdbb3.tar.gz |
Use Analysis API standalone mode entry points
Diffstat (limited to 'kotlin-analysis-api')
5 files changed, 46 insertions, 161 deletions
diff --git a/kotlin-analysis-api/build.gradle.kts b/kotlin-analysis-api/build.gradle.kts index ab6d725a..43ce47f4 100644 --- a/kotlin-analysis-api/build.gradle.kts +++ b/kotlin-analysis-api/build.gradle.kts @@ -2,7 +2,7 @@ description = "Kotlin Symbol Processing implementation using Kotlin Analysis API val intellijVersion: String by project val junitVersion: String by project -val analysisAPIVersion = "1.7.0-dev-961" +val analysisAPIVersion = "1.7.0-dev-1984" val libsForTesting by configurations.creating plugins { @@ -45,6 +45,12 @@ dependencies { implementation("org.jetbrains.kotlin:analysis-project-structure-for-ide:$analysisAPIVersion") { isTransitive = false } + implementation("org.jetbrains.kotlin:symbol-light-classes-for-ide:$analysisAPIVersion") { + isTransitive = false + } + implementation("org.jetbrains.kotlin:analysis-api-standalone-for-ide:$analysisAPIVersion") { + isTransitive = false + } implementation("org.jetbrains.kotlin:high-level-api-impl-base-for-ide:$analysisAPIVersion") { isTransitive = false } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/FirSealedClassInheritorsProcessorFactoryImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/FirSealedClassInheritorsProcessorFactoryImpl.kt deleted file mode 100644 index fa5dd3ea..00000000 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/FirSealedClassInheritorsProcessorFactoryImpl.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.google.devtools.ksp.impl - -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory -import org.jetbrains.kotlin.fir.declarations.FirRegularClass -import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider -import org.jetbrains.kotlin.name.ClassId - -class FirSealedClassInheritorsProcessorFactoryImpl: FirSealedClassInheritorsProcessorFactory() { - override fun createSealedClassInheritorsProvider(): SealedClassInheritorsProvider { - return SealedClassInheritorProviderImpl() - } -} - -class SealedClassInheritorProviderImpl: SealedClassInheritorsProvider() { - override fun getSealedClassInheritors(firClass: FirRegularClass): List<ClassId> { - return emptyList() - } - -} diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt index ac662f33..5c76d32d 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt @@ -3,99 +3,24 @@ package com.google.devtools.ksp.impl import com.intellij.mock.MockApplication import com.intellij.mock.MockProject import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer -import com.intellij.openapi.util.io.FileUtil -import com.intellij.openapi.util.text.StringUtilRt -import com.intellij.openapi.vfs.CharsetToolkit -import com.intellij.psi.impl.PsiFileFactoryImpl -import com.intellij.psi.search.GlobalSearchScope -import com.intellij.testFramework.LightVirtualFile -import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession -import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider +import com.intellij.openapi.vfs.StandardFileSystems +import com.intellij.openapi.vfs.impl.jar.CoreJarFileSystem +import com.intellij.psi.PsiManager +import org.jetbrains.kotlin.analysis.api.standalone.configureApplicationEnvironment +import org.jetbrains.kotlin.analysis.api.standalone.configureProjectEnvironment import org.jetbrains.kotlin.analysis.api.analyseWithReadAction -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSessionProvider -import org.jetbrains.kotlin.analysis.api.impl.base.references.HLApiReferenceProviderService import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.PackagePartProviderFactory -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.impl.KotlinStaticDeclarationProviderFactory -import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticModificationTrackerFactory -import org.jetbrains.kotlin.analysis.providers.impl.KotlinStaticPackageProviderFactory -import org.jetbrains.kotlin.analysis.providers.* import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.MessageCollector import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.idea.references.* -import org.jetbrains.kotlin.load.kotlin.PackagePartProvider -import org.jetbrains.kotlin.psi.KotlinReferenceProvidersService import org.jetbrains.kotlin.psi.KtFile import java.io.File - -@OptIn(InvalidWayOfUsingAnalysisSession::class) -fun registerComponents(project: MockProject, environment: KotlinCoreEnvironment, ktFiles: List<KtFile>) { - - project.picoContainer.registerComponentInstance( - KtAnalysisSessionProvider::class.qualifiedName, - KtFirAnalysisSessionProvider(project) - ) - - project.picoContainer.registerComponentInstance( - ProjectStructureProvider::class.qualifiedName, - ProjectStructureProviderImpl() - ) - - project.picoContainer.registerComponentInstance( - KotlinModificationTrackerFactory::class.qualifiedName, - KotlinStaticModificationTrackerFactory() - ) - - RegisterComponentService.registerFirIdeResolveStateService(project) - - project.picoContainer.registerComponentInstance( - KotlinDeclarationProviderFactory::class.qualifiedName, - KotlinStaticDeclarationProviderFactory(ktFiles) - ) - - project.picoContainer.registerComponentInstance( - KotlinPackageProviderFactory::class.qualifiedName, - KotlinStaticPackageProviderFactory(ktFiles) - ) - - project.picoContainer.registerComponentInstance( - FirSealedClassInheritorsProcessorFactory::class.qualifiedName, - FirSealedClassInheritorsProcessorFactoryImpl() - ) - project.picoContainer.registerComponentInstance( - PackagePartProviderFactory::class.qualifiedName, - object : PackagePartProviderFactory() { - override fun createPackagePartProviderForLibrary(scope: GlobalSearchScope): PackagePartProvider { - return environment.createPackagePartProvider(scope) - } - } - ) - - val application = ApplicationManager.getApplication() as MockApplication - KotlinCoreEnvironment.underApplicationLock { - application.registerService( - KotlinReferenceProvidersService::class.java, HLApiReferenceProviderService::class.java - ) - application.registerService( - KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java - ) - } - - project.picoContainer.registerComponentInstance( - KtModuleScopeProvider::class.qualifiedName, - KtModuleScopeProviderImpl() - ) - -} +import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoot fun findSomeReference(ktFile: KtFile): KtReference? { for (i in 1..300) { @@ -107,6 +32,18 @@ fun findSomeReference(ktFile: KtFile): KtReference? { return null } +private fun convertFilesToKtFiles(project: Project, files: List<File>): List<KtFile> { + val fs = StandardFileSystems.local() + val psiManager = PsiManager.getInstance(project) + val ktFiles = mutableListOf<KtFile>() + for (file in files) { + val vFile = fs.findFileByPath(file.absolutePath) ?: continue + val ktFile = psiManager.findFile(vFile) as? KtFile ?: continue + ktFiles.add(ktFile) + } + return ktFiles +} + fun main() { val compilerConfiguration = CompilerConfiguration() compilerConfiguration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, MessageCollector.NONE) @@ -115,18 +52,27 @@ fun main() { EnvironmentConfigFiles.JVM_CONFIG_FILES ) - val project = env.project as MockProject - val factory = PsiFileFactoryImpl(project) + val application = ApplicationManager.getApplication() as MockApplication + configureApplicationEnvironment(application) - val file = File("testData/api/hello.kt") - val text = FileUtil.loadFile(file, CharsetToolkit.UTF8, true).trim { it <= ' ' } + val file = File("testData/api/hello.kt").absoluteFile + compilerConfiguration.addJavaSourceRoot(file) - val virtualFile = LightVirtualFile("a.kt", KotlinLanguage.INSTANCE, StringUtilRt.convertLineSeparators(text)) - val ktFile = factory.trySetupPsiForFile(virtualFile, KotlinLanguage.INSTANCE, true, false) as KtFile - registerComponents(project, env, listOf(ktFile)) - analyseWithReadAction(ktFile) { - val fileSymbol = ktFile.getFileSymbol() - val members = fileSymbol.getFileScope().getAllSymbols() - members.filterIsInstance<KtFunctionSymbol>() + val project = env.project as MockProject + val ktFiles = convertFilesToKtFiles(project, listOf(file)) + configureProjectEnvironment( + project, + compilerConfiguration, + ktFiles, + env::createPackagePartProvider, + env.projectEnvironment.environment.jarFileSystem as CoreJarFileSystem + ) + + for (ktFile in ktFiles) { + analyseWithReadAction(ktFile) { + val fileSymbol = ktFile.getFileSymbol() + val members = fileSymbol.getFileScope().getAllSymbols() + members.filterIsInstance<KtFunctionSymbol>() + } } } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ProjectStructureProviderImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ProjectStructureProviderImpl.kt deleted file mode 100644 index ec302ba0..00000000 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ProjectStructureProviderImpl.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.google.devtools.ksp.impl - -import com.intellij.openapi.project.Project -import com.intellij.psi.PsiElement -import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.analysis.project.structure.KtModule -import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule -import org.jetbrains.kotlin.analysis.project.structure.ProjectStructureProvider -import org.jetbrains.kotlin.config.* -import org.jetbrains.kotlin.platform.TargetPlatform -import org.jetbrains.kotlin.platform.jvm.JdkPlatform -import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices -import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices - -class ProjectStructureProviderImpl : ProjectStructureProvider() { - override fun getKtModuleForKtElement(element: PsiElement): KtModule { - return object : KtSourceModule { - override val analyzerServices: PlatformDependentAnalyzerServices - get() = JvmPlatformAnalyzerServices - override val contentScope: GlobalSearchScope - get() = GlobalSearchScope.EMPTY_SCOPE - override val directFriendDependencies: List<KtModule> - get() = emptyList() - override val directRefinementDependencies: List<KtModule> - get() = emptyList() - override val directRegularDependencies: List<KtModule> - get() = emptyList() - override val languageVersionSettings: LanguageVersionSettings - get() = LanguageVersionSettingsImpl(LanguageVersion.LATEST_STABLE, ApiVersion.LATEST) - override val moduleName: String - get() = "main" - override val platform: TargetPlatform - get() = TargetPlatform(setOf(JdkPlatform(JvmTarget.DEFAULT))) - override val project: Project - get() = element.project - } - } -} diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/RegisterComponentService.java b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/RegisterComponentService.java deleted file mode 100644 index 54bfcbcb..00000000 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/RegisterComponentService.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.google.devtools.ksp.impl; - -import com.intellij.mock.MockProject; -import org.jetbrains.kotlin.analysis.low.level.api.fir.FirIdeResolveStateService; - -public class RegisterComponentService { - public static void registerFirIdeResolveStateService(MockProject project) { - project.getPicoContainer().registerComponentInstance(FirIdeResolveStateService.class.getName(), new FirIdeResolveStateService(project)); - } -} |