Skip to content

Commit d4612d6

Browse files
committed
feat(living-doc): add HarmonyOS living documentation support
This commit adds support for HarmonyOS living documentation in the project. The `LivingDocumentation` interface is implemented in the `HarmonyOsLivingDocumentation` class, which provides functionality for updating documentation, finding nearest documentation targets, and finding documentation targets in the selected code. This feature allows users to document their code using HarmonyOS-specific rules and conventions.
1 parent 8a0ad02 commit d4612d6

File tree

3 files changed

+79
-4
lines changed

3 files changed

+79
-4
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,7 @@ class JavaScriptLivingDocumentation : LivingDocumentation {
165165
)
166166

167167
val list = decls.filter {
168-
containsElement(selectionModel, it as PsiElement)
169-
&& isMeaningfulToDocumentInSelection(it as PsiElement)
168+
containsElement(selectionModel, it as PsiElement) && isMeaningfulToDocumentInSelection(it as PsiElement)
170169
}.toList()
171170

172171
return list.ifEmpty {
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package cc.unitmesh.devti.provider
2+
3+
import cc.unitmesh.devti.custom.document.LivingDocumentationType
4+
import com.intellij.openapi.command.WriteCommandAction
5+
import com.intellij.openapi.editor.Editor
6+
import com.intellij.openapi.editor.SelectionModel
7+
import com.intellij.psi.NavigatablePsiElement
8+
import com.intellij.psi.PsiElement
9+
import com.intellij.psi.PsiNameIdentifierOwner
10+
import com.intellij.psi.codeStyle.CodeStyleManager
11+
import com.intellij.psi.util.parentOfTypes
12+
13+
class HarmonyOsLivingDocumentation : LivingDocumentation {
14+
override val forbiddenRules: List<String> = listOf(
15+
"ArkTS is an extension of TypeScript, you can use TypeScript's rules",
16+
"do not return example code",
17+
"do not use @author and @version tags"
18+
)
19+
20+
override fun startEndString(type: LivingDocumentationType): Pair<String, String> {
21+
return when (type) {
22+
LivingDocumentationType.COMMENT -> Pair("/**", "*/")
23+
LivingDocumentationType.ANNOTATED -> Pair("", "")
24+
LivingDocumentationType.CUSTOM -> Pair("", "")
25+
}
26+
}
27+
28+
override fun updateDoc(target: PsiElement, newDoc: String, type: LivingDocumentationType, editor: Editor) {
29+
val project = target.project
30+
val codeStyleManager = CodeStyleManager.getInstance(project)
31+
WriteCommandAction.runWriteCommandAction(project, "Living Document", "cc.unitmesh.livingDoc", {
32+
val startOffset = target.textRange.startOffset
33+
val newEndOffset = startOffset + newDoc.length
34+
35+
editor.document.insertString(startOffset, newDoc)
36+
codeStyleManager.reformatText(target.containingFile, startOffset, newEndOffset)
37+
});
38+
}
39+
40+
override fun findNearestDocumentationTarget(psiElement: PsiElement): PsiNameIdentifierOwner? {
41+
if (psiElement is PsiNameIdentifierOwner) {
42+
return psiElement
43+
}
44+
45+
var candidate: PsiElement? =
46+
psiElement.parentOfTypes(PsiNameIdentifierOwner::class, NavigatablePsiElement::class)
47+
48+
while (candidate != null) {
49+
if (candidate is PsiNameIdentifierOwner) {
50+
return candidate
51+
}
52+
53+
candidate = candidate.parentOfTypes(PsiNameIdentifierOwner::class, NavigatablePsiElement::class)
54+
}
55+
56+
return null
57+
}
58+
59+
override fun findDocTargetsInSelection(
60+
psiElement: PsiElement,
61+
selectionModel: SelectionModel
62+
): List<PsiNameIdentifierOwner> {
63+
return listOf()
64+
}
65+
}

src/main/kotlin/cc/unitmesh/devti/provider/LivingDocumentation.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cc.unitmesh.devti.provider
33
import cc.unitmesh.devti.custom.document.LivingDocumentationType
44
import com.intellij.lang.Language
55
import com.intellij.lang.LanguageExtension
6+
import com.intellij.openapi.diagnostic.logger
67
import com.intellij.openapi.editor.Editor
78
import com.intellij.openapi.editor.SelectionModel
89
import com.intellij.psi.PsiElement
@@ -51,8 +52,18 @@ interface LivingDocumentation {
5152
private val languageExtension: LanguageExtension<LivingDocumentation> =
5253
LanguageExtension("cc.unitmesh.livingDocumentation")
5354

55+
val logger = logger<LivingDocumentation>()
5456
fun forLanguage(language: Language): LivingDocumentation? {
55-
return languageExtension.forLanguage(language)
57+
val documentation = languageExtension.forLanguage(language)
58+
if (documentation != null) {
59+
return documentation
60+
}
61+
62+
if (language.displayName == "TypeScript" || language.displayName == "ArkTS") {
63+
return HarmonyOsLivingDocumentation()
64+
}
65+
66+
return null
5667
}
5768
}
58-
}
69+
}

0 commit comments

Comments
 (0)