1
+ package io.runescript.plugin.ide.inspections
2
+
3
+ import com.intellij.codeInspection.LocalInspectionTool
4
+ import com.intellij.codeInspection.ProblemHighlightType
5
+ import com.intellij.codeInspection.ProblemsHolder
6
+ import com.intellij.psi.PsiElementVisitor
7
+ import com.intellij.psi.ResolveState
8
+ import io.runescript.plugin.ide.RsBundle
9
+ import io.runescript.plugin.lang.psi.RsArrayVariableDeclarationStatement
10
+ import io.runescript.plugin.lang.psi.RsLocalVariableDeclarationStatement
11
+ import io.runescript.plugin.lang.psi.RsLocalVariableExpression
12
+ import io.runescript.plugin.lang.psi.RsParameter
13
+ import io.runescript.plugin.lang.psi.RsVisitor
14
+ import io.runescript.plugin.lang.psi.scope.RsLocalVariableResolver
15
+ import io.runescript.plugin.lang.psi.scope.RsResolveMode
16
+ import io.runescript.plugin.lang.psi.scope.RsScopesUtil
17
+
18
+ class RuneScriptDuplicateLocalVariableInspection : LocalInspectionTool () {
19
+
20
+ override fun buildVisitor (holder : ProblemsHolder , isOnTheFly : Boolean ): PsiElementVisitor {
21
+ return object : RsVisitor () {
22
+
23
+ override fun visitParameter (o : RsParameter ) {
24
+ val name = o.localVariableExpression.name ? : return
25
+ var prev = o.prevSibling
26
+ while (prev != null ) {
27
+ if (prev is RsParameter ) {
28
+ val prevName = prev.localVariableExpression.name
29
+ if (name == prevName) {
30
+ holder.registerProblem(
31
+ o.localVariableExpression,
32
+ RsBundle .message(" inspection.error.duplicate.parameter" , name),
33
+ ProblemHighlightType .GENERIC_ERROR
34
+ )
35
+ break
36
+ }
37
+ }
38
+ prev = prev.prevSibling
39
+ }
40
+ }
41
+
42
+ override fun visitLocalVariableDeclarationStatement (o : RsLocalVariableDeclarationStatement ) {
43
+ val prev = o.prevSibling ? : o.parent ? : return
44
+ val expr = o.expressionList[0 ] as RsLocalVariableExpression
45
+ val name = expr.name ? : return
46
+ val resolver = RsLocalVariableResolver (name, RsResolveMode .Variables )
47
+ RsScopesUtil .walkUpScopes(resolver, ResolveState .initial(), prev)
48
+ if (resolver.declaration != null ) {
49
+ holder.registerProblem(
50
+ expr,
51
+ RsBundle .message(" inspection.error.duplicate.local.variable" , name),
52
+ ProblemHighlightType .GENERIC_ERROR
53
+ )
54
+ }
55
+ }
56
+
57
+ override fun visitArrayVariableDeclarationStatement (o : RsArrayVariableDeclarationStatement ) {
58
+ val prev = o.prevSibling ? : o.parent ? : return
59
+ val expr = o.expressionList[0 ] as RsLocalVariableExpression
60
+ val name = expr.name ? : return
61
+ val resolver = RsLocalVariableResolver (name, RsResolveMode .Arrays )
62
+ RsScopesUtil .walkUpScopes(resolver, ResolveState .initial(), prev)
63
+ if (resolver.declaration != null ) {
64
+ holder.registerProblem(
65
+ expr,
66
+ RsBundle .message(" inspection.error.duplicate.array.variable" , name),
67
+ ProblemHighlightType .GENERIC_ERROR
68
+ )
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
0 commit comments