-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathVisitors.kt
141 lines (111 loc) · 4.68 KB
/
Visitors.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.justai.jaicf.plugin.inspections
import com.intellij.codeInspection.LocalQuickFix
import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.psi.ElementManipulators
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElementVisitor
import com.intellij.psi.PsiFile
import com.justai.jaicf.plugin.notifications.checkEnvironmentAndNotify
import com.justai.jaicf.plugin.scenarios.psi.ScenarioDataService
import com.justai.jaicf.plugin.scenarios.psi.dto.State
import com.justai.jaicf.plugin.utils.StatePathExpression
import com.justai.jaicf.plugin.utils.VersionService
import com.justai.jaicf.plugin.utils.innerPathExpressions
import com.justai.jaicf.plugin.utils.isExist
import com.justai.jaicf.plugin.utils.isJaicfInclude
import org.jetbrains.kotlin.psi.KtAnnotated
import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtFile
abstract class StateVisitor(holder: ProblemsHolder) : VisitorBase(holder) {
abstract fun visitState(state: State)
override fun visitFile(file: PsiFile) {
if (!checkEnvironmentAndNotify(file))
return
if (file !is KtFile)
return
val service = ScenarioDataService.getInstance(file) ?: return
service.getScenarios(file)?.forEach {
recursiveEntryIntoState(it.innerState)
}
}
private fun recursiveEntryIntoState(state: State) {
visitState(state)
state.states.forEach { recursiveEntryIntoState(it) }
}
}
abstract class KtCallExpressionVisitor(holder: ProblemsHolder) : VisitorBase(holder) {
abstract fun visitCallExpression(callExpression: KtCallExpression)
override fun visitElement(element: PsiElement) {
if (!checkEnvironmentAndNotify(element))
return
if (element is KtCallExpression)
visitCallExpression(element)
}
}
abstract class PathExpressionVisitor(holder: ProblemsHolder) : VisitorBase(holder) {
abstract fun visitPathExpression(pathExpression: StatePathExpression)
override fun visitElement(element: PsiElement) {
if (!checkEnvironmentAndNotify(element))
return
if (element is KtCallExpression)
element.innerPathExpressions.forEach(this::visitPathExpression)
if (element is KtBinaryExpression)
element.innerPathExpressions.forEach(this::visitPathExpression)
}
}
abstract class AnnotatedElementVisitor(holder: ProblemsHolder) : VisitorBase(holder) {
abstract fun visitAnnotatedElement(annotatedElement: KtAnnotated)
override fun visitElement(element: PsiElement) {
if (!checkEnvironmentAndNotify(element))
return
(element as? KtAnnotated)?.let { visitAnnotatedElement(it) }
}
}
abstract class VisitorBase(private val holder: ProblemsHolder) : PsiElementVisitor() {
fun checkEnvironmentAndNotify(element: PsiElement): Boolean {
if (VersionService.getInstance(element)?.isJaicfInclude == false) return false
val project = if (element.isExist) element.project else return false
return checkEnvironmentAndNotify(project)
}
protected fun registerGenericErrorOrWarning(
element: PsiElement,
message: String,
vararg localQuickFix: LocalQuickFix,
) = registerProblem(element, message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, *localQuickFix)
protected fun registerGenericError(
element: PsiElement,
message: String,
vararg localQuickFix: LocalQuickFix,
) = registerProblem(element, message, ProblemHighlightType.GENERIC_ERROR, *localQuickFix)
protected fun registerWarning(
element: PsiElement,
message: String,
vararg localQuickFix: LocalQuickFix,
) = registerProblem(element, message, ProblemHighlightType.WARNING, *localQuickFix)
protected fun registerError(
element: PsiElement,
message: String,
vararg localQuickFix: LocalQuickFix,
) = registerProblem(element, message, ProblemHighlightType.ERROR, *localQuickFix)
protected fun registerWeakWarning(
element: PsiElement,
message: String,
vararg localQuickFix: LocalQuickFix,
) = registerProblem(element, message, ProblemHighlightType.WEAK_WARNING, *localQuickFix)
private fun registerProblem(
element: PsiElement,
message: String,
problemType: ProblemHighlightType,
vararg localQuickFix: LocalQuickFix,
) {
holder.registerProblem(
element,
message,
problemType,
ElementManipulators.getValueTextRange(element),
*localQuickFix
)
}
}