From f54f56d86be446b3812f7388d6a5490fc1900457 Mon Sep 17 00:00:00 2001 From: Manas Chaudhari Date: Mon, 29 Feb 2016 22:23:07 +0530 Subject: [PATCH] Add quickfix for adding documentation --- .../inspections/IntentionBasedInspection.kt | 20 ++++++------- .../KDocMissingDocumentationInspection.kt | 30 ++++++++++++++++++- .../kdocMissingDocumentation/.inspection | 1 + .../kdocMissingDocumentation/simple.kt | 4 +++ .../kdocMissingDocumentation/simple.kt.after | 5 ++++ .../idea/quickfix/QuickFixTestGenerated.java | 15 ++++++++++ 6 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 idea/testData/quickfix/kdocMissingDocumentation/.inspection create mode 100644 idea/testData/quickfix/kdocMissingDocumentation/simple.kt create mode 100644 idea/testData/quickfix/kdocMissingDocumentation/simple.kt.after diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt index 69b5ae435c6..2887f671c7f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/inspections/IntentionBasedInspection.kt @@ -122,15 +122,15 @@ abstract class IntentionBasedInspection( editor?.caretModel?.moveToOffset(startElement.textOffset) intention.applyTo(startElement as TElement, editor) } - - private fun PsiElement.findExistingEditor(): Editor? { - val file = containingFile?.virtualFile ?: return null - val document = FileDocumentManager.getInstance().getDocument(file) ?: return null - - val editorFactory = EditorFactory.getInstance() - - val editors = editorFactory.getEditors(document) - return if (editors.isEmpty()) null else editors[0] - } } } + +fun PsiElement.findExistingEditor(): Editor? { + val file = containingFile?.virtualFile ?: return null + val document = FileDocumentManager.getInstance().getDocument(file) ?: return null + + val editorFactory = EditorFactory.getInstance() + + val editors = editorFactory.getEditors(document) + return if (editors.isEmpty()) null else editors[0] +} 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 f22d153c074..38b5477a69a 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 @@ -16,7 +16,13 @@ package org.jetbrains.kotlin.idea.kdoc +import com.intellij.codeInspection.LocalQuickFix +import com.intellij.codeInspection.ProblemDescriptor import com.intellij.codeInspection.ProblemsHolder +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.editor.EditorFactory +import com.intellij.openapi.fileEditor.FileDocumentManager +import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor @@ -24,7 +30,15 @@ import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.inspections.AbstractKotlinInspection +import org.jetbrains.kotlin.idea.inspections.findExistingEditor +import org.jetbrains.kotlin.kdoc.psi.impl.KDocImpl +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtModifierListOwner import org.jetbrains.kotlin.psi.KtNamedDeclaration +import org.jetbrains.kotlin.psi.addRemoveModifier.removeModifier +import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.source.getPsi class KDocMissingDocumentationInspection(): AbstractKotlinInspection() { @@ -42,10 +56,24 @@ class KDocMissingDocumentationInspection(): AbstractKotlinInspection() { (descriptor as? CallableMemberDescriptor)?.overriddenDescriptors ?.any { (it.source.getPsi() as? KtNamedDeclaration)?.docComment != null } ?: false if (!hasDocumentation) { - holder.registerProblem(nameIdentifier, "Missing documentation") + holder.registerProblem(nameIdentifier, "Missing documentation", AddDocumentationFix()) } } } } } + + class AddDocumentationFix : LocalQuickFix { + override fun getName(): String = "Add documentation" + + override fun getFamilyName(): String = name + + override fun applyFix(project: Project, descriptor: ProblemDescriptor) { + 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) + } + } } diff --git a/idea/testData/quickfix/kdocMissingDocumentation/.inspection b/idea/testData/quickfix/kdocMissingDocumentation/.inspection new file mode 100644 index 00000000000..685d6ebcdf5 --- /dev/null +++ b/idea/testData/quickfix/kdocMissingDocumentation/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.kdoc.KDocMissingDocumentationInspection \ No newline at end of file diff --git a/idea/testData/quickfix/kdocMissingDocumentation/simple.kt b/idea/testData/quickfix/kdocMissingDocumentation/simple.kt new file mode 100644 index 00000000000..0ebe9fe3551 --- /dev/null +++ b/idea/testData/quickfix/kdocMissingDocumentation/simple.kt @@ -0,0 +1,4 @@ +// "Add documentation" "true" + +class C { +} diff --git a/idea/testData/quickfix/kdocMissingDocumentation/simple.kt.after b/idea/testData/quickfix/kdocMissingDocumentation/simple.kt.after new file mode 100644 index 00000000000..c2a10b8c18b --- /dev/null +++ b/idea/testData/quickfix/kdocMissingDocumentation/simple.kt.after @@ -0,0 +1,5 @@ +// "Add documentation" "true" + +/** */ +class C { +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index eaa76986b91..c9e4605df3e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -4798,6 +4798,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/kdocMissingDocumentation") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class KdocMissingDocumentation extends AbstractQuickFixTest { + public void testAllFilesPresentInKdocMissingDocumentation() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/kdocMissingDocumentation"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/kdocMissingDocumentation/simple.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/libraries") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)