Skip to content

Commit 9a8aa30

Browse files
committed
refactor(vue): optimize component collection with async processing
Replace synchronous file processing with asynchronous task execution using `CompletableFuture` and `Task.Backgroundable` to improve performance and responsiveness during Vue component collection. Also, fix minor string formatting in component view output.
1 parent 6c98907 commit 9a8aa30

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

core/src/main/kotlin/cc/unitmesh/devti/bridge/archview/ComponentViewFunctionProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ class ComponentViewFunctionProvider : ToolchainFunctionProvider {
1919
): String {
2020
val uiComponents = ComponentViewProvider.collect(project)
2121
val components = uiComponents.joinToString("\n", transform = UiComponent::format)
22-
return "Here is current project components, ${uiComponents.size}:\n$components"
22+
return "Here is current project ${uiComponents.size} components, \n$components"
2323
}
2424
}

exts/ext-vue/src/233/main/kotlin/cc/unitmesh/vue/provider/bridge/VueComponentViewProvider.kt

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ import cc.unitmesh.devti.util.relativePath
66
import com.intellij.javascript.nodejs.PackageJsonData
77
import com.intellij.javascript.nodejs.packageJson.PackageJsonFileManager
88
import com.intellij.javascript.web.html.WebFrameworkHtmlFileType
9+
import com.intellij.openapi.application.runReadAction
910
import com.intellij.openapi.fileTypes.ex.FileTypeManagerEx
11+
import com.intellij.openapi.progress.ProgressIndicator
12+
import com.intellij.openapi.progress.ProgressManager
13+
import com.intellij.openapi.progress.Task
14+
import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator
1015
import com.intellij.openapi.project.Project
1116
import com.intellij.openapi.vfs.VfsUtil
1217
import com.intellij.openapi.vfs.VirtualFile
@@ -19,6 +24,7 @@ import org.jetbrains.vuejs.model.VueInputProperty
1924
import org.jetbrains.vuejs.model.VueModelManager
2025
import org.jetbrains.vuejs.model.VueRegularComponent
2126
import java.io.IOException
27+
import java.util.concurrent.CompletableFuture
2228

2329
class VueComponentViewProvider : ComponentViewProvider() {
2430
override fun isApplicable(project: Project): Boolean {
@@ -46,17 +52,28 @@ class VueComponentViewProvider : ComponentViewProvider() {
4652
as? WebFrameworkHtmlFileType
4753
?: return emptyList()
4854

49-
val virtualFiles = FileTypeIndex.getFiles(fileType, searchScope)
55+
val future = CompletableFuture<List<UiComponent>>()
56+
val task = object : Task.Backgroundable(project, "Processing context", false) {
57+
override fun run(indicator: ProgressIndicator) {
58+
runReadAction {
59+
val virtualFiles = FileTypeIndex.getFiles(fileType, searchScope)
60+
val components = mutableListOf<UiComponent>()
5061

51-
val components = mutableListOf<UiComponent>()
52-
val psiManager = PsiManager.getInstance(project)
62+
val psiManager = PsiManager.getInstance(project)
63+
virtualFiles.forEach { file ->
64+
val xmlFile = psiManager.findFile(file) ?: return@forEach
65+
components += slowlyBuildComponents(xmlFile)
66+
}
5367

54-
virtualFiles.forEach { file ->
55-
val xmlFile = psiManager.findFile(file) ?: return@forEach
56-
components += slowlyBuildComponents(xmlFile)
68+
future.complete(components)
69+
}
70+
}
5771
}
5872

59-
return components
73+
ProgressManager.getInstance()
74+
.runProcessWithProgressAsynchronously(task, BackgroundableProcessIndicator(task))
75+
76+
return future.get()
6077
}
6178

6279
companion object {

0 commit comments

Comments
 (0)