feat: 2.21 use JS/TS/Vue "export default" doc for tree doc | 用 JS/TS/Vue "export default" 注释当文件注释

This commit is contained in:
林万程
2025-02-07 21:09:22 +08:00
parent 28b089fbd1
commit ba6ded4d44
5 changed files with 58 additions and 5 deletions

View File

@@ -64,7 +64,11 @@ public class HtmlLangDoc extends JsLangDoc {
public @Nullable <T extends SettingsInfo> String treeDoc(@NotNull T info, @NotNull ProjectViewNode<?> node,
@NotNull Project project) {
@Nullable VirtualFile virtualFile = node.getVirtualFile();
return VueRouterCache.fileDoc(virtualFile);
@Nullable String doc = VueRouterCache.fileDoc(virtualFile);
if (doc != null) {
return doc;
}
return super.treeDoc(info, node, project);
}
/**

View File

@@ -1,13 +1,21 @@
package io.github.linwancen.plugin.show.lang;
import com.intellij.ide.projectView.ProjectViewNode;
import com.intellij.lang.ecmascript6.psi.ES6ExportDefaultAssignment;
import com.intellij.lang.javascript.JavascriptLanguage;
import com.intellij.lang.javascript.documentation.JSDocumentationUtils;
import com.intellij.lang.javascript.psi.JSPsiReferenceElement;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.util.PsiTreeUtil;
import io.github.linwancen.plugin.show.bean.LineInfo;
import io.github.linwancen.plugin.show.bean.SettingsInfo;
import io.github.linwancen.plugin.show.lang.base.BaseLangDoc;
import io.github.linwancen.plugin.show.lang.vue.VueRouterCache;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -29,6 +37,32 @@ public class JsLangDoc extends BaseLangDoc {
return info.appSettings.showLineEndCommentJs;
}
@Override
public @Nullable <T extends SettingsInfo> String treeDoc(@NotNull T info, @NotNull ProjectViewNode<?> node,
@NotNull Project project) {
@Nullable VirtualFile virtualFile = node.getVirtualFile();
if (virtualFile == null) {
return null;
}
@Nullable PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
if (psiFile == null) {
return null;
}
@Nullable ES6ExportDefaultAssignment export = PsiTreeUtil.findChildOfType(psiFile,
ES6ExportDefaultAssignment.class);
if (export == null) {
return null;
}
@Nullable String doc = resolveDocPrint(info, export);
if (doc != null && "index".equals(virtualFile.getNameWithoutExtension())) {
VirtualFile parent = virtualFile.getParent();
if (parent != null) {
VueRouterCache.DOC_CACHE.put(parent, doc);
}
}
return doc;
}
@Override
public @Nullable <T extends SettingsInfo> String resolveDocRaw(@NotNull T info, @NotNull PsiElement resolve) {
@Nullable PsiComment psiComment = JSDocumentationUtils.findOwnDocCommentForImplicitElement(resolve);

View File

@@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -37,7 +38,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class VueRouterCache extends FileLoader {
private static final Logger LOG = LoggerFactory.getLogger(VueRouterCache.class);
private static final Map<VirtualFile, String> DOC_CACHE = new ConcurrentHashMap<>();
public static final Map<VirtualFile, String> DOC_CACHE = new ConcurrentHashMap<>();
@Nullable
public static String fileDoc(@Nullable VirtualFile virtualFile) {
@@ -157,7 +158,7 @@ public class VueRouterCache extends FileLoader {
}
}
if (title != null) {
VirtualFile file = parseComponent(obj);
@Nullable VirtualFile file = parseComponent(obj);
if (file != null) {
virtualFile = file;
DOC_CACHE.put(virtualFile, title);
@@ -186,6 +187,16 @@ public class VueRouterCache extends FileLoader {
return null;
}
@Nullable JSExpression value = titleProp.getValue();
if (value instanceof JSObjectLiteralExpression) {
@NotNull JSObjectLiteralExpression i18n = (JSObjectLiteralExpression) value;
// zh_CN
@NotNull String lang = Locale.getDefault().toString();
@Nullable JSProperty langProp = i18n.findProperty(lang);
if (langProp == null) {
return null;
}
value = langProp.getValue();
}
if (value instanceof JSLiteralExpression) {
return ((JSLiteralExpression) value).getStringValue();
}
@@ -227,7 +238,7 @@ public class VueRouterCache extends FileLoader {
}
@NotNull Collection<PsiElement> elements = importCall.resolveReferencedElements();
for (PsiElement element : elements) {
PsiFile psiFile = PsiTreeUtil.getParentOfType(element, PsiFile.class);
@Nullable PsiFile psiFile = PsiTreeUtil.getParentOfType(element, PsiFile.class);
if (psiFile != null) {
return psiFile.getVirtualFile();
}