Skip to content

Commit d3c105d

Browse files
committed
Add conflicts detecting for local variables and parameters
1 parent bcf7de0 commit d3c105d

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package io.runescript.plugin.ide.refactoring
2+
3+
import com.intellij.openapi.editor.Editor
4+
import com.intellij.openapi.project.Project
5+
import com.intellij.openapi.util.NlsContexts
6+
import com.intellij.psi.PsiElement
7+
import com.intellij.psi.ResolveState
8+
import com.intellij.refactoring.rename.RenamePsiElementProcessor
9+
import com.intellij.refactoring.rename.RenamePsiFileProcessor
10+
import com.intellij.refactoring.rename.RenameRefactoringDialog
11+
import com.intellij.util.containers.MultiMap
12+
import io.runescript.plugin.ide.RsBundle
13+
import io.runescript.plugin.lang.psi.RsLocalVariableExpression
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 RsRenameProcessor : RenamePsiElementProcessor() {
19+
20+
override fun createDialog(
21+
project: Project, element: PsiElement, nameSuggestionContext: PsiElement?, editor: Editor?
22+
): RenameRefactoringDialog? {
23+
return RenamePsiFileProcessor.PsiFileRenameDialog(project, element, nameSuggestionContext, editor)
24+
}
25+
26+
override fun findExistingNameConflicts(
27+
element: PsiElement, newName: String, conflicts: MultiMap<PsiElement?, @NlsContexts.DialogMessage String?>
28+
) {
29+
val resolver = RsLocalVariableResolver(newName, RsResolveMode.Both)
30+
RsScopesUtil.walkUpScopes(resolver, ResolveState.initial(), element)
31+
if (resolver.declaration != null) {
32+
conflicts.putValue(
33+
resolver.declaration, RsBundle.message("refactoring.error.duplicate.local.variable", newName)
34+
)
35+
}
36+
}
37+
38+
override fun canProcessElement(element: PsiElement): Boolean {
39+
return element is RsLocalVariableExpression
40+
}
41+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737

3838
<!-- Rename Handler -->
3939
<renameHandler implementation="io.runescript.plugin.ide.refactoring.RsMemberInplaceRenameHandler"/>
40+
<renamePsiElementProcessor implementation="io.runescript.plugin.ide.refactoring.RsRenameProcessor"/>
4041
<lang.namesValidator language="RuneScript" implementationClass="io.runescript.plugin.ide.refactoring.RsNamesValidator"/>
4142
<lang.namesValidator language="RuneScriptSymbol" implementationClass="io.runescript.plugin.ide.refactoring.RsNamesValidator"/>
4243

src/main/resources/messages/RsBundle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ module.builder.backend.neptune=Neptune
4646
module.builder.backend.rscp=RSCP
4747
module.builder.backend.neptune.compiler.path=Compiler path:
4848

49+
# Refactoring
50+
refactoring.error.duplicate.local.variable=An existing local variable {0} has the same name
51+
4952
# Inspections
5053
inspection.error.unresolved.procedure=Unresolved procedure `{0}`
5154
inspection.error.unresolved.clientscript=Unresolved clientscript `{0}`

0 commit comments

Comments
 (0)