Add quickfix for adding documentation

This commit is contained in:
Manas Chaudhari
2016-02-29 22:23:07 +05:30
committed by Dmitry Jemerov
parent 88fcad02a9
commit f54f56d86b
6 changed files with 64 additions and 11 deletions
@@ -122,15 +122,15 @@ abstract class IntentionBasedInspection<TElement : KtElement>(
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]
}
@@ -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<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)
}
}
}
@@ -0,0 +1 @@
org.jetbrains.kotlin.idea.kdoc.KDocMissingDocumentationInspection
@@ -0,0 +1,4 @@
// "Add documentation" "true"
class <caret>C {
}
@@ -0,0 +1,5 @@
// "Add documentation" "true"
/** <caret> */
class C {
}
@@ -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)