From 432e58d658c96f4958333cb84623b1ba50d8ecfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E4=B8=87=E7=A8=8B?= <1498425439@qq.com> Date: Sun, 23 Oct 2022 16:26:09 +0800 Subject: [PATCH] =?UTF-8?q?2.03=20support=20all=20JetBrains=20IDE=20SQL,?= =?UTF-8?q?=20JavaScript,=20Python,=20Golang,=20Kotlin;=20add=20doc=20live?= =?UTF-8?q?-templates=20|=20=E6=94=AF=E6=8C=81=E6=89=80=E6=9C=89=20JetBrai?= =?UTF-8?q?ns=20=E8=BD=AF=E4=BB=B6=E5=92=8C=E4=B8=BB=E6=B5=81=E8=AF=AD?= =?UTF-8?q?=E8=A8=80;=20=E5=A2=9E=E5=8A=A0=E8=BE=93=E5=85=A5=20doc=20/=20d?= =?UTF-8?q?occ=20=E7=AD=89=E7=94=9F=E6=88=90=20/**=20*/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 80 +++--- build.gradle | 137 +++++++--- gradle.properties | 40 ++- out/production/resources/META-INF/cs.xml | 5 + out/production/resources/META-INF/go.xml | 5 + out/production/resources/META-INF/java.xml | 6 + out/production/resources/META-INF/js.xml | 5 + out/production/resources/META-INF/kotlin.xml | 5 + out/production/resources/META-INF/plugin.xml | 132 +++++++++ .../resources/META-INF/pluginIcon.svg | 12 + out/production/resources/META-INF/python.xml | 5 + out/production/resources/META-INF/sql.xml | 5 + .../liveTemplates/show-comment-doc.xml | 254 ++++++++++++++++++ .../liveTemplates/show-comment-xml.xml | 12 + .../plugin/show/java/JavaLangDoc.java | 162 +++++++++++ .../linwancen/plugin/show/java/JavaTree.java | 133 +++++++++ .../plugin/show/java/JsonJumpJava.java} | 12 +- .../plugin/show/java/KotlinLangDoc.java | 66 +++++ .../show/java}/doc/OwnerToPsiDocUtils.java | 5 +- .../show/java}/doc/PackageFileToPsiDoc.java | 2 +- .../plugin/show/java}/doc/PsiClassUtils.java | 2 +- .../plugin/show/java}/doc/PsiDocToStrDoc.java | 39 +-- .../show/java}/doc/PsiMethodToPsiDoc.java | 5 +- .../java}/line/FileViewToDocStrUtils.java | 10 +- .../line/FileViewToPsiDocLeftToRight.java | 5 +- .../line/FileViewToPsiDocRightToLeft.java | 5 +- .../plugin/show/java}/line/JsonToPsiDoc.java | 15 +- .../show/java}/line/NewCallRefToPsiDoc.java | 58 +++- .../show/java}/line/OwnerToPsiDocSkip.java | 10 +- .../plugin/show/java}/line/SkipUtils.java | 57 +--- .../github/linwancen/plugin/show/LineEnd.java | 73 ++--- .../linwancen/plugin/show/LineEndAdd.java | 30 +-- .../linwancen/plugin/show/LineEndCopy.java | 43 +-- .../io/github/linwancen/plugin/show/Tree.java | 136 ++-------- .../linwancen/plugin/show/bean/FileInfo.java | 56 ++++ .../linwancen/plugin/show/bean/FuncEnum.java | 37 +++ .../linwancen/plugin/show/bean/LineInfo.java | 49 ++++ .../plugin/show/bean/SettingsInfo.java | 29 ++ .../linwancen/plugin/show/ext/LineExt.java | 56 ++-- .../linwancen/plugin/show/ext/TreeExt.java | 12 +- .../plugin/show/ext/conf/ConfCache.java | 12 +- .../show/ext/conf/ConfCacheGetUtils.java | 2 +- .../plugin/show/ext/conf/ConfFactory.java | 2 - .../linwancen/plugin/show/jump/JsonRef.java | 15 +- .../linwancen/plugin/show/lang/GoLangDoc.java | 37 +++ .../linwancen/plugin/show/lang/JsLangDoc.java | 45 ++++ .../plugin/show/lang/JsonLangDoc.java | 63 +++++ .../plugin/show/lang/PythonLangDoc.java | 25 ++ .../plugin/show/lang/SqlLangDoc.java | 50 ++++ .../plugin/show/lang/base/BaseLangDoc.java | 202 ++++++++++++++ .../plugin/show/lang/base/BaseTagLangDoc.java | 58 ++++ .../plugin/show/lang/base/DocFilter.java | 101 +++++++ .../plugin/show/lang/base/DocSkip.java | 67 +++++ .../linwancen/plugin/show/lang/base/Prev.java | 88 ++++++ .../plugin/show/lang/base/PsiElementTo.java | 36 +++ .../plugin/show/lang/base/ResolveDoc.java | 85 ++++++ .../show/settings/AppSettingsComponent.java | 130 ++++++--- .../settings/AppSettingsConfigurable.java | 59 ++-- .../show/settings/AppSettingsState.java | 17 +- .../settings/ProjectSettingsConfigurable.java | 2 - src/main/resources/META-INF/cs.xml | 5 + src/main/resources/META-INF/go.xml | 5 + src/main/resources/META-INF/java.xml | 6 + src/main/resources/META-INF/js.xml | 5 + src/main/resources/META-INF/kotlin.xml | 5 + src/main/resources/META-INF/plugin.xml | 20 +- src/main/resources/META-INF/pluginIcon.svg | 12 + src/main/resources/META-INF/python.xml | 5 + src/main/resources/META-INF/sql.xml | 5 + .../liveTemplates/show-comment-doc.xml | 254 ++++++++++++++++++ .../liveTemplates/show-comment-xml.xml | 12 + .../linwancen/plugin/show/lang/CsLineEnd.java | 29 ++ .../github/linwancen/plugin/show/demo/Cs.cs | 13 + .../linwancen/plugin/show/demo/Golang.go | 76 ++++++ .../linwancen/plugin/show/demo/HTML.html | 25 ++ .../linwancen/plugin/show/demo/JavaScript.js | 23 ++ .../plugin/show/demo/JavaScriptObject.js | 43 +++ .../linwancen/plugin/show/demo/Python.py | 37 +++ .../io/github/linwancen/plugin/show/demo/c.c | 0 .../show/demo/ext/cobol/doc/cbl.doc.tsv | 4 +- .../linwancen/plugin/show/demo/java/Call.java | 6 +- .../plugin/show/demo/java/InDoc.java | 1 + .../linwancen/plugin/show/demo/java/Kotlin.kt | 32 +++ .../plugin/show/demo/java/Param.java | 12 + .../linwancen/plugin/show/demo/java/Ref.java | 3 + .../plugin/show/demo/java/obj/Child.java | 4 +- .../{array-Pojo.json => array-Pojo.json5} | 0 .../github/linwancen/plugin/show/demo/sql.sql | 1 + .../base/DocFilterTest.java} | 11 +- .../base/DocSkipTest.java} | 12 +- 90 files changed, 3062 insertions(+), 510 deletions(-) create mode 100644 out/production/resources/META-INF/cs.xml create mode 100644 out/production/resources/META-INF/go.xml create mode 100644 out/production/resources/META-INF/java.xml create mode 100644 out/production/resources/META-INF/js.xml create mode 100644 out/production/resources/META-INF/kotlin.xml create mode 100644 out/production/resources/META-INF/plugin.xml create mode 100644 out/production/resources/META-INF/pluginIcon.svg create mode 100644 out/production/resources/META-INF/python.xml create mode 100644 out/production/resources/META-INF/sql.xml create mode 100644 out/production/resources/liveTemplates/show-comment-doc.xml create mode 100644 out/production/resources/liveTemplates/show-comment-xml.xml create mode 100644 src/main/idea/io/github/linwancen/plugin/show/java/JavaLangDoc.java create mode 100644 src/main/idea/io/github/linwancen/plugin/show/java/JavaTree.java rename src/main/{java/io/github/linwancen/plugin/show/JsonJump.java => idea/io/github/linwancen/plugin/show/java/JsonJumpJava.java} (89%) create mode 100644 src/main/idea/io/github/linwancen/plugin/show/java/KotlinLangDoc.java rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/doc/OwnerToPsiDocUtils.java (94%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/doc/PackageFileToPsiDoc.java (96%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/doc/PsiClassUtils.java (98%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/doc/PsiDocToStrDoc.java (76%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/doc/PsiMethodToPsiDoc.java (92%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/line/FileViewToDocStrUtils.java (91%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/line/FileViewToPsiDocLeftToRight.java (93%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/line/FileViewToPsiDocRightToLeft.java (92%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/line/JsonToPsiDoc.java (76%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/line/NewCallRefToPsiDoc.java (81%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/line/OwnerToPsiDocSkip.java (79%) rename src/main/{java/io/github/linwancen/plugin/show => idea/io/github/linwancen/plugin/show/java}/line/SkipUtils.java (53%) create mode 100644 src/main/java/io/github/linwancen/plugin/show/bean/FileInfo.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/bean/FuncEnum.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/bean/LineInfo.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/bean/SettingsInfo.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/GoLangDoc.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/JsLangDoc.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/JsonLangDoc.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/PythonLangDoc.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/SqlLangDoc.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/base/BaseLangDoc.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/base/BaseTagLangDoc.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/base/DocFilter.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/base/DocSkip.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/base/Prev.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/base/PsiElementTo.java create mode 100644 src/main/java/io/github/linwancen/plugin/show/lang/base/ResolveDoc.java create mode 100644 src/main/resources/META-INF/cs.xml create mode 100644 src/main/resources/META-INF/go.xml create mode 100644 src/main/resources/META-INF/java.xml create mode 100644 src/main/resources/META-INF/js.xml create mode 100644 src/main/resources/META-INF/kotlin.xml create mode 100644 src/main/resources/META-INF/pluginIcon.svg create mode 100644 src/main/resources/META-INF/python.xml create mode 100644 src/main/resources/META-INF/sql.xml create mode 100644 src/main/resources/liveTemplates/show-comment-doc.xml create mode 100644 src/main/resources/liveTemplates/show-comment-xml.xml create mode 100644 src/main/rider/io/github/linwancen/plugin/show/lang/CsLineEnd.java create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/Cs.cs create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/Golang.go create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/HTML.html create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/JavaScript.js create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/JavaScriptObject.js create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/Python.py create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/c.c create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/java/Kotlin.kt create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/java/Param.java rename src/test/java/io/github/linwancen/plugin/show/demo/json/{array-Pojo.json => array-Pojo.json5} (100%) create mode 100644 src/test/java/io/github/linwancen/plugin/show/demo/sql.sql rename src/test/java/io/github/linwancen/plugin/show/{doc/PsiDocToStrDocTest.java => lang/base/DocFilterTest.java} (82%) rename src/test/java/io/github/linwancen/plugin/show/{line/PsiClassSkipTest.java => lang/base/DocSkipTest.java} (93%) diff --git a/README.md b/README.md index 9133a18..941148d 100644 --- a/README.md +++ b/README.md @@ -61,58 +61,66 @@ Show doc comment at the Project view Tree, line End, json etc.

English Change Notes:

中文更新说明:

diff --git a/build.gradle b/build.gradle index cd9c1c8..56b1128 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,10 @@ plugins { + // New:https://github.com/JetBrains/gradle-intellij-plugin/releases id 'org.jetbrains.intellij' version '1.3.1' - id 'java' } group 'io.github.linwancen' -version '1.24.0.' + (new Date().format('yyyy.MM.dd_HH.mm')) - -apply plugin: 'java' +version '2.03.0.' + (new Date().format('yyyy.MM.dd_HH.mm')) repositories { mavenCentral() @@ -17,10 +15,57 @@ dependencies { testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' } +def system = org.gradle.internal.os.OperatingSystem.current() +def ideTypeStr = String.valueOf(ideType) + // See https://github.com/JetBrains/gradle-intellij-plugin/ intellij { - version = ideaVersion - plugins = ['java'] + type = ideType + if (system.isMacOsX()) { + localPath = "/Applications/IntelliJ IDEA.app" + } else { + version = ideaVersion + } + // see https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#intellij-extension-plugins + plugins = [ + 'Pythonid:201.6668.121', + ] + if ('IC' == ideTypeStr || 'IU' == ideTypeStr) { + plugins.add('java') + plugins.add('org.jetbrains.kotlin') + } + if (!ideTypeStr.endsWith('C')) { + plugins.add('JavaScript') + plugins.add('com.intellij.database') + plugins.add('org.jetbrains.plugins.go:201.6668.60.126') + } +} + +sourceSets { + // can not use plugin in IDEA IU + if ('RD' == ideTypeStr) { + main { + java { + srcDirs = ['src/main/java', 'src/main/rider'] + } + } + test { + java { + srcDirs = ['src/test/java', 'src/test/rider'] + } + } + } else { + main { + java { + srcDirs = ['src/main/java', 'src/main/idea'] + } + } + test { + java { + srcDirs = ['src/test/java', 'src/test/idea'] + } + } + } } tasks.withType(JavaCompile) { @@ -39,58 +84,66 @@ patchPluginXml { changeNotes = """

English Change Notes:

中文更新说明:

""" } diff --git a/gradle.properties b/gradle.properties index 813fac9..c4794bb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1,39 @@ -ideaVersion=2020.1 \ No newline at end of file +ideaVersion=2020.1 + +# Local area network HTTPS solves SSL problems +#systemProp.javax.net.ssl.trustStore=file_name.jks +#StorePassword=should_be_set_elsewhere + +#IntelliJ IDEA Ultimate Edition +ideType=IU + + +# region can use plugin in IDEA IU + +#IntelliJ IDEA Community Edition +#ideType=IC + +#GoLand +#ideType=GO + +#PyCharm Professional Edition +#ideType=PY + +#PyCharm Community Edition +#ideType=PC + +# endregion + + + +#CLion +#ideType=CL + +#Rider +#ideType=RD + +#JPS-only +#ideType=JP + +#Gateway +#ideType=GW \ No newline at end of file diff --git a/out/production/resources/META-INF/cs.xml b/out/production/resources/META-INF/cs.xml new file mode 100644 index 0000000..378e6e1 --- /dev/null +++ b/out/production/resources/META-INF/cs.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/out/production/resources/META-INF/go.xml b/out/production/resources/META-INF/go.xml new file mode 100644 index 0000000..83c4946 --- /dev/null +++ b/out/production/resources/META-INF/go.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/out/production/resources/META-INF/java.xml b/out/production/resources/META-INF/java.xml new file mode 100644 index 0000000..34293ac --- /dev/null +++ b/out/production/resources/META-INF/java.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/out/production/resources/META-INF/js.xml b/out/production/resources/META-INF/js.xml new file mode 100644 index 0000000..448e4da --- /dev/null +++ b/out/production/resources/META-INF/js.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/out/production/resources/META-INF/kotlin.xml b/out/production/resources/META-INF/kotlin.xml new file mode 100644 index 0000000..58051d5 --- /dev/null +++ b/out/production/resources/META-INF/kotlin.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/out/production/resources/META-INF/plugin.xml b/out/production/resources/META-INF/plugin.xml new file mode 100644 index 0000000..a9c4175 --- /dev/null +++ b/out/production/resources/META-INF/plugin.xml @@ -0,0 +1,132 @@ + + io.github.linwancen.show-comment + Show Comment + 林万程 + + English Notes: + + +

External Comment:

+Demo(GitHub) + + + +

中文说明:

+ + +

外部注释:

+示例(Gitee) +:比如你要给 .go 的文件配置文件注释可以放在相同目录或父目录的 xxx.go.tree.tsv 中 + + +如果对你有所帮助,别忘了给本项目 +GitHub +主页一个 Start,您的支持是项目前进的动力。 + ]]>
+ + + com.intellij.modules.java + com.intellij.database + JavaScript + com.intellij.modules.python + org.jetbrains.plugins.go + org.jetbrains.kotlin + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/out/production/resources/META-INF/pluginIcon.svg b/out/production/resources/META-INF/pluginIcon.svg new file mode 100644 index 0000000..22a4863 --- /dev/null +++ b/out/production/resources/META-INF/pluginIcon.svg @@ -0,0 +1,12 @@ + + + / + / + + + \ No newline at end of file diff --git a/out/production/resources/META-INF/python.xml b/out/production/resources/META-INF/python.xml new file mode 100644 index 0000000..4f45f9c --- /dev/null +++ b/out/production/resources/META-INF/python.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/out/production/resources/META-INF/sql.xml b/out/production/resources/META-INF/sql.xml new file mode 100644 index 0000000..6045846 --- /dev/null +++ b/out/production/resources/META-INF/sql.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/out/production/resources/liveTemplates/show-comment-doc.xml b/out/production/resources/liveTemplates/show-comment-doc.xml new file mode 100644 index 0000000..ad25ff4 --- /dev/null +++ b/out/production/resources/liveTemplates/show-comment-doc.xml @@ -0,0 +1,254 @@ + + + + + + + + + + \ No newline at end of file diff --git a/out/production/resources/liveTemplates/show-comment-xml.xml b/out/production/resources/liveTemplates/show-comment-xml.xml new file mode 100644 index 0000000..dbcddc9 --- /dev/null +++ b/out/production/resources/liveTemplates/show-comment-xml.xml @@ -0,0 +1,12 @@ + + + \ No newline at end of file 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 new file mode 100644 index 0000000..c871213 --- /dev/null +++ b/src/main/idea/io/github/linwancen/plugin/show/java/JavaLangDoc.java @@ -0,0 +1,162 @@ +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.util.PsiTreeUtil; +import io.github.linwancen.plugin.show.java.doc.OwnerToPsiDocUtils; +import io.github.linwancen.plugin.show.java.line.OwnerToPsiDocSkip; +import io.github.linwancen.plugin.show.bean.LineInfo; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import io.github.linwancen.plugin.show.lang.base.BaseTagLangDoc; +import io.github.linwancen.plugin.show.lang.base.DocFilter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class JavaLangDoc extends BaseTagLangDoc { + + public static final JavaLangDoc INSTANCE = new JavaLangDoc(); + + static { + LANG_DOC_MAP.put(JavaLanguage.INSTANCE.getID(), INSTANCE); + } + + @Override + public @NotNull Class getRefClass() { + return PsiJavaCodeReferenceElement.class; + } + + @Override + public boolean show(@NotNull LineInfo lineInfo) { + return lineInfo.appSettings.showLineEndCommentJava; + } + + @Override + public @Nullable String treeDoc(T settingsInfo, ProjectViewNode node, Project project) { + return JavaTree.treeDoc(settingsInfo, node, project); + } + + @Override + protected @Nullable String refDoc(@NotNull T lineInfo, @NotNull PsiElement ref) { + if ("Override".equals(ref.getText())) { + PsiMethod psiMethod = PsiTreeUtil.getParentOfType(ref, PsiMethod.class); + if (psiMethod == null) { + return null; + } + // must supper + PsiDocComment psiDocComment = OwnerToPsiDocUtils.supperMethodDoc(psiMethod); + return docElementToStr(lineInfo, psiDocComment); + } + if (lineInfo.appSettings.fromNew) { + PsiElement parent = ref.getParent(); + if (parent instanceof PsiNewExpression) { + PsiNewExpression psiNewExpression = (PsiNewExpression) parent; + try { + PsiMethod resolve = psiNewExpression.resolveMethod(); + if (resolve != null) { + return resolveDocPrint(lineInfo, resolve); + } + } catch (Throwable ignore) { + // ignore + } + } + } + return super.refDoc(lineInfo, ref); + } + + @Override + public @Nullable String resolveDocPrint(@NotNull T lineInfo, @NotNull PsiElement resolve) { + String resolveDocPrint = super.resolveDocPrint(lineInfo, resolve); + if (resolveDocPrint != null) { + return resolveDocPrint; + } + if (lineInfo.appSettings.fromParam && resolve instanceof PsiParameter) { + return paramDoc((PsiParameter) resolve); + } + return null; + } + + @Nullable + private String paramDoc(@NotNull PsiParameter psiParameter) { + PsiMethod method = PsiTreeUtil.getParentOfType(psiParameter, PsiMethod.class); + if (method == null) { + return null; + } + PsiDocComment psiDocComment = OwnerToPsiDocUtils.methodDoc(method); + if (psiDocComment == null) { + return null; + } + String name = psiParameter.getName(); + PsiDocTag[] params = psiDocComment.findTagsByName("param"); + for (PsiDocTag param : params) { + PsiDocTagValue value = param.getValueElement(); + if (value != null && name.equals(value.getText())) { + PsiElement[] dataElements = param.getDataElements(); + if (dataElements.length > 1) { + return dataElements[1].getText(); + } + } + } + return null; + } + + @Nullable + @Override + protected PsiDocComment toDocElement(@NotNull PsiElement resolve) { + if (resolve instanceof PsiDocCommentOwner) { + PsiDocCommentOwner psiDocCommentOwner = (PsiDocCommentOwner) resolve; + return OwnerToPsiDocSkip.refDoc(psiDocCommentOwner); + } + return null; + } + + @NotNull + @Override + protected String descDoc(@NotNull T lineInfo, @NotNull PsiDocComment psiDocComment) { + StringBuilder sb = new StringBuilder(); + int lineCount = 0; + PsiElement[] elements = psiDocComment.getDescriptionElements(); + for (PsiElement element : elements) { + if (appendElementText(sb, element)) { + lineCount++; + } + if (DocFilter.lineCountOrLenOver(lineInfo.appSettings, sb, lineCount)) { + break; + } + } + return sb.toString(); + } + + /** + * @return is new line + */ + private static boolean appendElementText(StringBuilder sb, PsiElement element) { + if (element instanceof PsiDocToken) { + PsiDocToken psiDocToken = (PsiDocToken) element; + DocFilter.addHtml(sb, psiDocToken.getText()); + } + if (element instanceof PsiInlineDocTag) { + PsiInlineDocTag psiInlineDocTag = (PsiInlineDocTag) element; + PsiElement[] children = psiInlineDocTag.getChildren(); + if (children.length > 3) { + DocFilter.addHtml(sb, children[3].getText()); + } + } + return element instanceof PsiWhiteSpace && sb.length() > 0; + } + + @Override + protected void appendTag(@NotNull T lineInfo, @NotNull StringBuilder tagStrBuilder, + @NotNull PsiDocComment psiDocComment, @NotNull String name) { + PsiDocTag[] tags = psiDocComment.findTagsByName(name); + for (PsiDocTag tag : tags) { + // @see @param should use getDataElements() + PsiDocTagValue value = tag.getValueElement(); + if (value != null) { + DocFilter.addHtml(tagStrBuilder, value.getText()); + } + } + } +} diff --git a/src/main/idea/io/github/linwancen/plugin/show/java/JavaTree.java b/src/main/idea/io/github/linwancen/plugin/show/java/JavaTree.java new file mode 100644 index 0000000..132a4cb --- /dev/null +++ b/src/main/idea/io/github/linwancen/plugin/show/java/JavaTree.java @@ -0,0 +1,133 @@ +package io.github.linwancen.plugin.show.java; + +import com.intellij.ide.projectView.ProjectViewNode; +import com.intellij.ide.projectView.impl.nodes.PackageElementNode; +import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; +import com.intellij.ide.projectView.impl.nodes.PsiFieldNode; +import com.intellij.ide.projectView.impl.nodes.PsiFileNode; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.*; +import com.intellij.psi.impl.source.PsiClassReferenceType; +import com.intellij.psi.javadoc.PsiDocComment; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import io.github.linwancen.plugin.show.java.doc.OwnerToPsiDocUtils; +import io.github.linwancen.plugin.show.java.line.NewCallRefToPsiDoc; +import io.github.linwancen.plugin.show.settings.AppSettingsState; +import org.jetbrains.annotations.Nullable; + +public class JavaTree { + + private JavaTree() {} + + @Nullable + public static String treeDoc(T settingsInfo, ProjectViewNode node, Project project) { + PsiDocComment docComment = nodeDoc(node, project); + if (docComment == null) { + return null; + } + return JavaLangDoc.INSTANCE.docElementToStr(settingsInfo, docComment); + } + + @Nullable + static PsiDocComment nodeDoc(ProjectViewNode node, Project project) { + if (node instanceof PsiFileNode) { + PsiFile psiFile = ((PsiFileNode) node).getValue(); + return OwnerToPsiDocUtils.fileDoc(psiFile); + } + if (node instanceof PsiDirectoryNode) { + PsiDirectory psiDirectory = ((PsiDirectoryNode) node).getValue(); + return dirDoc(psiDirectory); + } + + // if (node instanceof PsiMethodNode) { + // // On Show Members + // PsiMethod psiMethod = ((PsiMethodNode) node).getValue(); + // PsiDocComment psiDocComment = OwnerToPsiDocUtils.methodDoc(psiMethod); + // if (psiDocComment != null) { + // System.out.println("PsiMethodNode" + PsiDocToStrDoc.text(psiDocComment, true)); + // } + // return psiDocComment; + // } + if (node instanceof PsiFieldNode) { + // On Show Members + PsiField psiField = ((PsiFieldNode) node).getValue(); + // PsiDocComment docComment = OwnerToPsiDocUtils.srcOrByteCodeDoc(psiField); + // if (docComment != null) { + // System.out.println("PsiFieldNode" + PsiDocToStrDoc.text(docComment, true)); + // return docComment; + // } + // for @Autowire Bean + PsiType type = psiField.getType(); + if (type instanceof PsiClassReferenceType) { + PsiClassReferenceType psiClassReferenceType = (PsiClassReferenceType) type; + PsiJavaCodeReferenceElement reference = psiClassReferenceType.getReference(); + return NewCallRefToPsiDoc.javaCodeDoc(reference); + } + } + + // if (node instanceof ClassTreeNode) { + // // On Packages View, Project Files View, Show Members + // PsiClass psiClass = ((ClassTreeNode) node).getValue(); + // PsiDocComment psiDocComment = OwnerToPsiDocUtils.srcOrByteCodeDoc(psiClass); + // if (psiDocComment != null) { + // System.out.println("ClassTreeNode" + PsiDocToStrDoc.text(psiDocComment, true)); + // } + // return psiDocComment; + // } + if (node instanceof PackageElementNode) { + // On Packages View + PsiPackage psiPackage = ((PackageElementNode) node).getValue().getPackage(); + return packageDoc(psiPackage); + } + + // On Packages View, Project Files View + VirtualFile virtualFile = node.getVirtualFile(); + if (virtualFile == null || !virtualFile.isDirectory()) { + return null; + } + PsiDirectory psiDirectory = PsiManager.getInstance(project).findDirectory(virtualFile); + if (psiDirectory == null) { + return null; + } + return dirDoc(psiDirectory); + } + + @Nullable + static PsiDocComment dirDoc(PsiDirectory child) { + while (true) { + PsiDocComment docComment = OwnerToPsiDocUtils.dirDoc(child); + if (docComment != null) { + return docComment; + } + AppSettingsState instance = AppSettingsState.getInstance(); + if (!instance.compact) { + return null; + } + PsiDirectory parent = child.getParent(); + if (parent == null) { + return null; + } + if (parent.getChildren().length != 1) { + return null; + } + child = parent; + } + } + + @Nullable + static PsiDocComment packageDoc(PsiPackage child) { + while (true) { + PsiDocComment docComment = OwnerToPsiDocUtils.packageDoc(child); + if (docComment != null) { + return docComment; + } + PsiPackage parent = child.getParentPackage(); + if (parent == null) { + return null; + } + // PsiPackage not implemented getChildren() + child = parent; + } + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/JsonJump.java b/src/main/idea/io/github/linwancen/plugin/show/java/JsonJumpJava.java similarity index 89% rename from src/main/java/io/github/linwancen/plugin/show/JsonJump.java rename to src/main/idea/io/github/linwancen/plugin/show/java/JsonJumpJava.java index a5af3ed..9f4af59 100644 --- a/src/main/java/io/github/linwancen/plugin/show/JsonJump.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/JsonJumpJava.java @@ -1,4 +1,4 @@ -package io.github.linwancen.plugin.show; +package io.github.linwancen.plugin.show.java; import com.intellij.json.psi.JsonProperty; import com.intellij.json.psi.JsonStringLiteral; @@ -8,7 +8,7 @@ import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ProcessingContext; -import io.github.linwancen.plugin.show.doc.PsiClassUtils; +import io.github.linwancen.plugin.show.java.doc.PsiClassUtils; import io.github.linwancen.plugin.show.jump.JsonRef; import org.jetbrains.annotations.NotNull; @@ -16,15 +16,15 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class JsonJump extends PsiReferenceContributor { +public class JsonJumpJava extends PsiReferenceContributor { @Override public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) { registrar.registerReferenceProvider(PlatformPatterns.psiElement(JsonStringLiteral.class), new PsiReferenceProvider() { @Override - public PsiReference @NotNull [] getReferencesByElement(@NotNull PsiElement element, - @NotNull ProcessingContext context) { + public @NotNull PsiReference[] getReferencesByElement(@NotNull PsiElement element, + @NotNull ProcessingContext context) { JsonProperty jsonProp = PsiTreeUtil.getParentOfType(element, JsonProperty.class, true); if (jsonProp == null) { return PsiReference.EMPTY_ARRAY; @@ -43,7 +43,7 @@ public class JsonJump extends PsiReferenceContributor { List list = new ArrayList<>(); for (PsiField psiField : psiFields) { - list.add(new JsonRef(element, psiField, tips)); + list.add(new JsonRef<>(element, psiField, tips)); } return list.toArray(new PsiReference[0]); } 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 new file mode 100644 index 0000000..b1ee817 --- /dev/null +++ b/src/main/idea/io/github/linwancen/plugin/show/java/KotlinLangDoc.java @@ -0,0 +1,66 @@ +package io.github.linwancen.plugin.show.java; + +import com.intellij.psi.PsiElement; +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.lang.base.BaseTagLangDoc; +import io.github.linwancen.plugin.show.lang.base.DocFilter; +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.KDocSection; +import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag; +import org.jetbrains.kotlin.psi.KtNameReferenceExpression; + +import java.util.List; + +public class KotlinLangDoc extends BaseTagLangDoc { + + static { + LANG_DOC_MAP.put(KotlinLanguage.INSTANCE.getID(), new KotlinLangDoc()); + } + + @Override + public @NotNull Class getRefClass() { + return KtNameReferenceExpression.class; + } + + @Override + public boolean show(@NotNull LineInfo lineInfo) { + return lineInfo.appSettings.showLineEndCommentKotlin; + } + + @Override + @Nullable + protected KDocSection toDocElement(@NotNull PsiElement resolve) { + if (resolve instanceof PsiPackageBase) { + return null; + } + KDoc kDoc = PsiTreeUtil.getChildOfType(resolve, KDoc.class); + if (kDoc == null) { + return null; + } + return kDoc.getDefaultSection(); + } + + @NotNull + @Override + protected String descDoc(@NotNull T lineInfo, @NotNull KDocSection kDocSection) { + String content = kDocSection.getContent(); + return DocFilter.cutDoc(content, lineInfo.appSettings, false); + } + + @Override + protected void appendTag(@NotNull T lineInfo, @NotNull StringBuilder tagStrBuilder, + @NotNull KDocSection kDocSection, @NotNull String name) { + List tags = kDocSection.findTagsByName(name); + for (KDocTag tag : tags) { + String content = tag.getContent(); + String cutDoc = DocFilter.cutDoc(content, lineInfo.appSettings, false); + tagStrBuilder.append(cutDoc); + } + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/doc/OwnerToPsiDocUtils.java b/src/main/idea/io/github/linwancen/plugin/show/java/doc/OwnerToPsiDocUtils.java similarity index 94% rename from src/main/java/io/github/linwancen/plugin/show/doc/OwnerToPsiDocUtils.java rename to src/main/idea/io/github/linwancen/plugin/show/java/doc/OwnerToPsiDocUtils.java index c4f19a0..ff30dec 100644 --- a/src/main/java/io/github/linwancen/plugin/show/doc/OwnerToPsiDocUtils.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/doc/OwnerToPsiDocUtils.java @@ -1,8 +1,9 @@ -package io.github.linwancen.plugin.show.doc; +package io.github.linwancen.plugin.show.java.doc; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.javadoc.PsiDocComment; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -21,7 +22,7 @@ public class OwnerToPsiDocUtils { } @Nullable - public static PsiDocComment methodDoc(PsiMethod psiMethod) { + public static PsiDocComment methodDoc(@NotNull PsiMethod psiMethod) { return PsiMethodToPsiDoc.methodSupperNewPropDoc(psiMethod); } diff --git a/src/main/java/io/github/linwancen/plugin/show/doc/PackageFileToPsiDoc.java b/src/main/idea/io/github/linwancen/plugin/show/java/doc/PackageFileToPsiDoc.java similarity index 96% rename from src/main/java/io/github/linwancen/plugin/show/doc/PackageFileToPsiDoc.java rename to src/main/idea/io/github/linwancen/plugin/show/java/doc/PackageFileToPsiDoc.java index d5f5c68..6855283 100644 --- a/src/main/java/io/github/linwancen/plugin/show/doc/PackageFileToPsiDoc.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/doc/PackageFileToPsiDoc.java @@ -1,4 +1,4 @@ -package io.github.linwancen.plugin.show.doc; +package io.github.linwancen.plugin.show.java.doc; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiFile; diff --git a/src/main/java/io/github/linwancen/plugin/show/doc/PsiClassUtils.java b/src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiClassUtils.java similarity index 98% rename from src/main/java/io/github/linwancen/plugin/show/doc/PsiClassUtils.java rename to src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiClassUtils.java index 7f8f628..af34b81 100644 --- a/src/main/java/io/github/linwancen/plugin/show/doc/PsiClassUtils.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiClassUtils.java @@ -1,4 +1,4 @@ -package io.github.linwancen.plugin.show.doc; +package io.github.linwancen.plugin.show.java.doc; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; diff --git a/src/main/java/io/github/linwancen/plugin/show/doc/PsiDocToStrDoc.java b/src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiDocToStrDoc.java similarity index 76% rename from src/main/java/io/github/linwancen/plugin/show/doc/PsiDocToStrDoc.java rename to src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiDocToStrDoc.java index d994bc8..b2ed826 100644 --- a/src/main/java/io/github/linwancen/plugin/show/doc/PsiDocToStrDoc.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiDocToStrDoc.java @@ -1,16 +1,19 @@ -package io.github.linwancen.plugin.show.doc; +package io.github.linwancen.plugin.show.java.doc; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiWhiteSpace; import com.intellij.psi.javadoc.*; +import io.github.linwancen.plugin.show.lang.base.DocFilter; import io.github.linwancen.plugin.show.settings.AppSettingsState; import io.github.linwancen.plugin.show.settings.ProjectSettingsState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * @deprecated BaseTagLangDoc + */ public class PsiDocToStrDoc { private PsiDocToStrDoc() {} @@ -22,6 +25,7 @@ public class PsiDocToStrDoc { } AppSettingsState appSettings = AppSettingsState.getInstance(); int lineCount = 0; + // JavaLangDoc.descDoc StringBuilder sb = new StringBuilder(); PsiElement[] elements = psiDocComment.getDescriptionElements(); for (PsiElement element : elements) { @@ -35,6 +39,7 @@ public class PsiDocToStrDoc { } } StringBuilder tags = tags(psiDocComment, isTree, appSettings); + // BaseTagLangDoc.docElementToStr if (tags.length() > 0) { if (sb.length() > 0) { sb.append("@ "); @@ -46,37 +51,13 @@ public class PsiDocToStrDoc { return null; } ProjectSettingsState projectSettings = ProjectSettingsState.getInstance(psiDocComment.getProject()); - return getDocBySetting(text, appSettings, projectSettings); - } - - @Nullable - private static String getDocBySetting(String text, - AppSettingsState appSettings, - ProjectSettingsState projectSettings) { - // docGetEffect first because default false - if (appSettings.docGetEffect && projectSettings.globalFilterEffective) { - return getDoc(text, appSettings.docGet); - } else if (projectSettings.docGetEffect && projectSettings.projectFilterEffective) { - return getDoc(text, projectSettings.docGet); - } else { - return text; - } - } - - @Nullable - static String getDoc(String text, Pattern docGet) { - // if effect skip check empty - Matcher m = docGet.matcher(text); - if (m.find()) { - return m.group(m.groupCount()); - } - // one line - return text; + return DocFilter.filterDoc(text, appSettings, projectSettings); } @NotNull private static StringBuilder tags(@NotNull PsiDocComment psiDocComment, boolean isTree, AppSettingsState appSettings) { + // JavaLangDoc.descDoc StringBuilder sb = new StringBuilder(); String[] names = isTree ? appSettings.treeTags : appSettings.lineTags; for (String name : names) { @@ -96,6 +77,7 @@ public class PsiDocToStrDoc { * @return is new line */ private static boolean appendElementText(StringBuilder sb, PsiElement element) { + // JavaLangDoc.appendElementText if (element instanceof PsiDocToken) { PsiDocToken psiDocToken = (PsiDocToken) element; addHtml(sb, psiDocToken.getText()); @@ -113,6 +95,7 @@ public class PsiDocToStrDoc { private static final Pattern HTML_PATTERN = Pattern.compile("<[^>]++>"); private static void addHtml(StringBuilder sb, String s) { + // DocFilter.addHtml String deleteHtml = HTML_PATTERN.matcher(s.trim()).replaceAll(""); if (deleteHtml.length() > 0) { sb.append(deleteHtml).append(" "); diff --git a/src/main/java/io/github/linwancen/plugin/show/doc/PsiMethodToPsiDoc.java b/src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiMethodToPsiDoc.java similarity index 92% rename from src/main/java/io/github/linwancen/plugin/show/doc/PsiMethodToPsiDoc.java rename to src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiMethodToPsiDoc.java index c21fcab..a9a96ee 100644 --- a/src/main/java/io/github/linwancen/plugin/show/doc/PsiMethodToPsiDoc.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/doc/PsiMethodToPsiDoc.java @@ -1,10 +1,11 @@ -package io.github.linwancen.plugin.show.doc; +package io.github.linwancen.plugin.show.java.doc; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.psi.javadoc.PsiDocComment; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; class PsiMethodToPsiDoc { @@ -12,7 +13,7 @@ class PsiMethodToPsiDoc { private PsiMethodToPsiDoc() {} @Nullable - static PsiDocComment methodSupperNewPropDoc(PsiMethod psiMethod) { + static PsiDocComment methodSupperNewPropDoc(@NotNull PsiMethod psiMethod) { // .class PsiElement navElement = psiMethod.getNavigationElement(); if (navElement instanceof PsiMethod) { diff --git a/src/main/java/io/github/linwancen/plugin/show/line/FileViewToDocStrUtils.java b/src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToDocStrUtils.java similarity index 91% rename from src/main/java/io/github/linwancen/plugin/show/line/FileViewToDocStrUtils.java rename to src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToDocStrUtils.java index 5834d20..98c9614 100644 --- a/src/main/java/io/github/linwancen/plugin/show/line/FileViewToDocStrUtils.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToDocStrUtils.java @@ -1,4 +1,4 @@ -package io.github.linwancen.plugin.show.line; +package io.github.linwancen.plugin.show.java.line; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; @@ -6,14 +6,14 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.FileViewProvider; import com.intellij.psi.javadoc.PsiDocComment; -import io.github.linwancen.plugin.show.doc.PsiDocToStrDoc; -import io.github.linwancen.plugin.show.ext.LineExt; +import io.github.linwancen.plugin.show.java.doc.PsiDocToStrDoc; import io.github.linwancen.plugin.show.settings.AppSettingsState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * call LineExt, ~LeftToRight, ~RightToLeft + * @deprecated JavaLangDoc */ public class FileViewToDocStrUtils { @@ -32,9 +32,10 @@ public class FileViewToDocStrUtils { if (file != null) { int i = text.indexOf(setting.lineEndPrefix); String code = i <= 0 ? text : text.substring(0, i); - String extDoc = LineExt.extDoc(project, file.getPath(), file.getName(), file.getExtension(), code); + String extDoc = "LineExt.extDoc(project, file.getPath(), file.getName(), file.getExtension(), code)"; if (extDoc != null) { extDoc = extDoc.trim(); + // LineEnd.lineDocSkipHave if (text.endsWith(extDoc)) { return null; } @@ -64,6 +65,7 @@ public class FileViewToDocStrUtils { @Nullable Project project, @Nullable VirtualFile file, @Nullable FileViewProvider viewProvider) { + // textWithDoc StringBuilder sb = new StringBuilder(); for (int i = startLine; i <= endLine; i++) { int startOffset; diff --git a/src/main/java/io/github/linwancen/plugin/show/line/FileViewToPsiDocLeftToRight.java b/src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToPsiDocLeftToRight.java similarity index 93% rename from src/main/java/io/github/linwancen/plugin/show/line/FileViewToPsiDocLeftToRight.java rename to src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToPsiDocLeftToRight.java index 86c9cf6..33729ac 100644 --- a/src/main/java/io/github/linwancen/plugin/show/line/FileViewToPsiDocLeftToRight.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToPsiDocLeftToRight.java @@ -1,4 +1,4 @@ -package io.github.linwancen.plugin.show.line; +package io.github.linwancen.plugin.show.java.line; import com.intellij.json.JsonLanguage; import com.intellij.openapi.editor.Document; @@ -14,6 +14,7 @@ import org.jetbrains.annotations.Nullable; /** * call JsonToPsiDoc, NewCallRefToPsiDoc + * @deprecated JavaLangDoc */ public class FileViewToPsiDocLeftToRight { @@ -54,7 +55,7 @@ public class FileViewToPsiDocLeftToRight { return null; } AppSettingsState instance = AppSettingsState.getInstance(); - if (instance.inJson && element.getLanguage().is(JsonLanguage.INSTANCE)) { + if (instance.showLineEndCommentJson && element.getLanguage().is(JsonLanguage.INSTANCE)) { return JsonToPsiDoc.jsonDoc(element, startOffset, endOffset); } if (startWithSymbol) { diff --git a/src/main/java/io/github/linwancen/plugin/show/line/FileViewToPsiDocRightToLeft.java b/src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToPsiDocRightToLeft.java similarity index 92% rename from src/main/java/io/github/linwancen/plugin/show/line/FileViewToPsiDocRightToLeft.java rename to src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToPsiDocRightToLeft.java index bc10b2a..645e90e 100644 --- a/src/main/java/io/github/linwancen/plugin/show/line/FileViewToPsiDocRightToLeft.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/line/FileViewToPsiDocRightToLeft.java @@ -1,4 +1,4 @@ -package io.github.linwancen.plugin.show.line; +package io.github.linwancen.plugin.show.java.line; import com.intellij.json.JsonLanguage; import com.intellij.psi.FileViewProvider; @@ -12,6 +12,7 @@ import org.jetbrains.annotations.Nullable; /** * call JsonToPsiDoc, NewCallRefToPsiDoc + * @deprecated JavaLangDoc */ public class FileViewToPsiDocRightToLeft { @@ -48,7 +49,7 @@ public class FileViewToPsiDocRightToLeft { if (identifier != null && !(identifier instanceof PsiIdentifier)) { return null; } - if (setting.inJson && element.getLanguage().is(JsonLanguage.INSTANCE)) { + if (setting.showLineEndCommentJson && element.getLanguage().is(JsonLanguage.INSTANCE)) { return JsonToPsiDoc.jsonDoc(element, startOffset, endOffset); } return NewCallRefToPsiDoc.elementDoc(element, identifier, startOffset, endOffset); diff --git a/src/main/java/io/github/linwancen/plugin/show/line/JsonToPsiDoc.java b/src/main/idea/io/github/linwancen/plugin/show/java/line/JsonToPsiDoc.java similarity index 76% rename from src/main/java/io/github/linwancen/plugin/show/line/JsonToPsiDoc.java rename to src/main/idea/io/github/linwancen/plugin/show/java/line/JsonToPsiDoc.java index 39a3061..831dc71 100644 --- a/src/main/java/io/github/linwancen/plugin/show/line/JsonToPsiDoc.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/line/JsonToPsiDoc.java @@ -1,4 +1,4 @@ -package io.github.linwancen.plugin.show.line; +package io.github.linwancen.plugin.show.java.line; import com.intellij.json.psi.JsonProperty; import com.intellij.psi.PsiDocCommentOwner; @@ -6,9 +6,12 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.util.PsiTreeUtil; -import io.github.linwancen.plugin.show.doc.OwnerToPsiDocUtils; +import io.github.linwancen.plugin.show.java.doc.OwnerToPsiDocUtils; import org.jetbrains.annotations.Nullable; +/** + * @deprecated JsonLangDoc + */ public class JsonToPsiDoc { private JsonToPsiDoc() {} @@ -18,12 +21,18 @@ public class JsonToPsiDoc { */ @Nullable public static PsiDocComment jsonDoc(PsiElement element, int startOffset, int endOffset) { + // JsonLangDoc.refDoc JsonProperty jsonProp = PsiTreeUtil.getParentOfType(element, JsonProperty.class, true, startOffset); if (jsonProp == null || jsonProp.getNameElement().getTextRange().getEndOffset() > endOffset) { return null; } for (PsiReference reference : jsonProp.getNameElement().getReferences()) { - PsiElement resolve = reference.resolve(); + PsiElement resolve = null; + try { + resolve = reference.resolve(); + } catch (Throwable ignore) { + // ignore + } if (resolve instanceof PsiDocCommentOwner) { PsiDocCommentOwner owner = (PsiDocCommentOwner) resolve; PsiDocComment docComment = OwnerToPsiDocUtils.srcOrByteCodeDoc(owner); diff --git a/src/main/java/io/github/linwancen/plugin/show/line/NewCallRefToPsiDoc.java b/src/main/idea/io/github/linwancen/plugin/show/java/line/NewCallRefToPsiDoc.java similarity index 81% rename from src/main/java/io/github/linwancen/plugin/show/line/NewCallRefToPsiDoc.java rename to src/main/idea/io/github/linwancen/plugin/show/java/line/NewCallRefToPsiDoc.java index 8dacbc9..5b361dd 100644 --- a/src/main/java/io/github/linwancen/plugin/show/line/NewCallRefToPsiDoc.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/line/NewCallRefToPsiDoc.java @@ -1,10 +1,10 @@ -package io.github.linwancen.plugin.show.line; +package io.github.linwancen.plugin.show.java.line; import com.intellij.psi.*; import com.intellij.psi.impl.source.javadoc.PsiDocMethodOrFieldRef; import com.intellij.psi.javadoc.PsiDocComment; import com.intellij.psi.util.PsiTreeUtil; -import io.github.linwancen.plugin.show.doc.OwnerToPsiDocUtils; +import io.github.linwancen.plugin.show.java.doc.OwnerToPsiDocUtils; import io.github.linwancen.plugin.show.settings.AppSettingsState; import io.github.linwancen.plugin.show.settings.ProjectSettingsState; import org.jetbrains.annotations.Nullable; @@ -12,13 +12,17 @@ import org.jetbrains.annotations.Nullable; /** * call OwnerToPsiDocSkip */ -class NewCallRefToPsiDoc { +public class NewCallRefToPsiDoc { private NewCallRefToPsiDoc() {} + /** + * @deprecated + */ @Nullable static PsiDocComment elementDoc(PsiElement element, PsiElement psiIdentifier, int startOffset, int endOffset) { + // JavaLangDoc.refDoc AppSettingsState instance = AppSettingsState.getInstance(); if (psiIdentifier != null && "Override".equals(psiIdentifier.getText())) { ProjectSettingsState projectSettings = ProjectSettingsState.getInstance(psiIdentifier.getProject()); @@ -41,6 +45,9 @@ class NewCallRefToPsiDoc { return null; } + /** + * @deprecated + */ @Nullable private static PsiDocComment elementDoc(PsiElement element, int startOffset, int endOffset, AppSettingsState instance) { @@ -50,6 +57,7 @@ class NewCallRefToPsiDoc { return executableDoc; } } + // JavaLangDoc.refDoc if (instance.fromNew) { PsiDocComment newDoc = parentNewDoc(element, startOffset); if (newDoc != null) { @@ -62,9 +70,13 @@ class NewCallRefToPsiDoc { return null; } + /** + * @deprecated + */ @Nullable private static PsiDocComment parentMethodDoc(PsiElement element, int startOffset, int endOffset) { // method call + // JavaLangDoc.resolveDocPrint PsiMethodCallExpression call = PsiTreeUtil.getParentOfType(element, PsiMethodCallExpression.class, false, startOffset); if (call == null) { @@ -84,6 +96,9 @@ class NewCallRefToPsiDoc { return null; } + /** + * @deprecated + */ @Nullable private static PsiDocComment parentNewDoc(PsiElement element, int startOffset) { // new and Class should same line, so not need if endOffset @@ -91,9 +106,13 @@ class NewCallRefToPsiDoc { if (newExp == null) { return null; } - PsiDocComment methodComment = OwnerToPsiDocSkip.refDoc(newExp.resolveMethod()); - if (methodComment != null) { - return methodComment; + try { + PsiDocComment methodComment = OwnerToPsiDocSkip.refDoc(newExp.resolveMethod()); + if (methodComment != null) { + return methodComment; + } + } catch (Throwable ignore) { + // ignore } PsiJavaCodeReferenceElement classReference = newExp.getClassReference(); return javaCodeDoc(classReference); @@ -101,6 +120,7 @@ class NewCallRefToPsiDoc { /** * ::/class/field + * @deprecated */ @Nullable private static PsiDocComment refDoc(PsiElement element, int endOffset) { @@ -116,7 +136,12 @@ class NewCallRefToPsiDoc { element = parent; } if (element instanceof PsiReference) { - PsiElement resolve = ((PsiReference) element).resolve(); + PsiElement resolve = null; + try { + resolve = ((PsiReference) element).resolve(); + } catch (Throwable ignore) { + // ignore + } if (resolve instanceof PsiDocCommentOwner) { return OwnerToPsiDocSkip.refDoc(((PsiDocCommentOwner) resolve)); } @@ -136,17 +161,25 @@ class NewCallRefToPsiDoc { @Nullable - private static PsiDocComment javaCodeDoc(PsiJavaCodeReferenceElement ref) { + public static PsiDocComment javaCodeDoc(PsiJavaCodeReferenceElement ref) { if (ref == null) { return null; } - PsiElement resolve = ref.resolve(); + PsiElement resolve = null; + try { + resolve = ref.resolve(); + } catch (Throwable ignore) { + // ignore + } if (resolve instanceof PsiDocCommentOwner) { return OwnerToPsiDocSkip.refDoc(((PsiDocCommentOwner) resolve)); } return null; } + /** + * @deprecated + */ @Nullable private static PsiDocComment docRefDoc(PsiElement element) { PsiElement parent = element.getParent(); @@ -158,7 +191,12 @@ class NewCallRefToPsiDoc { if (reference == null) { return null; } - PsiElement resolve = reference.resolve(); + PsiElement resolve = null; + try { + resolve = reference.resolve(); + } catch (Throwable ignore) { + // ignore + } if (resolve instanceof PsiMethod) { return OwnerToPsiDocSkip.refDoc(((PsiMethod) resolve)); } diff --git a/src/main/java/io/github/linwancen/plugin/show/line/OwnerToPsiDocSkip.java b/src/main/idea/io/github/linwancen/plugin/show/java/line/OwnerToPsiDocSkip.java similarity index 79% rename from src/main/java/io/github/linwancen/plugin/show/line/OwnerToPsiDocSkip.java rename to src/main/idea/io/github/linwancen/plugin/show/java/line/OwnerToPsiDocSkip.java index 491d775..7baccce 100644 --- a/src/main/java/io/github/linwancen/plugin/show/line/OwnerToPsiDocSkip.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/line/OwnerToPsiDocSkip.java @@ -1,21 +1,21 @@ -package io.github.linwancen.plugin.show.line; +package io.github.linwancen.plugin.show.java.line; import com.intellij.psi.PsiDocCommentOwner; import com.intellij.psi.PsiMethod; import com.intellij.psi.javadoc.PsiDocComment; -import io.github.linwancen.plugin.show.doc.OwnerToPsiDocUtils; +import io.github.linwancen.plugin.show.java.doc.OwnerToPsiDocUtils; import io.github.linwancen.plugin.show.settings.AppSettingsState; import io.github.linwancen.plugin.show.settings.ProjectSettingsState; import org.jetbrains.annotations.Nullable; /** - * call OwnerToPsiDocUtils, SkipUtils + * call SkipUtils */ -class OwnerToPsiDocSkip { +public class OwnerToPsiDocSkip { private OwnerToPsiDocSkip() {} - static PsiDocComment refDoc(@Nullable PsiDocCommentOwner docOwner) { + public static PsiDocComment refDoc(@Nullable PsiDocCommentOwner docOwner) { if (docOwner == null) { return null; } diff --git a/src/main/java/io/github/linwancen/plugin/show/line/SkipUtils.java b/src/main/idea/io/github/linwancen/plugin/show/java/line/SkipUtils.java similarity index 53% rename from src/main/java/io/github/linwancen/plugin/show/line/SkipUtils.java rename to src/main/idea/io/github/linwancen/plugin/show/java/line/SkipUtils.java index 645bbf1..12a3c31 100644 --- a/src/main/java/io/github/linwancen/plugin/show/line/SkipUtils.java +++ b/src/main/idea/io/github/linwancen/plugin/show/java/line/SkipUtils.java @@ -1,17 +1,15 @@ -package io.github.linwancen.plugin.show.line; +package io.github.linwancen.plugin.show.java.line; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMember; import com.intellij.psi.javadoc.PsiDocComment; +import io.github.linwancen.plugin.show.lang.base.DocSkip; import io.github.linwancen.plugin.show.settings.AppSettingsState; import io.github.linwancen.plugin.show.settings.ProjectSettingsState; import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.regex.Pattern; - class SkipUtils { private SkipUtils() {} @@ -21,9 +19,7 @@ class SkipUtils { if (text == null) { return true; } - return skipText(text, - projectSettings.globalFilterEffective, appSettings.lineInclude, appSettings.lineExclude, - projectSettings.projectFilterEffective, projectSettings.lineInclude, projectSettings.lineExclude); + return DocSkip.skipSign(appSettings, projectSettings, text); } private static @Nullable String psiName(@Nullable PsiElement psiElement, AppSettingsState appSettings) { @@ -53,8 +49,6 @@ class SkipUtils { return null; } - public static final Pattern NOT_ASCII_PATTERN = Pattern.compile("[^\u0000-\u007f]"); - static PsiDocComment skipDoc(PsiDocComment doc, AppSettingsState appSettings, ProjectSettingsState projectSettings) { if (doc == null) { return null; @@ -63,12 +57,7 @@ class SkipUtils { return null; } String text = doc.getText(); - if (appSettings.skipAscii && !NOT_ASCII_PATTERN.matcher(text).find()) { - return null; - } - boolean skip = skipText(text, - projectSettings.globalFilterEffective, appSettings.docInclude, appSettings.docExclude, - projectSettings.projectFilterEffective, projectSettings.docInclude, projectSettings.docExclude); + boolean skip = DocSkip.skipDoc(appSettings, projectSettings, text); return skip ? null : doc; } @@ -82,42 +71,4 @@ class SkipUtils { } return true; } - - private static boolean skipText(String text, - boolean appFilterEffective, Pattern appDocInclude, Pattern appDocExclude, - boolean projectFilterEffective, Pattern projectDocInclude, Pattern projectDocExclude - ) { - if (text == null) { - return true; - } - if (appFilterEffective - && skipText(text, appDocInclude, appDocExclude)) { - return true; - } - if (projectFilterEffective) { - return skipText(text, projectDocInclude, projectDocExclude); - } - return false; - } - - static boolean skipText(@NotNull String text, Pattern include, Pattern exclude) { - if (exclude(text, exclude)) { - return true; - } - return !include(text, include); - } - - static boolean include(@NotNull String text, Pattern include) { - if (include.pattern().length() == 0) { - return true; - } - return include.matcher(text).find(); - } - - static boolean exclude(@NotNull String text, Pattern exclude) { - if (exclude.pattern().length() == 0) { - return false; - } - return exclude.matcher(text).find(); - } } diff --git a/src/main/java/io/github/linwancen/plugin/show/LineEnd.java b/src/main/java/io/github/linwancen/plugin/show/LineEnd.java index 006a5bb..f211b39 100644 --- a/src/main/java/io/github/linwancen/plugin/show/LineEnd.java +++ b/src/main/java/io/github/linwancen/plugin/show/LineEnd.java @@ -1,18 +1,17 @@ package io.github.linwancen.plugin.show; import com.intellij.json.JsonFileType; -import com.intellij.openapi.editor.Document; +import com.intellij.json.json5.Json5FileType; import com.intellij.openapi.editor.EditorLinePainter; import com.intellij.openapi.editor.LineExtensionInfo; import com.intellij.openapi.editor.markup.TextAttributes; -import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.FileViewProvider; -import com.intellij.psi.PsiManager; -import io.github.linwancen.plugin.show.line.FileViewToDocStrUtils; +import io.github.linwancen.plugin.show.bean.FileInfo; +import io.github.linwancen.plugin.show.bean.LineInfo; +import io.github.linwancen.plugin.show.ext.LineExt; +import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; import io.github.linwancen.plugin.show.settings.AppSettingsState; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,48 +34,62 @@ public class LineEnd extends EditorLinePainter { if (!file.exists()) { return null; } - String doc = doc(project, file, lineNumber); + LineInfo lineInfo = LineInfo.of(file, project, lineNumber); + String doc = lineDocSkipHave(lineInfo); if (doc == null) { return null; } TextAttributes textAttr = file.getFileType().equals(JsonFileType.INSTANCE) + || file.getFileType().equals(Json5FileType.INSTANCE) ? settings.lineEndJsonTextAttr : settings.lineEndTextAttr; LineExtensionInfo info = new LineExtensionInfo(settings.lineEndPrefix + doc, textAttr); return Collections.singletonList(info); } - private static @Nullable String doc(@NotNull Project project, - @NotNull VirtualFile file, int lineNumber) { - FileViewProvider viewProvider = PsiManager.getInstance(project).findViewProvider(file); - Document document = FileDocumentManager.getInstance().getDocument(file); - if (document == null) { - return null; + @NotNull + public static String textWithDoc(@NotNull FileInfo fileInfo, int startLine, int endLine) { + StringBuilder sb = new StringBuilder(); + for (int i = startLine; i <= endLine; i++) { + LineInfo lineInfo = LineInfo.of(fileInfo, i); + if (lineInfo == null) { + sb.append("\n"); + continue; + } + sb.append(lineInfo.text); + String doc = lineDocSkipHave(lineInfo); + if (doc != null) { + sb.append(lineInfo.appSettings.lineEndPrefix).append(doc); + } + sb.append("\n"); } - return doc(document, lineNumber, project, file, viewProvider); + if (sb.length() > 0) { + sb.delete(sb.length() - 1, sb.length()); + } + return sb.toString(); } - @Nullable - private static String doc(@NotNull Document document, int lineNumber, - @NotNull Project project, - @Nullable VirtualFile file, - @Nullable FileViewProvider viewProvider) { - // lineNumber start 0, as 1 <= 1 should return - if (document.getLineCount() <= lineNumber) { + private static @Nullable String lineDocSkipHave(@Nullable LineInfo lineInfo) { + String doc = lineDoc(lineInfo); + if (doc == null) { return null; } - int startOffset; - int endOffset; - try { - startOffset = document.getLineStartOffset(lineNumber); - endOffset = document.getLineEndOffset(lineNumber); - } catch (Exception e) { + String trimDoc = doc.trim(); + if (lineInfo.text.trim().endsWith(trimDoc)) { return null; } - if (startOffset == endOffset) { + return trimDoc; + } + + private static @Nullable String lineDoc(@Nullable LineInfo lineInfo) { + if (lineInfo == null) { return null; } - String text = document.getText(new TextRange(startOffset, endOffset)); - return FileViewToDocStrUtils.doc(document, project, file, viewProvider, startOffset, endOffset, text); + // override some text + String doc = LineExt.doc(lineInfo); + if (doc != null) { + return doc; + } + return BaseLangDoc.langDoc(lineInfo); } } diff --git a/src/main/java/io/github/linwancen/plugin/show/LineEndAdd.java b/src/main/java/io/github/linwancen/plugin/show/LineEndAdd.java index 5d17bbf..1d53708 100644 --- a/src/main/java/io/github/linwancen/plugin/show/LineEndAdd.java +++ b/src/main/java/io/github/linwancen/plugin/show/LineEndAdd.java @@ -1,27 +1,23 @@ package io.github.linwancen.plugin.show; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.WriteCommandAction; -import com.intellij.openapi.editor.Document; +import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileVisitor; -import com.intellij.psi.FileViewProvider; -import com.intellij.psi.PsiManager; -import io.github.linwancen.plugin.show.line.FileViewToDocStrUtils; -import io.github.linwancen.plugin.show.settings.AppSettingsState; +import io.github.linwancen.plugin.show.bean.FileInfo; import org.jetbrains.annotations.NotNull; /** * on ProjectViewPopupMenu */ -public class LineEndAdd extends AnAction { +public class LineEndAdd extends DumbAwareAction { @Override public void actionPerformed(@NotNull AnActionEvent event) { @@ -40,13 +36,12 @@ public class LineEndAdd extends AnAction { } private void addDocAll(@NotNull Project project, @NotNull VirtualFile[] files) { - AppSettingsState settings = AppSettingsState.getInstance(); for (VirtualFile file : files) { VfsUtilCore.visitChildrenRecursively(file, new VirtualFileVisitor() { @Override public boolean visitFile(@NotNull VirtualFile file) { if (!file.isDirectory()) { - ApplicationManager.getApplication().runReadAction(() -> addDoc(project, file, settings)); + ApplicationManager.getApplication().runReadAction(() -> addDoc(project, file)); } return true; } @@ -54,21 +49,16 @@ public class LineEndAdd extends AnAction { } } - private void addDoc(@NotNull Project project, @NotNull VirtualFile file, @NotNull AppSettingsState settings) { - FileViewProvider viewProvider = PsiManager.getInstance(project).findViewProvider(file); - if (viewProvider == null) { - return; - } - Document document = viewProvider.getDocument(); - if (document == null) { + private void addDoc(@NotNull Project project, @NotNull VirtualFile file) { + FileInfo fileInfo = FileInfo.of(file, project); + if (fileInfo == null) { return; } int startLine = 0; - int endLine = document.getLineCount() - 1; - String textWithDoc = FileViewToDocStrUtils.textWithDoc(settings, document, - startLine, endLine, project, file, viewProvider); + int endLine = fileInfo.document.getLineCount() - 1; + String textWithDoc = LineEnd.textWithDoc(fileInfo, startLine, endLine); WriteCommandAction.runWriteCommandAction(project, () -> - document.replaceString(0, document.getTextLength() - 1, textWithDoc) + fileInfo.document.replaceString(0, fileInfo.document.getTextLength() - 1, textWithDoc) ); } } \ No newline at end of file diff --git a/src/main/java/io/github/linwancen/plugin/show/LineEndCopy.java b/src/main/java/io/github/linwancen/plugin/show/LineEndCopy.java index 02aa2ae..8f840cd 100644 --- a/src/main/java/io/github/linwancen/plugin/show/LineEndCopy.java +++ b/src/main/java/io/github/linwancen/plugin/show/LineEndCopy.java @@ -1,19 +1,13 @@ package io.github.linwancen.plugin.show; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Caret; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.ide.CopyPasteManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.FileViewProvider; -import com.intellij.psi.PsiFile; -import io.github.linwancen.plugin.show.line.FileViewToDocStrUtils; -import io.github.linwancen.plugin.show.settings.AppSettingsState; +import com.intellij.openapi.project.DumbAwareAction; +import io.github.linwancen.plugin.show.bean.FileInfo; import org.jetbrains.annotations.NotNull; import java.awt.datatransfer.StringSelection; @@ -21,7 +15,7 @@ import java.awt.datatransfer.StringSelection; /** * on EditorPopupMenu */ -public class LineEndCopy extends AnAction { +public class LineEndCopy extends DumbAwareAction { @Override public void actionPerformed(@NotNull AnActionEvent event) { @@ -29,37 +23,26 @@ public class LineEndCopy extends AnAction { } private void copyWithDoc(@NotNull AnActionEvent event) { - Project project = event.getProject(); - VirtualFile file = event.getData(CommonDataKeys.VIRTUAL_FILE); - if (file == null) { - return; - } - PsiFile psiFile = event.getData(CommonDataKeys.PSI_FILE); - if (psiFile == null) { - return; - } - FileViewProvider viewProvider = psiFile.getViewProvider(); - Document document = viewProvider.getDocument(); - if (document == null) { + FileInfo fileInfo = FileInfo.of(event); + if (fileInfo == null) { return; } int startLine = 0; - int endLine = document.getLineCount() - 1; - + int endLine = fileInfo.document.getLineCount() - 1; // if select Editor editor = event.getData(CommonDataKeys.EDITOR); if (editor != null) { Caret primaryCaret = editor.getCaretModel().getPrimaryCaret(); int start = primaryCaret.getSelectionStart(); int end = primaryCaret.getSelectionEnd(); - startLine = document.getLineNumber(start); - endLine = document.getLineNumber(end); + try { + startLine = fileInfo.document.getLineNumber(start); + endLine = fileInfo.document.getLineNumber(end); + } catch (Exception e) { + return; + } } - - AppSettingsState settings = AppSettingsState.getInstance(); - - String textWithDoc = FileViewToDocStrUtils.textWithDoc(settings, document, - startLine, endLine, project, file, viewProvider); + String textWithDoc = LineEnd.textWithDoc(fileInfo, startLine, endLine); StringSelection content = new StringSelection(textWithDoc); CopyPasteManager.getInstance().setContents(content); } diff --git a/src/main/java/io/github/linwancen/plugin/show/Tree.java b/src/main/java/io/github/linwancen/plugin/show/Tree.java index 33f343b..3d3e461 100644 --- a/src/main/java/io/github/linwancen/plugin/show/Tree.java +++ b/src/main/java/io/github/linwancen/plugin/show/Tree.java @@ -3,23 +3,23 @@ package io.github.linwancen.plugin.show; import com.intellij.ide.projectView.PresentationData; import com.intellij.ide.projectView.ProjectViewNode; import com.intellij.ide.projectView.ProjectViewNodeDecorator; -import com.intellij.ide.projectView.impl.nodes.*; import com.intellij.ide.util.treeView.PresentableNodeDescriptor.ColoredFragment; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.packageDependencies.ui.PackageDependenciesNode; -import com.intellij.psi.*; -import com.intellij.psi.javadoc.PsiDocComment; +import com.intellij.psi.PsiElement; import com.intellij.ui.ColoredTreeCellRenderer; import com.intellij.ui.SimpleTextAttributes; -import io.github.linwancen.plugin.show.doc.OwnerToPsiDocUtils; -import io.github.linwancen.plugin.show.doc.PsiDocToStrDoc; +import io.github.linwancen.plugin.show.bean.FuncEnum; import io.github.linwancen.plugin.show.ext.TreeExt; +import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; +import io.github.linwancen.plugin.show.bean.SettingsInfo; import io.github.linwancen.plugin.show.settings.AppSettingsState; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.List; public class Tree implements ProjectViewNodeDecorator { @@ -37,7 +37,7 @@ public class Tree implements ProjectViewNodeDecorator { return; } ApplicationManager.getApplication().runReadAction(() -> { - String doc = doc(node, project); + String doc = treeDoc(node, project); if (doc == null) { return; } @@ -50,116 +50,28 @@ public class Tree implements ProjectViewNodeDecorator { } @Nullable - private String doc(ProjectViewNode node, Project project) { - String extDoc = extDoc(node); - if (extDoc != null) { - return extDoc; + private String treeDoc(ProjectViewNode node, @NotNull Project project) { + String doc = TreeExt.doc(node); + if (doc != null) { + return doc; } - PsiDocComment docComment = nodeDoc(node, project); - if (docComment == null) { - return null; - } - return PsiDocToStrDoc.text(docComment, true); - } - - @Nullable - public static String extDoc(ProjectViewNode node) { - VirtualFile file = node.getVirtualFile(); - if (file == null) { - return null; - } - return TreeExt.extDoc(file); - } - - @Nullable - private static PsiDocComment nodeDoc(ProjectViewNode node, Project project) { - if (node instanceof PsiFileNode) { - PsiFile psiFile = ((PsiFileNode) node).getValue(); - return OwnerToPsiDocUtils.fileDoc(psiFile); - } - if (node instanceof PsiDirectoryNode) { - PsiDirectory psiDirectory = ((PsiDirectoryNode) node).getValue(); - return dirDoc(psiDirectory); - } - - if (node instanceof PsiMethodNode) { - // On Show Members - PsiMethod psiMethod = ((PsiMethodNode) node).getValue(); - return OwnerToPsiDocUtils.methodDoc(psiMethod); - } - if (node instanceof PsiFieldNode) { - // On Show Members - PsiField psiField = ((PsiFieldNode) node).getValue(); - PsiDocComment docComment = OwnerToPsiDocUtils.srcOrByteCodeDoc(psiField); - if (docComment != null) { - return docComment; + SettingsInfo settingsInfo = SettingsInfo.of(project, FuncEnum.TREE); + Object value = node.getValue(); + if (value instanceof PsiElement) { + PsiElement psiElement = (PsiElement) value; + String docPrint = BaseLangDoc.resolveDoc(settingsInfo, psiElement); + if (docPrint != null) { + return docPrint; } - PsiClass psiClass = psiField.getContainingClass(); - if (psiClass != null) { - return OwnerToPsiDocUtils.srcOrByteCodeDoc(psiClass); - } - return null; } - - if (node instanceof ClassTreeNode) { - // On Packages View, Project Files View, Show Members - PsiClass psiClass = ((ClassTreeNode) node).getValue(); - return OwnerToPsiDocUtils.srcOrByteCodeDoc(psiClass); - } - if (node instanceof PackageElementNode) { - // On Packages View - PsiPackage psiPackage = ((PackageElementNode) node).getValue().getPackage(); - return packageDoc(psiPackage); - } - - // On Packages View, Project Files View - VirtualFile virtualFile = node.getVirtualFile(); - if (virtualFile == null || !virtualFile.isDirectory()) { - return null; - } - PsiDirectory psiDirectory = PsiManager.getInstance(project).findDirectory(virtualFile); - if (psiDirectory == null) { - return null; - } - return dirDoc(psiDirectory); - } - - @Nullable - private static PsiDocComment dirDoc(PsiDirectory child) { - while (true) { - PsiDocComment docComment = OwnerToPsiDocUtils.dirDoc(child); - if (docComment != null) { - return docComment; + Collection langDocs = BaseLangDoc.LANG_DOC_MAP.values(); + for (BaseLangDoc langDoc : langDocs) { + String s = langDoc.treeDoc(settingsInfo, node, project); + if (s != null) { + return s; } - AppSettingsState instance = AppSettingsState.getInstance(); - if (!instance.compact) { - return null; - } - PsiDirectory parent = child.getParent(); - if (parent == null) { - return null; - } - if (parent.getChildren().length != 1) { - return null; - } - child = parent; - } - } - - @Nullable - private static PsiDocComment packageDoc(PsiPackage child) { - while (true) { - PsiDocComment docComment = OwnerToPsiDocUtils.packageDoc(child); - if (docComment != null) { - return docComment; - } - PsiPackage parent = child.getParentPackage(); - if (parent == null) { - return null; - } - // PsiPackage not implemented getChildren() - child = parent; } + return null; } @Override diff --git a/src/main/java/io/github/linwancen/plugin/show/bean/FileInfo.java b/src/main/java/io/github/linwancen/plugin/show/bean/FileInfo.java new file mode 100644 index 0000000..564b50e --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/bean/FileInfo.java @@ -0,0 +1,56 @@ +package io.github.linwancen.plugin.show.bean; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CommonDataKeys; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class FileInfo extends SettingsInfo { + public final @NotNull VirtualFile file; + public final @NotNull Document document; + public final @NotNull Project project; + public final @NotNull FileViewProvider viewProvider; + + protected FileInfo(@NotNull VirtualFile file, @NotNull Document document, @NotNull Project project, + @NotNull FileViewProvider viewProvider, @NotNull FuncEnum funcEnum) { + super(project, funcEnum); + this.project = project; + this.file = file; + this.viewProvider = viewProvider; + this.document = document; + } + + public static @Nullable FileInfo of(@NotNull VirtualFile file, @NotNull Project project){ + Document document = FileDocumentManager.getInstance().getDocument(file); + if (document == null) { + return null; + } + FileViewProvider viewProvider = PsiManager.getInstance(project).findViewProvider(file); + if (viewProvider == null) { + return null; + } + return new FileInfo(file, document, project, viewProvider, FuncEnum.LINE); + } + + public static @Nullable FileInfo of(@NotNull AnActionEvent event){ + PsiFile psiFile = event.getData(CommonDataKeys.PSI_FILE); + if (psiFile == null) { + return null; + } + FileViewProvider viewProvider = psiFile.getViewProvider(); + Document document = viewProvider.getDocument(); + if (document == null) { + return null; + } + VirtualFile file = viewProvider.getVirtualFile(); + Project project = psiFile.getProject(); + return new FileInfo(file, document, project, viewProvider, FuncEnum.LINE); + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/bean/FuncEnum.java b/src/main/java/io/github/linwancen/plugin/show/bean/FuncEnum.java new file mode 100644 index 0000000..60d1478 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/bean/FuncEnum.java @@ -0,0 +1,37 @@ +package io.github.linwancen.plugin.show.bean; + +import java.util.LinkedHashMap; + +public enum FuncEnum { + /** tree: project view tree */ + TREE("tree", "project view tree"), + /** line: code line end */ + LINE("line", "code line end"), + ; + + public final String code; + public final String desc; + + FuncEnum(String code, String desc) { + this.code = code; + this.desc = desc; + } + + @Override + public String toString() { + return code + '-' + desc; + } + + private static final LinkedHashMap map; + + static { + map = new LinkedHashMap<>(); + for (FuncEnum value : values()) { + map.put(value.code, value); + } + } + + public static FuncEnum fromCode(String code) { + return map.get(code); + } +} \ No newline at end of file diff --git a/src/main/java/io/github/linwancen/plugin/show/bean/LineInfo.java b/src/main/java/io/github/linwancen/plugin/show/bean/LineInfo.java new file mode 100644 index 0000000..316ede5 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/bean/LineInfo.java @@ -0,0 +1,49 @@ +package io.github.linwancen.plugin.show.bean; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class LineInfo extends FileInfo { + public final int lineNumber; + public final int startOffset; + public final int endOffset; + public final @NotNull String text; + + protected LineInfo(@NotNull FileInfo fileInfo, @NotNull String text, + int lineNumber, int startOffset, int endOffset) { + super(fileInfo.file, fileInfo.document, fileInfo.project, fileInfo.viewProvider, FuncEnum.LINE); + this.lineNumber = lineNumber; + this.startOffset = startOffset; + this.endOffset = endOffset; + this.text = text; + } + + public static @Nullable LineInfo of(@NotNull VirtualFile file, @NotNull Project project, int lineNumber) { + FileInfo fileInfo = of(file, project); + if (fileInfo == null) { + return null; + } + return of(fileInfo, lineNumber); + } + + public static @Nullable LineInfo of(@NotNull FileInfo fileInfo, int lineNumber) { + // lineNumber start 0, as 1 <= 1 should return + if (fileInfo.document.getLineCount() <= lineNumber) { + return null; + } + try { + int startOffset = fileInfo.document.getLineStartOffset(lineNumber); + int endOffset = fileInfo.document.getLineEndOffset(lineNumber); + if (startOffset == endOffset) { + return null; + } + String text = fileInfo.document.getText(new TextRange(startOffset, endOffset)); + return new LineInfo(fileInfo, text, lineNumber, startOffset, endOffset); + } catch (Exception e) { + return null; + } + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/bean/SettingsInfo.java b/src/main/java/io/github/linwancen/plugin/show/bean/SettingsInfo.java new file mode 100644 index 0000000..fc8bb59 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/bean/SettingsInfo.java @@ -0,0 +1,29 @@ +package io.github.linwancen.plugin.show.bean; + +import com.intellij.openapi.project.Project; +import io.github.linwancen.plugin.show.settings.AppSettingsState; +import io.github.linwancen.plugin.show.settings.ProjectSettingsState; +import org.jetbrains.annotations.NotNull; + +public class SettingsInfo { + public final @NotNull AppSettingsState appSettings; + public final @NotNull ProjectSettingsState projectSettings; + public final @NotNull FuncEnum funcEnum; + + protected SettingsInfo(@NotNull Project project, @NotNull FuncEnum funcEnum) { + this.funcEnum = funcEnum; + this.appSettings = AppSettingsState.getInstance(); + this.projectSettings = ProjectSettingsState.getInstance(project); + } + + public static @NotNull SettingsInfo of(@NotNull Project project, FuncEnum funcEnum) { + return new SettingsInfo(project, funcEnum); + } + + /** treeTags/lineTags */ + public String[] tagNames() { + return funcEnum == FuncEnum.TREE + ? appSettings.treeTags + : appSettings.lineTags; + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/ext/LineExt.java b/src/main/java/io/github/linwancen/plugin/show/ext/LineExt.java index 36f70c7..c09b64b 100644 --- a/src/main/java/io/github/linwancen/plugin/show/ext/LineExt.java +++ b/src/main/java/io/github/linwancen/plugin/show/ext/LineExt.java @@ -1,7 +1,7 @@ package io.github.linwancen.plugin.show.ext; -import com.intellij.openapi.project.Project; import io.github.linwancen.plugin.show.ext.conf.ConfCache; +import io.github.linwancen.plugin.show.bean.LineInfo; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,27 +14,42 @@ public class LineExt { private LineExt() {} - public static String extDoc(@Nullable Project project, - @NotNull String path, @NotNull String name, @Nullable String ext, - @NotNull String text) { + public static @Nullable String doc(@NotNull LineInfo lineInfo) { + int i = lineInfo.text.indexOf(lineInfo.appSettings.lineEndPrefix); + String code = i <= 0 ? lineInfo.text : lineInfo.text.substring(0, i); + String extDoc = LineExt.extDoc(lineInfo, code); + if (extDoc == null) { + return null; + } + extDoc = extDoc.trim(); + if (lineInfo.text.endsWith(extDoc)) { + return null; + } + return extDoc; + } + + public static String extDoc(@NotNull LineInfo lineInfo, @NotNull String code) { + String path = lineInfo.file.getPath(); + String name = lineInfo.file.getName(); + String ext = lineInfo.file.getExtension(); Map>> keyMap = ConfCache.keyMap(path, name, ext); if (keyMap.isEmpty()) { return null; } - Pattern pattern = ConfCache.pattern(project, keyMap, path); + Pattern pattern = ConfCache.pattern(lineInfo.project, keyMap, path); if (pattern == null || pattern.pattern().length() == 0) { return null; } Map>> docMap = ConfCache.docMap(path, name, ext); - if (docMap.isEmpty()) { + Map>> treeMap = ConfCache.treeMap(path, name, ext); + if (docMap.isEmpty() && treeMap.isEmpty()) { return null; } - Map>> treeMap = ConfCache.treeMap(path); if (ext == null || "cbl".equals(ext) || "cob".equals(ext) || "cobol".equals(ext)) { - text = cblNotAndOr(text); + code = cblNotAndOr(code); } - String[] words = pattern.split(text); - Matcher matcher = pattern.matcher(text); + String[] words = pattern.split(code); + Matcher matcher = pattern.matcher(code); return extDoc(keyMap, matcher, docMap, words, treeMap); } @@ -65,18 +80,15 @@ public class LineExt { @NotNull Map>> docMap, @NotNull String[] words, @NotNull Map>> treeMap) { boolean haveDoc = false; + boolean haveKey = false; StringBuilder sb = new StringBuilder(); for (String s : words) { - if (appendDoc(sb, s, docMap, treeMap)) { - haveDoc = true; - } - appendKeyDoc(sb, matcher, keyMap); + haveDoc |= appendDoc(sb, s, docMap, treeMap); + haveKey = appendKeyDoc(sb, matcher, keyMap); + } + while (haveKey) { + haveKey = appendKeyDoc(sb, matcher, keyMap); } - int before; - do { - before = sb.length(); - appendKeyDoc(sb, matcher, keyMap); - } while (sb.length() != before); if (!haveDoc) { return null; } @@ -100,15 +112,16 @@ public class LineExt { sb.append(treeDoc); return true; } + // not word doc ues word sb.append(word); return false; } - private static void appendKeyDoc(@NotNull StringBuilder sb, + private static boolean appendKeyDoc(@NotNull StringBuilder sb, @NotNull Matcher matcher, @NotNull Map>> keyMap) { if (!matcher.find()) { - return; + return false; } String keyword = matcher.group(); // "" if no doc @@ -120,5 +133,6 @@ public class LineExt { if (sb.length() != 1) { sb.append(" "); } + return true; } } diff --git a/src/main/java/io/github/linwancen/plugin/show/ext/TreeExt.java b/src/main/java/io/github/linwancen/plugin/show/ext/TreeExt.java index 56cc157..0bae0ae 100644 --- a/src/main/java/io/github/linwancen/plugin/show/ext/TreeExt.java +++ b/src/main/java/io/github/linwancen/plugin/show/ext/TreeExt.java @@ -1,8 +1,10 @@ package io.github.linwancen.plugin.show.ext; +import com.intellij.ide.projectView.ProjectViewNode; import com.intellij.openapi.vfs.VirtualFile; import io.github.linwancen.plugin.show.ext.conf.ConfCache; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; @@ -11,8 +13,16 @@ public class TreeExt { private TreeExt() {} + public static @Nullable String doc(ProjectViewNode node) { + VirtualFile file = node.getVirtualFile(); + if (file == null) { + return null; + } + return TreeExt.extDoc(file); + } + public static String extDoc(@NotNull VirtualFile file) { - Map>> docMap = ConfCache.treeMap(file.getPath()); + Map>> docMap = ConfCache.treeMap(file.getPath(), file.getName(), file.getPath()); String[] words = { file.getName(), file.getNameWithoutExtension(), diff --git a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCache.java b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCache.java index d7928f0..aea67c5 100644 --- a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCache.java +++ b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCache.java @@ -63,8 +63,10 @@ public class ConfCache { } @NotNull - public static Map>> treeMap(@NotNull String path) { - return ConfCacheGetUtils.filterPath(TREE_CACHE, path); + public static Map>> treeMap(@NotNull String path, + @NotNull String name, + @Nullable String ext) { + return ConfCacheGetUtils.filterPath(TREE_CACHE, path, name, ext); } static void clearAll() { @@ -113,13 +115,13 @@ public class ConfCache { new NotificationGroup("Ext Doc Conf Load All", NotificationDisplayType.BALLOON, true); static void loadAll(@NotNull Project project) { - ApplicationManager.getApplication().runReadAction(() -> - DumbService.getInstance(project).runReadActionInSmartMode(() -> { + DumbService.getInstance(project).runReadActionInSmartMode(() -> + ApplicationManager.getApplication().runReadAction(() -> { Collection files = FilenameIndex.getAllFilesByExt(project, EXT); StringBuilder sb = new StringBuilder(); for (VirtualFile file : files) { load(project, file); - sb.append(file.getPath()).append("\n"); + sb.append(file.getName()).append("\n"); } if (files.isEmpty()) { return; diff --git a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCacheGetUtils.java b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCacheGetUtils.java index 3958e41..20130ff 100644 --- a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCacheGetUtils.java +++ b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfCacheGetUtils.java @@ -75,7 +75,7 @@ class ConfCacheGetUtils { @NotNull static TreeMap filterPath(@SuppressWarnings("SameParameterValue") @NotNull Map cache, - @NotNull String path) { + @NotNull String path, String name, String ext) { TreeMap map = new TreeMap<>(); int max = path.length(); int length = String.valueOf(max).length(); diff --git a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfFactory.java b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfFactory.java index e3cc1e7..1b89251 100644 --- a/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfFactory.java +++ b/src/main/java/io/github/linwancen/plugin/show/ext/conf/ConfFactory.java @@ -94,8 +94,6 @@ class ConfFactory { map.put(key, words); } } - DATA_LOG.createNotification("Ext doc file load complete", map.size() + " lines", - "\n" + path, NotificationType.INFORMATION).notify(project); return map; } } diff --git a/src/main/java/io/github/linwancen/plugin/show/jump/JsonRef.java b/src/main/java/io/github/linwancen/plugin/show/jump/JsonRef.java index 987802b..b34df07 100644 --- a/src/main/java/io/github/linwancen/plugin/show/jump/JsonRef.java +++ b/src/main/java/io/github/linwancen/plugin/show/jump/JsonRef.java @@ -6,12 +6,12 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -public class JsonRef extends PsiReferenceBase implements PsiPolyVariantReference { +public class JsonRef extends PsiReferenceBase implements PsiPolyVariantReference { - final PsiField psiField; - final List tips; + final T psiField; + final List tips; - public JsonRef(@NotNull PsiElement element, @NotNull PsiField psiField, @NotNull List tips) { + public JsonRef(@NotNull PsiElement element, @NotNull T psiField, @NotNull List tips) { super(element); this.psiField = psiField; this.tips = tips; @@ -21,13 +21,12 @@ public class JsonRef extends PsiReferenceBase implements PsiPolyVari * do not use it because PsiReference.resolveReference() is @Experimental */ @Override - public ResolveResult @NotNull [] multiResolve(boolean incompleteCode) { + public @NotNull ResolveResult[] multiResolve(boolean incompleteCode) { return new ResolveResult[]{new PsiElementResolveResult(psiField)}; } - @Nullable @Override - public PsiElement resolve() { + public @Nullable PsiElement resolve() { return psiField; } @@ -35,7 +34,7 @@ public class JsonRef extends PsiReferenceBase implements PsiPolyVari * I don't know how to use it */ @Override - public Object @NotNull [] getVariants() { + public @NotNull Object[] getVariants() { return tips.toArray(); } } \ No newline at end of file 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 new file mode 100644 index 0000000..23832d6 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/GoLangDoc.java @@ -0,0 +1,37 @@ +package io.github.linwancen.plugin.show.lang; + +import com.goide.GoLanguage; +import com.goide.documentation.GoDocumentationProvider; +import com.goide.psi.GoReferenceExpressionBase; +import com.intellij.psi.PsiComment; +import com.intellij.psi.PsiElement; +import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; +import io.github.linwancen.plugin.show.bean.LineInfo; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class GoLangDoc extends BaseLangDoc { + + static { + LANG_DOC_MAP.put(GoLanguage.INSTANCE.getID(), new GoLangDoc()); + } + + @Override + public @NotNull Class getRefClass() { + return GoReferenceExpressionBase.class; + } + + @Override + public boolean show(@NotNull LineInfo lineInfo) { + return lineInfo.appSettings.showLineEndCommentGo; + } + + @Override + public @Nullable String resolveDocRaw(@NotNull T lineInfo, @NotNull PsiElement resolve) { + List comments = GoDocumentationProvider.getCommentsForElement(resolve); + return GoDocumentationProvider.getCommentText(comments, false); + } +} 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 new file mode 100644 index 0000000..7ad174b --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/JsLangDoc.java @@ -0,0 +1,45 @@ +package io.github.linwancen.plugin.show.lang; + +import com.intellij.lang.javascript.JavascriptLanguage; +import com.intellij.lang.javascript.documentation.JSDocumentationUtils; +import com.intellij.lang.javascript.psi.JSPsiReferenceElement; +import com.intellij.psi.PsiComment; +import com.intellij.psi.PsiElement; +import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; +import io.github.linwancen.plugin.show.bean.LineInfo; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class JsLangDoc extends BaseLangDoc { + + static { + LANG_DOC_MAP.put(JavascriptLanguage.INSTANCE.getID(), new JsLangDoc()); + } + + @Override + public @NotNull Class getRefClass() { + return JSPsiReferenceElement.class; + } + + @Override + public boolean show(@NotNull LineInfo lineInfo) { + return lineInfo.appSettings.showLineEndCommentJs; + } + + @Override + public @Nullable String resolveDocRaw(@NotNull T lineInfo, @NotNull PsiElement resolve) { + PsiComment psiComment = JSDocumentationUtils.findOwnDocCommentForImplicitElement(resolve); + if (psiComment == null) { + return null; + } + String text = psiComment.getText(); + if (text!=null) { + return text; + } + if (!lineInfo.appSettings.jsDoc) { + return super.resolveDocRaw(lineInfo, resolve); + } + return null; + } +} 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 new file mode 100644 index 0000000..789053e --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/JsonLangDoc.java @@ -0,0 +1,63 @@ +package io.github.linwancen.plugin.show.lang; + +import com.intellij.json.psi.JsonProperty; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; +import io.github.linwancen.plugin.show.bean.LineInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class JsonLangDoc extends BaseLangDoc { + + public static final JsonLangDoc INSTANCE = new JsonLangDoc(); + + @Override + public @NotNull Class getRefClass() { + return JsonProperty.class; + } + + @Override + public boolean show(@NotNull LineInfo lineInfo) { + return lineInfo.appSettings.showLineEndCommentJson; + } + + @Override + public @Nullable String findRefDoc(@NotNull LineInfo lineInfo, @NotNull PsiElement element) { + PsiElement start = lineInfo.viewProvider.findElementAt(lineInfo.startOffset); + if (start == null) { + return null; + } + PsiElement jsonProperty = start.getNextSibling(); + if (jsonProperty == null) { + return null; + } + return refElementDoc(lineInfo, jsonProperty); + } + + @Override + protected @Nullable String refDoc(@NotNull T lineInfo, @NotNull PsiElement ref) { + if (!(ref instanceof JsonProperty)) { + return null; + } + JsonProperty jsonProperty = (JsonProperty) ref; + PsiReference[] references = jsonProperty.getNameElement().getReferences(); + for (PsiReference reference : references) { + PsiElement resolve = null; + try { + resolve = reference.resolve(); + } catch (Throwable ignore) { + // ignore + } + if (resolve == null) { + continue; + } + String doc = BaseLangDoc.resolveDoc(lineInfo, resolve); + if (doc != null) { + return doc; + } + } + return null; + } +} 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 new file mode 100644 index 0000000..5725a97 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/PythonLangDoc.java @@ -0,0 +1,25 @@ +package io.github.linwancen.plugin.show.lang; + +import com.intellij.psi.PsiElement; +import com.jetbrains.python.PythonLanguage; +import com.jetbrains.python.psi.PyReferenceExpression; +import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; +import io.github.linwancen.plugin.show.bean.LineInfo; +import org.jetbrains.annotations.NotNull; + +public class PythonLangDoc extends BaseLangDoc { + + static { + LANG_DOC_MAP.put(PythonLanguage.INSTANCE.getID(), new PythonLangDoc()); + } + + @Override + public @NotNull Class getRefClass() { + return PyReferenceExpression.class; + } + + @Override + public boolean show(@NotNull LineInfo lineInfo) { + return lineInfo.appSettings.showLineEndCommentPy; + } +} 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 new file mode 100644 index 0000000..f6bf7a1 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/SqlLangDoc.java @@ -0,0 +1,50 @@ +package io.github.linwancen.plugin.show.lang; + +import com.intellij.database.psi.DbElement; +import com.intellij.psi.PsiElement; +import com.intellij.sql.SqlDocumentationProvider; +import com.intellij.sql.psi.SqlLanguage; +import com.intellij.sql.psi.SqlReferenceExpression; +import com.intellij.util.containers.JBIterable; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; +import io.github.linwancen.plugin.show.lang.base.DocSkip; +import io.github.linwancen.plugin.show.bean.LineInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SqlLangDoc extends BaseLangDoc { + + static { + LANG_DOC_MAP.put(SqlLanguage.INSTANCE.getID(), new SqlLangDoc()); + } + + @Override + public @NotNull Class getRefClass() { + return SqlReferenceExpression.class; + } + + @Override + public boolean show(@NotNull LineInfo lineInfo) { + return lineInfo.appSettings.showLineEndCommentSql; + } + + + @Override + protected @Nullable String refElementDoc(@NotNull T lineInfo, + @NotNull PsiElement ref) { + JBIterable relatedDbElements; + try { + relatedDbElements = SqlDocumentationProvider.findRelatedDbElements(ref, false); + } catch (Throwable e) { + return null; + } + for (DbElement dbElement : relatedDbElements) { + String refDoc = dbElement.getComment(); + if (refDoc != null && !DocSkip.skipDoc(lineInfo.appSettings, lineInfo.projectSettings, refDoc)) { + return refDoc; + } + } + return null; + } +} 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 new file mode 100644 index 0000000..9d68596 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/BaseLangDoc.java @@ -0,0 +1,202 @@ +package io.github.linwancen.plugin.show.lang.base; + +import com.intellij.ide.projectView.ProjectViewNode; +import com.intellij.json.JsonLanguage; +import com.intellij.lang.Language; +import com.intellij.openapi.editor.EditorLinePainter; +import com.intellij.openapi.editor.LineExtensionInfo; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import io.github.linwancen.plugin.show.lang.JsonLangDoc; +import io.github.linwancen.plugin.show.bean.LineInfo; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * + */ +public abstract class BaseLangDoc extends EditorLinePainter { + public static final Map LANG_DOC_MAP = new LinkedHashMap<>(); + + public abstract @Nullable Class getRefClass(); + + public abstract boolean show(@NotNull LineInfo lineInfo); + + @Nullable + public String treeDoc(T settingsInfo, ProjectViewNode node, Project project) { + return null; + } + + @Override + public @Nullable Collection getLineExtensions(@NotNull Project project, + @NotNull VirtualFile file, int lineNumber) { + // Only Load Class + return null; + } + + public static @Nullable String langDoc(@NotNull LineInfo lineInfo) { + PsiElement element = lineInfo.viewProvider.findElementAt(lineInfo.endOffset); + if (element == null) { + // file end + element = lineInfo.viewProvider.findElementAt(lineInfo.endOffset - 1); + if (element == null) { + return null; + } + } + Language language = PsiElementTo.language(element); + BaseLangDoc lineEnd = LANG_DOC_MAP.get(language.getID()); + if (lineEnd != null && lineEnd.show(lineInfo)) { + return lineEnd.findRefDoc(lineInfo, element); + } else if (language == JsonLanguage.INSTANCE && JsonLangDoc.INSTANCE.show(lineInfo)) { + return JsonLangDoc.INSTANCE.findRefDoc(lineInfo, element); + } + return null; + } + + /** + * Override like JSON + */ + @Nullable + public String findRefDoc(@NotNull LineInfo lineInfo, @NotNull PsiElement element) { + Class refClass = getRefClass(); + if (refClass == null) { + return null; + } + String doc = null; + PsiElement refElement = element; + while ((refElement = Prev.prevRefChild(lineInfo, refElement, refClass)) != null) { + PsiElement parent = refElement.getParent(); + String filterDoc = refElementDoc(lineInfo, parent); + if (filterDoc != null) { + doc = filterDoc; + refElement = parent; + break; + } + } + if (refElement == null) { + return null; + } + // before doc + refElement = Prev.prevRefChild(lineInfo, refElement, refClass); + if (refElement == null) { + return doc; + } + String text = refElement.getText(); + boolean set = text.startsWith("set"); + PsiElement parent = refElement.getParent(); + String before = refElementDoc(lineInfo, parent); + if (before != null) { + doc = mergeDoc(set, lineInfo.appSettings.getToSet, before, doc); + } + return doc; + } + + @NotNull + private String mergeDoc(boolean set, boolean getToSet, String before, String doc) { + if (set) { + if (getToSet) { + // because lambda is -> or => + doc = doc + " --> " + before; + } else { + doc = before + " = " + doc; + } + } else { + doc = before + " " + doc; + } + return doc; + } + + /** + * Override like SQL + */ + protected String refElementDoc(@NotNull T lineInfo, + @NotNull PsiElement refElement) { + String refDoc = refDoc(lineInfo, refElement); + if (refDoc != null && !DocSkip.skipDoc(lineInfo.appSettings, lineInfo.projectSettings, refDoc)) { + return refDoc; + } + return null; + } + + /** + * Override like Java/Json + */ + @Nullable + protected String refDoc(@NotNull T lineInfo, @NotNull PsiElement ref) { + // kotlin ref.getReference() == null but ref.getReferences().length == 2 + PsiReference[] references = ref.getReferences(); + if (references.length < 1) { + return null; + } + for (PsiReference reference : references) { + PsiElement resolve; + try { + resolve = reference.resolve(); + } catch (Throwable e) { + // 2021.3: Slow operations are prohibited on EDT. See SlowOperations.assertSlowOperationsAreAllowed javadoc. + return null; + } + if (resolve == null) { + return null; + } + String resolveDoc = resolveDoc(lineInfo, resolve); + if (resolveDoc != null) { + return resolveDoc; + } + } + return null; + } + + public static @Nullable String resolveDoc(T settingsInfo, PsiElement psiElement) { + // support like java <-> kotlin + Language language = PsiElementTo.language(psiElement); + BaseLangDoc lineEnd = LANG_DOC_MAP.get(language.getID()); + if (lineEnd == null) { + return null; + } + return lineEnd.resolveDocPrint(settingsInfo, psiElement); + } + + /** + * Override like Java/Kotlin + */ + @Nullable + protected String resolveDocPrint(@NotNull T lineInfo, @NotNull PsiElement resolve) { + String s = resolveDocRaw(lineInfo, resolve); + if (s == null) { + return null; + } + String cutDoc = DocFilter.cutDoc(s, lineInfo.appSettings, true); + String filterDoc = DocFilter.filterDoc(cutDoc, lineInfo.appSettings, lineInfo.projectSettings); + if (filterDoc.trim().length() == 0) { + return null; + } + return filterDoc; + } + + /** + * Override like JS/Go + */ + @Nullable + protected String resolveDocRaw(@NotNull T lineInfo, @NotNull PsiElement resolve) { + FileViewProvider viewProvider = PsiElementTo.viewProvider(resolve); + if (viewProvider == null) { + return null; + } + String doc = ResolveDoc.fromLineEnd(lineInfo, resolve, viewProvider); + if (doc != null) { + return doc; + } + return ResolveDoc.fromLineUp(lineInfo, resolve, viewProvider, keywords()); + } + + protected List keywords() { + return Collections.emptyList(); + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/base/BaseTagLangDoc.java b/src/main/java/io/github/linwancen/plugin/show/lang/base/BaseTagLangDoc.java new file mode 100644 index 0000000..b701fb5 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/BaseTagLangDoc.java @@ -0,0 +1,58 @@ +package io.github.linwancen.plugin.show.lang.base; + +import com.intellij.psi.PsiElement; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class BaseTagLangDoc extends BaseLangDoc { + + @Override + public @Nullable String resolveDocPrint(@NotNull T lineInfo, @NotNull PsiElement resolve) { + DocElement docElement = toDocElement(resolve); + if (docElement == null) { + return null; + } + return docElementToStr(lineInfo, docElement); + } + + @Nullable + public String docElementToStr(@NotNull T lineInfo, @Nullable DocElement docElement) { + if (docElement == null) { + return null; + } + // desc + String descDoc = descDoc(lineInfo, docElement).trim(); + String desc = DocFilter.filterDoc(descDoc, lineInfo.appSettings, lineInfo.projectSettings); + // tag + StringBuilder tagStrBuilder = new StringBuilder(); + String[] names = lineInfo.tagNames(); + for (String name : names) { + appendTag(lineInfo, tagStrBuilder, docElement, name); + } + if (desc.length() > 0) { + if (tagStrBuilder.length() > 0) { + tagStrBuilder.insert(0, " @ "); + } + tagStrBuilder.insert(0, desc); + } + String text = tagStrBuilder.toString().trim(); + if (text.length() == 0) { + return null; + } + return text; + } + + @Nullable + protected abstract DocElement toDocElement(@NotNull PsiElement resolve); + + /** + * cut / * # not filter text + */ + @NotNull + protected abstract String descDoc(@NotNull T lineInfo, @NotNull DocElement docElement); + + protected abstract void appendTag(@NotNull T lineInfo, + @NotNull StringBuilder tagStrBuilder, + @NotNull DocElement docElement, @NotNull String name); +} diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/base/DocFilter.java b/src/main/java/io/github/linwancen/plugin/show/lang/base/DocFilter.java new file mode 100644 index 0000000..0ff93a9 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/DocFilter.java @@ -0,0 +1,101 @@ +package io.github.linwancen.plugin.show.lang.base; + +import io.github.linwancen.plugin.show.settings.AppSettingsState; +import io.github.linwancen.plugin.show.settings.ProjectSettingsState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class DocFilter { + + private DocFilter() {} + + private static final Pattern DOC_PATTERN = Pattern.compile("(?m" + + // ///// xx line start + ")^ *//++ *+" + + // /**** xx block start + "|^ */\\*++ *+" + + // ****/ xx block end, not only line start and must before **** + "| *\\*++/.*" + + // **** xx block body + "|^ *\\*++ *+" + + // #### xx python and shell start + "|^ *#++ *+" + ); + + private static final Pattern LINE_SEPARATOR_PATTERN = Pattern.compile("[\r\n]"); + + /** + * delete / * # in resolveDocPrint() + * end with space + */ + @NotNull + public static String cutDoc(String text, + AppSettingsState appSettings, boolean deletePrefix) { + String[] split = LINE_SEPARATOR_PATTERN.split(text); + int lineCount = 0; + StringBuilder sb = new StringBuilder(); + for (String s : split) { + if (deletePrefix) { + s = DOC_PATTERN.matcher(s).replaceAll(""); + } + s = s.trim(); + sb.append(s); + if (s.length() > 0) { + sb.append(" "); + } + lineCount++; + if (lineCountOrLenOver(appSettings, sb, lineCount)) break; + } + return sb.toString(); + } + + public static boolean lineCountOrLenOver(@NotNull AppSettingsState appSettings, + @NotNull StringBuilder sb, int lineCount) { + boolean countOver = appSettings.lineEndCount > 0 && lineCount >= appSettings.lineEndCount; + boolean lenOver = appSettings.lineEndLen > 0 && sb.length() >= appSettings.lineEndLen; + return countOver || lenOver; + } + + /** + * filter doc text in resolveDocPrint() + */ + @NotNull + public static String filterDoc(@NotNull String text, + AppSettingsState appSettings, + ProjectSettingsState projectSettings) { + // docGetEffect first because default false + if (projectSettings.docGetEffect && projectSettings.projectFilterEffective) { + return filterDoc(text, projectSettings.docGet); + } else if (appSettings.docGetEffect && projectSettings.globalFilterEffective) { + return filterDoc(text, appSettings.docGet); + } else { + return text; + } + } + + @NotNull + public static String filterDoc(@NotNull String text, @NotNull Pattern docGet) { + // if effect skip check empty + Matcher m = docGet.matcher(text); + if (m.find()) { + return m.group(m.groupCount()); + } + // one line + return text; + } + + private static final Pattern HTML_PATTERN = Pattern.compile("<[^>]++>"); + + /** + * trim end with space + */ + public static void addHtml(@NotNull StringBuilder sb, @NotNull String s) { + String deleteHtml = HTML_PATTERN.matcher(s).replaceAll("").trim(); + if (deleteHtml.length() > 0) { + sb.append(deleteHtml).append(" "); + } + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/base/DocSkip.java b/src/main/java/io/github/linwancen/plugin/show/lang/base/DocSkip.java new file mode 100644 index 0000000..4bc531f --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/DocSkip.java @@ -0,0 +1,67 @@ +package io.github.linwancen.plugin.show.lang.base; + +import io.github.linwancen.plugin.show.settings.AppSettingsState; +import io.github.linwancen.plugin.show.settings.ProjectSettingsState; +import org.jetbrains.annotations.NotNull; + +import java.util.regex.Pattern; + +public class DocSkip { + + private DocSkip() {} + + public static boolean skipSign(AppSettingsState appSettings, ProjectSettingsState projectSettings, String text) { + return skipText(text, + projectSettings.globalFilterEffective, appSettings.lineInclude, appSettings.lineExclude, + projectSettings.projectFilterEffective, projectSettings.lineInclude, projectSettings.lineExclude); + } + + private static final Pattern NOT_ASCII_PATTERN = Pattern.compile("[^\u0000-\u007f]"); + + public static boolean skipDoc(AppSettingsState appSettings, ProjectSettingsState projectSettings, String text) { + if (appSettings.skipAscii && !NOT_ASCII_PATTERN.matcher(text).find()) { + return true; + } + return skipText(text, + projectSettings.globalFilterEffective, appSettings.docInclude, appSettings.docExclude, + projectSettings.projectFilterEffective, projectSettings.docInclude, projectSettings.docExclude); + } + + static boolean skipText(String text, + boolean appFilterEffective, Pattern appDocInclude, Pattern appDocExclude, + boolean projectFilterEffective, Pattern projectDocInclude, Pattern projectDocExclude + ) { + if (text == null) { + return true; + } + if (appFilterEffective + && skipText(text, appDocInclude, appDocExclude)) { + return true; + } + if (projectFilterEffective) { + return skipText(text, projectDocInclude, projectDocExclude); + } + return false; + } + + static boolean skipText(@NotNull String text, Pattern include, Pattern exclude) { + if (exclude(text, exclude)) { + return true; + } + return !include(text, include); + } + + static boolean include(@NotNull String text, Pattern include) { + if (include.pattern().length() == 0) { + return true; + } + return include.matcher(text).find(); + } + + static boolean exclude(@NotNull String text, Pattern exclude) { + if (exclude.pattern().length() == 0) { + return false; + } + return exclude.matcher(text).find(); + } +} 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 new file mode 100644 index 0000000..25d00c7 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/Prev.java @@ -0,0 +1,88 @@ +package io.github.linwancen.plugin.show.lang.base; + +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import io.github.linwancen.plugin.show.bean.LineInfo; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.regex.Pattern; + +public class Prev { + + private Prev() {} + + public static PsiElement prevRefChild(@NotNull LineInfo lineInfo, @NotNull PsiElement element, + @NotNull Class refClass) { + PsiElement prevParent = element.getParent(); + while ((element = PsiTreeUtil.prevVisibleLeaf(element)) != null) { + if (element.getTextRange().getEndOffset() < lineInfo.startOffset) { + return null; + } + PsiElement parent = refClassParent(element, refClass); + if (parent != null) { + // skip b in a.b.c + if (prevParent.getTextRange().getEndOffset() < lineInfo.endOffset + && PsiTreeUtil.findChildOfType(prevParent, refClass) == parent) { + prevParent = parent; + } else { + return element; + } + } + } + return null; + } + + private static final Pattern SYMBOL_PATTERN = Pattern.compile("[" + + ":-@" + + "\\[-`" + + "{-~" + + "]++"); + + private static PsiElement refClassParent(@NotNull PsiElement element, + @NotNull Class refClass) { + String text = element.getText(); + if (SYMBOL_PATTERN.matcher(text).find()) { + return null; + + } + PsiElement parent = element.getParent(); + if (parent == null) { + return null; + } + if (!refClass.isAssignableFrom(parent.getClass())) { + parent = parent.getParent(); + if (parent == null) { + return null; + } + } + if (!refClass.isAssignableFrom(parent.getClass())) { + return null; + } + return parent; + } + + public static @Nullable PsiElement prevCompactElement( + @SuppressWarnings("unused") @NotNull T lineInfo, @NotNull PsiElement resolve, @NotNull Document document) { + PsiElement element = PsiTreeUtil.prevVisibleLeaf(resolve); + if (element == null) { + return null; + } + int endOffset = element.getTextRange().getEndOffset(); + int startOffset = resolve.getTextRange().getStartOffset(); + String spaceText; + try { + spaceText = document.getText(TextRange.create(endOffset, startOffset)); + } catch (Exception e) { + return null; + } + String replace = spaceText.replace("\n", ""); + if (spaceText.length() - replace.length() > 1) { + return null; + } + return element; + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/base/PsiElementTo.java b/src/main/java/io/github/linwancen/plugin/show/lang/base/PsiElementTo.java new file mode 100644 index 0000000..a0f59a7 --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/PsiElementTo.java @@ -0,0 +1,36 @@ +package io.github.linwancen.plugin.show.lang.base; + +import com.intellij.lang.Language; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PsiElementTo { + + private PsiElementTo() {} + + public static @Nullable FileViewProvider viewProvider(PsiElement resolve) { + PsiFile psiFile = resolve.getContainingFile(); + if (psiFile == null) { + return null; + } + VirtualFile resolveFile = psiFile.getVirtualFile(); + if (resolveFile == null) { + return null; + } + return PsiManager.getInstance(resolve.getProject()).findViewProvider(resolveFile); + } + + public static @NotNull Language language(@NotNull PsiElement element) { + Language lang = element.getLanguage(); + Language base = lang.getBaseLanguage(); + if (base != null) { + return base; + } + return lang; + } +} diff --git a/src/main/java/io/github/linwancen/plugin/show/lang/base/ResolveDoc.java b/src/main/java/io/github/linwancen/plugin/show/lang/base/ResolveDoc.java new file mode 100644 index 0000000..dff973d --- /dev/null +++ b/src/main/java/io/github/linwancen/plugin/show/lang/base/ResolveDoc.java @@ -0,0 +1,85 @@ +package io.github.linwancen.plugin.show.lang.base; + +import com.intellij.openapi.editor.Document; +import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiComment; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import io.github.linwancen.plugin.show.bean.SettingsInfo; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ResolveDoc { + + private ResolveDoc() {} + + @Nullable + public static String fromLineEnd(@SuppressWarnings("unused") @NotNull T lineInfo, + @NotNull PsiElement resolve, + @NotNull FileViewProvider resolveViewProvider) { + Document document = resolveViewProvider.getDocument(); + if (document == null) { + return null; + } + int endOffset = resolve.getTextRange().getEndOffset(); + int lineNumber; + int resolveEndOffset; + try { + lineNumber = document.getLineNumber(endOffset); + resolveEndOffset = document.getLineEndOffset(lineNumber); + } catch (Exception e) { + return null; + } + // end over will return last + PsiElement psiElement = resolveViewProvider.findElementAt(resolveEndOffset); + if (psiElement == null) { + return null; + } + PsiElement docElement = PsiTreeUtil.prevVisibleLeaf(psiElement); + if (!(docElement instanceof PsiComment)) { + return null; + } + int docEnd = docElement.getTextRange().getEndOffset(); + int docLineNumber = document.getLineNumber(docEnd); + if (lineNumber != docLineNumber) { + return null; + } + return docElement.getText(); + } + + @Nullable + public static String fromLineUp(@NotNull T lineInfo, + PsiElement resolve, + @NotNull FileViewProvider resolveViewProvider, + @NotNull List keywords) { + Document document = resolveViewProvider.getDocument(); + if (document == null) { + return null; + } + PsiElement psiElement = Prev.prevCompactElement(lineInfo, resolve, document); + if (!keywords.isEmpty()) { + while (psiElement != null) { + String text = psiElement.getText(); + if (keywords.contains(text)) { + psiElement = Prev.prevCompactElement(lineInfo, psiElement, document); + } else { + break; + } + } + } + StringBuilder sb = new StringBuilder(); + while (psiElement instanceof PsiComment) { + String text = psiElement.getText(); + if (text != null) { + sb.insert(0, "\n").insert(0, text); + } + psiElement = Prev.prevCompactElement(lineInfo, psiElement, document); + } + if (sb.length() == 0) { + return null; + } + return sb.toString(); + } +} 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 f86bc90..750ab68 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 @@ -18,17 +18,23 @@ public class AppSettingsComponent extends AbstractSettingsComponent { private final JBCheckBox compact = new JBCheckBox("compact "); private final JBTextField treeTags = new JBTextField(); private final JBCheckBox showLineEndComment = new JBCheckBox("Show line end comment "); + private final JBCheckBox showLineEndCommentJava = new JBCheckBox("Java "); + private final JBCheckBox showLineEndCommentSql = new JBCheckBox("sql "); + private final JBCheckBox showLineEndCommentJson = new JBCheckBox("json "); + private final JBCheckBox showLineEndCommentJs = new JBCheckBox("js "); + private final JBCheckBox jsdoc = new JBCheckBox("jsdoc "); + private final JBCheckBox showLineEndCommentPy = new JBCheckBox("Python "); + private final JBCheckBox showLineEndCommentGo = new JBCheckBox("Go "); + private final JBCheckBox showLineEndCommentKotlin = new JBCheckBox("Kotlin "); private final JBTextField lineTags = new JBTextField(); - private final JBCheckBox fromCall = new JBCheckBox("call "); - private final JBCheckBox fromNew = new JBCheckBox("new "); - private final JBCheckBox fromRef = new JBCheckBox("ref "); - private final JBCheckBox inJson = new JBCheckBox("in json "); + private final JBCheckBox getToSet = new JBCheckBox("get |> set "); + private final JBCheckBox fromNew = new JBCheckBox("java new "); + private final JBCheckBox fromParam = new JBCheckBox("java param "); private final JBCheckBox skipAnnotation = new JBCheckBox("skip @ "); private final JBCheckBox skipAscii = new JBCheckBox("skip English "); private final JBCheckBox skipBlank = new JBCheckBox("skip Blank "); private final ColorPanel lineEndColor = new ColorPanel(); private final ColorPanel lineEndJsonColor = new ColorPanel(); - private final JBCheckBox findElementRightToLeft = new JBCheckBox("Find element right to left"); private final JBTextField lineEndPrefix = new JBTextField(); private final JBTextField lineEndCount = new JBTextField(); @@ -43,8 +49,17 @@ public class AppSettingsComponent extends AbstractSettingsComponent { @NotNull private JPanel showPanel() { JPanel comment = FormBuilder.createFormBuilder() - .addComponent(showTreeComment, 1) - .addComponent(showLineEndComment, 1) + .addComponent(JPanelFactory.of(showTreeComment, compact), 1) + .addComponent(JPanelFactory.of(showLineEndComment, + showLineEndCommentJava, + showLineEndCommentSql, + showLineEndCommentJson, + showLineEndCommentJs, + jsdoc, + showLineEndCommentPy, + showLineEndCommentGo, + showLineEndCommentKotlin + ), 1) .addLabeledComponent(new JBLabel("tree tags split by |:"), treeTags, 1, true) .addLabeledComponent(new JBLabel("line tags split by |:"), lineTags, 1, true) .getPanel(); @@ -60,9 +75,10 @@ public class AppSettingsComponent extends AbstractSettingsComponent { new JBLabel("json text color: "), lineEndJsonColor, new JBLabel("prefix: "), lineEndPrefix); FormBuilder formBuilder = FormBuilder.createFormBuilder() - .addComponent(JPanelFactory.of(findElementRightToLeft, compact)) + // .addComponent(JPanelFactory.of(findElementRightToLeft)) .addSeparator() - .addComponent(JPanelFactory.of(fromCall, fromNew, fromRef, inJson, skipAnnotation, skipAscii, skipBlank), 1) + // .addComponent(JPanelFactory.of(fromCall, fromNew, fromRef, inJson, skipAnnotation, skipAscii, skipBlank), 1) + .addComponent(JPanelFactory.of(fromNew, fromParam, getToSet, skipAnnotation, skipAscii, skipBlank), 1) .addSeparator() .addComponent(text) .addSeparator(); @@ -111,6 +127,70 @@ public class AppSettingsComponent extends AbstractSettingsComponent { showLineEndComment.setSelected(newStatus); } + public boolean getShowLineEndCommentJava() { + return showLineEndCommentJava.isSelected(); + } + + public void setShowLineEndCommentJava(boolean newStatus) { + showLineEndCommentJava.setSelected(newStatus); + } + + public boolean getShowLineEndCommentSql() { + return showLineEndCommentSql.isSelected(); + } + + public void setShowLineEndCommentSql(boolean newStatus) { + showLineEndCommentSql.setSelected(newStatus); + } + + public boolean getShowLineEndCommentJson() { + return showLineEndCommentJson.isSelected(); + } + + public void setShowLineEndCommentJson(boolean newStatus) { + showLineEndCommentJson.setSelected(newStatus); + } + + public boolean getShowLineEndCommentJs() { + return showLineEndCommentJs.isSelected(); + } + + public void setShowLineEndCommentJs(boolean newStatus) { + showLineEndCommentJs.setSelected(newStatus); + } + + public boolean getJsdoc() { + return jsdoc.isSelected(); + } + + public void setJsdoc(boolean newStatus) { + jsdoc.setSelected(newStatus); + } + + public boolean getShowLineEndCommentPy() { + return showLineEndCommentPy.isSelected(); + } + + public void setShowLineEndCommentPy(boolean newStatus) { + showLineEndCommentPy.setSelected(newStatus); + } + + public boolean getShowLineEndCommentGo() { + return showLineEndCommentGo.isSelected(); + } + + public void setShowLineEndCommentGo(boolean newStatus) { + showLineEndCommentGo.setSelected(newStatus); + } + + public boolean getShowLineEndCommentKotlin() { + return showLineEndCommentKotlin.isSelected(); + } + + public void setShowLineEndCommentKotlin(boolean newStatus) { + showLineEndCommentKotlin.setSelected(newStatus); + } + @NotNull public String getLineTags() { return lineTags.getText(); @@ -120,12 +200,12 @@ public class AppSettingsComponent extends AbstractSettingsComponent { lineTags.setText(newText); } - public boolean getFromCall() { - return fromCall.isSelected(); + public boolean getGetToSet() { + return getToSet.isSelected(); } - public void setFromCall(boolean newStatus) { - fromCall.setSelected(newStatus); + public void setGetToSet(boolean newStatus) { + getToSet.setSelected(newStatus); } public boolean getFromNew() { @@ -136,20 +216,12 @@ public class AppSettingsComponent extends AbstractSettingsComponent { fromNew.setSelected(newStatus); } - public boolean getFromRef() { - return fromRef.isSelected(); + public boolean getFromParam() { + return fromParam.isSelected(); } - public void setFromRef(boolean newStatus) { - fromRef.setSelected(newStatus); - } - - public boolean getInJson() { - return inJson.isSelected(); - } - - public void setInJson(boolean newStatus) { - inJson.setSelected(newStatus); + public void setFromParam(boolean newStatus) { + fromParam.setSelected(newStatus); } public boolean getSkipAnnotation() { @@ -192,14 +264,6 @@ public class AppSettingsComponent extends AbstractSettingsComponent { lineEndJsonColor.setSelectedColor(color); } - public boolean getFindElementRightToLeft() { - return findElementRightToLeft.isSelected(); - } - - public void setFindElementRightToLeft(boolean newStatus) { - findElementRightToLeft.setSelected(newStatus); - } - @NotNull public String getLineEndPrefix() { return lineEndPrefix.getText(); 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 070245b..83039f4 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 @@ -2,7 +2,6 @@ package io.github.linwancen.plugin.show.settings; import com.google.common.base.Splitter; import com.intellij.openapi.options.Configurable; -import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -11,7 +10,6 @@ public class AppSettingsConfigurable implements Configurable { private AppSettingsComponent mySettingsComponent; - @Nls(capitalization = Nls.Capitalization.Title) @Override public String getDisplayName() { return "Show Comment Global."; @@ -34,8 +32,18 @@ public class AppSettingsConfigurable implements Configurable { AppSettingsState settings = AppSettingsState.getInstance(); boolean modified = mySettingsComponent.getShowTreeComment() != settings.showTreeComment; modified |= mySettingsComponent.getCompact() != settings.compact; - modified |= !mySettingsComponent.getTreeTags().equals(String.join("|", settings.treeTags)); + modified |= mySettingsComponent.getShowLineEndComment() != settings.showLineEndComment; + modified |= mySettingsComponent.getShowLineEndCommentJava() != settings.showLineEndCommentJava; + modified |= mySettingsComponent.getShowLineEndCommentSql() != settings.showLineEndCommentSql; + modified |= mySettingsComponent.getShowLineEndCommentJson() != settings.showLineEndCommentJson; + modified |= mySettingsComponent.getShowLineEndCommentJs() != settings.showLineEndCommentJs; + modified |= mySettingsComponent.getJsdoc() != settings.jsDoc; + modified |= mySettingsComponent.getShowLineEndCommentPy() != settings.showLineEndCommentPy; + modified |= mySettingsComponent.getShowLineEndCommentGo() != settings.showLineEndCommentGo; + modified |= mySettingsComponent.getShowLineEndCommentKotlin() != settings.showLineEndCommentKotlin; + + modified |= !mySettingsComponent.getTreeTags().equals(String.join("|", settings.treeTags)); modified |= !mySettingsComponent.getLineTags().equals(String.join("|", settings.lineTags)); modified |= !mySettingsComponent.getLineEndCount().equals(String.valueOf(settings.lineEndCount)); @@ -43,12 +51,9 @@ public class AppSettingsConfigurable implements Configurable { modified |= !mySettingsComponent.getLineEndJsonColor().equals(settings.lineEndJsonTextAttr.getForegroundColor()); modified |= !mySettingsComponent.getLineEndPrefix().equals(settings.lineEndPrefix); - modified |= mySettingsComponent.getFindElementRightToLeft() != settings.findElementRightToLeft; - - modified |= mySettingsComponent.getFromCall() != settings.fromCall; + modified |= mySettingsComponent.getGetToSet() != settings.getToSet; modified |= mySettingsComponent.getFromNew() != settings.fromNew; - modified |= mySettingsComponent.getFromRef() != settings.fromRef; - modified |= mySettingsComponent.getInJson() != settings.inJson; + modified |= mySettingsComponent.getFromParam() != settings.fromParam; modified |= mySettingsComponent.getSkipAnnotation() != settings.skipAnnotation; modified |= mySettingsComponent.getSkipAscii() != settings.skipAscii; modified |= mySettingsComponent.getSkipBlank() != settings.skipBlank; @@ -63,8 +68,18 @@ public class AppSettingsConfigurable implements Configurable { AppSettingsState settings = AppSettingsState.getInstance(); settings.showTreeComment = mySettingsComponent.getShowTreeComment(); settings.compact = mySettingsComponent.getCompact(); - settings.treeTags = Splitter.on('|').splitToList(mySettingsComponent.getTreeTags()).toArray(new String[0]); + settings.showLineEndComment = mySettingsComponent.getShowLineEndComment(); + settings.showLineEndCommentJava = mySettingsComponent.getShowLineEndCommentJava(); + settings.showLineEndCommentSql = mySettingsComponent.getShowLineEndCommentSql(); + settings.showLineEndCommentJson = mySettingsComponent.getShowLineEndCommentJson(); + settings.showLineEndCommentJs = mySettingsComponent.getShowLineEndCommentJs(); + settings.jsDoc = mySettingsComponent.getJsdoc(); + settings.showLineEndCommentPy = mySettingsComponent.getShowLineEndCommentPy(); + settings.showLineEndCommentGo = mySettingsComponent.getShowLineEndCommentGo(); + settings.showLineEndCommentKotlin = mySettingsComponent.getShowLineEndCommentKotlin(); + + settings.treeTags = Splitter.on('|').splitToList(mySettingsComponent.getTreeTags()).toArray(new String[0]); settings.lineTags = Splitter.on('|').splitToList(mySettingsComponent.getLineTags()).toArray(new String[0]); try { @@ -76,12 +91,9 @@ public class AppSettingsConfigurable implements Configurable { settings.lineEndJsonTextAttr.setForegroundColor(mySettingsComponent.getLineEndJsonColor()); settings.lineEndPrefix = mySettingsComponent.getLineEndPrefix(); - settings.findElementRightToLeft = mySettingsComponent.getFindElementRightToLeft(); - - settings.fromCall = mySettingsComponent.getFromCall(); + settings.getToSet = mySettingsComponent.getGetToSet(); settings.fromNew = mySettingsComponent.getFromNew(); - settings.fromRef = mySettingsComponent.getFromRef(); - settings.inJson = mySettingsComponent.getInJson(); + settings.fromParam = mySettingsComponent.getFromParam(); settings.skipAnnotation = mySettingsComponent.getSkipAnnotation(); settings.skipAscii = mySettingsComponent.getSkipAscii(); settings.skipBlank = mySettingsComponent.getSkipBlank(); @@ -94,8 +106,18 @@ public class AppSettingsConfigurable implements Configurable { AppSettingsState settings = AppSettingsState.getInstance(); mySettingsComponent.setShowTreeComment(settings.showTreeComment); mySettingsComponent.setCompact(settings.compact); - mySettingsComponent.setTreeTags(String.join("|", settings.treeTags)); + mySettingsComponent.setShowLineEndComment(settings.showLineEndComment); + mySettingsComponent.setShowLineEndCommentJava(settings.showLineEndCommentJava); + mySettingsComponent.setShowLineEndCommentSql(settings.showLineEndCommentSql); + mySettingsComponent.setShowLineEndCommentJson(settings.showLineEndCommentJson); + mySettingsComponent.setShowLineEndCommentJs(settings.showLineEndCommentJs); + mySettingsComponent.setJsdoc(settings.jsDoc); + mySettingsComponent.setShowLineEndCommentPy(settings.showLineEndCommentPy); + mySettingsComponent.setShowLineEndCommentGo(settings.showLineEndCommentGo); + mySettingsComponent.setShowLineEndCommentKotlin(settings.showLineEndCommentKotlin); + + mySettingsComponent.setTreeTags(String.join("|", settings.treeTags)); mySettingsComponent.setLineTags(String.join("|", settings.lineTags)); mySettingsComponent.setLineEndCount(String.valueOf(settings.lineEndCount)); @@ -103,12 +125,9 @@ public class AppSettingsConfigurable implements Configurable { mySettingsComponent.setLineEndJsonColor(settings.lineEndJsonTextAttr.getForegroundColor()); mySettingsComponent.setLineEndPrefix(settings.lineEndPrefix); - mySettingsComponent.setFindElementRightToLeft(settings.findElementRightToLeft); - - mySettingsComponent.setFromCall(settings.fromCall); + mySettingsComponent.setGetToSet(settings.getToSet); mySettingsComponent.setFromNew(settings.fromNew); - mySettingsComponent.setFromRef(settings.fromRef); - mySettingsComponent.setInJson(settings.inJson); + mySettingsComponent.setFromParam(settings.fromParam); mySettingsComponent.setSkipAnnotation(settings.skipAnnotation); mySettingsComponent.setSkipAscii(settings.skipAscii); mySettingsComponent.setSkipBlank(settings.skipBlank); 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 02e8d97..9f7b2b7 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 @@ -23,8 +23,18 @@ public class AppSettingsState extends AbstractSettingsState implements Persisten public boolean showTreeComment = true; public boolean compact = true; - public String[] treeTags = {"author"}; + public boolean showLineEndComment = true; + public boolean showLineEndCommentJava = true; + public boolean showLineEndCommentSql = true; + public boolean showLineEndCommentJson = true; + public boolean showLineEndCommentJs = true; + public boolean jsDoc = true; + public boolean showLineEndCommentPy = true; + public boolean showLineEndCommentGo = true; + public boolean showLineEndCommentKotlin = true; + + public String[] treeTags = {"author"}; public String[] lineTags = {}; public final TextAttributes lineEndTextAttr = new TextAttributes( @@ -37,10 +47,13 @@ public class AppSettingsState extends AbstractSettingsState implements Persisten public String lineEndPrefix = " // "; public int lineEndCount = 2; public int lineEndLen = 0; + public boolean getToSet = true; + @Deprecated public boolean fromCall = true; public boolean fromNew = true; + @Deprecated public boolean fromRef = true; - public boolean inJson = true; + public boolean fromParam = false; public boolean skipAnnotation = true; public boolean skipAscii = !"en".equals(Locale.getDefault().getLanguage()); public boolean skipBlank = true; diff --git a/src/main/java/io/github/linwancen/plugin/show/settings/ProjectSettingsConfigurable.java b/src/main/java/io/github/linwancen/plugin/show/settings/ProjectSettingsConfigurable.java index 0e1d96d..64bba5a 100644 --- a/src/main/java/io/github/linwancen/plugin/show/settings/ProjectSettingsConfigurable.java +++ b/src/main/java/io/github/linwancen/plugin/show/settings/ProjectSettingsConfigurable.java @@ -3,7 +3,6 @@ package io.github.linwancen.plugin.show.settings; import com.intellij.application.options.ModuleAwareProjectConfigurable; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,7 +22,6 @@ public class ProjectSettingsConfigurable extends ModuleAwareProjectConfigurable< private ProjectSettingsComponent mySettingsComponent; - @Nls(capitalization = Nls.Capitalization.Title) @Override public String getDisplayName() { return "Show Comment Project."; diff --git a/src/main/resources/META-INF/cs.xml b/src/main/resources/META-INF/cs.xml new file mode 100644 index 0000000..378e6e1 --- /dev/null +++ b/src/main/resources/META-INF/cs.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/go.xml b/src/main/resources/META-INF/go.xml new file mode 100644 index 0000000..83c4946 --- /dev/null +++ b/src/main/resources/META-INF/go.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/java.xml b/src/main/resources/META-INF/java.xml new file mode 100644 index 0000000..34293ac --- /dev/null +++ b/src/main/resources/META-INF/java.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/js.xml b/src/main/resources/META-INF/js.xml new file mode 100644 index 0000000..448e4da --- /dev/null +++ b/src/main/resources/META-INF/js.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/kotlin.xml b/src/main/resources/META-INF/kotlin.xml new file mode 100644 index 0000000..58051d5 --- /dev/null +++ b/src/main/resources/META-INF/kotlin.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 4fb7d6e..4dc832a 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -55,15 +55,18 @@ Show doc comment at the Project view Tree, line End, json etc. - com.intellij.modules.platform - com.intellij.modules.java + com.intellij.modules.java + com.intellij.database + JavaScript + com.intellij.modules.python + org.jetbrains.plugins.go + org.jetbrains.kotlin + + - - - @@ -74,22 +77,21 @@ Show doc comment at the Project view Tree, line End, json etc. - + + + - - - diff --git a/src/main/resources/META-INF/pluginIcon.svg b/src/main/resources/META-INF/pluginIcon.svg new file mode 100644 index 0000000..22a4863 --- /dev/null +++ b/src/main/resources/META-INF/pluginIcon.svg @@ -0,0 +1,12 @@ + + + / + / + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/python.xml b/src/main/resources/META-INF/python.xml new file mode 100644 index 0000000..4f45f9c --- /dev/null +++ b/src/main/resources/META-INF/python.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/sql.xml b/src/main/resources/META-INF/sql.xml new file mode 100644 index 0000000..6045846 --- /dev/null +++ b/src/main/resources/META-INF/sql.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/liveTemplates/show-comment-doc.xml b/src/main/resources/liveTemplates/show-comment-doc.xml new file mode 100644 index 0000000..ad25ff4 --- /dev/null +++ b/src/main/resources/liveTemplates/show-comment-doc.xml @@ -0,0 +1,254 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/liveTemplates/show-comment-xml.xml b/src/main/resources/liveTemplates/show-comment-xml.xml new file mode 100644 index 0000000..dbcddc9 --- /dev/null +++ b/src/main/resources/liveTemplates/show-comment-xml.xml @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/src/main/rider/io/github/linwancen/plugin/show/lang/CsLineEnd.java b/src/main/rider/io/github/linwancen/plugin/show/lang/CsLineEnd.java new file mode 100644 index 0000000..5f91790 --- /dev/null +++ b/src/main/rider/io/github/linwancen/plugin/show/lang/CsLineEnd.java @@ -0,0 +1,29 @@ +package io.github.linwancen.plugin.show.lang; + +import com.intellij.psi.PsiElement; +import com.jetbrains.rider.ideaInterop.fileTypes.csharp.CSharpLanguage; +import com.jetbrains.rider.ideaInterop.fileTypes.csharp.psi.CSharpDummyNode; +import io.github.linwancen.plugin.show.bean.LineInfo; +import io.github.linwancen.plugin.show.lang.base.BaseLangDoc; +import org.jetbrains.annotations.NotNull; + +/** + * Doesn't work because I don't know how to get Reference for CSharp PsiElement + *
https://intellij-support.jetbrains.com/hc/en-us/requests/4228491 + */ +public class CsLineEnd extends BaseLangDoc { + + static { + LANG_DOC_MAP.put(CSharpLanguage.INSTANCE.getID(), new CsLineEnd()); + } + + @Override + public boolean show(@NotNull LineInfo lineInfo) { + return true; + } + + @Override + public @NotNull Class getRefClass() { + return CSharpDummyNode.class; + } +} diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/Cs.cs b/src/test/java/io/github/linwancen/plugin/show/demo/Cs.cs new file mode 100644 index 0000000..4557ff7 --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/Cs.cs @@ -0,0 +1,13 @@ +namespace ConsoleApplication1 +{ + /* + * Program + */ + internal class Program + { + public static void Main(string[] args) + { + var program = new Program(); + } + } +} \ No newline at end of file diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/Golang.go b/src/test/java/io/github/linwancen/plugin/show/demo/Golang.go new file mode 100644 index 0000000..9ddfda2 --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/Golang.go @@ -0,0 +1,76 @@ +// Copyright + +// go package +package main + +// doc +func main() { + line(val) + line(val1) + line(value) + + t := &Class{} + line2(t.a) + line2(t.b) + + line(t) + multiLine(t) + lineBlock(t) + block(t) + + // t + a := &Class{} + line(a) + line(multiLine(block(t))) +} + +// const +const val = "" + +const ( + // val1 + val1 = "" +) + +// var +var value *Class + +// First Class +type Class struct { + // a + a *Class2 + b *Class2 // b +} + +// Class2 +type Class2 struct{} + +// line +func line(t *Class) *Class { + return t +} + +// line2 +func line2(t *Class2) *Class2 { + return t +} + +/*** lineBlock */ +func lineBlock(t *Class) *Class { + return t +} + +/***** + ***** block + *****/ +func block(t *Class) *Class { + return t +} + +// other + +// 1 +// 2 +func multiLine(t *Class) *Class { + return t +} diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/HTML.html b/src/test/java/io/github/linwancen/plugin/show/demo/HTML.html new file mode 100644 index 0000000..bab241a --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/HTML.html @@ -0,0 +1,25 @@ + + + + + Title + + + + + + \ No newline at end of file diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/JavaScript.js b/src/test/java/io/github/linwancen/plugin/show/demo/JavaScript.js new file mode 100644 index 0000000..d621bed --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/JavaScript.js @@ -0,0 +1,23 @@ + +lineBlock(isNotDoc) +lineBlock(docVal) +block() + +// isNotDoc +const isNotDoc = "" + +/** docVal */ +const docVal = "" + +/*** lineBlock ***/ +function lineBlock(t) { + return t +} + +/***** + ***** 1 + ***** 2 + *****/ +function block(t) { + return t +} \ No newline at end of file diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/JavaScriptObject.js b/src/test/java/io/github/linwancen/plugin/show/demo/JavaScriptObject.js new file mode 100644 index 0000000..ce1531c --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/JavaScriptObject.js @@ -0,0 +1,43 @@ + +obj.isA(obj.getB()) +obj.setA(obj.getB()) +obj.setB(obj.a) + +/** A */ +let a = obj.isA(obj.getA()) +/** B */ +let b = obj + .setA(obj.getA()) +/** B */ +let b = obj + .setA( + obj.getB()) + +/** obj1 */ +let obj = { + /** a */ + "a":"A", + /** b */ + "b":"B", + /** sub */ + "sub":{ + /** subKey */ + "subKey":"subVal" + }, + /** isA */ + isA: function (t) { + return t + }, + /** setA */ + setA: function (t) { + return t + }, + /** getB */ + getB: function (t) { + return t + }, + /** setB */ + setB: function (t) { + return t + }, +} \ No newline at end of file diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/Python.py b/src/test/java/io/github/linwancen/plugin/show/demo/Python.py new file mode 100644 index 0000000..2f74150 --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/Python.py @@ -0,0 +1,37 @@ +# Copyright + +""" +This module provides Python Demo. +""" + +# VAL1 +VAL = "" + + +# Type1 +class Type: + # Type init + def __init__(self): + pass + # field1 + field = "" + + +# line1 +def line(): + print() + + +# 1 +# 2 +def multi_line(): + print() + + +if __name__ == "__main__": + print VAL + line() + multi_line() + t1 = Type + t2 = Type() + print t2.field diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/c.c b/src/test/java/io/github/linwancen/plugin/show/demo/c.c new file mode 100644 index 0000000..e69de29 diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/ext/cobol/doc/cbl.doc.tsv b/src/test/java/io/github/linwancen/plugin/show/demo/ext/cobol/doc/cbl.doc.tsv index c329d16..c1ff82f 100644 --- a/src/test/java/io/github/linwancen/plugin/show/demo/ext/cobol/doc/cbl.doc.tsv +++ b/src/test/java/io/github/linwancen/plugin/show/demo/ext/cobol/doc/cbl.doc.tsv @@ -1,5 +1,5 @@ -KEY = '1' 字典1 -KEY = '2' 字典2 +KEY = '1' 字典1 ) +KEY = '2' 字典2 ) HELLO-WORLD 你好世界 B001-A 程序A A a diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/java/Call.java b/src/test/java/io/github/linwancen/plugin/show/demo/java/Call.java index 883f3e8..f8e015c 100644 --- a/src/test/java/io/github/linwancen/plugin/show/demo/java/Call.java +++ b/src/test/java/io/github/linwancen/plugin/show/demo/java/Call.java @@ -4,13 +4,17 @@ import io.github.linwancen.plugin.show.demo.java.obj.Child; import io.github.linwancen.plugin.show.demo.java.obj.Face; import io.github.linwancen.plugin.show.demo.java.obj.Parent; +/** + * @author lin + */ public class Call extends Parent { public static void call() { + new Call(); Child child = new Child(true); Parent parentMethod = child.parentMethod(); Face faceMethod = child.faceMethod(child); boolean is = child.isBool(); Child get = child.getField(); - child.setField(new Child(true)); // field + child.setField(new Child(true)); } } diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/java/InDoc.java b/src/test/java/io/github/linwancen/plugin/show/demo/java/InDoc.java index ddbcf7d..6d5e739 100644 --- a/src/test/java/io/github/linwancen/plugin/show/demo/java/InDoc.java +++ b/src/test/java/io/github/linwancen/plugin/show/demo/java/InDoc.java @@ -2,6 +2,7 @@ package io.github.linwancen.plugin.show.demo.java; /** * InDoc + * * {@link InDoc} * {@link InDoc#field} * {@link InDoc#method1} 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 new file mode 100644 index 0000000..6516146 --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/java/Kotlin.kt @@ -0,0 +1,32 @@ +package io.github.linwancen.plugin.show.demo.java + +import io.github.linwancen.plugin.show.demo.java.obj.Child +import io.github.linwancen.plugin.show.demo.java.obj.Parent + +/** + * @author l + */ +object Kotlin : Parent() { + /** call */ + fun call() { + Kotlin() + abc() + val child = Child(true) + val parentMethod = child.parentMethod() + val faceMethod = child.faceMethod(child) + val `is` = child.isBool // NotAutoComment + val get = child.getField() + child.setField(Child(true)) + } + + private operator fun invoke() { + TODO("Not yet implemented") + } + + /** + * abc + */ + private fun abc() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/java/Param.java b/src/test/java/io/github/linwancen/plugin/show/demo/java/Param.java new file mode 100644 index 0000000..1256df8 --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/java/Param.java @@ -0,0 +1,12 @@ +package io.github.linwancen.plugin.show.demo.java; + +public class Param { + /** + * @param a a + * @param b b + */ + public static void func(String a, String b) { + System.out.println(a); + System.out.println(b); + } +} diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/java/Ref.java b/src/test/java/io/github/linwancen/plugin/show/demo/java/Ref.java index 4b67277..8f120c3 100644 --- a/src/test/java/io/github/linwancen/plugin/show/demo/java/Ref.java +++ b/src/test/java/io/github/linwancen/plugin/show/demo/java/Ref.java @@ -16,6 +16,9 @@ public class Ref implements Face { .faceMethod(face1 -> Child::setFun); } + /** + * do not show this after @Override + */ @Override public Face faceMethod(Face face) { return null; diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/java/obj/Child.java b/src/test/java/io/github/linwancen/plugin/show/demo/java/obj/Child.java index 7658759..60959be 100644 --- a/src/test/java/io/github/linwancen/plugin/show/demo/java/obj/Child.java +++ b/src/test/java/io/github/linwancen/plugin/show/demo/java/obj/Child.java @@ -22,8 +22,8 @@ public class Child extends Parent implements Face { return null; } - /** String fun */ - public String fun; + /** only Name fun */ + public Face fun; public static Face setFun(Face face) { return null; diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/json/array-Pojo.json b/src/test/java/io/github/linwancen/plugin/show/demo/json/array-Pojo.json5 similarity index 100% rename from src/test/java/io/github/linwancen/plugin/show/demo/json/array-Pojo.json rename to src/test/java/io/github/linwancen/plugin/show/demo/json/array-Pojo.json5 diff --git a/src/test/java/io/github/linwancen/plugin/show/demo/sql.sql b/src/test/java/io/github/linwancen/plugin/show/demo/sql.sql new file mode 100644 index 0000000..ea4a16e --- /dev/null +++ b/src/test/java/io/github/linwancen/plugin/show/demo/sql.sql @@ -0,0 +1 @@ +select * from NewTable where Column1 is not null ; \ No newline at end of file diff --git a/src/test/java/io/github/linwancen/plugin/show/doc/PsiDocToStrDocTest.java b/src/test/java/io/github/linwancen/plugin/show/lang/base/DocFilterTest.java similarity index 82% rename from src/test/java/io/github/linwancen/plugin/show/doc/PsiDocToStrDocTest.java rename to src/test/java/io/github/linwancen/plugin/show/lang/base/DocFilterTest.java index 3297f3a..a14636b 100644 --- a/src/test/java/io/github/linwancen/plugin/show/doc/PsiDocToStrDocTest.java +++ b/src/test/java/io/github/linwancen/plugin/show/lang/base/DocFilterTest.java @@ -1,5 +1,6 @@ -package io.github.linwancen.plugin.show.doc; +package io.github.linwancen.plugin.show.lang.base; +import io.github.linwancen.plugin.show.lang.base.DocFilter; import org.jetbrains.annotations.Nullable; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -7,9 +8,9 @@ import org.junit.jupiter.api.Test; import java.util.regex.Pattern; /** - * @see PsiDocToStrDoc + * @see DocFilter */ -class PsiDocToStrDocTest { +class DocFilterTest { public static final String[] STRS = { "english. next", @@ -31,7 +32,7 @@ class PsiDocToStrDocTest { }; /** - * @see PsiDocToStrDoc#getDoc + * @see DocFilter#filterDoc */ @Test void testGetDoc() { @@ -39,7 +40,7 @@ class PsiDocToStrDocTest { Pattern p = PATTERNS[pi]; for (int si = 0; si < STRS.length; si++) { String s = STRS[si]; - @Nullable String doc = PsiDocToStrDoc.getDoc(s, p); + @Nullable String doc = DocFilter.filterDoc(s, p); String pattern = p.pattern(); System.out.println("(" + s + ", " + pattern + "): " + doc); if (pi < 2) { diff --git a/src/test/java/io/github/linwancen/plugin/show/line/PsiClassSkipTest.java b/src/test/java/io/github/linwancen/plugin/show/lang/base/DocSkipTest.java similarity index 93% rename from src/test/java/io/github/linwancen/plugin/show/line/PsiClassSkipTest.java rename to src/test/java/io/github/linwancen/plugin/show/lang/base/DocSkipTest.java index 9d5b699..fa933ae 100644 --- a/src/test/java/io/github/linwancen/plugin/show/line/PsiClassSkipTest.java +++ b/src/test/java/io/github/linwancen/plugin/show/lang/base/DocSkipTest.java @@ -1,4 +1,4 @@ -package io.github.linwancen.plugin.show.line; +package io.github.linwancen.plugin.show.lang.base; import groovy.json.JsonOutput; @@ -9,9 +9,9 @@ import java.util.function.BiPredicate; import java.util.regex.Pattern; /** - * @see SkipUtils + * @see DocSkip */ -class PsiClassSkipTest { +class DocSkipTest { private static final boolean o = true; private static final boolean x = false; @@ -66,7 +66,7 @@ class PsiClassSkipTest { Pattern include = includes[includeIndex]; for (int excludeIndex = 0, excludesLength = excludes.length; excludeIndex < excludesLength; excludeIndex++) { Pattern exclude = excludes[excludeIndex]; - boolean isSkip = SkipUtils.skipText(name, include, exclude); + boolean isSkip = DocSkip.skipText(name, include, exclude); String tip = name + "==" + JsonOutput.toJson(include) + "!=" + JsonOutput.toJson(exclude) + "=>" + isSkip; System.out.println(tip); @@ -86,7 +86,7 @@ class PsiClassSkipTest { {x, o, o}, // {"io"}, {o, o, o}, // {"java", "io"}, }; - loopTest(SkipUtils::include, results); + loopTest(DocSkip::include, results); } @Test @@ -98,7 +98,7 @@ class PsiClassSkipTest { {x, o, o}, // {"io"}, {o, o, o}, // {"java", "io"}, }; - loopTest(SkipUtils::exclude, results); + loopTest(DocSkip::exclude, results); } private void loopTest(BiPredicate biPredicate, boolean[][] results) {