diff --git a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java index 3f0077fe5..1c76cc4e9 100644 --- a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java +++ b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java @@ -19,12 +19,11 @@ import com.intellij.psi.PsiType; import com.intellij.psi.PsiTypeParameter; import com.intellij.psi.impl.CheckUtil; -import com.intellij.psi.impl.light.LightIdentifier; import com.intellij.psi.impl.light.LightMethodBuilder; import com.intellij.psi.impl.light.LightModifierList; -import com.intellij.psi.impl.light.LightParameterListBuilder; import com.intellij.util.IncorrectOperationException; import com.intellij.util.StringBuilderSpinAllocator; +import de.plushnikov.intellij.plugin.util.ReflectionUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -33,17 +32,14 @@ * @author Plushnikov Michail */ public class LombokLightMethodBuilder extends LightMethodBuilder { - private final LightIdentifier myNameIdentifier; private final LombokLightReferenceListBuilder myThrowsList; private ASTNode myASTNode; - private String myName; private PsiCodeBlock myBodyCodeBlock; public LombokLightMethodBuilder(@NotNull PsiManager manager, @NotNull String name) { super(manager, JavaLanguage.INSTANCE, name, - new LightParameterListBuilder(manager, JavaLanguage.INSTANCE), new LombokLightModifierList(manager, JavaLanguage.INSTANCE)); - myName = name; - myNameIdentifier = new LombokLightIdentifier(manager, name); + new LombokLightParameterListBuilder(manager, JavaLanguage.INSTANCE), + new LombokLightModifierList(manager, JavaLanguage.INSTANCE)); myThrowsList = new LombokLightReferenceListBuilder(manager, JavaLanguage.INSTANCE, PsiReferenceList.Role.THROWS_LIST); } @@ -124,7 +120,7 @@ public PsiCodeBlock getBody() { @Override public PsiIdentifier getNameIdentifier() { - return myNameIdentifier; + return new LombokLightIdentifier(myManager, getName()); } @Override @@ -223,16 +219,53 @@ public PsiElement replace(@NotNull PsiElement newElement) throws IncorrectOperat return null; } - @NotNull @Override - public String getName() { - return myName; + public PsiElement setName(@NotNull String name) throws IncorrectOperationException { + ReflectionUtil.setFinalFieldPerReflection(LightMethodBuilder.class, this, String.class, name); + return this; } @Override - public PsiElement setName(@NotNull String name) throws IncorrectOperationException { - myName = name; - return this; + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LombokLightMethodBuilder that = (LombokLightMethodBuilder) o; + + if (!getName().equals(that.getName())) { + return false; + } + if (isConstructor() != that.isConstructor()) { + return false; + } + final PsiClass containingClass = getContainingClass(); + final PsiClass thatContainingClass = that.getContainingClass(); + if (containingClass != null ? !containingClass.equals(thatContainingClass) : thatContainingClass != null) { + return false; + } + if (!getModifierList().equals(that.getModifierList())) { + return false; + } + if (!getParameterList().equals(that.getParameterList())) { + return false; + } + final PsiType returnType = getReturnType(); + final PsiType thatReturnType = that.getReturnType(); + if (returnType != null ? !returnType.equals(thatReturnType) : thatReturnType != null) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + // should be constant because of RenameJavaMethodProcessor#renameElement and fixNameCollisionsWithInnerClassMethod(...) + return 1; } @Override diff --git a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java index b2801d329..022705f96 100644 --- a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java +++ b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java @@ -101,4 +101,27 @@ public TextRange getTextRange() { public String toString() { return "LombokLightModifierList"; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LombokLightModifierList that = (LombokLightModifierList) o; + + if (!myAnnotations.equals(that.myAnnotations)) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + return myAnnotations.hashCode(); + } } diff --git a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java index eaa12f3f7..d628839be 100644 --- a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java +++ b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java @@ -57,4 +57,23 @@ public LombokLightParameter setModifiers(String... modifiers) { ReflectionUtil.setFinalFieldPerReflection(LightVariableBuilder.class, this, LightModifierList.class, modifierList); return this; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LombokLightParameter that = (LombokLightParameter) o; + + return getType().equals(that.getType()); + } + + @Override + public int hashCode() { + return getType().hashCode(); + } } diff --git a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameterListBuilder.java b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameterListBuilder.java new file mode 100644 index 000000000..1b5e356fc --- /dev/null +++ b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameterListBuilder.java @@ -0,0 +1,32 @@ +package de.plushnikov.intellij.plugin.psi; + +import com.intellij.lang.Language; +import com.intellij.psi.PsiManager; +import com.intellij.psi.impl.light.LightParameterListBuilder; + +import java.util.Arrays; + +public class LombokLightParameterListBuilder extends LightParameterListBuilder { + public LombokLightParameterListBuilder(PsiManager manager, Language language) { + super(manager, language); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LombokLightParameterListBuilder that = (LombokLightParameterListBuilder) o; + + return Arrays.equals(getParameters(), that.getParameters()); + } + + @Override + public int hashCode() { + return Arrays.hashCode(getParameters()); + } +} diff --git a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java index 2377a53fb..3f0ecb1c1 100644 --- a/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java +++ b/lombok-plugin/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java @@ -10,10 +10,10 @@ public class ReflectionUtil { private static final Logger LOG = Logger.getInstance(ReflectionUtil.class.getName()); - public static void setFinalFieldPerReflection(Class clazz, T instance, Class oldClazz, R newValue) { + public static void setFinalFieldPerReflection(Class clazz, T instance, Class fieldClass, R newValue) { try { for (Field field : clazz.getDeclaredFields()) { - if (field.getType().equals(oldClazz)) { + if (field.getType().equals(fieldClass)) { field.setAccessible(true); field.set(instance, newValue); break; diff --git a/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameBuilderClass.java b/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameBuilderClass.java new file mode 100644 index 000000000..1ecc34a16 --- /dev/null +++ b/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameBuilderClass.java @@ -0,0 +1,20 @@ +package de.plushnikov.refactor; + +import lombok.Getter; +import lombok.Setter; +import lombok.experimental.Builder; + +@Builder +@Getter +@Setter +public class RenameBuilderClass { + private int intFielda; + + public static void main(String[] args) { + RenameBuilderClass builderClass1 = new RenameBuilderClass(2); + builderClass1.getIntFielda(); + + RenameBuilderClass builderClass = RenameBuilderClass.builder().intFielda(123).build(); + System.out.println(builderClass); + } +} diff --git a/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameDataTest.java b/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameDataTest.java new file mode 100644 index 000000000..8d8b7185d --- /dev/null +++ b/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameDataTest.java @@ -0,0 +1,15 @@ +package de.plushnikov.refactor; + +import lombok.Data; + +@Data +public class RenameDataTest { + String data; + + public static RenameDataTest factoryMethod() { + RenameDataTest foo = new RenameDataTest(); + foo.setData("data"); + System.out.println(foo.getData()); + return foo; + } +} diff --git a/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameGetterTest.java b/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameGetterTest.java new file mode 100644 index 000000000..d1e16b58c --- /dev/null +++ b/test-manual/lombok/src/main/java/de/plushnikov/refactor/RenameGetterTest.java @@ -0,0 +1,14 @@ +package de.plushnikov.refactor; + +import lombok.Getter; + +@Getter +public class RenameGetterTest { + private String someString; + + public static RenameGetterTest factoryMethod() { + RenameGetterTest foo = new RenameGetterTest(); + foo.getSomeString(); + return foo; + } +}