From 7e2b82843495ded83a85107f6c8da1d9a4b48678 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9E=97=E4=B8=87=E7=A8=8B?= <1498425439@qq.com>
Date: Tue, 27 Feb 2024 19:24:07 +0800
Subject: [PATCH] =?UTF-8?q?feat(ScalaLangDoc):=20support=20Scala=20|=20?=
=?UTF-8?q?=E6=94=AF=E6=8C=81=20Scala?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 8 +-
build.gradle | 5 +-
.../plugin/show/java/JavaLangDoc.java | 33 ++++++--
.../plugin/show/java/ScalaLangDoc.java | 79 +++++++++++++++++++
.../show/java/line/OwnerToPsiDocSkip.java | 8 +-
.../show/settings/AppSettingsComponent.java | 30 ++++++-
.../settings/AppSettingsConfigurable.java | 6 ++
.../show/settings/AppSettingsState.java | 2 +
src/main/resources/META-INF/plugin.xml | 6 +-
src/main/resources/META-INF/scala.xml | 5 ++
.../plugin/show/demo/ScalaClass.scala | 21 +++++
11 files changed, 186 insertions(+), 17 deletions(-)
create mode 100644 src/main/idea/io/github/linwancen/plugin/show/java/ScalaLangDoc.java
create mode 100644 src/main/resources/META-INF/scala.xml
create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/ScalaClass.scala
diff --git a/README.md b/README.md
index cab1d6d..dd5843d 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ Show doc comment in the Project view Tree, line End, json, other
English Note
-- support Java Kotlin JS/TS PHP Python Go Rust C SQL
+
- support Java Kotlin Scala JS/TS PHP Python Go Rust C SQL
- tree doc from lang or README.md pom .gradle etc. by settings
- input `doc` `docc` -> /** */
- json doc from xxx.json.tsv
@@ -58,7 +58,7 @@ Show doc comment in the Project view Tree, line End, json, other
- 在结构树显示 文件注释 或 项目说明 (README.md pom.xml 等,可设置)
- 在行末尾显示 引用对象的文档注释,欢迎反馈您想要支持的语言,欢迎 C# 大神研究 CsLineEnd.java
-
- 目前支持 Java Kotlin JS/TS PHP Python Go Rust C SQL
+
- 目前支持 Java Kotlin Scala JS/TS PHP Python Go Rust C SQL
- 输入 doc / docc 等生成 /** */
- json 字段注释从 xxx.json.tsv 读取
- json 字典注释从 键名.tsv 读取
@@ -121,7 +121,7 @@ Show doc comment in the Project view Tree, line End, json, other
English Change Notes:
-- 2.16 Add line-end-comment support Rust, PHP, C/C++/Object C
+
- 2.16 Add line-end-comment support Rust, PHP, C/C++/Object C, Scala
- 2.15 Add line-end-comment java anno doc
- 2.14 Add line-end-comment java enum doc for Yes(1, "Yes")
- 2.13 ★ Cache for 2023.3
@@ -166,7 +166,7 @@ Show doc comment in the Project view Tree, line End, json, other
中文更新说明:
-- 2.16 增加 行末注释 支持 Rust, PHP, C/C++/Object C
+
- 2.16 增加 行末注释 支持 Rust, PHP, C/C++/Object C, Scala
- 2.15 增加 行末注释 java 注解注释
- 2.14 增加 行末注释 java 枚举注释用于 Yes(1, "是")
- 2.13 ★ 缓存用于支持 2023.3
diff --git a/build.gradle b/build.gradle
index d234cee..8837963 100644
--- a/build.gradle
+++ b/build.gradle
@@ -33,6 +33,7 @@ intellij {
'Pythonid:201.6668.121',
'org.rust.lang:0.3.131.3366-201',
'org.toml.lang:0.2.131.3366-201',
+ 'org.intellij.scala:2020.1.43',
]
if ('IC' == ideTypeStr || 'IU' == ideTypeStr) {
plugins.add('java')
@@ -91,7 +92,7 @@ patchPluginXml {
changeNotes = """
English Change Notes:
-- 2.16 Add line-end-comment support Rust, PHP, C/C++/Object C
+
- 2.16 Add line-end-comment support Rust, PHP, C/C++/Object C, Scala
- 2.15 Add line-end-comment java anno doc
- 2.14 Add line-end-comment java enum doc for Yes(1, "Yes")
- 2.13 ★ Cache for 2023.3
@@ -136,7 +137,7 @@ patchPluginXml {
中文更新说明:
-- 2.16 增加 行末注释 支持 Rust, PHP, C/C++/Object C
+
- 2.16 增加 行末注释 支持 Rust, PHP, C/C++/Object C, Scala
- 2.15 增加 行末注释 java 注解注释
- 2.14 增加 行末注释 java 枚举注释用于 Yes(1, "是")
- 2.13 ★ 缓存用于支持 2023.3
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 a60e725..4d13cb4 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
@@ -3,8 +3,20 @@ package io.github.linwancen.plugin.show.java;
import com.intellij.ide.projectView.ProjectViewNode;
import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.project.Project;
-import com.intellij.psi.*;
-import com.intellij.psi.javadoc.*;
+import com.intellij.psi.PsiDocCommentOwner;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiEnumConstant;
+import com.intellij.psi.PsiField;
+import com.intellij.psi.PsiJavaCodeReferenceElement;
+import com.intellij.psi.PsiJvmModifiersOwner;
+import com.intellij.psi.PsiMethod;
+import com.intellij.psi.PsiParameter;
+import com.intellij.psi.PsiWhiteSpace;
+import com.intellij.psi.javadoc.PsiDocComment;
+import com.intellij.psi.javadoc.PsiDocTag;
+import com.intellij.psi.javadoc.PsiDocTagValue;
+import com.intellij.psi.javadoc.PsiDocToken;
+import com.intellij.psi.javadoc.PsiInlineDocTag;
import com.intellij.psi.util.PsiTreeUtil;
import io.github.linwancen.plugin.show.bean.LineInfo;
import io.github.linwancen.plugin.show.bean.SettingsInfo;
@@ -111,9 +123,14 @@ public class JavaLangDoc extends BaseTagLangDoc {
@NotNull
@Override
protected String descDoc(@NotNull T info, @NotNull PsiDocComment psiDocComment) {
+ @NotNull PsiElement[] elements = psiDocComment.getDescriptionElements();
+ return elementsDesc(info, elements);
+ }
+
+ @NotNull
+ protected String elementsDesc(@NotNull T info, @NotNull PsiElement[] elements) {
@NotNull StringBuilder sb = new StringBuilder();
int lineCount = 0;
- @NotNull PsiElement[] elements = psiDocComment.getDescriptionElements();
for (PsiElement element : elements) {
if (appendElementText(sb, element)) {
lineCount++;
@@ -126,9 +143,9 @@ public class JavaLangDoc extends BaseTagLangDoc {
}
/**
- * @return is new line
+ * @return is a new line
*/
- private static boolean appendElementText(@NotNull StringBuilder sb, PsiElement element) {
+ protected boolean appendElementText(@NotNull StringBuilder sb, PsiElement element) {
if (element instanceof PsiDocToken) {
@NotNull PsiDocToken psiDocToken = (PsiDocToken) element;
DocFilter.addHtml(sb, psiDocToken.getText());
@@ -148,10 +165,14 @@ public class JavaLangDoc extends BaseTagLangDoc {
@NotNull PsiDocComment psiDocComment, @NotNull String name) {
@NotNull PsiDocTag[] tags = psiDocComment.findTagsByName(name);
for (@NotNull PsiDocTag tag : tags) {
- // @see @param should use getDataElements()
@Nullable PsiDocTagValue value = tag.getValueElement();
if (value != null) {
DocFilter.addHtml(tagStrBuilder, value.getText());
+ } else {
+ PsiElement[] dataElements = tag.getDataElements();
+ if (dataElements.length > 0) {
+ DocFilter.addHtml(tagStrBuilder, dataElements[0].getText());
+ }
}
}
}
diff --git a/src/main/idea/io/github/linwancen/plugin/show/java/ScalaLangDoc.java b/src/main/idea/io/github/linwancen/plugin/show/java/ScalaLangDoc.java
new file mode 100644
index 0000000..5903176
--- /dev/null
+++ b/src/main/idea/io/github/linwancen/plugin/show/java/ScalaLangDoc.java
@@ -0,0 +1,79 @@
+package io.github.linwancen.plugin.show.java;
+
+import com.intellij.psi.PsiDocCommentOwner;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.javadoc.PsiDocComment;
+import com.intellij.psi.javadoc.PsiDocTag;
+import io.github.linwancen.plugin.show.bean.LineInfo;
+import io.github.linwancen.plugin.show.bean.SettingsInfo;
+import io.github.linwancen.plugin.show.java.line.OwnerToPsiDocSkip;
+import io.github.linwancen.plugin.show.lang.base.DocFilter;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.plugins.scala.ScalaLanguage;
+import org.jetbrains.plugins.scala.lang.psi.api.expr.ScReferenceExpression;
+import org.jetbrains.plugins.scala.lang.scaladoc.psi.api.ScDocResolvableCodeReference;
+import org.jetbrains.plugins.scala.lang.scaladoc.psi.api.ScDocTag;
+
+import java.util.List;
+
+public class ScalaLangDoc extends JavaLangDoc {
+
+ public static final ScalaLangDoc INSTANCE = new ScalaLangDoc();
+
+ static {
+ LANG_DOC_MAP.put(ScalaLanguage.INSTANCE.getID(), INSTANCE);
+ }
+
+ @Override
+ public @NotNull List> getRefClass() {
+ return List.of(ScReferenceExpression.class, ScDocResolvableCodeReference.class);
+ }
+
+ @Override
+ public boolean show(@NotNull LineInfo info) {
+ return info.appSettings.showLineEndCommentScala;
+ }
+
+ @Override
+ protected boolean parseBaseComment(@NotNull T info) {
+ return info.appSettings.showLineEndCommentScalaBase;
+ }
+
+ @Nullable
+ @Override
+ protected PsiDocComment toDocElement(@NotNull T info,
+ @NotNull PsiElement resolve) {
+ if (resolve instanceof PsiDocCommentOwner) {
+ @NotNull PsiDocCommentOwner psiDocCommentOwner = (PsiDocCommentOwner) resolve;
+ return OwnerToPsiDocSkip.refDocWithOutSkip(info, psiDocCommentOwner);
+ }
+ return null;
+ }
+
+ @NotNull
+ @Override
+ protected String descDoc(@NotNull T info, @NotNull PsiDocComment psiDocComment) {
+ @NotNull PsiElement[] elements = psiDocComment.getChildren();
+ StringBuilder sb = new StringBuilder();
+ for (PsiElement element : elements) {
+ if (!(element instanceof PsiDocTag)) {
+ sb.append(element.getText());
+ }
+ }
+ return DocFilter.cutDoc(sb.toString(), info, true);
+ }
+
+ @Override
+ protected void appendTag(@NotNull T info, @NotNull StringBuilder tagStrBuilder,
+ @NotNull PsiDocComment psiDocComment, @NotNull String name) {
+ @NotNull PsiDocTag[] tags = psiDocComment.findTagsByName("@" + name);
+ for (@NotNull PsiDocTag tag : tags) {
+ if (tag instanceof ScDocTag) {
+ ScDocTag scDocTag = (ScDocTag) tag;
+ String doc = scDocTag.getCommentDataText();
+ DocFilter.addHtml(tagStrBuilder, doc);
+ }
+ }
+ }
+}
diff --git a/src/main/idea/io/github/linwancen/plugin/show/java/line/OwnerToPsiDocSkip.java b/src/main/idea/io/github/linwancen/plugin/show/java/line/OwnerToPsiDocSkip.java
index 608f4c0..f3addf7 100644
--- a/src/main/idea/io/github/linwancen/plugin/show/java/line/OwnerToPsiDocSkip.java
+++ b/src/main/idea/io/github/linwancen/plugin/show/java/line/OwnerToPsiDocSkip.java
@@ -18,6 +18,12 @@ public class OwnerToPsiDocSkip {
@Nullable
public static PsiDocComment refDoc(@NotNull T info,
@Nullable PsiDocCommentOwner docOwner) {
+ return SkipUtils.skipDoc(info, refDocWithOutSkip(info, docOwner));
+ }
+
+ @Nullable
+ public static PsiDocComment refDocWithOutSkip(@NotNull T info,
+ @Nullable PsiDocCommentOwner docOwner) {
if (docOwner == null) {
return null;
}
@@ -27,6 +33,6 @@ public class OwnerToPsiDocSkip {
@Nullable PsiDocComment docComment = docOwner instanceof PsiMethod
? PsiMethodToPsiDoc.methodSupperNewPropDoc(((PsiMethod) docOwner))
: docOwner.getDocComment();
- return SkipUtils.skipDoc(info, docComment);
+ return docComment;
}
}
diff --git a/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsComponent.java b/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsComponent.java
index 2e28f17..73a87b7 100644
--- a/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsComponent.java
+++ b/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsComponent.java
@@ -24,7 +24,9 @@ public class AppSettingsComponent {
private final JBCheckBox showLineEndCommentJava = new JBCheckBox(" Java ");
private final JBCheckBox showLineEndCommentJavaBase = new JBCheckBox("// Java ");
private final JBCheckBox showLineEndCommentKotlin = new JBCheckBox(" Kotlin ");
+ private final JBCheckBox showLineEndCommentScala = new JBCheckBox(" Scala ");
private final JBCheckBox showLineEndCommentKotlinBase = new JBCheckBox("// Kotlin ");
+ private final JBCheckBox showLineEndCommentScalaBase = new JBCheckBox("// Scala ");
private final JBCheckBox showLineEndCommentJs = new JBCheckBox(" js ");
private final JBCheckBox showLineEndCommentJsBase = new JBCheckBox("// js ");
private final JBCheckBox showLineEndCommentPhp = new JBCheckBox(" php ");
@@ -69,19 +71,27 @@ public class AppSettingsComponent {
.addComponent(JPanelFactory.of(
showLineEndCommentJava,
showLineEndCommentKotlin,
+ showLineEndCommentScala
+ ), 1)
+ .addComponent(JPanelFactory.of(
+ showLineEndCommentJavaBase,
+ showLineEndCommentKotlinBase,
+ showLineEndCommentScalaBase
+ ), 1)
+ .addComponent(JPanelFactory.of(
showLineEndCommentJs,
showLineEndCommentPhp,
showLineEndCommentPy,
+
showLineEndCommentGo,
showLineEndCommentSql,
showLineEndCommentJson
), 1)
.addComponent(JPanelFactory.of(
- showLineEndCommentJavaBase,
- showLineEndCommentKotlinBase,
showLineEndCommentJsBase,
showLineEndCommentPhpBase,
showLineEndCommentPyBase,
+
showLineEndCommentRustBase,
showLineEndCommentCBase,
showLineEndCommentSwiftBase
@@ -184,6 +194,14 @@ public class AppSettingsComponent {
showLineEndCommentKotlin.setSelected(newStatus);
}
+ public boolean getShowLineEndCommentScala() {
+ return showLineEndCommentScala.isSelected();
+ }
+
+ public void setShowLineEndCommentScala(boolean newStatus) {
+ showLineEndCommentScala.setSelected(newStatus);
+ }
+
public boolean getShowLineEndCommentJs() {
return showLineEndCommentJs.isSelected();
}
@@ -232,6 +250,14 @@ public class AppSettingsComponent {
showLineEndCommentKotlinBase.setSelected(newStatus);
}
+ public boolean getShowLineEndCommentScalaBase() {
+ return showLineEndCommentScalaBase.isSelected();
+ }
+
+ public void setShowLineEndCommentScalaBase(boolean newStatus) {
+ showLineEndCommentScalaBase.setSelected(newStatus);
+ }
+
public boolean getShowLineEndCommentJsBase() {
return showLineEndCommentJsBase.isSelected();
}
diff --git a/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsConfigurable.java b/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsConfigurable.java
index 7fd9e0d..9e649a1 100644
--- a/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsConfigurable.java
+++ b/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsConfigurable.java
@@ -43,12 +43,14 @@ public class AppSettingsConfigurable implements Configurable {
modified |= mySettingsComponent.getLineEndCache() != settings.lineEndCache;
modified |= mySettingsComponent.getShowLineEndCommentJava() != settings.showLineEndCommentJava;
modified |= mySettingsComponent.getShowLineEndCommentKotlin() != settings.showLineEndCommentKotlin;
+ modified |= mySettingsComponent.getShowLineEndCommentScala() != settings.showLineEndCommentScala;
modified |= mySettingsComponent.getShowLineEndCommentJs() != settings.showLineEndCommentJs;
modified |= mySettingsComponent.getShowLineEndCommentPhp() != settings.showLineEndCommentPhp;
modified |= mySettingsComponent.getShowLineEndCommentPy() != settings.showLineEndCommentPy;
modified |= mySettingsComponent.getShowLineEndCommentGo() != settings.showLineEndCommentGo;
modified |= mySettingsComponent.getShowLineEndCommentJavaBase() != settings.showLineEndCommentJavaBase;
modified |= mySettingsComponent.getShowLineEndCommentKotlinBase() != settings.showLineEndCommentKotlinBase;
+ modified |= mySettingsComponent.getShowLineEndCommentScalaBase() != settings.showLineEndCommentScalaBase;
modified |= mySettingsComponent.getShowLineEndCommentJsBase() != settings.showLineEndCommentJsBase;
modified |= mySettingsComponent.getShowLineEndCommentPhpBase() != settings.showLineEndCommentPhpBase;
modified |= mySettingsComponent.getShowLineEndCommentPyBase() != settings.showLineEndCommentPyBase;
@@ -87,12 +89,14 @@ public class AppSettingsConfigurable implements Configurable {
settings.lineEndCache = mySettingsComponent.getLineEndCache();
settings.showLineEndCommentJava = mySettingsComponent.getShowLineEndCommentJava();
settings.showLineEndCommentKotlin = mySettingsComponent.getShowLineEndCommentKotlin();
+ settings.showLineEndCommentScala = mySettingsComponent.getShowLineEndCommentScala();
settings.showLineEndCommentJs = mySettingsComponent.getShowLineEndCommentJs();
settings.showLineEndCommentPhp = mySettingsComponent.getShowLineEndCommentPhp();
settings.showLineEndCommentPy = mySettingsComponent.getShowLineEndCommentPy();
settings.showLineEndCommentGo = mySettingsComponent.getShowLineEndCommentGo();
settings.showLineEndCommentJavaBase = mySettingsComponent.getShowLineEndCommentJavaBase();
settings.showLineEndCommentKotlinBase = mySettingsComponent.getShowLineEndCommentKotlinBase();
+ settings.showLineEndCommentScalaBase = mySettingsComponent.getShowLineEndCommentScalaBase();
settings.showLineEndCommentJsBase = mySettingsComponent.getShowLineEndCommentJsBase();
settings.showLineEndCommentPhpBase = mySettingsComponent.getShowLineEndCommentPhpBase();
settings.showLineEndCommentPyBase = mySettingsComponent.getShowLineEndCommentPyBase();
@@ -134,12 +138,14 @@ public class AppSettingsConfigurable implements Configurable {
mySettingsComponent.setLineEndCache(settings.lineEndCache);
mySettingsComponent.setShowLineEndCommentJava(settings.showLineEndCommentJava);
mySettingsComponent.setShowLineEndCommentKotlin(settings.showLineEndCommentKotlin);
+ mySettingsComponent.setShowLineEndCommentScala(settings.showLineEndCommentScala);
mySettingsComponent.setShowLineEndCommentJs(settings.showLineEndCommentJs);
mySettingsComponent.setShowLineEndCommentPhp(settings.showLineEndCommentPhp);
mySettingsComponent.setShowLineEndCommentPy(settings.showLineEndCommentPy);
mySettingsComponent.setShowLineEndCommentGo(settings.showLineEndCommentGo);
mySettingsComponent.setShowLineEndCommentJavaBase(settings.showLineEndCommentJavaBase);
mySettingsComponent.setShowLineEndCommentKotlinBase(settings.showLineEndCommentKotlinBase);
+ mySettingsComponent.setShowLineEndCommentScalaBase(settings.showLineEndCommentScalaBase);
mySettingsComponent.setShowLineEndCommentJsBase(settings.showLineEndCommentJsBase);
mySettingsComponent.setShowLineEndCommentPhpBase(settings.showLineEndCommentPhpBase);
mySettingsComponent.setShowLineEndCommentPyBase(settings.showLineEndCommentPyBase);
diff --git a/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsState.java b/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsState.java
index 410d2f7..daa53ad 100644
--- a/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsState.java
+++ b/src/main/java/io/github/linwancen/plugin/show/settings/AppSettingsState.java
@@ -33,6 +33,8 @@ public class AppSettingsState implements PersistentStateComponentEnglish Note
-- support Java Kotlin JS/TS PHP Python Go Rust C SQL
+
- support Java Kotlin Scala JS/TS PHP Python Go Rust C SQL
- tree doc from lang or README.md pom .gradle etc. by settings
- input `doc` `docc` -> /** */
- json doc from xxx.json.tsv
@@ -56,7 +56,7 @@ Show doc comment in the Project view Tree, line End, json, other
- 在结构树显示 文件注释 或 项目说明 (README.md pom.xml 等,可设置)
- 在行末尾显示 引用对象的文档注释,欢迎反馈您想要支持的语言,欢迎 C# 大神研究 CsLineEnd.java
-
- 目前支持 Java Kotlin JS/TS PHP Python Go Rust C SQL
+
- 目前支持 Java Kotlin Scala JS/TS PHP Python Go Rust C SQL
- 输入 doc / docc 等生成 /** */
- json 字段注释从 xxx.json.tsv 读取
- json 字典注释从 键名.tsv 读取
@@ -120,6 +120,8 @@ Show doc comment in the Project view Tree, line End, json, other
com.intellij.modules.platform
com.intellij.modules.java
org.jetbrains.kotlin
+
+ org.intellij.scala
com.intellij.database
JavaScript
com.jetbrains.php
diff --git a/src/main/resources/META-INF/scala.xml b/src/main/resources/META-INF/scala.xml
new file mode 100644
index 0000000..91465e5
--- /dev/null
+++ b/src/main/resources/META-INF/scala.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/ScalaClass.scala b/src/test/java/io/github/linwancen/plugin/show/demo/ScalaClass.scala
new file mode 100644
index 0000000..f6baf5f
--- /dev/null
+++ b/src/test/java/io/github/linwancen/plugin/show/demo/ScalaClass.scala
@@ -0,0 +1,21 @@
+/**
+ * Class
+ * [[ScalaClass#fun2()]]
+ */
+class ScalaClass {
+ /**
+ * fun
+ * call [[ScalaClass#fun2()]] method
+ */
+ private def fun(): Unit = {
+ fun2()
+ }
+
+ /**
+ * fun2
+ * @author name
+ */
+ def fun2(): Unit = {
+
+ }
+}