Skip to content

Commit 6786175

Browse files
committed
feat(python): fix insert issues
1 parent 287854e commit 6786175

File tree

4 files changed

+42
-39
lines changed

4 files changed

+42
-39
lines changed

gradle-222.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
ideaVersion=IU-2022.2.4
55

66
# please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description
7-
pluginSinceBuild = 222.*
7+
pluginSinceBuild = 221.*
88
pluginUntilBuild = 232.*

pycharm/src/main/kotlin/cc/unitmesh/pycharm/provider/PythonLivingDocumentation.kt

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -19,21 +19,23 @@ package cc.unitmesh.pycharm.provider
1919
import cc.unitmesh.devti.custom.document.LivingDocumentationType
2020
import cc.unitmesh.devti.provider.LivingDocumentation
2121
import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil
22-
import com.intellij.openapi.editor.Document
22+
import com.intellij.openapi.command.WriteCommandAction
2323
import com.intellij.openapi.editor.Editor
2424
import com.intellij.openapi.editor.SelectionModel
25-
import com.intellij.openapi.project.Project
25+
import com.intellij.psi.PsiDocumentManager
2626
import com.intellij.psi.PsiElement
2727
import com.intellij.psi.PsiNameIdentifierOwner
2828
import com.intellij.psi.PsiWhiteSpace
2929
import com.intellij.psi.util.PsiTreeUtil
3030
import com.intellij.util.IncorrectOperationException
31-
import com.jetbrains.python.documentation.docstrings.PyDocstringGenerator
3231
import com.jetbrains.python.psi.*
3332

3433

