@@ -3,13 +3,18 @@ package cc.unitmesh.ide.webstorm.provider
3
3
import cc.unitmesh.devti.custom.document.LivingDocumentationType
4
4
import cc.unitmesh.devti.provider.LivingDocumentation
5
5
import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil
6
- import com.intellij.lang.javascript.psi.JSFunction
6
+ import com.intellij.lang.ecmascript6.psi.ES6ExportDefaultAssignment
7
+ import com.intellij.lang.javascript.psi.*
8
+ import com.intellij.lang.javascript.psi.ecma6.TypeScriptObjectType
7
9
import com.intellij.lang.javascript.psi.ecmal4.JSClass
10
+ import com.intellij.lang.javascript.psi.util.JSUtils
8
11
import com.intellij.openapi.editor.Editor
9
12
import com.intellij.openapi.editor.SelectionModel
10
13
import com.intellij.psi.PsiElement
11
14
import com.intellij.psi.PsiNameIdentifierOwner
15
+ import com.intellij.psi.PsiWhiteSpace
12
16
import com.intellij.psi.util.PsiTreeUtil
17
+ import com.intellij.psi.util.parentOfTypes
13
18
14
19
class JavaScriptLivingDocumentation : LivingDocumentation {
15
20
override val forbiddenRules: List <String > = listOf (
@@ -30,14 +35,59 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
30
35
}
31
36
32
37
override fun findNearestDocumentationTarget (psiElement : PsiElement ): PsiNameIdentifierOwner ? {
33
- if (psiElement is JSFunction || psiElement is JSClass ) return psiElement as PsiNameIdentifierOwner
38
+ var candidate : PsiElement ? = null
34
39
35
- val closestIdentifierOwner = PsiTreeUtil .getParentOfType(psiElement, PsiNameIdentifierOwner ::class .java)
36
- if (closestIdentifierOwner !is JSFunction ) {
37
- return PsiTreeUtil .getParentOfType(psiElement, JSFunction ::class .java) ? : closestIdentifierOwner
40
+ // lookup
41
+ if (psiElement is PsiWhiteSpace ) {
42
+ val parent = psiElement.parent
43
+ when (parent) {
44
+ is JSFile , is JSEmbeddedContent , is JSObjectLiteralExpression , is JSBlockStatement , is TypeScriptObjectType -> {
45
+ candidate = PsiTreeUtil .skipWhitespacesAndCommentsForward(psiElement)
46
+ }
47
+ is JSClass -> {
48
+ val next = PsiTreeUtil .skipWhitespacesAndCommentsForward(psiElement)
49
+ if (JSUtils .isMember(next)) {
50
+ candidate = next
51
+ }
52
+ }
53
+ }
38
54
}
39
55
40
- return closestIdentifierOwner
56
+ // find to parent
57
+ if (candidate == null ) {
58
+ candidate = psiElement.parentOfTypes(PsiNameIdentifierOwner ::class , JSSourceElement ::class )
59
+ }
60
+
61
+ if (candidate is JSParameter ) {
62
+ candidate = candidate.declaringFunction
63
+ }
64
+
65
+ // by element type
66
+ when (psiElement) {
67
+ is JSExpressionStatement -> {
68
+ val expression: JSAssignmentExpression ? = psiElement.expression as ? JSAssignmentExpression
69
+ if (expression is JSAssignmentExpression ) {
70
+ val lOperand = expression.lOperand
71
+ if (lOperand is JSDefinitionExpression ) {
72
+ candidate = lOperand
73
+ }
74
+ }
75
+ }
76
+ is ES6ExportDefaultAssignment -> {
77
+ candidate = psiElement.expression
78
+ }
79
+ is JSProperty , is JSFunction , is JSVariable , is JSClass , is JSField -> {
80
+ candidate = psiElement
81
+ }
82
+ is JSVarStatement -> {
83
+ val variables = psiElement.variables
84
+ if (variables.isNotEmpty()) {
85
+ candidate = variables[0 ] as PsiElement
86
+ }
87
+ }
88
+ }
89
+
90
+ return candidate as ? PsiNameIdentifierOwner
41
91
}
42
92
43
93
override fun findDocTargetsInSelection (
0 commit comments