@@ -23,6 +23,7 @@ import cn.enaium.jimmer.buddy.extensions.wizard.JimmerProjectModel
23
23
import cn.enaium.jimmer.buddy.service.NavigationService
24
24
import cn.enaium.jimmer.buddy.service.PsiService
25
25
import cn.enaium.jimmer.buddy.service.UiService
26
+ import cn.enaium.jimmer.buddy.storage.JimmerBuddySetting
26
27
import cn.enaium.jimmer.buddy.utility.*
27
28
import com.google.devtools.ksp.getClassDeclarationByName
28
29
import com.intellij.compiler.CompilerConfiguration
@@ -101,7 +102,7 @@ object JimmerBuddy {
101
102
102
103
const val INFO_GROUP_ID = " JimmerBuddy.NotificationGroup"
103
104
104
- val DEQ = DelayedExecutionQueue (2000 )
105
+ val DEQ = DelayedExecutionQueue (JimmerBuddySetting . INSTANCE .state.autoGenerateDelay )
105
106
106
107
object Services {
107
108
val PSI : PsiService = ServiceLoader .load(PsiService ::class .java, JimmerBuddy ::class .java.classLoader).first()
@@ -199,57 +200,69 @@ object JimmerBuddy {
199
200
200
201
val javaImmutablePsiClassCache = CopyOnWriteArraySet <PsiClass >()
201
202
202
- val kotlinImmutableKtClassCache = CopyOnWriteArraySet <KtClass >()
203
-
204
203
var init = false
205
204
var initialized = false
206
205
207
- fun init () {
206
+ fun init (enable : Boolean = true ) {
208
207
if (init ) return
209
208
init = true
210
209
project.runWhenSmart {
211
210
val projects = findProjects(project.guessProjectDir()?.toNioPath()!! )
212
211
CoroutineScope (Dispatchers .IO ).launch {
213
212
log.info(" Project ${project.name} is initializing" )
214
213
if (project.isJavaProject()) {
215
- sourcesProcessJava(
216
- GenerateProject .generate(
217
- projects,
218
- setOf (" main" , " test" ),
219
- GenerateProject .SourceRootType .JAVA
220
- )
214
+ val generateProject = GenerateProject .generate(
215
+ projects,
216
+ setOf (" main" , " test" ),
217
+ GenerateProject .SourceRootType .JAVA
221
218
)
222
- dtoProcessJava(
223
- GenerateProject .generate(
224
- projects,
225
- setOf (" main" , " test" ),
226
- GenerateProject .SourceRootType .DTO
219
+ project.runReadActionSmart {
220
+ generateProject.forEach {
221
+ it.sourceFiles.forEach { sourceFile ->
222
+ val psiFile =
223
+ sourceFile.toFile().toVirtualFile()?.findPsiFile(project) ? : return @forEach
224
+ psiFile.getChildOfType<PsiClass >()?.takeIf { it.hasJimmerAnnotation() }?.also {
225
+ javaImmutablePsiClassCache.add(it)
226
+ }
227
+ }
228
+ }
229
+ }
230
+ if (enable) {
231
+ sourcesProcessJava(generateProject)
232
+ dtoProcessJava(
233
+ GenerateProject .generate(
234
+ projects,
235
+ setOf (" main" , " test" ),
236
+ GenerateProject .SourceRootType .DTO
237
+ )
227
238
)
228
- )
239
+ }
229
240
} else if (project.isKotlinProject()) {
230
- sourcesProcessKotlin(
231
- GenerateProject .generate(
232
- projects,
233
- setOf (" main" , " test" ),
234
- listOf (GenerateProject .SourceRootType .KOTLIN ) +
235
- if (project.isAndroidProject()) {
236
- listOf (
237
- GenerateProject .SourceRootType .JAVA_KOTLIN ,
238
- GenerateProject .SourceRootType .JVM_MAIN_KOTLIN ,
239
- GenerateProject .SourceRootType .ANDROID_MAIN_KOTLIN
240
- )
241
- } else {
242
- emptyList()
243
- }
241
+ if (enable) {
242
+ sourcesProcessKotlin(
243
+ GenerateProject .generate(
244
+ projects,
245
+ setOf (" main" , " test" ),
246
+ listOf (GenerateProject .SourceRootType .KOTLIN ) +
247
+ if (project.isAndroidProject()) {
248
+ listOf (
249
+ GenerateProject .SourceRootType .JAVA_KOTLIN ,
250
+ GenerateProject .SourceRootType .JVM_MAIN_KOTLIN ,
251
+ GenerateProject .SourceRootType .ANDROID_MAIN_KOTLIN
252
+ )
253
+ } else {
254
+ emptyList()
255
+ }
256
+ )
244
257
)
245
- )
246
- dtoProcessKotlin (
247
- GenerateProject .generate(
248
- projects ,
249
- setOf ( " main " , " test " ),
250
- GenerateProject . SourceRootType . DTO
258
+ dtoProcessKotlin(
259
+ GenerateProject .generate (
260
+ projects,
261
+ setOf ( " main " , " test " ) ,
262
+ GenerateProject . SourceRootType . DTO
263
+ )
251
264
)
252
- )
265
+ }
253
266
}
254
267
log.info(" Project ${project.name} is initialized" )
255
268
initialized = true
@@ -264,7 +277,6 @@ object JimmerBuddy {
264
277
265
278
fun reset () {
266
279
javaImmutablePsiClassCache.clear()
267
- kotlinImmutableKtClassCache.clear()
268
280
init = false
269
281
}
270
282
@@ -364,14 +376,14 @@ object JimmerBuddy {
364
376
365
377
val generatedDir = getGeneratedDir(project, projectDir, src) ? : return @runReadActionSmart
366
378
367
- val (pe, rootElements, sources) = project.psiClassesToApt(psiCaches, javaImmutablePsiClassCache)
379
+ val (pe, rootElements, sources) = project.psiClassesToApt(javaImmutablePsiClassCache)
368
380
val currentModule = project.modules.find { it.name.endsWith(" .$src " ) }
369
381
val aptOptions = currentModule?.let { module ->
370
382
CompilerConfiguration .getInstance(project)
371
383
.getAnnotationProcessingConfiguration(module).processorOptions
372
384
} ? : emptyMap()
373
385
374
- log.info(" SourcesProcessJava Project:${projectDir.name} :${src} PsiCaches: ${javaImmutablePsiClassCache.size} APTOptions:${aptOptions} " )
386
+ log.info(" SourcesProcessJava Project:${projectDir.name} :${src} APTOptions:${aptOptions} " )
375
387
376
388
val option = createAptOption(
377
389
aptOptions,
@@ -414,18 +426,14 @@ object JimmerBuddy {
414
426
log.error(e)
415
427
}
416
428
}
417
- javaImmutablePsiClassCache.addAll(psiCaches)
418
429
}
419
430
asyncRefreshSources(needRefresh)
420
431
}
421
432
422
433
suspend fun dtoProcessJava (projects : Set <GenerateProject >) {
423
434
val needRefresh = mutableListOf<Pair <Source , Path >>()
424
435
project.runReadActionSmart {
425
- val (pe, rootElements, sources) = project.psiClassesToApt(
426
- CopyOnWriteArraySet (),
427
- javaImmutablePsiClassCache
428
- )
436
+ val (pe, rootElements, sources) = project.psiClassesToApt(emptySet())
429
437
projects.forEach { (projectDir, sourceFiles, src) ->
430
438
sourceFiles.forEach { sourceFile ->
431
439
val currentModule = project.modules.find { it.name.endsWith(" .$src " ) }
@@ -483,25 +491,18 @@ object JimmerBuddy {
483
491
val needRefresh = mutableListOf<Pair <Source , Path >>()
484
492
projects.forEach { (projectDir, sourceFiles, src) ->
485
493
sourceFiles.isEmpty() && return @forEach
486
- val ktClassCaches = CopyOnWriteArraySet <KtClass >()
487
494
project.runReadActionSmart {
488
- sourceFiles.forEach { sourceFile ->
489
- val psiFile = sourceFile.toFile().toPsiFile(project) ? : return @forEach
490
- psiFile.getChildOfType<KtClass >()?.takeIf { it.hasJimmerAnnotation() }?.also {
491
- ktClassCaches.add(it)
492
- }
493
- }
494
-
495
495
val generatedDir = getGeneratedDir(project, projectDir, src) ? : return @runReadActionSmart
496
-
497
- val (resolver, environment, sources) = project.ktClassToKsp(
498
- ktClassCaches,
499
- kotlinImmutableKtClassCache
496
+ val (resolver, environment, sources) = project.ktClassesToKsp(
497
+ sourceFiles.mapNotNull { sourceFile ->
498
+ sourceFile.toFile().toPsiFile(project)?.getChildOfType<KtClass >()
499
+ ?.takeIf { it.hasJimmerAnnotation() }
500
+ }.toSet()
500
501
)
501
502
try {
502
503
val kspOptions = getKspOptions(project)
503
504
504
- log.info(" SourcesProcessKotlin Project:${projectDir.name} :${src} KtClassCaches: ${kotlinImmutableKtClassCache.size} KSPOptions:${kspOptions} " )
505
+ log.info(" SourcesProcessKotlin Project:${projectDir.name} :${src} KSPOptions:${kspOptions} " )
505
506
506
507
val option = createKspOption(
507
508
kspOptions,
@@ -522,18 +523,14 @@ object JimmerBuddy {
522
523
log.error(e)
523
524
}
524
525
}
525
- kotlinImmutableKtClassCache.addAll(ktClassCaches)
526
526
}
527
527
asyncRefreshSources(needRefresh)
528
528
}
529
529
530
530
suspend fun dtoProcessKotlin (projects : Set <GenerateProject >) {
531
531
val needRefresh = mutableListOf<Pair <Source , Path >>()
532
532
project.runReadActionSmart {
533
- val (resolver, environment, sources) = project.ktClassToKsp(
534
- CopyOnWriteArraySet (),
535
- kotlinImmutableKtClassCache
536
- )
533
+ val (resolver, environment, sources) = project.ktClassesToKsp(emptySet())
537
534
projects.forEach { (projectDir, sourceFiles, src) ->
538
535
sourceFiles.isEmpty() && return @forEach
539
536
0 commit comments