add more quickfixes to cleanup action
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.inspections
|
package org.jetbrains.kotlin.idea.inspections
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
import com.intellij.codeInspection.*
|
import com.intellij.codeInspection.*
|
||||||
import com.intellij.openapi.progress.ProcessCanceledException
|
import com.intellij.openapi.progress.ProcessCanceledException
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
@@ -27,9 +28,13 @@ import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult
|
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult
|
||||||
import org.jetbrains.kotlin.idea.highlighter.JetPsiChecker
|
import org.jetbrains.kotlin.idea.highlighter.JetPsiChecker
|
||||||
import org.jetbrains.kotlin.idea.quickfix.JetWholeProjectModalAction
|
import org.jetbrains.kotlin.idea.quickfix.JetWholeProjectModalAction
|
||||||
|
import org.jetbrains.kotlin.idea.quickfix.ReplaceObsoleteLabelSyntaxFix
|
||||||
|
import org.jetbrains.kotlin.idea.quickfix.looksLikeObsoleteLabel
|
||||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||||
|
import org.jetbrains.kotlin.psi.JetAnnotationEntry
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
import org.jetbrains.kotlin.psi.JetTreeVisitorVoid
|
import org.jetbrains.kotlin.psi.JetTreeVisitorVoid
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
|
||||||
|
|
||||||
public class KotlinCleanupInspection(): LocalInspectionTool(), CleanupLocalInspectionTool {
|
public class KotlinCleanupInspection(): LocalInspectionTool(), CleanupLocalInspectionTool {
|
||||||
@@ -52,7 +57,7 @@ public class KotlinCleanupInspection(): LocalInspectionTool(), CleanupLocalInspe
|
|||||||
super.visitElement(element)
|
super.visitElement(element)
|
||||||
val collection = diagnostics.forElement(element)
|
val collection = diagnostics.forElement(element)
|
||||||
collection.forEach {
|
collection.forEach {
|
||||||
if (it.getFactory().isCleanup()) {
|
if (it.isCleanup()) {
|
||||||
problemDescriptors.add(it.toProblemDescriptor(file, manager))
|
problemDescriptors.add(it.toProblemDescriptor(file, manager))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,18 +66,27 @@ public class KotlinCleanupInspection(): LocalInspectionTool(), CleanupLocalInspe
|
|||||||
return problemDescriptors.toTypedArray()
|
return problemDescriptors.toTypedArray()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun Diagnostic.isCleanup() = getFactory().isCleanup() || isObsoleteLabel()
|
||||||
|
|
||||||
private fun DiagnosticFactory<*>.isCleanup() =
|
private fun DiagnosticFactory<*>.isCleanup() =
|
||||||
this == Errors.DEPRECATED_TRAIT_KEYWORD ||
|
this == Errors.DEPRECATED_TRAIT_KEYWORD ||
|
||||||
this == Errors.DEPRECATED_ANNOTATION_SYNTAX ||
|
this == Errors.DEPRECATED_ANNOTATION_SYNTAX ||
|
||||||
this == Errors.ENUM_ENTRY_USES_DEPRECATED_OR_NO_DELIMITER ||
|
this == Errors.ENUM_ENTRY_USES_DEPRECATED_OR_NO_DELIMITER ||
|
||||||
this == Errors.ENUM_ENTRY_USES_DEPRECATED_SUPER_CONSTRUCTOR ||
|
this == Errors.ENUM_ENTRY_USES_DEPRECATED_SUPER_CONSTRUCTOR ||
|
||||||
this == Errors.DEPRECATED_LAMBDA_SYNTAX ||
|
this == Errors.DEPRECATED_LAMBDA_SYNTAX ||
|
||||||
|
this == Errors.MISSING_CONSTRUCTOR_KEYWORD ||
|
||||||
|
this == Errors.FUNCTION_EXPRESSION_WITH_NAME ||
|
||||||
this == Errors.JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION ||
|
this == Errors.JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION ||
|
||||||
this == ErrorsJvm.JAVA_LANG_CLASS_ARGUMENT_IN_ANNOTATION
|
this == ErrorsJvm.JAVA_LANG_CLASS_ARGUMENT_IN_ANNOTATION
|
||||||
|
|
||||||
|
private fun Diagnostic.isObsoleteLabel(): Boolean {
|
||||||
|
val annotationEntry = getPsiElement().getNonStrictParentOfType<JetAnnotationEntry>() ?: return false
|
||||||
|
return annotationEntry.looksLikeObsoleteLabel()
|
||||||
|
}
|
||||||
|
|
||||||
private fun Diagnostic.toProblemDescriptor(file: JetFile, manager: InspectionManager): ProblemDescriptor? {
|
private fun Diagnostic.toProblemDescriptor(file: JetFile, manager: InspectionManager): ProblemDescriptor? {
|
||||||
val quickFixes = JetPsiChecker.createQuickfixes(this)
|
val quickFixes = JetPsiChecker.createQuickfixes(this)
|
||||||
.filter { it !is JetWholeProjectModalAction<*> }
|
.filter { it.isCleanupFix(this) }
|
||||||
.map { IntentionWrapper(it, file) }
|
.map { IntentionWrapper(it, file) }
|
||||||
|
|
||||||
return manager.createProblemDescriptor(getPsiElement(),
|
return manager.createProblemDescriptor(getPsiElement(),
|
||||||
@@ -81,4 +95,11 @@ public class KotlinCleanupInspection(): LocalInspectionTool(), CleanupLocalInspe
|
|||||||
quickFixes.toTypedArray(),
|
quickFixes.toTypedArray(),
|
||||||
ProblemHighlightType.GENERIC_ERROR_OR_WARNING)
|
ProblemHighlightType.GENERIC_ERROR_OR_WARNING)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun IntentionAction.isCleanupFix(diagnostic: Diagnostic): Boolean {
|
||||||
|
if (diagnostic.getFactory() == Errors.UNRESOLVED_REFERENCE) {
|
||||||
|
return this is ReplaceObsoleteLabelSyntaxFix
|
||||||
|
}
|
||||||
|
return this !is JetWholeProjectModalAction<*>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,13 +78,6 @@ public class ReplaceObsoleteLabelSyntaxFix(element: JetAnnotationEntry?) : JetIn
|
|||||||
} && analyze().getDiagnostics().forElement(nameExpression).any { it.getFactory() == Errors.UNRESOLVED_REFERENCE }
|
} && analyze().getDiagnostics().forElement(nameExpression).any { it.getFactory() == Errors.UNRESOLVED_REFERENCE }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun JetAnnotationEntry.looksLikeObsoleteLabel() =
|
|
||||||
getAtSymbol() != null &&
|
|
||||||
getParent() is JetAnnotatedExpression &&
|
|
||||||
(getParent() as JetAnnotatedExpression).getAnnotationEntries().size() == 1 &&
|
|
||||||
getValueArgumentList() == null &&
|
|
||||||
getCalleeExpression()?.getConstructorReferenceExpression()?.getIdentifier() != null
|
|
||||||
|
|
||||||
private fun replaceWithLabel(annotation: JetAnnotationEntry) {
|
private fun replaceWithLabel(annotation: JetAnnotationEntry) {
|
||||||
val labelName = annotation.getCalleeExpression()?.getConstructorReferenceExpression()?.getReferencedName() ?: return
|
val labelName = annotation.getCalleeExpression()?.getConstructorReferenceExpression()?.getReferencedName() ?: return
|
||||||
val annotatedExpression = annotation.getParent() as? JetAnnotatedExpression ?: return
|
val annotatedExpression = annotation.getParent() as? JetAnnotatedExpression ?: return
|
||||||
@@ -103,3 +96,10 @@ public class ReplaceObsoleteLabelSyntaxFix(element: JetAnnotationEntry?) : JetIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public fun JetAnnotationEntry.looksLikeObsoleteLabel(): Boolean =
|
||||||
|
getAtSymbol() != null &&
|
||||||
|
getParent() is JetAnnotatedExpression &&
|
||||||
|
(getParent() as JetAnnotatedExpression).getAnnotationEntries().size() == 1 &&
|
||||||
|
getValueArgumentList() == null &&
|
||||||
|
getCalleeExpression()?.getConstructorReferenceExpression()?.getIdentifier() != null
|
||||||
|
|||||||
@@ -18,3 +18,15 @@ val f = { (a: Int, b: Int) -> a + b }
|
|||||||
annotation class Ann(val arg1: Class<*>, val arg2: Class<out Any?>)
|
annotation class Ann(val arg1: Class<*>, val arg2: Class<out Any?>)
|
||||||
|
|
||||||
Ann(javaClass<String>(), javaClass<Int>()) class MyClass
|
Ann(javaClass<String>(), javaClass<Int>()) class MyClass
|
||||||
|
|
||||||
|
class A private()
|
||||||
|
|
||||||
|
val x = fun foo(x: String) { }
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
@loop
|
||||||
|
for (i in 1..100) {
|
||||||
|
/* comment */
|
||||||
|
continue@loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,3 +20,15 @@ val f = { a: Int, b: Int -> a + b }
|
|||||||
annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>)
|
annotation class Ann(val arg1: KClass<*>, val arg2: KClass<out Any?>)
|
||||||
|
|
||||||
Ann(String::class, Int::class) class MyClass
|
Ann(String::class, Int::class) class MyClass
|
||||||
|
|
||||||
|
class A private constructor()
|
||||||
|
|
||||||
|
val x = fun(x: String) { }
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
loop@
|
||||||
|
for (i in 1..100) {
|
||||||
|
/* comment */
|
||||||
|
continue@loop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user