From 25caa79a68da55a2b229de1669fc8756db672f07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E4=B8=87=E7=A8=8B?= <1498425439@qq.com> Date: Fri, 26 Jan 2024 19:59:17 +0800 Subject: [PATCH] feat(BaseLangDoc): multi RefClass to support Ref in javadoc and kotlin doc --- .../plugin/show/java/JavaLangDoc.java | 6 +++-- .../plugin/show/java/KotlinLangDoc.java | 5 ++-- .../linwancen/plugin/show/lang/GoLangDoc.java | 4 +-- .../linwancen/plugin/show/lang/JsLangDoc.java | 6 +++-- .../plugin/show/lang/JsonLangDoc.java | 4 +-- .../plugin/show/lang/PythonLangDoc.java | 6 +++-- .../plugin/show/lang/SqlLangDoc.java | 5 ++-- .../plugin/show/lang/base/BaseLangDoc.java | 7 ++--- .../linwancen/plugin/show/lang/base/Prev.java | 27 +++++++++++++++---- .../linwancen/plugin/show/demo/java/Kotlin.kt | 6 +++++ 10 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/main/idea/io/github/linwancen/plugin/show/java/JavaLangDoc.java b/src/main/idea/io/github/linwancen/plugin/show/java/JavaLangDoc.java index 982ce3d..76c7bc4 100644 --- a/src/main/idea/io/github/linwancen/plugin/show/java/JavaLangDoc.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/JavaLangDoc.java @@ -19,6 +19,8 @@ import io.github.linwancen.plugin.show.lang.base.DocFilter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + public class JavaLangDoc extends BaseTagLangDoc { public static final JavaLangDoc INSTANCE = new JavaLangDoc(); @@ -28,8 +30,8 @@ public class JavaLangDoc extends BaseTagLangDoc { } @Override - public @NotNull Class getRefClass() { - return PsiJavaCodeReferenceElement.class; + public @NotNull List> getRefClass() { + return List.of(PsiJavaCodeReferenceElement.class, PsiDocTagValue.class); } @Override diff --git a/src/main/idea/io/github/linwancen/plugin/show/java/KotlinLangDoc.java b/src/main/idea/io/github/linwancen/plugin/show/java/KotlinLangDoc.java index d3ac952..7b68908 100644 --- a/src/main/idea/io/github/linwancen/plugin/show/java/KotlinLangDoc.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/KotlinLangDoc.java @@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.idea.KotlinLanguage; import org.jetbrains.kotlin.kdoc.psi.api.KDoc; +import org.jetbrains.kotlin.kdoc.psi.impl.KDocName; import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection; import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag; import org.jetbrains.kotlin.psi.KtNameReferenceExpression; @@ -24,8 +25,8 @@ public class KotlinLangDoc extends BaseTagLangDoc { } @Override - public @NotNull Class getRefClass() { - return KtNameReferenceExpression.class; + public @NotNull List> getRefClass() { + return List.of(KtNameReferenceExpression.class, KDocName.class); } @Override diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/GoLangDoc.java b/src/main/java/io/github/linwancen/plugin/show/lang/GoLangDoc.java index abb6319..ed2cf4d 100644 --- a/src/main/java/io/github/linwancen/plugin/show/lang/GoLangDoc.java +++ b/src/main/java/io/github/linwancen/plugin/show/lang/GoLangDoc.java @@ -20,8 +20,8 @@ public class GoLangDoc extends BaseLangDoc { } @Override - public @NotNull Class getRefClass() { - return GoReferenceExpressionBase.class; + public @NotNull List> getRefClass() { + return List.of(GoReferenceExpressionBase.class); } @Override diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/JsLangDoc.java b/src/main/java/io/github/linwancen/plugin/show/lang/JsLangDoc.java index 32b4e01..3a2ae03 100644 --- a/src/main/java/io/github/linwancen/plugin/show/lang/JsLangDoc.java +++ b/src/main/java/io/github/linwancen/plugin/show/lang/JsLangDoc.java @@ -11,6 +11,8 @@ import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + public class JsLangDoc extends BaseLangDoc { static { @@ -18,8 +20,8 @@ public class JsLangDoc extends BaseLangDoc { } @Override - public @NotNull Class getRefClass() { - return JSPsiReferenceElement.class; + public @NotNull List> getRefClass() { + return List.of(JSPsiReferenceElement.class); } @Override diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/JsonLangDoc.java b/src/main/java/io/github/linwancen/plugin/show/lang/JsonLangDoc.java index 503e783..5c94790 100644 --- a/src/main/java/io/github/linwancen/plugin/show/lang/JsonLangDoc.java +++ b/src/main/java/io/github/linwancen/plugin/show/lang/JsonLangDoc.java @@ -30,8 +30,8 @@ public class JsonLangDoc extends BaseLangDoc { public static final JsonLangDoc INSTANCE = new JsonLangDoc(); @Override - public @NotNull Class getRefClass() { - return JsonProperty.class; + public @NotNull List> getRefClass() { + return List.of(JsonProperty.class); } @Override diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/PythonLangDoc.java b/src/main/java/io/github/linwancen/plugin/show/lang/PythonLangDoc.java index 76e33a6..e07b60b 100644 --- a/src/main/java/io/github/linwancen/plugin/show/lang/PythonLangDoc.java +++ b/src/main/java/io/github/linwancen/plugin/show/lang/PythonLangDoc.java @@ -15,6 +15,8 @@ import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + public class PythonLangDoc extends BaseTagLangDoc { static { @@ -22,8 +24,8 @@ public class PythonLangDoc extends BaseTagLangDoc { } @Override - public @NotNull Class getRefClass() { - return PyReferenceExpression.class; + public @NotNull List> getRefClass() { + return List.of(PyReferenceExpression.class); } @Override diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/SqlLangDoc.java b/src/main/java/io/github/linwancen/plugin/show/lang/SqlLangDoc.java index 9ff44b2..9f02956 100644 --- a/src/main/java/io/github/linwancen/plugin/show/lang/SqlLangDoc.java +++ b/src/main/java/io/github/linwancen/plugin/show/lang/SqlLangDoc.java @@ -12,6 +12,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.lang.reflect.Method; +import java.util.List; public class SqlLangDoc extends BaseLangDoc { @@ -20,8 +21,8 @@ public class SqlLangDoc extends BaseLangDoc { } @Override - public @NotNull Class getRefClass() { - return SqlReferenceExpression.class; + public @NotNull List> getRefClass() { + return List.of(SqlReferenceExpression.class); } @Override diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/base/BaseLangDoc.java b/src/main/java/io/github/linwancen/plugin/show/lang/base/BaseLangDoc.java index b010012..f17c106 100644 --- a/src/main/java/io/github/linwancen/plugin/show/lang/base/BaseLangDoc.java +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/BaseLangDoc.java @@ -29,7 +29,7 @@ import java.util.Map; public abstract class BaseLangDoc extends EditorLinePainter { public static final Map LANG_DOC_MAP = new LinkedHashMap<>(); - public abstract @Nullable Class getRefClass(); + public abstract @NotNull List> getRefClass(); public abstract boolean show(@NotNull LineInfo info); @@ -75,10 +75,7 @@ public abstract class BaseLangDoc extends EditorLinePainter { @Nullable public String findRefDoc(@NotNull LineInfo info, @NotNull FileViewProvider viewProvider, @NotNull PsiElement element) { - @Nullable Class refClass = getRefClass(); - if (refClass == null) { - return null; - } + @NotNull List> refClass = getRefClass(); @Nullable String doc = null; @Nullable String text = null; @Nullable PsiElement refElement = element; diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/base/Prev.java b/src/main/java/io/github/linwancen/plugin/show/lang/base/Prev.java index a002a08..4a5a0f9 100644 --- a/src/main/java/io/github/linwancen/plugin/show/lang/base/Prev.java +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/Prev.java @@ -10,6 +10,7 @@ import io.github.linwancen.plugin.show.bean.SettingsInfo; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.regex.Pattern; public class Prev { @@ -18,7 +19,7 @@ public class Prev { @Nullable public static PsiElement prevRefChild(@NotNull LineInfo info, @NotNull PsiElement element, - @NotNull Class refClass) { + @NotNull List> refClass) { @Nullable PsiElement prevParent = refClassParent(element, refClass); while ((element = PsiTreeUtil.prevVisibleLeaf(element)) != null) { if (element.getTextRange().getEndOffset() < info.startOffset) { @@ -29,7 +30,7 @@ public class Prev { // skip b in a.b.c if (prevParent != null && prevParent.getTextRange().getEndOffset() < info.endOffset - && PsiTreeUtil.findChildOfType(prevParent, refClass) == parent) { + && prevParentChildEqParent(prevParent, refClass, parent)) { prevParent = parent; } else { if (!(element instanceof PsiComment)) { @@ -41,6 +42,17 @@ public class Prev { return null; } + private static boolean prevParentChildEqParent(@NotNull PsiElement prevParent, + @NotNull List> refClass, + @NotNull PsiElement parent) { + for (@NotNull Class c : refClass) { + if (PsiTreeUtil.findChildOfType(prevParent, c) == parent) { + return true; + } + } + return false; + } + private static final Pattern SYMBOL_PATTERN = Pattern.compile("[^" + ":-@" + "\\[-`" + @@ -49,7 +61,7 @@ public class Prev { @Nullable private static PsiElement refClassParent(@NotNull PsiElement element, - @NotNull Class refClass) { + @NotNull List> refClass) { String text = element.getText(); if (!SYMBOL_PATTERN.matcher(text).find()) { return null; @@ -58,18 +70,23 @@ public class Prev { if (parent == null) { return null; } - if (!refClass.isAssignableFrom(parent.getClass())) { + if (notAssignableFrom(refClass, parent)) { parent = parent.getParent(); if (parent == null) { return null; } } - if (!refClass.isAssignableFrom(parent.getClass())) { + if (notAssignableFrom(refClass, parent)) { return null; } return parent; } + private static boolean notAssignableFrom(@NotNull List> refClass, + @NotNull PsiElement parent) { + return refClass.stream().noneMatch(it -> it.isAssignableFrom(parent.getClass())); + } + public static @Nullable PsiElement prevCompactElement( @SuppressWarnings("unused") @NotNull T info, @NotNull PsiElement resolve, @NotNull Document document) { @Nullable PsiElement element = PsiTreeUtil.prevVisibleLeaf(resolve); diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/java/Kotlin.kt b/src/test/java/io/github/linwancen/plugin/show/demo/java/Kotlin.kt index 6516146..bb3b402 100644 --- a/src/test/java/io/github/linwancen/plugin/show/demo/java/Kotlin.kt +++ b/src/test/java/io/github/linwancen/plugin/show/demo/java/Kotlin.kt @@ -4,6 +4,12 @@ import io.github.linwancen.plugin.show.demo.java.obj.Child import io.github.linwancen.plugin.show.demo.java.obj.Parent /** + * Kotlin + * + * [call] + * [InDoc.field] + * [InDoc.method1] [InDoc.method2] + * * @author l */ object Kotlin : Parent() {