@@ -3,6 +3,7 @@ package shop.itbug.flutterx.common.yaml
33import com.intellij.openapi.application.readAction
44import com.intellij.psi.SmartPointerManager
55import com.intellij.psi.SmartPsiElementPointer
6+ import com.intellij.psi.util.PsiTreeUtil
67import org.jetbrains.yaml.psi.impl.YAMLBlockMappingImpl
78import org.jetbrains.yaml.psi.impl.YAMLKeyValueImpl
89import org.jetbrains.yaml.psi.impl.YAMLPlainTextImpl
@@ -71,10 +72,14 @@ data class DartYamlModel(
7172 companion object {
7273
7374 suspend fun create (element : YAMLKeyValueImpl ): DartYamlModel ? {
74- val pt = element.findChild<YAMLPlainTextImpl >() ? : return null
75- val hasBlock = element.findChild<YAMLBlockMappingImpl >() != null
76- if (hasBlock) return null
75+ // 在 readAction 内部进行所有 PSI 访问,避免元素在异步操作中失效
7776 return readAction {
77+ // 检查元素是否仍然有效
78+ if (! element.isValid) return @readAction null
79+ val pt = PsiTreeUtil .findChildOfType(element,YAMLPlainTextImpl ::class .java) ? : return @readAction null
80+ val hasBlock = PsiTreeUtil .findChildOfType(element,YAMLBlockMappingImpl ::class .java) != null
81+ if (hasBlock) return @readAction null
82+
7883 val version = element.valueText.trim()
7984 if (version.isBlank()) return @readAction null
8085 val name = element.keyText.trim()
@@ -92,8 +97,11 @@ data class DartYamlModel(
9297 */
9398 suspend fun fetch (element : YAMLKeyValueImpl ): DartYamlModel ? {
9499 val model = create(element) ? : return null
95- val file = readAction { element.containingFile }
96- val project = readAction { element.project }
100+ val fileAndProject = readAction {
101+ if (! element.isValid) return @readAction null
102+ element.containingFile to element.project
103+ } ? : return null
104+ val (file, project) = fileAndProject
97105 val isIgnored = YamlFileIgDartPackageCache .getInstance(project).state.hasItem(file, model.name)
98106 if (isIgnored) return null
99107 val data = PubService .callPluginDetails(model.name) ? : return null
0 commit comments