@@ -50,7 +50,6 @@ import com.intellij.openapi.roots.PackageIndex
50
50
import com.intellij.openapi.util.Disposer
51
51
import com.intellij.openapi.vfs.StandardFileSystems
52
52
import com.intellij.openapi.vfs.VirtualFile
53
- import com.intellij.openapi.vfs.VirtualFileManager
54
53
import com.intellij.psi.PsiFileSystemItem
55
54
import com.intellij.psi.PsiJavaFile
56
55
import com.intellij.psi.PsiManager
@@ -125,7 +124,6 @@ import org.jetbrains.kotlin.platform.konan.NativePlatforms
125
124
import org.jetbrains.kotlin.platform.wasm.WasmPlatforms
126
125
import org.jetbrains.kotlin.psi.KtFile
127
126
import java.io.File
128
- import java.nio.file.Files
129
127
import java.nio.file.Path
130
128
131
129
class KotlinSymbolProcessing (
@@ -356,11 +354,10 @@ class KotlinSymbolProcessing(
356
354
compilerConfiguration : CompilerConfiguration
357
355
): List <KSFile > {
358
356
val project = kotlinCoreProjectEnvironment.project
359
- val psiManager = PsiManager .getInstance(project)
360
357
val ktFiles = createSourceFilesFromSourceRoots(
361
358
compilerConfiguration, project, compilerConfiguration.kotlinSourceRoots
362
359
).toSet().toList()
363
- val psiFiles = getPsiFilesFromPaths<PsiFileSystemItem >(
360
+ val allJavaFiles = getPsiFilesFromPaths<PsiJavaFile >(
364
361
project,
365
362
getSourceFilePaths(compilerConfiguration, includeDirectoryRoot = true )
366
363
)
@@ -378,21 +375,47 @@ class KotlinSymbolProcessing(
378
375
).update(ktFiles)
379
376
380
377
// Update Java providers for newly generated source files.
381
- reinitJavaFileManager(kotlinCoreProjectEnvironment, modules, psiFiles)
382
-
383
- val localFileSystem = VirtualFileManager .getInstance().getFileSystem(StandardFileSystems .FILE_PROTOCOL )
384
- val javaFiles = if (kspConfig is KSPJvmConfig ) {
385
- val javaRoots = kspConfig.javaSourceRoots + kspConfig.javaOutputDir
386
- // Get non-symbolic paths first
387
- javaRoots.sortedBy { Files .isSymbolicLink(it.toPath()) }
388
- .flatMap { root -> root.walk().filter { it.isFile && it.extension == " java" }.toList() }
389
- // This time is for .java files
390
- .sortedBy { Files .isSymbolicLink(it.toPath()) }
391
- .distinctBy { it.canonicalPath }
392
- .mapNotNull { localFileSystem.findFileByPath(it.path)?.let { psiManager.findFile(it) } as ? PsiJavaFile }
393
- } else {
394
- emptyList()
395
- }
378
+ reinitJavaFileManager(kotlinCoreProjectEnvironment, modules, allJavaFiles)
379
+
380
+ return ktFiles.map { analyze { KSFileImpl .getCached(it.getFileSymbol()) } } +
381
+ allJavaFiles.map { KSFileJavaImpl .getCached(it) }
382
+ }
383
+
384
+ private fun prepareNewKSFiles (
385
+ kotlinCoreProjectEnvironment : KotlinCoreProjectEnvironment ,
386
+ modules : List <KtModule >,
387
+ compilerConfiguration : CompilerConfiguration ,
388
+ newKotlinFiles : List <File >,
389
+ newJavaFiles : List <File >,
390
+ ): List <KSFile > {
391
+ val project = kotlinCoreProjectEnvironment.project
392
+ val ktFiles = getPsiFilesFromPaths<KtFile >(
393
+ project,
394
+ newKotlinFiles.map { it.toPath() }.toSet()
395
+ )
396
+ val javaFiles = getPsiFilesFromPaths<PsiJavaFile >(
397
+ project,
398
+ newJavaFiles.map { it.toPath() }.toSet()
399
+ )
400
+ val allJavaFiles = getPsiFilesFromPaths<PsiJavaFile >(
401
+ project,
402
+ getSourceFilePaths(compilerConfiguration, includeDirectoryRoot = true )
403
+ )
404
+
405
+ // Update Kotlin providers for newly generated source files.
406
+ (
407
+ project.getService(
408
+ KotlinDeclarationProviderFactory ::class .java
409
+ ) as IncrementalKotlinDeclarationProviderFactory
410
+ ).update(ktFiles)
411
+ (
412
+ project.getService(
413
+ KotlinPackageProviderFactory ::class .java
414
+ ) as IncrementalKotlinPackageProviderFactory
415
+ ).update(ktFiles)
416
+
417
+ // Update Java providers for newly generated source files.
418
+ reinitJavaFileManager(kotlinCoreProjectEnvironment, modules, allJavaFiles)
396
419
397
420
return ktFiles.map { analyze { KSFileImpl .getCached(it.getFileSymbol()) } } +
398
421
javaFiles.map { KSFileJavaImpl .getCached(it) }
@@ -533,7 +556,7 @@ class KotlinSymbolProcessing(
533
556
}
534
557
535
558
// Drop caches
536
- KotlinGlobalModificationService .getInstance(project).publishGlobalModuleStateModification ()
559
+ KotlinGlobalModificationService .getInstance(project).publishGlobalSourceModuleStateModification ()
537
560
KtAnalysisSessionProvider .getInstance(project).clearCaches()
538
561
psiManager.dropResolveCaches()
539
562
psiManager.dropPsiCaches()
@@ -542,10 +565,26 @@ class KotlinSymbolProcessing(
542
565
543
566
val newFilePaths = codeGenerator.generatedFile.filter { it.extension == " kt" || it.extension == " java" }
544
567
.map { it.canonicalPath }.toSet()
545
- allDirtyKSFiles = prepareAllKSFiles(kotlinCoreProjectEnvironment, modules, compilerConfiguration).filter {
546
- it.filePath !in allCleanFilePaths
547
- }
548
- newKSFiles = allDirtyKSFiles.filter { it.filePath in newFilePaths }
568
+ newKSFiles = prepareNewKSFiles(
569
+ kotlinCoreProjectEnvironment,
570
+ modules,
571
+ compilerConfiguration,
572
+ newFilePaths.filter { it.endsWith(" .kt" ) }.map { File (it) }.toList(),
573
+ newFilePaths.filter { it.endsWith(" .java" ) }.map { File (it) }.toList(),
574
+ )
575
+ // Now that caches are dropped, KtSymbols and KS* are invalid. They need to be re-created from PSI.
576
+ allDirtyKSFiles = allDirtyKSFiles.map {
577
+ when (it) {
578
+ is KSFileImpl -> {
579
+ val ktFile = it.ktFileSymbol.psi!! as KtFile
580
+ analyze { KSFileImpl .getCached(ktFile.getFileSymbol()) }
581
+ }
582
+ is KSFileJavaImpl -> {
583
+ KSFileJavaImpl .getCached(it.psi)
584
+ }
585
+ else -> throw IllegalArgumentException (" Unknown KSFile implementation: $it " )
586
+ }
587
+ } + newKSFiles
549
588
incrementalContext.registerGeneratedFiles(newKSFiles)
550
589
codeGenerator.closeFiles()
551
590
}
@@ -612,7 +651,7 @@ class DirectoriesScope(
612
651
private fun reinitJavaFileManager (
613
652
environment : KotlinCoreProjectEnvironment ,
614
653
modules : List <KtModule >,
615
- sourceFiles : List <PsiFileSystemItem >,
654
+ sourceFiles : List <PsiJavaFile >,
616
655
) {
617
656
val project = environment.project
618
657
val javaFileManager = project.getService(JavaFileManager ::class .java) as KotlinCliJavaFileManagerImpl
0 commit comments