Skip to content

Commit c69a335

Browse files
committed
feat(js): make doc better
1 parent 119f7d3 commit c69a335

File tree

1 file changed

+43
-8
lines changed

1 file changed

+43
-8
lines changed

webstorm/src/main/kotlin/cc/unitmesh/ide/webstorm/provider/JavaScriptLivingDocumentation.kt

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,23 @@ import com.intellij.lang.ecmascript6.psi.ES6ExportDefaultAssignment
77
import com.intellij.lang.ecmascript6.psi.ES6ImportSpecifier
88
import com.intellij.lang.ecmascript6.psi.ES6ImportSpecifierAlias
99
import com.intellij.lang.ecmascript6.psi.ES6ImportedBinding
10+
import com.intellij.lang.javascript.documentation.JSDocumentationUtils
1011
import com.intellij.lang.javascript.psi.*
1112
import com.intellij.lang.javascript.psi.ecma6.TypeScriptModule
1213
import com.intellij.lang.javascript.psi.ecmal4.JSClass
1314
import com.intellij.lang.javascript.psi.impl.JSChangeUtil
1415
import com.intellij.lang.javascript.psi.impl.JSPsiElementFactory
16+
import com.intellij.lang.javascript.psi.jsdoc.JSDocComment
17+
import com.intellij.lang.javascript.psi.util.JSDestructuringUtil
1518
import com.intellij.lang.javascript.psi.util.JSStubBasedPsiTreeUtil
1619
import com.intellij.lang.javascript.psi.util.JSUtils
1720
import com.intellij.openapi.command.WriteCommandAction
1821
import com.intellij.openapi.editor.Editor
1922
import com.intellij.openapi.editor.SelectionModel
20-
import com.intellij.psi.PsiElement
21-
import com.intellij.psi.PsiFile
22-
import com.intellij.psi.PsiNameIdentifierOwner
23-
import com.intellij.psi.ResolveState
23+
import com.intellij.psi.*
2424
import com.intellij.psi.codeStyle.CodeStyleManager
2525
import com.intellij.psi.util.PsiTreeUtil
2626
import com.intellij.psi.util.parentOfTypes
27-
import com.intellij.util.IncorrectOperationException
2827

2928
class JavaScriptLivingDocumentation : LivingDocumentation {
3029
override val forbiddenRules: List<String> = listOf(
@@ -49,10 +48,18 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
4948

5049
when (type) {
5150
LivingDocumentationType.COMMENT -> {
51+
val existingComment = JSDocumentationUtils.findOwnDocComment(target)
52+
?: findDocFallback(target)
53+
5254
val createJSDocComment: PsiElement = JSPsiElementFactory.createJSDocComment(newDoc, target)
53-
val parent = target.parent
54-
parent.addBefore(createJSDocComment, target)
55-
JSChangeUtil.addWs(parent.node, target.node, "\n")
55+
56+
if (existingComment != null) {
57+
existingComment.replace(createJSDocComment)
58+
} else {
59+
val parent = target.parent
60+
parent.addBefore(createJSDocComment, target)
61+
JSChangeUtil.addWs(parent.node, target.node, "\n")
62+
}
5663
}
5764

5865
LivingDocumentationType.ANNOTATED -> {
@@ -66,7 +73,35 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
6673
}
6774
}
6875
})
76+
}
77+
78+
private fun findDocFallback(documentationTarget: PsiElement): JSDocComment? {
79+
val parentOfDestructuring: PsiElement? by lazy {
80+
var context = documentationTarget.context
81+
while (JSDestructuringUtil.isDestructuring(context)) {
82+
val psiElement = context
83+
context = psiElement?.context
84+
}
85+
86+
context
87+
}
88+
89+
val filterIsInstanceFunctions = sequenceOf(
90+
{ PsiTreeUtil.skipWhitespacesBackward(documentationTarget) },
91+
{ parentOfDestructuring?.let { PsiTreeUtil.skipWhitespacesBackward(it) } },
92+
{
93+
parentOfDestructuring?.firstChild?.let { firstChild ->
94+
if (firstChild is PsiWhiteSpace) {
95+
PsiTreeUtil.skipWhitespacesForward(firstChild)
96+
} else {
97+
firstChild
98+
}
99+
}
100+
}
101+
)
69102

103+
val filteredSequence = filterIsInstanceFunctions.mapNotNull { it.invoke() }
104+
return filteredSequence.filterIsInstance<JSDocComment>().firstOrNull()
70105
}
71106

72107
override fun findNearestDocumentationTarget(psiElement: PsiElement): PsiNameIdentifierOwner? {

0 commit comments

Comments
 (0)