@@ -7,24 +7,23 @@ import com.intellij.lang.ecmascript6.psi.ES6ExportDefaultAssignment
7
7
import com.intellij.lang.ecmascript6.psi.ES6ImportSpecifier
8
8
import com.intellij.lang.ecmascript6.psi.ES6ImportSpecifierAlias
9
9
import com.intellij.lang.ecmascript6.psi.ES6ImportedBinding
10
+ import com.intellij.lang.javascript.documentation.JSDocumentationUtils
10
11
import com.intellij.lang.javascript.psi.*
11
12
import com.intellij.lang.javascript.psi.ecma6.TypeScriptModule
12
13
import com.intellij.lang.javascript.psi.ecmal4.JSClass
13
14
import com.intellij.lang.javascript.psi.impl.JSChangeUtil
14
15
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
15
18
import com.intellij.lang.javascript.psi.util.JSStubBasedPsiTreeUtil
16
19
import com.intellij.lang.javascript.psi.util.JSUtils
17
20
import com.intellij.openapi.command.WriteCommandAction
18
21
import com.intellij.openapi.editor.Editor
19
22
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.*
24
24
import com.intellij.psi.codeStyle.CodeStyleManager
25
25
import com.intellij.psi.util.PsiTreeUtil
26
26
import com.intellij.psi.util.parentOfTypes
27
- import com.intellij.util.IncorrectOperationException
28
27
29
28
class JavaScriptLivingDocumentation : LivingDocumentation {
30
29
override val forbiddenRules: List <String > = listOf (
@@ -49,10 +48,18 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
49
48
50
49
when (type) {
51
50
LivingDocumentationType .COMMENT -> {
51
+ val existingComment = JSDocumentationUtils .findOwnDocComment(target)
52
+ ? : findDocFallback(target)
53
+
52
54
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
+ }
56
63
}
57
64
58
65
LivingDocumentationType .ANNOTATED -> {
@@ -66,7 +73,35 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
66
73
}
67
74
}
68
75
})
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
+ )
69
102
103
+ val filteredSequence = filterIsInstanceFunctions.mapNotNull { it.invoke() }
104
+ return filteredSequence.filterIsInstance<JSDocComment >().firstOrNull()
70
105
}
71
106
72
107
override fun findNearestDocumentationTarget (psiElement : PsiElement ): PsiNameIdentifierOwner ? {
0 commit comments