feat(AnnoDoc): 2.23 kotlin anno doc | kotlin 注解注释 Fixed #78

This commit is contained in:
林万程
2025-04-20 22:42:09 +08:00
parent 156ed6f014
commit bc3e0c747f
8 changed files with 270 additions and 256 deletions

View File

@@ -18,7 +18,7 @@ import com.intellij.psi.javadoc.PsiDocTagValue;
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.java.doc.AnnoDoc;
import io.github.linwancen.plugin.show.java.doc.AnnoDocJava;
import io.github.linwancen.plugin.show.java.doc.EnumDoc;
import io.github.linwancen.plugin.show.java.doc.NewDoc;
import io.github.linwancen.plugin.show.java.doc.ParamDoc;
@@ -101,7 +101,7 @@ public class JavaLangDoc extends BaseTagLangDoc<PsiDocComment> {
return EnumDoc.enumDoc((PsiEnumConstant) resolve);
}
if (resolve instanceof PsiJvmModifiersOwner) {
return AnnoDoc.annoDoc(info, (PsiJvmModifiersOwner) resolve);
return AnnoDocJava.INSTANCE.annoDoc(info, (PsiJvmModifiersOwner) resolve);
}
return null;
}

View File

@@ -5,6 +5,7 @@ import com.intellij.psi.impl.file.PsiPackageBase;
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.java.kt.AnnoDocKt;
import io.github.linwancen.plugin.show.lang.base.BaseTagLangDoc;
import io.github.linwancen.plugin.show.lang.base.DocFilter;
import org.jetbrains.annotations.NotNull;
@@ -13,6 +14,7 @@ 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.KtAnnotated;
import org.jetbrains.kotlin.psi.KtNameReferenceExpression;
import java.util.List;
@@ -29,6 +31,18 @@ public class KotlinLangDoc extends BaseTagLangDoc<KDocSection> {
return info.appSettings.showLineEndCommentKotlin;
}
@Override
public @Nullable <T extends SettingsInfo> String resolveDocPrint(@NotNull T info, @NotNull PsiElement resolve) {
@Nullable String resolveDocPrint = super.resolveDocPrint(info, resolve);
if (resolveDocPrint != null) {
return resolveDocPrint;
}
if (resolve instanceof KtAnnotated) {
return AnnoDocKt.INSTANCE.annoDoc(info, (KtAnnotated) resolve);
}
return null;
}
@Override
protected <T extends SettingsInfo> boolean parseBaseComment(@NotNull T info) {
return info.appSettings.showLineEndCommentKotlinBase;

View File

@@ -10,50 +10,18 @@ import com.intellij.psi.PsiDocCommentOwner;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiJvmModifiersOwner;
import com.intellij.psi.PsiMethod;
import io.github.linwancen.plugin.show.bean.SettingsInfo;
import io.github.linwancen.plugin.show.settings.GlobalSettingsState;
import io.github.linwancen.plugin.show.settings.ProjectSettingsState;
import org.apache.commons.lang3.StringUtils;
import io.github.linwancen.plugin.show.lang.base.BaseAnnoDoc;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class AnnoDoc {
public class AnnoDocJava extends BaseAnnoDoc<PsiJvmModifiersOwner> {
private AnnoDoc() {}
public static AnnoDocJava INSTANCE = new AnnoDocJava();
private AnnoDocJava() {}
@Nullable
public static <T extends SettingsInfo> String annoDoc(@NotNull T info, @NotNull PsiJvmModifiersOwner owner) {
@NotNull ProjectSettingsState projectSettings = info.projectSettings;
@NotNull GlobalSettingsState globalSettings = info.globalSettings;
// annoDocEffect first because default false
if (projectSettings.annoDocEffect && projectSettings.projectFilterEffective) {
@Nullable String doc = annoDocArr(owner, projectSettings.annoDoc);
if (StringUtils.isNotBlank(doc)) {
return doc;
}
}
if (globalSettings.annoDocEffect && projectSettings.globalFilterEffective) {
return annoDocArr(owner, globalSettings.annoDoc);
}
return null;
}
@Nullable
private static String annoDocArr(@NotNull PsiJvmModifiersOwner owner, @NotNull String[][] lines) {
for (@NotNull String[] arr : lines) {
if (arr.length < 3) {
continue;
}
@Nullable String s = annoDocMatch(owner, arr);
if (s != null) {
return s;
}
}
return null;
}
@Nullable
private static String annoDocMatch(@NotNull PsiJvmModifiersOwner owner, @NotNull String[] arr) {
protected String annoDocMatch(@NotNull PsiJvmModifiersOwner owner, @NotNull String[] arr) {
if (typeMatch(owner, arr[0])) {
return annoDocName(owner, arr);
}

View File

@@ -0,0 +1,85 @@
package io.github.linwancen.plugin.show.java.kt;
import io.github.linwancen.plugin.show.lang.base.BaseAnnoDoc;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.KtAnnotated;
import org.jetbrains.kotlin.psi.KtAnnotationEntry;
import org.jetbrains.kotlin.psi.KtExpression;
import org.jetbrains.kotlin.psi.KtFunction;
import org.jetbrains.kotlin.psi.KtProperty;
import org.jetbrains.kotlin.psi.KtPureClassOrObject;
import org.jetbrains.kotlin.psi.KtStringTemplateExpression;
import org.jetbrains.kotlin.psi.ValueArgument;
import org.jetbrains.kotlin.psi.ValueArgumentName;
public class AnnoDocKt extends BaseAnnoDoc<KtAnnotated> {
public static AnnoDocKt INSTANCE = new AnnoDocKt();
private AnnoDocKt() {}
@Nullable
protected String annoDocMatch(@NotNull KtAnnotated owner, @NotNull String[] arr) {
if (typeMatch(owner, arr[0])) {
for (KtAnnotationEntry entry : owner.getAnnotationEntries()) {
String s = annoDocName(entry, arr);
if (s != null) {
return s;
}
}
}
return null;
}
private static boolean typeMatch(KtAnnotated owner, @NotNull String type) {
switch (type) {
case "field":
return owner instanceof KtProperty;
case "method":
return owner instanceof KtFunction;
case "class":
return owner instanceof KtPureClassOrObject;
case "!doc":
case "all":
return true;
default:
return false;
}
}
@Nullable
private static String annoDocName(@NotNull KtAnnotationEntry entry, @NotNull String[] arr) {
Name shortName = entry.getShortName();
if (shortName == null) {
return null;
}
String name = shortName.asString();
String annoName = arr[1];
int i = annoName.lastIndexOf('.');
if (i > 0) {
annoName = annoName.substring(i + 1);
}
if (!annoName.equals(name)) {
return null;
}
for (ValueArgument argument : entry.getValueArguments()) {
ValueArgumentName argumentName = argument.getArgumentName();
String method = argumentName == null ? "value" : argumentName.getAsName().asString();
if (arr[2].equals(method)) {
KtExpression expression = argument.getArgumentExpression();
if (expression instanceof KtStringTemplateExpression) {
String text = expression.getText();
if (text.length() >= 2) {
String s = text.substring(1, text.length() - 1);
if (!s.isEmpty()) {
return s;
}
}
}
}
}
return null;
}
}

View File

@@ -0,0 +1,47 @@
package io.github.linwancen.plugin.show.lang.base;
import io.github.linwancen.plugin.show.bean.SettingsInfo;
import io.github.linwancen.plugin.show.settings.GlobalSettingsState;
import io.github.linwancen.plugin.show.settings.ProjectSettingsState;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public abstract class BaseAnnoDoc<O> {
@Nullable
public <T extends SettingsInfo> String annoDoc(@NotNull T info, @NotNull O owner) {
@NotNull ProjectSettingsState projectSettings = info.projectSettings;
@NotNull GlobalSettingsState globalSettings = info.globalSettings;
// annoDocEffect first because default false
if (projectSettings.annoDocEffect && projectSettings.projectFilterEffective) {
@Nullable String doc = annoDocArr(owner, projectSettings.annoDoc);
if (StringUtils.isNotBlank(doc)) {
return doc;
}
}
if (globalSettings.annoDocEffect && projectSettings.globalFilterEffective) {
return annoDocArr(owner, globalSettings.annoDoc);
}
return null;
}
@Nullable
protected String annoDocArr(@NotNull O owner, @NotNull String[][] lines) {
for (@NotNull String[] arr : lines) {
if (arr.length < 3) {
continue;
}
@Nullable String s = annoDocMatch(owner, arr);
if (s != null) {
return s;
}
}
return null;
}
@Nullable
protected String annoDocMatch(@NotNull O owner, @NotNull String[] arr) {
return null;
}
}

View File

@@ -161,7 +161,7 @@ public abstract class BaseLangDoc extends EditorLinePainter {
return null;
}
if (resolve == null) {
return null;
continue;
}
@Nullable String resolveDoc = resolveDoc(info, resolve);
if (resolveDoc != null) {