KT-20880: Fix AddDocumentationFix to add multiline comment

#KT-20880 fixed
This commit is contained in:
Simon Ogorodnik
2017-10-22 23:24:48 +03:00
parent be630f93dd
commit d28e9fd22d
5 changed files with 59 additions and 7 deletions
@@ -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<KtNamedDeclaration>(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<KDocSection>() ?: return
val asterisk = section.firstChild
PostprocessReformattingAspect.getInstance(project).disablePostprocessFormattingInside {
val whitespace = KtPsiFactory(project).createWhiteSpace()
section.addAfter(whitespace, asterisk)
editor.caretModel.moveToOffset(asterisk.endOffset + 1)
}
}
}
}
@@ -1,5 +1,7 @@
// "Add documentation" "true"
/** <caret> */
/**
* <caret>
*/
class C {
}
@@ -0,0 +1,9 @@
// "Add documentation" "true"
class C {
fun <caret>foo() {
}
}
@@ -0,0 +1,12 @@
// "Add documentation" "true"
class C {
/**
* <caret>
*/
fun foo() {
}
}
@@ -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")