mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-15 02:59:33 +07:00
[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:
committed by
intellij-monorepo-bot
parent
0b4694bb4f
commit
4bb7fa8914
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user