diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/extension/LombokRenameFieldReferenceProcessor.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/extension/LombokRenameFieldReferenceProcessor.java index 986722222bfc..d04c4a855387 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/extension/LombokRenameFieldReferenceProcessor.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/extension/LombokRenameFieldReferenceProcessor.java @@ -5,6 +5,7 @@ import com.intellij.refactoring.rename.RenameJavaVariableProcessor; import com.intellij.util.containers.ContainerUtil; import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.processor.field.AccessorsInfo; +import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; import de.plushnikov.intellij.plugin.processor.handler.singular.BuilderElementHandler; import de.plushnikov.intellij.plugin.processor.handler.singular.SingularHandlerFactory; import de.plushnikov.intellij.plugin.psi.LombokLightClassBuilder; @@ -12,6 +13,7 @@ import de.plushnikov.intellij.plugin.psi.LombokLightFieldBuilder; import de.plushnikov.intellij.plugin.psi.LombokLightMethodBuilder; import de.plushnikov.intellij.plugin.thirdparty.LombokUtils; import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; +import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil; import org.jetbrains.annotations.NotNull; import java.util.Arrays; @@ -23,10 +25,10 @@ public class LombokRenameFieldReferenceProcessor extends RenameJavaVariableProce @Override public boolean canProcessElement(@NotNull PsiElement element) { if (element instanceof PsiField && !(element instanceof LombokLightFieldBuilder)) { - final PsiClass containingClass = ((PsiField) element).getContainingClass(); + final PsiClass containingClass = ((PsiField)element).getContainingClass(); if (null != containingClass) { return ContainerUtil.exists(containingClass.getMethods(), LombokLightMethodBuilder.class::isInstance) || - ContainerUtil.exists(containingClass.getInnerClasses(), LombokLightClassBuilder.class::isInstance); + ContainerUtil.exists(containingClass.getInnerClasses(), LombokLightClassBuilder.class::isInstance); } } return false; @@ -34,7 +36,7 @@ public class LombokRenameFieldReferenceProcessor extends RenameJavaVariableProce @Override public void prepareRenaming(@NotNull PsiElement element, @NotNull String newFieldName, @NotNull Map allRenames) { - final PsiField psiField = (PsiField) element; + final PsiField psiField = (PsiField)element; final PsiClass containingClass = psiField.getContainingClass(); final String currentFieldName = psiField.getName(); if (null != containingClass) { @@ -62,12 +64,23 @@ public class LombokRenameFieldReferenceProcessor extends RenameJavaVariableProce } } - final PsiAnnotation builderAnnotation = PsiAnnotationSearchUtil.findAnnotation(containingClass, LombokClassNames.BUILDER, LombokClassNames.SUPER_BUILDER); + final PsiAnnotation builderAnnotation = + PsiAnnotationSearchUtil.findAnnotation(containingClass, LombokClassNames.BUILDER, LombokClassNames.SUPER_BUILDER); if (null != builderAnnotation) { final PsiAnnotation singularAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiField, LombokClassNames.SINGULAR); - final BuilderElementHandler handler = SingularHandlerFactory.getHandlerFor(psiField, null!=singularAnnotation); - final List currentBuilderMethodNames = handler.getBuilderMethodNames(accessorsInfo.removePrefix(currentFieldName), singularAnnotation, accessorsInfo.getCapitalizationStrategy()); - final List newBuilderMethodNames = handler.getBuilderMethodNames(accessorsInfo.removePrefix(newFieldName), singularAnnotation, accessorsInfo.getCapitalizationStrategy()); + final BuilderElementHandler handler = SingularHandlerFactory.getHandlerFor(psiField, null != singularAnnotation); + + final String setterPrefix = + PsiAnnotationUtil.getStringAnnotationValue(builderAnnotation, BuilderHandler.ANNOTATION_SETTER_PREFIX, ""); + + final List currentBuilderMethodNames = handler.getBuilderMethodNames(accessorsInfo.removePrefix(currentFieldName), + setterPrefix, + singularAnnotation, + accessorsInfo.getCapitalizationStrategy()); + final List newBuilderMethodNames = handler.getBuilderMethodNames(accessorsInfo.removePrefix(newFieldName), + setterPrefix, + singularAnnotation, + accessorsInfo.getCapitalizationStrategy()); if (currentBuilderMethodNames.size() == newBuilderMethodNames.size()) { Arrays.stream(containingClass.getInnerClasses()) @@ -84,7 +97,8 @@ public class LombokRenameFieldReferenceProcessor extends RenameJavaVariableProce } } - final boolean hasFieldNameConstantAnnotation = PsiAnnotationSearchUtil.isAnnotatedWith(containingClass, LombokClassNames.FIELD_NAME_CONSTANTS); + final boolean hasFieldNameConstantAnnotation = + PsiAnnotationSearchUtil.isAnnotatedWith(containingClass, LombokClassNames.FIELD_NAME_CONSTANTS); if (hasFieldNameConstantAnnotation) { Arrays.stream(containingClass.getInnerClasses()) .map(PsiClass::getFields) @@ -95,5 +109,4 @@ public class LombokRenameFieldReferenceProcessor extends RenameJavaVariableProce } } } - } diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java index 45ef93ace60f..defc4ea9b688 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java @@ -47,7 +47,7 @@ public class BuilderHandler { private final static String ANNOTATION_BUILDER_CLASS_NAME = "builderClassName"; private static final String ANNOTATION_BUILD_METHOD_NAME = "buildMethodName"; private static final String ANNOTATION_BUILDER_METHOD_NAME = "builderMethodName"; - private static final String ANNOTATION_SETTER_PREFIX = "setterPrefix"; + public static final String ANNOTATION_SETTER_PREFIX = "setterPrefix"; private final static String BUILD_METHOD_NAME = "build"; private final static String BUILDER_METHOD_NAME = "builder"; diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/AbstractSingularHandler.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/AbstractSingularHandler.java index 55d3d835bdcd..0be090edf17a 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/AbstractSingularHandler.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/AbstractSingularHandler.java @@ -119,10 +119,11 @@ public abstract class AbstractSingularHandler implements BuilderElementHandler { } @Override - public List getBuilderMethodNames(@NotNull String fieldName, @Nullable PsiAnnotation singularAnnotation, + public List getBuilderMethodNames(@NotNull String fieldName, @NotNull String prefix, @Nullable PsiAnnotation singularAnnotation, CapitalizationStrategy capitalizationStrategy) { - return Arrays.asList(createSingularName(singularAnnotation, fieldName), - fieldName, + final String accessorName = LombokUtils.buildAccessorName(prefix, fieldName, capitalizationStrategy); + return Arrays.asList(createSingularName(singularAnnotation, accessorName), + accessorName, createSingularClearMethodName(fieldName, capitalizationStrategy)); } diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/BuilderElementHandler.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/BuilderElementHandler.java index 7686bf6343c7..01aa498de419 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/BuilderElementHandler.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/BuilderElementHandler.java @@ -45,6 +45,6 @@ public interface BuilderElementHandler { Collection renderBuilderMethod(@NotNull BuilderInfo info); - List getBuilderMethodNames(@NotNull String newName, @Nullable PsiAnnotation singularAnnotation, - CapitalizationStrategy capitalizationStrategy); + List getBuilderMethodNames(@NotNull String fieldName, @NotNull String prefix, + @Nullable PsiAnnotation singularAnnotation, CapitalizationStrategy capitalizationStrategy); } diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/EmptyBuilderElementHandler.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/EmptyBuilderElementHandler.java index 50a9e8e535c1..5d34df8153b1 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/EmptyBuilderElementHandler.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/EmptyBuilderElementHandler.java @@ -30,8 +30,8 @@ class EmptyBuilderElementHandler implements BuilderElementHandler { } @Override - public List getBuilderMethodNames(@NotNull String newName, @Nullable PsiAnnotation singularAnnotation, - CapitalizationStrategy capitalizationStrategy) { + public List getBuilderMethodNames(@NotNull String fieldName, @NotNull String prefix, + @Nullable PsiAnnotation singularAnnotation, CapitalizationStrategy capitalizationStrategy) { return Collections.emptyList(); } diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/NonSingularHandler.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/NonSingularHandler.java index 5625a6f96daa..772954a11988 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/NonSingularHandler.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/NonSingularHandler.java @@ -6,6 +6,7 @@ import de.plushnikov.intellij.plugin.psi.LombokLightFieldBuilder; import de.plushnikov.intellij.plugin.psi.LombokLightMethodBuilder; import de.plushnikov.intellij.plugin.thirdparty.CapitalizationStrategy; import de.plushnikov.intellij.plugin.thirdparty.LombokCopyableAnnotations; +import de.plushnikov.intellij.plugin.thirdparty.LombokUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,9 +60,9 @@ class NonSingularHandler implements BuilderElementHandler { } @Override - public List getBuilderMethodNames(@NotNull String newName, @Nullable PsiAnnotation singularAnnotation, + public List getBuilderMethodNames(@NotNull String fieldName, @NotNull String prefix, @Nullable PsiAnnotation singularAnnotation, CapitalizationStrategy capitalizationStrategy) { - return Collections.singletonList(newName); + return Collections.singletonList(LombokUtils.buildAccessorName(prefix, fieldName, capitalizationStrategy)); } @Override diff --git a/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokRenameTest.java b/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokRenameTest.java new file mode 100644 index 000000000000..2c36022986a0 --- /dev/null +++ b/plugins/lombok/src/test/java/com/intellij/java/lomboktest/LombokRenameTest.java @@ -0,0 +1,62 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.java.lomboktest; + +import com.intellij.ide.highlighter.JavaFileType; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import com.intellij.testFramework.LightProjectDescriptor; +import com.intellij.testFramework.fixtures.LightJavaCodeInsightFixtureTestCase; +import de.plushnikov.intellij.plugin.LombokTestUtil; +import org.intellij.lang.annotations.Language; +import org.jetbrains.annotations.NotNull; + +public class LombokRenameTest extends LightJavaCodeInsightFixtureTestCase { + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return LombokTestUtil.LOMBOK_NEW_DESCRIPTOR; + } + + public void testLombokRenameFieldInBuilderWithPrefix() { + + final @Language("JAVA") String testFileData = """ + import lombok.Builder; + import lombok.Data; + import lombok.Singular; + + import java.util.List; + + @Data + @Builder(setterPrefix = "with") + public class App { + + private String firmPartyGfcId; + + @Singular + private List someStrValues; + + public static App doSomething() { + return App.builder() + .withFirmPartyGfcId("firm_party_gfcid") + .withSomeStrValue("someValue") + .withSomeStrValues(List.of("xyz")) + .clearSomeStrValues() + .build(); + } + + public static void main(String[] args) { + + } + }"""; + myFixture.configureByText(JavaFileType.INSTANCE, testFileData); + + myFixture.renameElementAtCaret("firmPartyGfcId_NewName"); + + + final PsiClass appBuilderClass = myFixture.findClass("App.AppBuilder"); + assertEquals(1, appBuilderClass.findMethodsByName("withFirmPartyGfcId_NewName", false).length); + + final PsiMethod doSomethingMethod = appBuilderClass.getContainingClass().findMethodsByName("doSomething", false)[0]; + assertTrue(doSomethingMethod.getBody().getText().contains("withFirmPartyGfcId_NewName(\"firm_party_gfcid\")")); + } +}