feat(ScalaLangDoc): support Scala | 支持 Scala

This commit is contained in:
林万程
2024-02-27 19:24:07 +08:00
parent 11eae9fa4d
commit 7e2b828434
11 changed files with 186 additions and 17 deletions

View File

@@ -13,7 +13,7 @@ Show doc comment in the Project view Tree, line End, json, other
<h2>English Note</h2>
<ul>
<li>support Java Kotlin JS/TS PHP Python Go Rust C SQL
<li>support Java Kotlin Scala JS/TS PHP Python Go Rust C SQL
<li>tree doc from lang or README.md pom .gradle etc. by settings
<li>input `doc` `docc` -> /** */
<li>json doc from xxx.json.tsv
@@ -58,7 +58,7 @@ Show doc comment in the Project view Tree, line End, json, other
<ul>
<li>在结构树显示 文件注释 或 项目说明 (README.md pom.xml 等,可设置)
<li>在行末尾显示 引用对象的文档注释,欢迎反馈您想要支持的语言,欢迎 C# 大神研究 CsLineEnd.java
<li>目前支持 Java Kotlin JS/TS PHP Python Go Rust C SQL
<li>目前支持 Java Kotlin Scala JS/TS PHP Python Go Rust C SQL
<li>输入 doc / docc 等生成 /** */
<li>json 字段注释从 xxx.json.tsv 读取
<li>json 字典注释从 键名.tsv 读取
@@ -121,7 +121,7 @@ Show doc comment in the Project view Tree, line End, json, other
<h2>English Change Notes:</h2>
<ul>
<li>2.16 Add line-end-comment support Rust, PHP, C/C++/Object C
<li>2.16 Add line-end-comment support Rust, PHP, C/C++/Object C, Scala
<li>2.15 Add line-end-comment java anno doc
<li>2.14 Add line-end-comment java enum doc for Yes(1, "Yes")
<li>2.13 ★ Cache for 2023.3
@@ -166,7 +166,7 @@ Show doc comment in the Project view Tree, line End, json, other
<h2>中文更新说明:</h2>
<ul>
<li>2.16 增加 行末注释 支持 Rust, PHP, C/C++/Object C
<li>2.16 增加 行末注释 支持 Rust, PHP, C/C++/Object C, Scala
<li>2.15 增加 行末注释 java 注解注释
<li>2.14 增加 行末注释 java 枚举注释用于 Yes(1, "是")
<li>2.13 ★ 缓存用于支持 2023.3

View File

@@ -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 = """
<h2>English Change Notes:</h2>
<ul>
<li>2.16 Add line-end-comment support Rust, PHP, C/C++/Object C
<li>2.16 Add line-end-comment support Rust, PHP, C/C++/Object C, Scala
<li>2.15 Add line-end-comment java anno doc
<li>2.14 Add line-end-comment java enum doc for Yes(1, "Yes")
<li>2.13 ★ Cache for 2023.3
@@ -136,7 +137,7 @@ patchPluginXml {
<h2>中文更新说明:</h2>
<ul>
<li>2.16 增加 行末注释 支持 Rust, PHP, C/C++/Object C
<li>2.16 增加 行末注释 支持 Rust, PHP, C/C++/Object C, Scala
<li>2.15 增加 行末注释 java 注解注释
<li>2.14 增加 行末注释 java 枚举注释用于 Yes(1, "是")
<li>2.13 ★ 缓存用于支持 2023.3

View File

@@ -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<PsiDocComment> {
@NotNull
@Override
protected <T extends SettingsInfo> String descDoc(@NotNull T info, @NotNull PsiDocComment psiDocComment) {
@NotNull PsiElement[] elements = psiDocComment.getDescriptionElements();
return elementsDesc(info, elements);
}
@NotNull
protected <T extends SettingsInfo> 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<PsiDocComment> {
}
/**
* @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<PsiDocComment> {
@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());
}
}
}
}

View File

@@ -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<Class<? extends PsiElement>> getRefClass() {
return List.of(ScReferenceExpression.class, ScDocResolvableCodeReference.class);
}
@Override
public boolean show(@NotNull LineInfo info) {
return info.appSettings.showLineEndCommentScala;
}
@Override
protected <T extends SettingsInfo> boolean parseBaseComment(@NotNull T info) {
return info.appSettings.showLineEndCommentScalaBase;
}
@Nullable
@Override
protected <T extends SettingsInfo> 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 <T extends SettingsInfo> 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 <T extends SettingsInfo> 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);
}
}
}
}

View File

@@ -18,6 +18,12 @@ public class OwnerToPsiDocSkip {
@Nullable
public static <T extends SettingsInfo> PsiDocComment refDoc(@NotNull T info,
@Nullable PsiDocCommentOwner docOwner) {
return SkipUtils.skipDoc(info, refDocWithOutSkip(info, docOwner));
}
@Nullable
public static <T extends SettingsInfo> 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;
}
}

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -33,6 +33,8 @@ public class AppSettingsState implements PersistentStateComponent<AppSettingsSta
public boolean showLineEndCommentJavaBase = false;
public boolean showLineEndCommentKotlin = true;
public boolean showLineEndCommentKotlinBase = false;
public boolean showLineEndCommentScala = true;
public boolean showLineEndCommentScalaBase = false;
public boolean showLineEndCommentJs = true;
public boolean showLineEndCommentJsBase = false;
public boolean showLineEndCommentPhp = true;

View File

@@ -11,7 +11,7 @@ Show doc comment in the Project view Tree, line End, json, other
<h2>English Note</h2>
<ul>
<li>support Java Kotlin JS/TS PHP Python Go Rust C SQL
<li>support Java Kotlin Scala JS/TS PHP Python Go Rust C SQL
<li>tree doc from lang or README.md pom .gradle etc. by settings
<li>input `doc` `docc` -> /** */
<li>json doc from xxx.json.tsv
@@ -56,7 +56,7 @@ Show doc comment in the Project view Tree, line End, json, other
<ul>
<li>在结构树显示 文件注释 或 项目说明 (README.md pom.xml 等,可设置)
<li>在行末尾显示 引用对象的文档注释,欢迎反馈您想要支持的语言,欢迎 C# 大神研究 CsLineEnd.java
<li>目前支持 Java Kotlin JS/TS PHP Python Go Rust C SQL
<li>目前支持 Java Kotlin Scala JS/TS PHP Python Go Rust C SQL
<li>输入 doc / docc 等生成 /** */
<li>json 字段注释从 xxx.json.tsv 读取
<li>json 字典注释从 键名.tsv 读取
@@ -120,6 +120,8 @@ Show doc comment in the Project view Tree, line End, json, other
<depends>com.intellij.modules.platform</depends>
<depends optional="true" config-file="java.xml">com.intellij.modules.java</depends>
<depends optional="true" config-file="kotlin.xml">org.jetbrains.kotlin</depends>
<!--suppress PluginXmlValidity -->
<depends optional="true" config-file="scala.xml">org.intellij.scala</depends>
<depends optional="true" config-file="sql.xml">com.intellij.database</depends>
<depends optional="true" config-file="js.xml">JavaScript</depends>
<depends optional="true" config-file="php.xml">com.jetbrains.php</depends>

View File

@@ -0,0 +1,5 @@
<idea-plugin>
<extensions defaultExtensionNs="com.intellij">
<editor.linePainter implementation="io.github.linwancen.plugin.show.java.ScalaLangDoc"/>
</extensions>
</idea-plugin>

View File

@@ -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 = {
}
}