[groovy] hand qualification check logic over to extensions

This commit is contained in:
Daniil Ovchinnikov
2016-11-01 13:32:33 +03:00
parent 3dc68a7a20
commit 5bbed1994b
5 changed files with 41 additions and 3 deletions
@@ -16,6 +16,8 @@
package org.jetbrains.plugins.groovy.refactoring.rename;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
import com.intellij.psi.PsiMember;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -47,5 +49,16 @@ public interface GrRenameHelper {
* @see DefaultRenameHelper
*/
@Nullable
String getNewMemberName(@NotNull PsiMember member, @NotNull String newOriginalName);
default String getNewMemberName(@NotNull PsiMember member, @NotNull String newOriginalName) {
return null;
}
/**
* @param manager
* @param before element to which the reference resolved before rename
* @param after element to which the reference resolves after rename
*/
default boolean isQualificationNeeded(@NotNull PsiManager manager, @NotNull PsiElement before, @NotNull PsiElement after) {
return false;
}
}
@@ -51,6 +51,7 @@ import java.util.List;
import java.util.Map;
import static org.jetbrains.plugins.groovy.refactoring.rename.RenameHelperKt.getNewNameFromTransformations;
import static org.jetbrains.plugins.groovy.refactoring.rename.RenameHelperKt.isQualificationNeeded;
/**
* @author ilyas
@@ -100,13 +101,16 @@ public class RenameGrFieldProcessor extends RenameJavaVariableProcessor {
field.setName(newName);
PsiManager manager = psiElement.getManager();
for (GrReferenceExpression expression : handled.keySet()) {
PsiElement oldResolved = handled.get(expression);
if (oldResolved == null) continue;
PsiElement resolved = expression.resolve();
if (resolved == null) continue;
if (expression.getManager().areElementsEquivalent(oldResolved, resolved)) continue;
qualify(field, expression);
if (manager.areElementsEquivalent(oldResolved, resolved)) continue;
if (oldResolved.equals(field) || isQualificationNeeded(manager, oldResolved, resolved)) {
qualify(field, expression);
}
}
if (listener != null) {
@@ -16,6 +16,7 @@
package org.jetbrains.plugins.groovy.refactoring.rename
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiMember
fun PsiElement?.getNewNameFromTransformations(newName: String) = (this as? PsiMember)?.let {
@@ -29,4 +30,8 @@ private fun doGetNewNameFromTransformations(member: PsiMember, newName: String):
if (newMemberName != null) return newMemberName
}
return null
}
fun isQualificationNeeded(manager: PsiManager, before: PsiElement, after: PsiElement) = GrRenameHelper.EP_NAME.extensions.any {
it.isQualificationNeeded(manager, before, after)
}
@@ -15,6 +15,8 @@
*/
package org.jetbrains.plugins.groovy.transformations.impl
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiMember
import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAccessorMethod
import org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils.getAccessorName
@@ -32,4 +34,10 @@ class DefaultRenameHelper : GrRenameHelper {
getAccessorName(if (member.name.startsWith("is")) "is" else "get", newOriginalName)
}
}
override fun isQualificationNeeded(manager: PsiManager,
before: PsiElement,
after: PsiElement): Boolean {
return before is GrAccessorMethod && (after !is GrAccessorMethod || !manager.areElementsEquivalent(before.property, after.property))
}
}
@@ -15,6 +15,8 @@
*/
package org.jetbrains.plugins.groovy.transformations.impl
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiMember
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GrTraitField
import org.jetbrains.plugins.groovy.lang.psi.util.GrTraitUtil
@@ -28,4 +30,10 @@ class TraitRenameHelper : GrRenameHelper {
val containingClass = prototype.containingClass ?: return null
return GrTraitUtil.getTraitFieldPrefix(containingClass) + newOriginalName
}
override fun isQualificationNeeded(manager: PsiManager,
before: PsiElement,
after: PsiElement): Boolean {
return before is GrTraitField && (after !is GrTraitField || !manager.areElementsEquivalent(after.prototype, before.prototype))
}
}