diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/KDocMissingDocumentationInspection.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/KDocMissingDocumentationInspection.kt index 93997e4e25a..03a7ea76584 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/KDocMissingDocumentationInspection.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/kdoc/KDocMissingDocumentationInspection.kt @@ -23,23 +23,28 @@ import com.intellij.codeInspection.ProblemsHolder import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor +import com.intellij.psi.impl.source.PostprocessReformattingAspect import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny +import org.jetbrains.kotlin.idea.core.unblockDocument import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection import org.jetbrains.kotlin.idea.inspections.findExistingEditor +import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.psi.psiUtil.getChildOfType import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.source.getPsi -class KDocMissingDocumentationInspection(): AbstractKotlinInspection() { +class KDocMissingDocumentationInspection() : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor = KDocMissingDocumentationInspection(holder) - private class KDocMissingDocumentationInspection(private val holder: ProblemsHolder): PsiElementVisitor() { + private class KDocMissingDocumentationInspection(private val holder: ProblemsHolder) : PsiElementVisitor() { override fun visitElement(element: PsiElement) { if (element is KtNamedDeclaration) { @@ -66,9 +71,27 @@ class KDocMissingDocumentationInspection(): AbstractKotlinInspection() { if (!FileModificationService.getInstance().preparePsiElementForWrite(descriptor.psiElement)) return val declaration = descriptor.psiElement.getParentOfType(true) ?: throw IllegalStateException("Can't find declaration") - declaration.addBefore(KDocElementFactory(project).createKDocFromText("/** */"), declaration.firstChild) - val editor = descriptor.psiElement.findExistingEditor() - editor?.caretModel?.moveToOffset(declaration.startOffset + 4) + + + declaration.addBefore(KDocElementFactory(project).createKDocFromText("/**\n*\n*/\n"), declaration.firstChild) + + val editor = descriptor.psiElement.findExistingEditor() ?: return + + + // If we just add whitespace + // /** + // *[HERE] + // it will be erased by formatter, so following code adds it right way and moves caret then + editor.unblockDocument() + + val section = declaration.firstChild.getChildOfType() ?: return + val asterisk = section.firstChild + + PostprocessReformattingAspect.getInstance(project).disablePostprocessFormattingInside { + val whitespace = KtPsiFactory(project).createWhiteSpace() + section.addAfter(whitespace, asterisk) + editor.caretModel.moveToOffset(asterisk.endOffset + 1) + } } } } diff --git a/idea/testData/quickfix/kdocMissingDocumentation/simple.kt.after b/idea/testData/quickfix/kdocMissingDocumentation/simple.kt.after index c2a10b8c18b..6d65b866567 100644 --- a/idea/testData/quickfix/kdocMissingDocumentation/simple.kt.after +++ b/idea/testData/quickfix/kdocMissingDocumentation/simple.kt.after @@ -1,5 +1,7 @@ // "Add documentation" "true" -/** */ +/** + * + */ class C { } diff --git a/idea/testData/quickfix/kdocMissingDocumentation/withIndentation.kt b/idea/testData/quickfix/kdocMissingDocumentation/withIndentation.kt new file mode 100644 index 00000000000..0ac9226e522 --- /dev/null +++ b/idea/testData/quickfix/kdocMissingDocumentation/withIndentation.kt @@ -0,0 +1,9 @@ +// "Add documentation" "true" + + +class C { + + fun foo() { + + } +} diff --git a/idea/testData/quickfix/kdocMissingDocumentation/withIndentation.kt.after b/idea/testData/quickfix/kdocMissingDocumentation/withIndentation.kt.after new file mode 100644 index 00000000000..1170e94f399 --- /dev/null +++ b/idea/testData/quickfix/kdocMissingDocumentation/withIndentation.kt.after @@ -0,0 +1,12 @@ +// "Add documentation" "true" + + +class C { + + /** + * + */ + fun foo() { + + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index d105bc89370..cf9c7b3c86d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6781,6 +6781,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/kdocMissingDocumentation/simple.kt"); doTest(fileName); } + + @TestMetadata("withIndentation.kt") + public void testWithIndentation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/kdocMissingDocumentation/withIndentation.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/lateinit")