Skip to content

Commit 81b9ae7

Browse files
committed
chore: init selection
1 parent 821e7b0 commit 81b9ae7

File tree

1 file changed

+56
-6
lines changed

1 file changed

+56
-6
lines changed

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

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@ package cc.unitmesh.ide.webstorm.provider
33
import cc.unitmesh.devti.custom.document.LivingDocumentationType
44
import cc.unitmesh.devti.provider.LivingDocumentation
55
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
79
import com.intellij.lang.javascript.psi.ecmal4.JSClass
10+
import com.intellij.lang.javascript.psi.util.JSUtils
811
import com.intellij.openapi.editor.Editor
912
import com.intellij.openapi.editor.SelectionModel
1013
import com.intellij.psi.PsiElement
1114
import com.intellij.psi.PsiNameIdentifierOwner
15+
import com.intellij.psi.PsiWhiteSpace
1216
import com.intellij.psi.util.PsiTreeUtil
17+
import com.intellij.psi.util.parentOfTypes
1318

1419
class JavaScriptLivingDocumentation : LivingDocumentation {
1520
override val forbiddenRules: List<String> = listOf(
@@ -30,14 +35,59 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
3035
}
3136

3237
override fun findNearestDocumentationTarget(psiElement: PsiElement): PsiNameIdentifierOwner? {
33-
if (psiElement is JSFunction || psiElement is JSClass) return psiElement as PsiNameIdentifierOwner
38+
var candidate: PsiElement? = null
3439

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+
}
3854
}
3955

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
4191
}
4292

4393
override fun findDocTargetsInSelection(

0 commit comments

Comments
 (0)