1616package com.google.idea.blaze.clwb
1717
1818import com.google.idea.blaze.base.lang.buildfile.language.BuildFileType
19+ import com.google.idea.blaze.base.project.AutoImportProjectOpenProcessor
1920import com.google.idea.blaze.base.settings.Blaze
2021import com.google.idea.blaze.base.sync.data.BlazeDataStorage
2122import com.google.idea.blaze.base.wizard2.BazelImportCurrentProjectAction
@@ -27,8 +28,13 @@ import com.intellij.openapi.vfs.VirtualFile
2728import com.intellij.util.concurrency.annotations.RequiresReadLock
2829import com.jetbrains.cidr.lang.daemon.OCFileScopeProvider.Companion.getProjectSourceLocationKind
2930import com.google.idea.sdkcompat.clion.projectStatus.*
31+ import com.intellij.util.concurrency.annotations.RequiresReadLockAbsence
3032import com.jetbrains.cidr.project.workspace.CidrWorkspace
33+ import kotlinx.coroutines.Dispatchers
34+ import kotlinx.coroutines.withContext
3135import java.io.File
36+ import java.nio.file.Files
37+ import java.nio.file.Path
3238
3339// / This function is a little overloaded, ensures the project could be imported
3440// and returns the potential workspace root.
@@ -38,7 +44,7 @@ private fun guessWorkspaceRoot(project: Project, file: VirtualFile?): String? {
3844 return null
3945 }
4046
41- if (! Blaze .isBlazeProject(project)) {
47+ if (Blaze .isBlazeProject(project)) {
4248 return null
4349 }
4450
@@ -56,13 +62,32 @@ private fun guessWorkspaceRoot(project: Project, file: VirtualFile?): String? {
5662 return workspaceRoot.removeSuffix(BlazeDataStorage .PROJECT_DATA_SUBDIRECTORY )
5763}
5864
59- @RequiresReadLock
60- private fun guessWidgetStatus (project : Project , currentFile : VirtualFile ? ): WidgetStatus ? {
65+ @RequiresReadLockAbsence
66+ private fun validateWorkspaceRoot (workspaceRoot : String ): Boolean {
67+ return AutoImportProjectOpenProcessor .WORKSPACE_MARKER_FILES .any {
68+ Files .exists(Path .of(workspaceRoot, it))
69+ }
70+ }
71+
72+ @RequiresReadLockAbsence
73+ private suspend fun guessWidgetStatus (project : Project , currentFile : VirtualFile ? ): WidgetStatus ? {
6174 if (Blaze .isBlazeProject(project)) {
6275 return DefaultWidgetStatus (Status .OK , Scope .Project , " Bazel project is configured" )
6376 }
6477
65- if (currentFile == null || guessWorkspaceRoot(project, currentFile) == null ) {
78+ if (currentFile == null ) {
79+ return null
80+ }
81+
82+ val workspaceRoot = readAction {
83+ guessWorkspaceRoot(project, currentFile)
84+ }
85+
86+ if (workspaceRoot == null ) {
87+ return null
88+ }
89+
90+ if (withContext(Dispatchers .IO ) { ! validateWorkspaceRoot(workspaceRoot) }) {
6691 return null
6792 }
6893
@@ -86,13 +111,13 @@ class BazelProjectFixesProvider : ProjectFixesProvider {
86111class BazelWidgetStatusProvider : WidgetStatusProvider {
87112
88113 override suspend fun computeWidgetStatus (project : Project , currentFile : VirtualFile ? ): WidgetStatus ? {
89- return readAction { guessWidgetStatus(project, currentFile) }
114+ return guessWidgetStatus(project, currentFile)
90115 }
91116}
92117
93118class BazelEditorNotificationProvider : EditorNotificationWarningProvider {
94119
95120 override suspend fun computeProjectNotification (project : Project , file : VirtualFile ): ProjectNotification ? {
96- return convertStatus(readAction { guessWidgetStatus(project, file) } )
121+ return convertStatus(guessWidgetStatus(project, file))
97122 }
98123}
0 commit comments