[lombok] IDEA-329939 provide quick fixes for "Lombok annotations" "Existing Builder must be an abstract static inner class"

GitOrigin-RevId: 3a2871e3162c0f77382d74deeb68811bc9750a3c
This commit is contained in:
Michail Plushnikov
2023-09-02 18:35:36 +02:00
committed by intellij-monorepo-bot
parent 0b4694bb4f
commit 4bb7fa8914
2 changed files with 64 additions and 9 deletions

View File

@@ -9,6 +9,7 @@ import de.plushnikov.intellij.plugin.problem.ProblemSink;
import de.plushnikov.intellij.plugin.processor.clazz.ToStringProcessor;
import de.plushnikov.intellij.plugin.psi.LombokLightClassBuilder;
import de.plushnikov.intellij.plugin.psi.LombokLightMethodBuilder;
import de.plushnikov.intellij.plugin.quickfix.PsiQuickFixFactory;
import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil;
import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil;
import de.plushnikov.intellij.plugin.util.PsiClassUtil;
@@ -41,20 +42,22 @@ public class SuperBuilderHandler extends BuilderHandler {
public boolean validateExistingBuilderClass(@NotNull String builderClassName,
@NotNull PsiClass psiClass,
@NotNull ProblemSink problemSink) {
final Optional<PsiClass> existingInnerBuilderClass = PsiClassUtil.getInnerClassInternByName(psiClass, builderClassName);
final Optional<PsiClass> existingInnerBuilderClassOptional = PsiClassUtil.getInnerClassInternByName(psiClass, builderClassName);
if (existingInnerBuilderClass.isPresent()) {
if (existingInnerBuilderClassOptional.isPresent()) {
if (!validateInvalidAnnotationsOnBuilderClass(existingInnerBuilderClass.get(), problemSink)) {
final PsiClass existingInnerBuilderClass = existingInnerBuilderClassOptional.get();
if (!validateInvalidAnnotationsOnBuilderClass(existingInnerBuilderClass, problemSink)) {
return false;
}
final Optional<PsiClass> isStaticAndAbstract = existingInnerBuilderClass
.filter(psiInnerClass -> psiInnerClass.hasModifierProperty(PsiModifier.STATIC))
.filter(psiInnerClass -> psiInnerClass.hasModifierProperty(PsiModifier.ABSTRACT));
final boolean isStaticAndAbstract = existingInnerBuilderClass.hasModifierProperty(PsiModifier.STATIC) &&
existingInnerBuilderClass.hasModifierProperty(PsiModifier.ABSTRACT);
if (isStaticAndAbstract.isEmpty()) {
problemSink.addErrorMessage("inspection.message.existing.builder.must.be.abstract.static.inner.class");
if (!isStaticAndAbstract) {
problemSink.addErrorMessage("inspection.message.existing.builder.must.be.abstract.static.inner.class")
.withLocalQuickFixes(() -> PsiQuickFixFactory.createModifierListFix(existingInnerBuilderClass, PsiModifier.ABSTRACT, true, false),
() -> PsiQuickFixFactory.createModifierListFix(existingInnerBuilderClass, PsiModifier.STATIC, true, false));
return false;
}
}
@@ -333,7 +336,8 @@ public class SuperBuilderHandler extends BuilderHandler {
final String callSuperCode = "super." + FILL_VALUES_METHOD_NAME + "(" + INSTANCE_VARIABLE_NAME + ");\n";
final String codeBlockText = String.format("%s%s.%s(%s, this);\nreturn self();", forceCallSuper ? callSuperCode : "",
baseClassBuilder.getQualifiedName(), STATIC_FILL_VALUES_METHOD_NAME, INSTANCE_VARIABLE_NAME);
baseClassBuilder.getQualifiedName(), STATIC_FILL_VALUES_METHOD_NAME,
INSTANCE_VARIABLE_NAME);
methodBuilder.withBodyText(codeBlockText);
result.add(methodBuilder);

View File

@@ -0,0 +1,51 @@
package de.plushnikov.intellij.plugin.inspection;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiFile;
import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl;
import com.intellij.util.containers.ContainerUtil;
import de.plushnikov.intellij.plugin.AbstractLombokLightCodeInsightTestCase;
import java.util.List;
public class SuperBuilderQuickFixTest extends AbstractLombokLightCodeInsightTestCase {
public void testAddModifiersAbstractStaticOnInnerBuilderClass() {
myFixture.configureByText(JavaFileType.INSTANCE, """
import lombok.experimental.SuperBuilder;
@SuperBuilder
class DeltaComponentWithSalesAndTechComponentId {
}
@SuperBuilder<caret>
public class DeltaOfferComponent extends DeltaComponentWithSalesAndTechComponentId {
Integer max;
public class DeltaOfferComponentBuilder {
public DeltaOfferComponentBuilder max(Integer max) {
this.max = max;
return this;
}
}
}
""");
assertTrue(hasActionWithText("Make 'DeltaOfferComponentBuilder' abstract"));
assertTrue(hasActionWithText("Make 'DeltaOfferComponentBuilder' static"));
}
private boolean hasActionWithText(String text) {
myFixture.enableInspections(LombokInspection.class);
final Editor editor = getEditor();
final PsiFile file = getFile();
CodeInsightTestFixtureImpl.instantiateAndRun(file, editor, new int[0], false);
final List<IntentionAction> availableActions = CodeInsightTestFixtureImpl.getAvailableIntentions(editor, file);
return ContainerUtil.exists(availableActions, action -> action.getText().contains(text));
}
}