@@ -31,6 +31,7 @@ import com.google.devtools.ksp.impl.symbol.kotlin.KSFileJavaImpl
31
31
import com.google.devtools.ksp.impl.symbol.kotlin.Restorable
32
32
import com.google.devtools.ksp.impl.symbol.kotlin.analyze
33
33
import com.google.devtools.ksp.processing.*
34
+ import com.google.devtools.ksp.standalone.IncrementalJavaFileManager
34
35
import com.google.devtools.ksp.standalone.IncrementalKotlinDeclarationProviderFactory
35
36
import com.google.devtools.ksp.standalone.IncrementalKotlinPackageProviderFactory
36
37
import com.google.devtools.ksp.standalone.KspStandaloneDirectInheritorsProvider
@@ -40,13 +41,10 @@ import com.google.devtools.ksp.symbol.KSFile
40
41
import com.google.devtools.ksp.symbol.KSNode
41
42
import com.google.devtools.ksp.symbol.Origin
42
43
import com.intellij.core.CoreApplicationEnvironment
43
- import com.intellij.core.CorePackageIndex
44
- import com.intellij.ide.highlighter.JavaFileType
45
44
import com.intellij.mock.MockProject
46
45
import com.intellij.openapi.Disposable
47
46
import com.intellij.openapi.application.Application
48
47
import com.intellij.openapi.project.Project
49
- import com.intellij.openapi.roots.PackageIndex
50
48
import com.intellij.openapi.util.Disposer
51
49
import com.intellij.openapi.vfs.StandardFileSystems
52
50
import com.intellij.openapi.vfs.VirtualFile
@@ -55,10 +53,8 @@ import com.intellij.psi.PsiJavaFile
55
53
import com.intellij.psi.PsiManager
56
54
import com.intellij.psi.PsiTreeChangeAdapter
57
55
import com.intellij.psi.PsiTreeChangeListener
58
- import com.intellij.psi.impl.file.impl.JavaFileManager
59
56
import com.intellij.psi.search.DelegatingGlobalSearchScope
60
57
import com.intellij.psi.search.GlobalSearchScope
61
- import com.intellij.psi.search.ProjectScope
62
58
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
63
59
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeTokenProvider
64
60
import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionProvider
@@ -83,24 +79,15 @@ import org.jetbrains.kotlin.analysis.providers.impl.*
83
79
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot
84
80
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots
85
81
import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots
86
- import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCliJavaFileManagerImpl
87
82
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreApplicationEnvironmentMode
88
83
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreProjectEnvironment
89
- import org.jetbrains.kotlin.cli.jvm.compiler.computeDefaultRootModules
90
84
import org.jetbrains.kotlin.cli.jvm.compiler.createSourceFilesFromSourceRoots
91
- import org.jetbrains.kotlin.cli.jvm.compiler.getJavaModuleRoots
92
85
import org.jetbrains.kotlin.cli.jvm.compiler.setupIdeaStandaloneExecution
93
86
import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoot
94
87
import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoots
95
88
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
96
89
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
97
90
import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots
98
- import org.jetbrains.kotlin.cli.jvm.index.JavaRoot
99
- import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesDynamicCompoundIndex
100
- import org.jetbrains.kotlin.cli.jvm.index.JvmDependenciesIndexImpl
101
- import org.jetbrains.kotlin.cli.jvm.index.SingleJavaFileRootsIndex
102
- import org.jetbrains.kotlin.cli.jvm.modules.CliJavaModuleFinder
103
- import org.jetbrains.kotlin.cli.jvm.modules.JavaModuleGraph
104
91
import org.jetbrains.kotlin.config.ApiVersion
105
92
import org.jetbrains.kotlin.config.CommonConfigurationKeys
106
93
import org.jetbrains.kotlin.config.CompilerConfiguration
@@ -351,7 +338,8 @@ class KotlinSymbolProcessing(
351
338
private fun prepareAllKSFiles (
352
339
kotlinCoreProjectEnvironment : KotlinCoreProjectEnvironment ,
353
340
modules : List <KtModule >,
354
- compilerConfiguration : CompilerConfiguration
341
+ compilerConfiguration : CompilerConfiguration ,
342
+ javaFileManager : IncrementalJavaFileManager ,
355
343
): List <KSFile > {
356
344
val project = kotlinCoreProjectEnvironment.project
357
345
val ktFiles = createSourceFilesFromSourceRoots(
@@ -375,16 +363,15 @@ class KotlinSymbolProcessing(
375
363
).update(ktFiles)
376
364
377
365
// Update Java providers for newly generated source files.
378
- reinitJavaFileManager(kotlinCoreProjectEnvironment, modules, allJavaFiles)
366
+ javaFileManager.initialize( modules, allJavaFiles)
379
367
380
368
return ktFiles.map { analyze { KSFileImpl .getCached(it.getFileSymbol()) } } +
381
369
allJavaFiles.map { KSFileJavaImpl .getCached(it) }
382
370
}
383
371
384
372
private fun prepareNewKSFiles (
385
373
kotlinCoreProjectEnvironment : KotlinCoreProjectEnvironment ,
386
- modules : List <KtModule >,
387
- compilerConfiguration : CompilerConfiguration ,
374
+ javaFileManager : IncrementalJavaFileManager ,
388
375
newKotlinFiles : List <File >,
389
376
newJavaFiles : List <File >,
390
377
): List <KSFile > {
@@ -397,10 +384,6 @@ class KotlinSymbolProcessing(
397
384
project,
398
385
newJavaFiles.map { it.toPath() }.toSet()
399
386
)
400
- val allJavaFiles = getPsiFilesFromPaths<PsiJavaFile >(
401
- project,
402
- getSourceFilePaths(compilerConfiguration, includeDirectoryRoot = true )
403
- )
404
387
405
388
// Update Kotlin providers for newly generated source files.
406
389
(
@@ -415,7 +398,7 @@ class KotlinSymbolProcessing(
415
398
).update(ktFiles)
416
399
417
400
// Update Java providers for newly generated source files.
418
- reinitJavaFileManager(kotlinCoreProjectEnvironment, modules, allJavaFiles )
401
+ javaFileManager.add(javaFiles )
419
402
420
403
return ktFiles.map { analyze { KSFileImpl .getCached(it.getFileSymbol()) } } +
421
404
javaFiles.map { KSFileJavaImpl .getCached(it) }
@@ -470,7 +453,9 @@ class KotlinSymbolProcessing(
470
453
ResolverAAImpl .ktModule = modules.single() as KtSourceModule
471
454
472
455
// Initializing environments
473
- val allKSFiles = prepareAllKSFiles(kotlinCoreProjectEnvironment, modules, compilerConfiguration)
456
+ val javaFileManager = IncrementalJavaFileManager (kotlinCoreProjectEnvironment)
457
+ val allKSFiles =
458
+ prepareAllKSFiles(kotlinCoreProjectEnvironment, modules, compilerConfiguration, javaFileManager)
474
459
val anyChangesWildcard = AnyChanges (kspConfig.projectBaseDir)
475
460
val codeGenerator = CodeGeneratorImpl (
476
461
kspConfig.classOutputDir,
@@ -499,7 +484,6 @@ class KotlinSymbolProcessing(
499
484
var allDirtyKSFiles = incrementalContext.calcDirtyFiles(allKSFiles).toList()
500
485
var newKSFiles = allDirtyKSFiles
501
486
val initialDirtySet = allDirtyKSFiles.toSet()
502
- val allCleanFilePaths = allKSFiles.filterNot { it in initialDirtySet }.map { it.filePath }.toSet()
503
487
504
488
val targetPlatform = ResolverAAImpl .ktModule.platform
505
489
val symbolProcessorEnvironment = SymbolProcessorEnvironment (
@@ -567,8 +551,7 @@ class KotlinSymbolProcessing(
567
551
.map { it.canonicalPath }.toSet()
568
552
newKSFiles = prepareNewKSFiles(
569
553
kotlinCoreProjectEnvironment,
570
- modules,
571
- compilerConfiguration,
554
+ javaFileManager,
572
555
newFilePaths.filter { it.endsWith(" .kt" ) }.map { File (it) }.toList(),
573
556
newFilePaths.filter { it.endsWith(" .java" ) }.map { File (it) }.toList(),
574
557
)
@@ -648,78 +631,6 @@ class DirectoriesScope(
648
631
override fun toString () = " All files under: $directories "
649
632
}
650
633
651
- private fun reinitJavaFileManager (
652
- environment : KotlinCoreProjectEnvironment ,
653
- modules : List <KtModule >,
654
- sourceFiles : List <PsiJavaFile >,
655
- ) {
656
- val project = environment.project
657
- val javaFileManager = project.getService(JavaFileManager ::class .java) as KotlinCliJavaFileManagerImpl
658
- val javaModuleFinder = CliJavaModuleFinder (null , null , javaFileManager, project, null )
659
- val javaModuleGraph = JavaModuleGraph (javaModuleFinder)
660
- val allSourceFileRoots = sourceFiles.map { JavaRoot (it.virtualFile, JavaRoot .RootType .SOURCE ) }
661
- val jdkRoots = getDefaultJdkModuleRoots(javaModuleFinder, javaModuleGraph)
662
- val libraryRoots = StandaloneProjectFactory .getAllBinaryRoots(modules, environment)
663
-
664
- val rootsWithSingleJavaFileRoots = buildList {
665
- addAll(libraryRoots)
666
- addAll(allSourceFileRoots)
667
- addAll(jdkRoots)
668
- }
669
-
670
- val (roots, singleJavaFileRoots) = rootsWithSingleJavaFileRoots.partition { (file) ->
671
- file.isDirectory || file.extension != JavaFileType .DEFAULT_EXTENSION
672
- }
673
-
674
- val corePackageIndex = project.getService(PackageIndex ::class .java) as CorePackageIndex
675
- val rootsIndex = JvmDependenciesDynamicCompoundIndex ().apply {
676
- addIndex(JvmDependenciesIndexImpl (roots))
677
- indexedRoots.forEach { javaRoot ->
678
- if (javaRoot.file.isDirectory) {
679
- if (javaRoot.type == JavaRoot .RootType .SOURCE ) {
680
- // NB: [JavaCoreProjectEnvironment#addSourcesToClasspath] calls:
681
- // 1) [CoreJavaFileManager#addToClasspath], which is used to look up Java roots;
682
- // 2) [CorePackageIndex#addToClasspath], which populates [PackageIndex]; and
683
- // 3) [FileIndexFacade#addLibraryRoot], which conflicts with this SOURCE root when generating a library scope.
684
- // Thus, here we manually call first two, which are used to:
685
- // 1) create [PsiPackage] as a package resolution result; and
686
- // 2) find directories by package name.
687
- // With both supports, annotations defined in package-info.java can be properly propagated.
688
- javaFileManager.addToClasspath(javaRoot.file)
689
- corePackageIndex.addToClasspath(javaRoot.file)
690
- } else {
691
- environment.addSourcesToClasspath(javaRoot.file)
692
- }
693
- }
694
- }
695
- }
696
-
697
- javaFileManager.initialize(
698
- rootsIndex,
699
- listOf (
700
- StandaloneProjectFactory .createPackagePartsProvider(
701
- libraryRoots + jdkRoots,
702
- LanguageVersionSettingsImpl (LanguageVersion .LATEST_STABLE , ApiVersion .LATEST )
703
- ).invoke(ProjectScope .getLibrariesScope(project))
704
- ),
705
- SingleJavaFileRootsIndex (singleJavaFileRoots),
706
- true
707
- )
708
- }
709
-
710
- private fun getDefaultJdkModuleRoots (
711
- javaModuleFinder : CliJavaModuleFinder ,
712
- javaModuleGraph : JavaModuleGraph
713
- ): List <JavaRoot > {
714
- // In contrast to `ClasspathRootsResolver.addModularRoots`, we do not need to handle automatic Java modules because JDK modules
715
- // aren't automatic.
716
- return javaModuleGraph.getAllDependencies(javaModuleFinder.computeDefaultRootModules()).flatMap { moduleName ->
717
- val module = javaModuleFinder.findModule(moduleName) ? : return @flatMap emptyList<JavaRoot >()
718
- val result = module.getJavaModuleRoots()
719
- result
720
- }
721
- }
722
-
723
634
fun String?.toKotlinVersion (): KotlinVersion {
724
635
if (this == null )
725
636
return KotlinVersion .CURRENT
0 commit comments