detekt-rules/src/software/aws/toolkits/gradle/detekt/rules/DialogModalityRule.kt (33 lines of code) (raw):
// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package software.aws.toolkits.gradle.detekt.rules
import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Debt
import io.gitlab.arturbosch.detekt.api.Entity
import io.gitlab.arturbosch.detekt.api.Issue
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.Severity
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
import org.jetbrains.kotlin.psi.psiUtil.containingClass
import org.jetbrains.kotlin.psi.psiUtil.getSuperNames
class DialogModalityRule : Rule() {
override val issue = Issue("RunInEdtWithoutModalityInDialog", Severity.Defect, "Use ModalityState when calling runInEdt in dialogs", Debt.FIVE_MINS)
override fun visitCallExpression(element: KtCallExpression) {
super.visitCallExpression(element)
val callee = element.calleeExpression as? KtNameReferenceExpression ?: return
if (callee.getReferencedName() != "runInEdt") return
val clz = element.containingClass() ?: return
if (clz.getSuperNames().none { it in KNOWN_DIALOG_SUPER_TYPES }) return
if (element.valueArguments.none { it.text == "ModalityState.any()" }) {
report(
CodeSmell(
issue,
Entity.from(element),
message = "Call to runInEdt without ModalityState.any() within Dialog will not run until Dialog exits."
)
)
}
}
companion object {
private val KNOWN_DIALOG_SUPER_TYPES = setOf("DialogWrapper")
}
}