3534
class PythonLivingDocumentation : LivingDocumentation {
36-
override val forbiddenRules: List<String> = listOf()
35+
override val forbiddenRules: List<String> = listOf(
36+
"do not return any code, just documentation.",
37+
"write Docstring",
38+
)
3739

3840
override fun startEndString(type: LivingDocumentationType): Pair<String, String> {
3941
return Pair("\"\"\"", "\"\"\"")
@@ -44,8 +46,9 @@ class PythonLivingDocumentation : LivingDocumentation {
4446
throw IncorrectOperationException()
4547
}
4648

47-
val docstringGenerator = PyDocstringGenerator.forDocStringOwner((target as PyDocStringOwner?)!!)
48-
docstringGenerator.buildAndInsert(newDoc, target)
49+
WriteCommandAction.runWriteCommandAction(target.project, "Living Document", "cc.unitmesh.livingDoc", {
50+
buildAndInsert(newDoc, target)
51+
});
4952
}
5053

5154
override fun findNearestDocumentationTarget(psiElement: PsiElement): PsiNameIdentifierOwner? {
@@ -113,47 +116,47 @@ class PythonLivingDocumentation : LivingDocumentation {
113116
private fun containsElement(selectionModel: SelectionModel, element: PsiElement): Boolean {
114117
return selectionModel.selectionStart <= element.textRange.startOffset && element.textRange.endOffset <= selectionModel.selectionEnd
115118
}
116-
117119
}
118120

119-
fun PyDocstringGenerator.buildAndInsert(replacementText: String, myDocStringOwner: PyDocStringOwner): PyDocStringOwner {
120-
val project: Project = myDocStringOwner.getProject()
121-
val elementGenerator = PyElementGenerator.getInstance(project)
121+
fun buildAndInsert(replacementText: String, anchor: PyDocStringOwner): PyDocStringOwner {
122+
val elementGenerator = PyElementGenerator.getInstance(anchor.project)
122123
val replacement = elementGenerator.createDocstring(replacementText)
123124

124-
val docStringExpression: PyStringLiteralExpression? = myDocStringOwner.getDocStringExpression()
125+
val docStringExpression: PyStringLiteralExpression? = anchor.docStringExpression
125126
if (docStringExpression != null) {
126127
docStringExpression.replace(replacement.expression)
127-
} else {
128-
val container = PyUtil.`as`(
129-
myDocStringOwner,
130-
PyStatementListContainer::class.java
131-
) ?: throw IncorrectOperationException("Cannot find container for docstring, Should be a function or class")
128+
return anchor
129+
}
132130

133-
val statements = container.statementList
134-
val indentation = PyIndentUtil.getElementIndent(statements)
131+
val container = PyUtil.`as`(
132+
anchor,
133+
PyStatementListContainer::class.java
134+
) ?: throw IncorrectOperationException("Cannot find container for docstring, Should be a function or class")
135135

136-
PyUtil.updateDocumentUnblockedAndCommitted(myDocStringOwner) { document: Document ->
137-
val beforeStatements = statements.prevSibling
138-
var replacementWithLineBreaks = """
136+
val statements = container.statementList
137+
val indentation = PyIndentUtil.getElementIndent(statements)
138+
139+
val manager = PsiDocumentManager.getInstance(anchor.project)
140+
val document = manager.getDocument(anchor.containingFile)!!
141+
val beforeStatements = statements.prevSibling
142+
var replacementWithLineBreaks = """
139143
140144
$indentation$replacementText
141145
""".trimIndent()
142-
if (statements.statements.isNotEmpty()) {
143-
replacementWithLineBreaks += """
146+
if (statements.statements.isNotEmpty()) {
147+
replacementWithLineBreaks += """
144148
145149
$indentation
146150
""".trimIndent()
147-
}
148-
val range = beforeStatements.textRange
149-
if (beforeStatements !is PsiWhiteSpace) {
150-
document.insertString(range.endOffset, replacementWithLineBreaks)
151-
} else if (statements.statements.isEmpty() && beforeStatements.textContains('\n')) {
152-
document.insertString(range.startOffset, replacementWithLineBreaks)
153-
} else {
154-
document.replaceString(range.startOffset, range.endOffset, replacementWithLineBreaks)
155-
}
156-
}
157151
}
158-
return myDocStringOwner
152+
val range = beforeStatements.textRange
153+
if (beforeStatements !is PsiWhiteSpace) {
154+
document.insertString(range.endOffset, replacementWithLineBreaks)
155+
} else if (statements.statements.isEmpty() && beforeStatements.textContains('\n')) {
156+
document.insertString(range.startOffset, replacementWithLineBreaks)
157+
} else {
158+
document.replaceString(range.startOffset, range.endOffset, replacementWithLineBreaks)
159+
}
160+
161+
return anchor
159162
}

src/main/kotlin/cc/unitmesh/devti/custom/document/CustomLivingDocTask.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class CustomLivingDocTask(
2727
val builder = CustomLivingDocPromptBuilder(editor, target, config, documentation)
2828
val prompt = builder.buildPrompt(project, target, config.prompt)
2929

30-
logger.warn("Prompt: $prompt")
30+
logger.info("Prompt: $prompt")
3131

3232
val stream =
3333
LlmFactory().create(project).stream(prompt, "")
@@ -40,7 +40,7 @@ class CustomLivingDocTask(
4040
}
4141
}
4242

43-
logger.warn("Result: $result")
43+
logger.info("Result: $result")
4444

4545
documentation.updateDoc(target, result, config.type, editor)
4646
}

src/main/kotlin/cc/unitmesh/devti/intentions/action/task/LivingDocPromptBuilder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ open class LivingDocPromptBuilder(
101101
}
102102

103103
contextInstruction(llmQueryContext)
104-
} ?: "Write documentation for given code. "
104+
} ?: "Write documentation for given code."
105105

106106
instruction.append(basicInstruction)
107107

@@ -116,7 +116,7 @@ open class LivingDocPromptBuilder(
116116
val startEndString = documentation.startEndString(type)
117117
instruction.append(documentation.forbiddenRules.joinToString { "\n- $it" })
118118

119-
instruction.append("\n\nStart your documentation with ${startEndString.first} here, no code, and ends with `${startEndString.second}`.\n")
119+
instruction.append("\n\nStart your documentation with ${startEndString.first} here, and ends with `${startEndString.second}`.\n")
120120
instruction.toString()
121121
}
122122
}

0 commit comments

Comments
 (0)