AA: utilize file lookup utils (to reuse in facade)

This commit is contained in:
Jinseong Jeon
2022-05-31 14:32:27 -07:00
committed by Ilya Kirillov
parent 4cfefbd921
commit 72bf702309
2 changed files with 44 additions and 42 deletions
@@ -8,9 +8,7 @@ package org.jetbrains.kotlin.analysis.api.standalone
import com.intellij.mock.MockApplication
import com.intellij.mock.MockProject
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.PsiManager
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
import org.jetbrains.kotlin.analysis.api.session.KtAnalysisSessionProvider
@@ -23,11 +21,12 @@ 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.buildKtModuleProviderByCompilerConfiguration
import org.jetbrains.kotlin.analysis.project.structure.impl.getPsiFilesFromPaths
import org.jetbrains.kotlin.analysis.project.structure.impl.getSourceFilePaths
import org.jetbrains.kotlin.analysis.providers.*
import org.jetbrains.kotlin.analysis.providers.impl.*
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
import org.jetbrains.kotlin.cli.jvm.config.javaSourceRoots
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProviderImpl
@@ -38,8 +37,6 @@ import org.jetbrains.kotlin.light.classes.symbol.caches.SymbolLightClassFacadeCa
import org.jetbrains.kotlin.load.kotlin.PackagePartProvider
import org.jetbrains.kotlin.psi.KotlinReferenceProvidersService
import org.jetbrains.kotlin.psi.KtFile
import java.nio.file.Files
import java.nio.file.Paths
/**
* Configure Application environment for Analysis API standalone mode.
@@ -91,44 +88,10 @@ public fun configureProjectEnvironment(
compilerConfig: CompilerConfiguration,
packagePartProvider: (GlobalSearchScope) -> PackagePartProvider,
) {
val ktFiles = getKtFilesFromPaths(project, getSourceFilePaths(compilerConfig))
val ktFiles = getPsiFilesFromPaths<KtFile>(project, getSourceFilePaths(compilerConfig))
configureProjectEnvironment(project, compilerConfig, ktFiles, packagePartProvider)
}
private fun getSourceFilePaths(
compilerConfig: CompilerConfiguration,
): Set<String> {
return buildSet {
compilerConfig.javaSourceRoots.forEach { srcRoot ->
val path = Paths.get(srcRoot)
if (Files.isDirectory(path)) {
// E.g., project/app/src
Files.walk(path)
.filter(Files::isRegularFile)
.forEach { add(it.toString()) }
} else {
// E.g., project/app/src/some/pkg/main.kt
add(srcRoot)
}
}
}
}
private fun getKtFilesFromPaths(
project: Project,
paths: Collection<String>,
): List<KtFile> {
val fs = StandardFileSystems.local()
val psiManager = PsiManager.getInstance(project)
return buildList {
for (path in paths) {
val vFile = fs.findFileByPath(path) ?: continue
val ktFile = psiManager.findFile(vFile) as? KtFile ?: continue
add(ktFile)
}
}
}
internal fun configureProjectEnvironment(
project: MockProject,
compilerConfig: CompilerConfiguration,
@@ -5,9 +5,12 @@
package org.jetbrains.kotlin.analysis.project.structure.impl
import com.google.common.io.Files
import com.google.common.io.Files.getNameWithoutExtension
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.StandardFileSystems
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.ProjectScope
import com.intellij.util.io.URLUtil
@@ -19,6 +22,7 @@ import org.jetbrains.kotlin.analysis.project.structure.builder.buildKtSourceModu
import org.jetbrains.kotlin.analysis.project.structure.builder.buildProjectStructureProvider
import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.cli.jvm.config.javaSourceRoots
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots
import org.jetbrains.kotlin.config.CommonConfigurationKeys
@@ -36,6 +40,7 @@ import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
import org.jetbrains.kotlin.resolve.konan.platform.NativePlatformAnalyzerServices
import java.nio.file.Files
import java.nio.file.Paths
internal fun TargetPlatform.getAnalyzerServices(): PlatformDependentAnalyzerServices {
@@ -48,6 +53,40 @@ internal fun TargetPlatform.getAnalyzerServices(): PlatformDependentAnalyzerServ
}
}
internal fun getSourceFilePaths(
compilerConfig: CompilerConfiguration,
): Set<String> {
return buildSet {
compilerConfig.javaSourceRoots.forEach { srcRoot ->
val path = Paths.get(srcRoot)
if (Files.isDirectory(path)) {
// E.g., project/app/src
Files.walk(path)
.filter(java.nio.file.Files::isRegularFile)
.forEach { add(it.toString()) }
} else {
// E.g., project/app/src/some/pkg/main.kt
add(srcRoot)
}
}
}
}
internal inline fun <reified T : PsiFile> getPsiFilesFromPaths(
project: Project,
paths: Collection<String>,
): List<T> {
val fs = StandardFileSystems.local()
val psiManager = PsiManager.getInstance(project)
return buildList {
for (path in paths) {
val vFile = fs.findFileByPath(path) ?: continue
val psiFile = psiManager.findFile(vFile) as? T ?: continue
add(psiFile)
}
}
}
internal fun buildKtModuleProviderByCompilerConfiguration(
compilerConfig: CompilerConfiguration,
project: Project,
@@ -85,7 +124,7 @@ internal fun buildKtModuleProviderByCompilerConfiguration(
this.platform = platform
this.project = project
binaryRoots = listOf(root)
libraryName = Files.getNameWithoutExtension(root.toString())
libraryName = getNameWithoutExtension(root.toString())
isBuiltinsContainingStdlib =
libraryName.startsWith("kotlin-stdlib") &&
!libraryName.contains("common") && !libraryName.contains("jdk")