fix(FileInfo): Move FileViewProvider to langDoc() to fix Slow ... EDT

PsiManager.getInstance(project).findViewProvider(file)
Slow operations are prohibited on EDT in 2023.3
This commit is contained in:
林万程
2023-12-29 19:53:08 +08:00
parent 617e1d0748
commit f0e490992f
4 changed files with 26 additions and 20 deletions

View File

@@ -8,7 +8,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.FileViewProvider; import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -16,14 +15,12 @@ public class FileInfo extends SettingsInfo {
public final @NotNull VirtualFile file; public final @NotNull VirtualFile file;
public final @NotNull Document document; public final @NotNull Document document;
public final @NotNull Project project; public final @NotNull Project project;
public final @NotNull FileViewProvider viewProvider;
protected FileInfo(@NotNull VirtualFile file, @NotNull Document document, @NotNull Project project, protected FileInfo(@NotNull VirtualFile file, @NotNull Document document, @NotNull Project project,
@NotNull FileViewProvider viewProvider, @NotNull FuncEnum funcEnum) { @NotNull FuncEnum funcEnum) {
super(project, funcEnum); super(project, funcEnum);
this.project = project; this.project = project;
this.file = file; this.file = file;
this.viewProvider = viewProvider;
this.document = document; this.document = document;
} }
@@ -32,11 +29,7 @@ public class FileInfo extends SettingsInfo {
if (document == null) { if (document == null) {
return null; return null;
} }
@Nullable FileViewProvider viewProvider = PsiManager.getInstance(project).findViewProvider(file); return new FileInfo(file, document, project, FuncEnum.LINE);
if (viewProvider == null) {
return null;
}
return new FileInfo(file, document, project, viewProvider, FuncEnum.LINE);
} }
public static @Nullable FileInfo of(@NotNull AnActionEvent event) { public static @Nullable FileInfo of(@NotNull AnActionEvent event) {
@@ -51,6 +44,6 @@ public class FileInfo extends SettingsInfo {
} }
@NotNull VirtualFile file = viewProvider.getVirtualFile(); @NotNull VirtualFile file = viewProvider.getVirtualFile();
@NotNull Project project = psiFile.getProject(); @NotNull Project project = psiFile.getProject();
return new FileInfo(file, document, project, viewProvider, FuncEnum.LINE); return new FileInfo(file, document, project, FuncEnum.LINE);
} }
} }

View File

@@ -14,7 +14,7 @@ public class LineInfo extends FileInfo {
protected LineInfo(@NotNull FileInfo info, @NotNull String text, protected LineInfo(@NotNull FileInfo info, @NotNull String text,
int lineNumber, int startOffset, int endOffset) { int lineNumber, int startOffset, int endOffset) {
super(info.file, info.document, info.project, info.viewProvider, FuncEnum.LINE); super(info.file, info.document, info.project, FuncEnum.LINE);
this.lineNumber = lineNumber; this.lineNumber = lineNumber;
this.startOffset = startOffset; this.startOffset = startOffset;
this.endOffset = endOffset; this.endOffset = endOffset;

View File

@@ -5,6 +5,7 @@ import com.intellij.json.psi.JsonObject;
import com.intellij.json.psi.JsonProperty; import com.intellij.json.psi.JsonProperty;
import com.intellij.json.psi.JsonValue; import com.intellij.json.psi.JsonValue;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReference;
import com.intellij.psi.search.FilenameIndex; import com.intellij.psi.search.FilenameIndex;
@@ -39,8 +40,9 @@ public class JsonLangDoc extends BaseLangDoc {
} }
@Override @Override
public @Nullable String findRefDoc(@NotNull LineInfo info, @NotNull PsiElement element) { public @Nullable String findRefDoc(@NotNull LineInfo info, @NotNull FileViewProvider viewProvider,
@Nullable PsiElement start = info.viewProvider.findElementAt(info.startOffset); @NotNull PsiElement element) {
@Nullable PsiElement start = viewProvider.findElementAt(info.startOffset);
if (start == null) { if (start == null) {
return null; return null;
} }

View File

@@ -9,6 +9,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.FileViewProvider; import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReference;
import io.github.linwancen.plugin.show.bean.LineInfo; import io.github.linwancen.plugin.show.bean.LineInfo;
import io.github.linwancen.plugin.show.bean.SettingsInfo; import io.github.linwancen.plugin.show.bean.SettingsInfo;
@@ -16,7 +17,11 @@ import io.github.linwancen.plugin.show.lang.JsonLangDoc;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.*; import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/** /**
* *
@@ -41,10 +46,14 @@ public abstract class BaseLangDoc extends EditorLinePainter {
} }
public static @Nullable String langDoc(@NotNull LineInfo info) { public static @Nullable String langDoc(@NotNull LineInfo info) {
@Nullable PsiElement element = info.viewProvider.findElementAt(info.endOffset); @Nullable FileViewProvider viewProvider = PsiManager.getInstance(info.project).findViewProvider(info.file);
if (viewProvider == null) {
return null;
}
@Nullable PsiElement element = viewProvider.findElementAt(info.endOffset);
if (element == null) { if (element == null) {
// file end // file end
element = info.viewProvider.findElementAt(info.endOffset - 1); element = viewProvider.findElementAt(info.endOffset - 1);
if (element == null) { if (element == null) {
return null; return null;
} }
@@ -52,9 +61,9 @@ public abstract class BaseLangDoc extends EditorLinePainter {
@NotNull Language language = PsiElementTo.language(element); @NotNull Language language = PsiElementTo.language(element);
BaseLangDoc lineEnd = LANG_DOC_MAP.get(language.getID()); BaseLangDoc lineEnd = LANG_DOC_MAP.get(language.getID());
if (lineEnd != null && lineEnd.show(info)) { if (lineEnd != null && lineEnd.show(info)) {
return lineEnd.findRefDoc(info, element); return lineEnd.findRefDoc(info, viewProvider, element);
} else if (language == JsonLanguage.INSTANCE && JsonLangDoc.INSTANCE.show(info)) { } else if (language == JsonLanguage.INSTANCE && JsonLangDoc.INSTANCE.show(info)) {
return JsonLangDoc.INSTANCE.findRefDoc(info, element); return JsonLangDoc.INSTANCE.findRefDoc(info, viewProvider, element);
} }
return null; return null;
} }
@@ -63,7 +72,8 @@ public abstract class BaseLangDoc extends EditorLinePainter {
* Override like JSON * Override like JSON
*/ */
@Nullable @Nullable
public String findRefDoc(@NotNull LineInfo info, @NotNull PsiElement element) { public String findRefDoc(@NotNull LineInfo info, @NotNull FileViewProvider viewProvider,
@NotNull PsiElement element) {
@Nullable Class<? extends PsiElement> refClass = getRefClass(); @Nullable Class<? extends PsiElement> refClass = getRefClass();
if (refClass == null) { if (refClass == null) {
return null; return null;
@@ -98,7 +108,8 @@ public abstract class BaseLangDoc extends EditorLinePainter {
} }
@NotNull @NotNull
private String mergeDoc(@NotNull String beforeText, @NotNull String text, boolean getToSet, String before, String doc) { private String mergeDoc(@NotNull String beforeText, @NotNull String text,
boolean getToSet, String before, String doc) {
if (beforeText.startsWith("set")) { if (beforeText.startsWith("set")) {
beforeText = beforeText.substring(3); beforeText = beforeText.substring(3);
if (text.startsWith("get")) { if (text.startsWith("get")) {