aboutsummaryrefslogtreecommitdiff
path: root/kotlin-analysis-api
diff options
context:
space:
mode:
authorJinseong Jeon <jsjeon@google.com>2022-02-24 23:33:16 -0800
committerJiaxiang Chen <roaringacw@gmail.com>2022-03-10 15:09:18 -0800
commitdecab20f1698020abedae7a142263e3261cfdbb3 (patch)
tree5b2ea52a34b0e10b8d16fa8850a0766a0275407f /kotlin-analysis-api
parentb375b48ec423246706c4359f5b592e4179c0db53 (diff)
downloadksp-decab20f1698020abedae7a142263e3261cfdbb3.tar.gz
Use Analysis API standalone mode entry points
Diffstat (limited to 'kotlin-analysis-api')
-rw-r--r--kotlin-analysis-api/build.gradle.kts8
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/FirSealedClassInheritorsProcessorFactoryImpl.kt19
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt132
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ProjectStructureProviderImpl.kt38
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/RegisterComponentService.java10
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));
- }
-}