Skip to content

Commit 6324c2d

Browse files
committed
chore: add selection
1 parent 0f1a628 commit 6324c2d

File tree

1 file changed

+55
-4
lines changed

1 file changed

+55
-4
lines changed

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

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,20 @@ import cc.unitmesh.devti.custom.document.LivingDocumentationType
44
import cc.unitmesh.devti.provider.LivingDocumentation
55
import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil
66
import com.intellij.lang.ecmascript6.psi.ES6ExportDefaultAssignment
7+
import com.intellij.lang.ecmascript6.psi.ES6ImportSpecifier
8+
import com.intellij.lang.ecmascript6.psi.ES6ImportSpecifierAlias
9+
import com.intellij.lang.ecmascript6.psi.ES6ImportedBinding
710
import com.intellij.lang.javascript.psi.*
8-
import com.intellij.lang.javascript.psi.ecma6.TypeScriptObjectType
11+
import com.intellij.lang.javascript.psi.ecma6.TypeScriptModule
912
import com.intellij.lang.javascript.psi.ecmal4.JSClass
13+
import com.intellij.lang.javascript.psi.util.JSStubBasedPsiTreeUtil
1014
import com.intellij.lang.javascript.psi.util.JSUtils
1115
import com.intellij.openapi.editor.Editor
1216
import com.intellij.openapi.editor.SelectionModel
1317
import com.intellij.psi.PsiElement
18+
import com.intellij.psi.PsiFile
1419
import com.intellij.psi.PsiNameIdentifierOwner
15-
import com.intellij.psi.PsiWhiteSpace
20+
import com.intellij.psi.ResolveState
1621
import com.intellij.psi.util.PsiTreeUtil
1722
import com.intellij.psi.util.parentOfTypes
1823

@@ -52,12 +57,15 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
5257
}
5358
}
5459
}
60+
5561
is ES6ExportDefaultAssignment -> {
5662
candidate = psiElement.expression
5763
}
64+
5865
is JSProperty, is JSFunction, is JSVariable, is JSClass, is JSField -> {
5966
candidate = psiElement
6067
}
68+
6169
is JSVarStatement -> {
6270
val variables = psiElement.variables
6371
if (variables.isNotEmpty()) {
@@ -73,16 +81,59 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
7381
root: PsiElement,
7482
selectionModel: SelectionModel
7583
): List<PsiNameIdentifierOwner> {
76-
val findCommonParent = CollectHighlightsUtil.findCommonParent(
84+
val commonParent = CollectHighlightsUtil.findCommonParent(
7785
root,
7886
selectionModel.selectionStart,
7987
selectionModel.selectionEnd
8088
) ?: return emptyList()
8189

82-
return emptyList()
90+
val decls: MutableList<PsiNameIdentifierOwner> = mutableListOf()
91+
JSStubBasedPsiTreeUtil.processDeclarationsInScope(
92+
commonParent,
93+
{ element: PsiElement, _: ResolveState ->
94+
if (element is PsiNameIdentifierOwner) {
95+
decls.add(element)
96+
}
97+
true
98+
},
99+
true
100+
)
101+
102+
val list = decls.filter {
103+
containsElement(selectionModel, it as PsiElement)
104+
&& isMeaningfulToDocumentInSelection(it as PsiElement)
105+
}.toList()
106+
107+
return list.ifEmpty {
108+
listOfNotNull(findNearestDocumentationTarget(commonParent))
109+
}
83110
}
84111

85112
private fun containsElement(selectionModel: SelectionModel, element: PsiElement): Boolean {
86113
return selectionModel.selectionStart <= element.textRange.startOffset && element.textRange.endOffset <= selectionModel.selectionEnd
87114
}
115+
116+
private fun isMeaningfulToDocumentInSelection(element: PsiElement?): Boolean {
117+
if ((element is ES6ImportedBinding) || (element is ES6ImportSpecifierAlias) || (element is ES6ImportSpecifier)) {
118+
return false
119+
}
120+
121+
if (element is JSVariable && !JSUtils.isMember(element)) {
122+
val initializerOrStub = element.initializerOrStub
123+
if (initializerOrStub is JSFunctionExpression) {
124+
return true
125+
}
126+
127+
if (initializerOrStub is JSCallExpression && initializerOrStub.isRequireCall) {
128+
return false
129+
}
130+
131+
val parentOfType = PsiTreeUtil.getParentOfType(element, JSSourceElement::class.java, true)
132+
val scope = parentOfType?.parent
133+
134+
return scope is PsiFile || scope is JSEmbeddedContent || scope is TypeScriptModule
135+
}
136+
137+
return true
138+
}
88139
}

0 commit comments

Comments
 (0)