@@ -31,34 +31,34 @@ import com.intellij.psi.PsiElementVisitor
31
31
import com.intellij.psi.PsiFile
32
32
import com.intellij.util.SmartList
33
33
import org.jetbrains.kotlin.idea.intentions.SelfTargetingRangeIntention
34
+ import kotlin.reflect.KClass
34
35
35
36
abstract class IntentionBasedInspection <TElement : PsiElement >(
36
- val intentions : List <IntentionBasedInspection .IntentionData <TElement >>,
37
- protected open val problemText : String? ,
38
- protected val elementType : Class <TElement >
37
+ val intentionInfos : List <IntentionBasedInspection .IntentionData <TElement >>,
38
+ protected open val problemText : String?
39
39
) : AbstractKotlinInspection() {
40
40
41
41
constructor (
42
- intention: SelfTargetingRangeIntention <TElement >,
42
+ intention: KClass < out SelfTargetingRangeIntention <TElement > >,
43
43
problemText: String? = null
44
- ) : this (listOf (IntentionData (intention)), problemText, intention.elementType )
44
+ ) : this (listOf (IntentionData (intention)), problemText)
45
45
46
46
constructor (
47
- intention: SelfTargetingRangeIntention <TElement >,
47
+ intention: KClass < out SelfTargetingRangeIntention <TElement > >,
48
48
additionalChecker: (TElement , IntentionBasedInspection <TElement >) -> Boolean ,
49
49
problemText: String? = null
50
- ) : this (listOf (IntentionData (intention, additionalChecker)), problemText, intention.elementType )
50
+ ) : this (listOf (IntentionData (intention, additionalChecker)), problemText)
51
51
52
52
constructor (
53
- intention: SelfTargetingRangeIntention <TElement >,
53
+ intention: KClass < out SelfTargetingRangeIntention <TElement > >,
54
54
additionalChecker: (TElement ) -> Boolean ,
55
55
problemText: String? = null
56
- ) : this (listOf (IntentionData (intention, { element, inspection -> additionalChecker(element) } )), problemText, intention.elementType )
56
+ ) : this (listOf (IntentionData (intention, { element, inspection -> additionalChecker(element) } )), problemText)
57
57
58
58
59
59
60
60
data class IntentionData <TElement : PsiElement >(
61
- val intention : SelfTargetingRangeIntention <TElement >,
61
+ val intention : KClass < out SelfTargetingRangeIntention <TElement > >,
62
62
val additionalChecker : (TElement , IntentionBasedInspection <TElement >) -> Boolean = { element, inspection -> true }
63
63
)
64
64
@@ -67,6 +67,13 @@ abstract class IntentionBasedInspection<TElement : PsiElement>(
67
67
open fun inspectionRange (element : TElement ): TextRange ? = null
68
68
69
69
override fun buildVisitor (holder : ProblemsHolder , isOnTheFly : Boolean , session : LocalInspectionToolSession ): PsiElementVisitor {
70
+
71
+ val intentionsAndCheckers = intentionInfos.map {
72
+ it.intention.constructors.single().call() to it.additionalChecker
73
+ }
74
+ val elementType = intentionsAndCheckers.map { it.first.elementType }.distinct().singleOrNull()
75
+ ? : error(" $intentionInfos should have the same elementType" )
76
+
70
77
return object : PsiElementVisitor () {
71
78
override fun visitElement (element : PsiElement ) {
72
79
if (! elementType.isInstance(element) || element.textLength == 0 ) return
@@ -77,21 +84,19 @@ abstract class IntentionBasedInspection<TElement : PsiElement>(
77
84
var problemRange: TextRange ? = null
78
85
var fixes: SmartList <LocalQuickFix >? = null
79
86
80
- for ((intention, additionalChecker) in intentions) {
81
- synchronized(intention) {
82
- val range = intention.applicabilityRange(targetElement)?.let { range ->
83
- val elementRange = targetElement.textRange
84
- assert (range in elementRange) { " Wrong applicabilityRange() result for $intention - should be within element's range" }
85
- range.shiftRight(- elementRange.startOffset)
86
- }
87
+ for ((intention, additionalChecker) in intentionsAndCheckers) {
88
+ val range = intention.applicabilityRange(targetElement)?.let { range ->
89
+ val elementRange = targetElement.textRange
90
+ assert (range in elementRange) { " Wrong applicabilityRange() result for $intention - should be within element's range" }
91
+ range.shiftRight(- elementRange.startOffset)
92
+ }
87
93
88
- if (range != null && additionalChecker(targetElement, this @IntentionBasedInspection)) {
89
- problemRange = problemRange?.union(range) ? : range
90
- if (fixes == null ) {
91
- fixes = SmartList <LocalQuickFix >()
92
- }
93
- fixes!! .add(createQuickFix(intention, additionalChecker, targetElement))
94
+ if (range != null && additionalChecker(targetElement, this @IntentionBasedInspection)) {
95
+ problemRange = problemRange?.union(range) ? : range
96
+ if (fixes == null ) {
97
+ fixes = SmartList <LocalQuickFix >()
94
98
}
99
+ fixes!! .add(createQuickFix(intention, additionalChecker, targetElement))
95
100
}
96
101
}
97
102
0 commit comments