AbstractDiagnosticBasedMigrationInspection: make lazy initialization

This commit is contained in:
Dmitry Gridin
2020-02-12 11:17:37 +07:00
parent cfc2c0fb20
commit 09e6ffdb0a
8 changed files with 49 additions and 29 deletions
@@ -23,10 +23,11 @@ import org.jetbrains.kotlin.psi.KtTreeVisitorVoid
abstract class AbstractDiagnosticBasedMigrationInspection<T : KtElement>(
private val diagnosticFactory: DiagnosticFactoryWithPsiElement<T, *>,
private val elementType: Class<T>,
private val customIntentionFactory: ((Diagnostic) -> IntentionAction?)? = null,
val elementType: Class<T>,
) : AbstractKotlinInspection() {
abstract val diagnosticFactory: DiagnosticFactoryWithPsiElement<T, *>
open fun getCustomIntentionFactory(): ((Diagnostic) -> IntentionAction?)? = null
override fun checkFile(file: PsiFile, manager: InspectionManager, isOnTheFly: Boolean): Array<ProblemDescriptor>? {
if (file !is KtFile) return null
val diagnostics by lazy {
@@ -48,8 +49,9 @@ abstract class AbstractDiagnosticBasedMigrationInspection<T : KtElement>(
.singleOrNull()
?: error("Must have one diagnostic")
val customIntentionFactory = getCustomIntentionFactory()
val intentionAction = if (customIntentionFactory != null)
customIntentionFactory.invoke(diagnostic) ?: return
customIntentionFactory(diagnostic) ?: return
else
actionsFactory.createActions(diagnostic).ifEmpty { return }.singleOrNull() ?: error("Must have one fix")
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.inspections.migration
import com.intellij.codeInspection.CleanupLocalInspectionTool
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate
import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix
@@ -15,14 +16,14 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
class ProhibitJvmOverloadsOnConstructorsOfAnnotationClassesMigrationInspection :
AbstractDiagnosticBasedMigrationInspection<KtAnnotationEntry>(
ErrorsJvm.OVERLOADS_ANNOTATION_CLASS_CONSTRUCTOR,
KtAnnotationEntry::class.java,
),
AbstractDiagnosticBasedMigrationInspection<KtAnnotationEntry>(KtAnnotationEntry::class.java),
MigrationFix,
CleanupLocalInspectionTool {
override fun isApplicable(migrationInfo: MigrationInfo): Boolean {
return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_3, LanguageVersion.KOTLIN_1_4)
}
override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtAnnotationEntry, *>
get() = ErrorsJvm.OVERLOADS_ANNOTATION_CLASS_CONSTRUCTOR
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.inspections.migration
import com.intellij.codeInspection.CleanupLocalInspectionTool
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate
@@ -15,11 +16,14 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry
class ProhibitRepeatedUseSiteTargetAnnotationsMigrationInspection :
AbstractDiagnosticBasedMigrationInspection<KtAnnotationEntry>(Errors.REPEATED_ANNOTATION, KtAnnotationEntry::class.java),
AbstractDiagnosticBasedMigrationInspection<KtAnnotationEntry>(KtAnnotationEntry::class.java),
MigrationFix,
CleanupLocalInspectionTool {
override fun isApplicable(migrationInfo: MigrationInfo): Boolean {
return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_3, LanguageVersion.KOTLIN_1_4)
}
override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtAnnotationEntry, *>
get() = Errors.REPEATED_ANNOTATION
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.inspections.migration
import com.intellij.codeInspection.CleanupLocalInspectionTool
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate
@@ -15,14 +16,14 @@ import org.jetbrains.kotlin.psi.KtTypeParameterList
class ProhibitTypeParametersForLocalVariablesMigrationInspection :
AbstractDiagnosticBasedMigrationInspection<KtTypeParameterList>(
Errors.LOCAL_VARIABLE_WITH_TYPE_PARAMETERS,
KtTypeParameterList::class.java,
),
AbstractDiagnosticBasedMigrationInspection<KtTypeParameterList>(KtTypeParameterList::class.java),
MigrationFix,
CleanupLocalInspectionTool {
override fun isApplicable(migrationInfo: MigrationInfo): Boolean {
return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_3, LanguageVersion.KOTLIN_1_4)
}
override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtTypeParameterList, *>
get() = Errors.LOCAL_VARIABLE_WITH_TYPE_PARAMETERS
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.inspections.migration
import com.intellij.codeInspection.CleanupLocalInspectionTool
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate
@@ -15,11 +16,14 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry
class ProhibitUseSiteTargetAnnotationsOnSuperTypesMigrationInspection :
AbstractDiagnosticBasedMigrationInspection<KtAnnotationEntry>(Errors.ANNOTATION_ON_SUPERCLASS, KtAnnotationEntry::class.java),
AbstractDiagnosticBasedMigrationInspection<KtAnnotationEntry>(KtAnnotationEntry::class.java),
MigrationFix,
CleanupLocalInspectionTool {
override fun isApplicable(migrationInfo: MigrationInfo): Boolean {
return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_3, LanguageVersion.KOTLIN_1_4)
}
override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtAnnotationEntry, *>
get() = Errors.ANNOTATION_ON_SUPERCLASS
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.inspections.migration
import com.intellij.codeInspection.CleanupLocalInspectionTool
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate
@@ -15,7 +16,7 @@ import org.jetbrains.kotlin.psi.KtElement
class RedundantLabelMigrationInspection :
AbstractDiagnosticBasedMigrationInspection<KtElement>(Errors.REDUNDANT_LABEL_WARNING, KtElement::class.java),
AbstractDiagnosticBasedMigrationInspection<KtElement>(KtElement::class.java),
MigrationFix,
CleanupLocalInspectionTool {
override fun isApplicable(migrationInfo: MigrationInfo): Boolean {
@@ -23,5 +24,8 @@ class RedundantLabelMigrationInspection :
}
override fun descriptionMessage(): String = "Redundant label"
override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtElement, *>
get() = Errors.REDUNDANT_LABEL_WARNING
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.inspections.migration
import com.intellij.codeInspection.CleanupLocalInspectionTool
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate
@@ -15,11 +16,14 @@ import org.jetbrains.kotlin.psi.KtExpressionWithLabel
class RestrictReturnStatementTargetMigrationInspection :
AbstractDiagnosticBasedMigrationInspection<KtExpressionWithLabel>(Errors.NOT_A_FUNCTION_LABEL, KtExpressionWithLabel::class.java),
AbstractDiagnosticBasedMigrationInspection<KtExpressionWithLabel>(KtExpressionWithLabel::class.java),
MigrationFix,
CleanupLocalInspectionTool {
override fun isApplicable(migrationInfo: MigrationInfo): Boolean {
return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_3, LanguageVersion.KOTLIN_1_4)
}
override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtExpressionWithLabel, *>
get() = Errors.NOT_A_FUNCTION_LABEL
}
@@ -10,6 +10,7 @@ import com.intellij.codeInspection.CleanupLocalInspectionTool
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.configuration.MigrationInfo
@@ -23,22 +24,21 @@ import org.jetbrains.kotlin.psi.KtParameter
class WarningOnMainUnusedParameterMigrationInspection :
AbstractDiagnosticBasedMigrationInspection<KtParameter>(
Errors.UNUSED_PARAMETER,
KtParameter::class.java,
::createIntentionActionForMainFunction,
),
AbstractDiagnosticBasedMigrationInspection<KtParameter>(KtParameter::class.java),
MigrationFix,
CleanupLocalInspectionTool {
override fun isApplicable(migrationInfo: MigrationInfo): Boolean {
return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_3, LanguageVersion.KOTLIN_1_4)
}
}
private fun createIntentionActionForMainFunction(diagnostic: Diagnostic): IntentionAction? {
val parameter = diagnostic.psiElement as? KtParameter ?: return null
val ownerFunction = parameter.ownerFunction as? KtNamedFunction ?: return null
val mainFunctionDetector = MainFunctionDetector(parameter.languageVersionSettings) { it.descriptor as? FunctionDescriptor }
if (!mainFunctionDetector.isMain(ownerFunction)) return null
return RemoveUnusedFunctionParameterFix(parameter, false)
}
override val diagnosticFactory: DiagnosticFactoryWithPsiElement<KtParameter, *>
get() = Errors.UNUSED_PARAMETER
override fun getCustomIntentionFactory(): ((Diagnostic) -> IntentionAction?)? = fun(diagnostic: Diagnostic): IntentionAction? {
val parameter = diagnostic.psiElement as? KtParameter ?: return null
val ownerFunction = parameter.ownerFunction as? KtNamedFunction ?: return null
val mainFunctionDetector = MainFunctionDetector(parameter.languageVersionSettings) { it.descriptor as? FunctionDescriptor }
if (!mainFunctionDetector.isMain(ownerFunction)) return null
return RemoveUnusedFunctionParameterFix(parameter, false)
}
}