Skip to content

Commit f6b0136

Browse files
committed
feat(js): add documentation support
1 parent 6324c2d commit f6b0136

File tree

2 files changed

+39
-12
lines changed

2 files changed

+39
-12
lines changed

webstorm/src/main/kotlin/cc/unitmesh/ide/webstorm/context/JavaScriptMethodContextBuilder.kt

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,21 @@ class JavaScriptMethodContextBuilder : MethodContextBuilder {
1515
includeClassContext: Boolean,
1616
gatherUsages: Boolean
1717
): MethodContext? {
18-
if (psiElement !is JSFunction) {
19-
return null
20-
}
21-
val jsFunction = psiElement
18+
if (psiElement !is JSFunction) return null
2219

23-
val functionSignature = JSFormatUtil.buildFunctionSignaturePresentation(jsFunction)
24-
val containingClass: PsiElement = JSUtils.getMemberContainingClass(jsFunction)
25-
val languageDisplayName = jsFunction.language.displayName
26-
val returnType = jsFunction.returnType
20+
val functionSignature = JSFormatUtil.buildFunctionSignaturePresentation(psiElement)
21+
val containingClass: PsiElement? = JSUtils.getMemberContainingClass(psiElement)
22+
val languageDisplayName = psiElement.language.displayName
23+
val returnType = psiElement.returnType
2724
val returnTypeText = returnType?.substitute()?.getTypeText(JSType.TypeTextFormat.CODE)
2825

29-
val parameterNames = jsFunction.parameters.mapNotNull { it.name }
26+
val parameterNames = psiElement.parameters.mapNotNull { it.name }
3027

3128
val usages =
32-
if (gatherUsages) JavaScriptClassContextBuilder.findUsages(jsFunction as PsiNameIdentifierOwner) else emptyList()
29+
if (gatherUsages) JavaScriptClassContextBuilder.findUsages(psiElement as PsiNameIdentifierOwner) else emptyList()
3330

3431
return MethodContext(
35-
jsFunction, jsFunction.text, jsFunction.name!!, functionSignature, containingClass, languageDisplayName,
32+
psiElement, psiElement.text, psiElement.name!!, functionSignature, containingClass, languageDisplayName,
3633
returnTypeText, parameterNames, includeClassContext, usages
3734
)
3835
}

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,21 @@ import com.intellij.lang.ecmascript6.psi.ES6ImportedBinding
1010
import com.intellij.lang.javascript.psi.*
1111
import com.intellij.lang.javascript.psi.ecma6.TypeScriptModule
1212
import com.intellij.lang.javascript.psi.ecmal4.JSClass
13+
import com.intellij.lang.javascript.psi.impl.JSChangeUtil
14+
import com.intellij.lang.javascript.psi.impl.JSPsiElementFactory
1315
import com.intellij.lang.javascript.psi.util.JSStubBasedPsiTreeUtil
1416
import com.intellij.lang.javascript.psi.util.JSUtils
17+
import com.intellij.openapi.command.WriteCommandAction
1518
import com.intellij.openapi.editor.Editor
1619
import com.intellij.openapi.editor.SelectionModel
1720
import com.intellij.psi.PsiElement
1821
import com.intellij.psi.PsiFile
1922
import com.intellij.psi.PsiNameIdentifierOwner
2023
import com.intellij.psi.ResolveState
24+
import com.intellij.psi.codeStyle.CodeStyleManager
2125
import com.intellij.psi.util.PsiTreeUtil
2226
import com.intellij.psi.util.parentOfTypes
27+
import com.intellij.util.IncorrectOperationException
2328

2429
class JavaScriptLivingDocumentation : LivingDocumentation {
2530
override val forbiddenRules: List<String> = listOf(
@@ -36,7 +41,32 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
3641
}
3742

3843
override fun updateDoc(target: PsiElement, newDoc: String, type: LivingDocumentationType, editor: Editor) {
39-
TODO("Not yet implemented")
44+
val project = target.project
45+
val codeStyleManager = CodeStyleManager.getInstance(project)
46+
WriteCommandAction.runWriteCommandAction(project, "Living Document", "cc.unitmesh.livingDoc", {
47+
val startOffset = target.textRange.startOffset
48+
val newEndOffset = startOffset + newDoc.length
49+
50+
when (type) {
51+
LivingDocumentationType.COMMENT -> {
52+
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")
56+
}
57+
58+
LivingDocumentationType.ANNOTATED -> {
59+
editor.document.insertString(startOffset, newDoc)
60+
codeStyleManager.reformatText(target.containingFile, startOffset, newEndOffset)
61+
}
62+
63+
LivingDocumentationType.CUSTOM -> {
64+
editor.document.insertString(startOffset, newDoc)
65+
codeStyleManager.reformatText(target.containingFile, startOffset, newEndOffset)
66+
}
67+
}
68+
})
69+
4070
}
4171

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

0 commit comments

Comments
 (0)