Skip to content

Commit

Permalink
added support for lombok.noArgsConstructor.extraPrivate #490
Browse files Browse the repository at this point in the history
added changelog
  • Loading branch information
mplushnikov committed Jun 26, 2018
1 parent b860d34 commit d276071
Show file tree
Hide file tree
Showing 13 changed files with 62 additions and 13 deletions.
2 changes: 2 additions & 0 deletions parts/pluginChanges.html
Expand Up @@ -2,6 +2,8 @@
<li>0.19
<ol>
<li>Fixed #475: Added support for @FieldNameConstants</li>
<li>Fixed #488: Added support for @Flogger annotation</li>
<li>Fixed #490: Added support for lombok.noArgsConstructor.extraPrivate</li>
<li>Fixed #473: Warning about Wither requiring AllArgsConstructor, although Builder provides one</li>
</ol>
</li>
Expand Down
2 changes: 1 addition & 1 deletion parts/pluginDescription.html
Expand Up @@ -17,7 +17,7 @@ <h1>IntelliJ Lombok plugin</h1>
<li><a href="https://projectlombok.org/features/ToString.html">@ToString</a></li>
<li><a href="https://projectlombok.org/features/EqualsAndHashCode.html">@EqualsAndHashCode</a></li>
<li><a href="https://projectlombok.org/features/Constructor.html">@AllArgsConstructor, @RequiredArgsConstructor and @NoArgsConstructor</a></li>
<li><a href="https://projectlombok.org/features/Log.html">@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog</a></li>
<li><a href="https://projectlombok.org/features/Log.html">@Log, @Log4j, @Log4j2, @Slf4j, @XSlf4j, @CommonsLog, @JBossLog, @Flogger</a></li>
<li><a href="https://projectlombok.org/features/Data.html">@Data</a></li>
<li><a href="https://projectlombok.org/features/Builder.html">@Builder</a></li>
<li><a href="https://projectlombok.org/features/Builder.html#singular">@Singular</a></li>
Expand Down
Expand Up @@ -5,6 +5,7 @@
import de.plushnikov.intellij.plugin.processor.clazz.GetterProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.SetterProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.ToStringProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.NoArgsConstructorProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.RequiredArgsConstructorProcessor;
import de.plushnikov.intellij.plugin.processor.field.GetterFieldProcessor;
import de.plushnikov.intellij.plugin.processor.field.SetterFieldProcessor;
Expand All @@ -17,6 +18,7 @@ public DelombokDataAction() {
new SetterProcessor(new SetterFieldProcessor()),
new EqualsAndHashCodeProcessor(),
new ToStringProcessor(),
new RequiredArgsConstructorProcessor())));
new RequiredArgsConstructorProcessor(),
new NoArgsConstructorProcessor())));
}
}
Expand Up @@ -61,8 +61,8 @@ private static BaseDelombokHandler createHandler() {

return new BaseDelombokHandler(true,
requiredArgsConstructorProcessor, allArgsConstructorProcessor, noArgsConstructorProcessor,
new DataProcessor(getterProcessor, setterProcessor, equalsAndHashCodeProcessor, toStringProcessor, requiredArgsConstructorProcessor),
getterProcessor, new ValueProcessor(getterProcessor, equalsAndHashCodeProcessor, toStringProcessor, allArgsConstructorProcessor),
new DataProcessor(getterProcessor, setterProcessor, equalsAndHashCodeProcessor, toStringProcessor, requiredArgsConstructorProcessor, noArgsConstructorProcessor),
getterProcessor, new ValueProcessor(getterProcessor, equalsAndHashCodeProcessor, toStringProcessor, allArgsConstructorProcessor, noArgsConstructorProcessor),
new WitherProcessor(new WitherFieldProcessor(requiredArgsConstructorProcessor)),
setterProcessor, equalsAndHashCodeProcessor, toStringProcessor,
new CommonsLogProcessor(), new JBossLogProcessor(), new Log4jProcessor(), new Log4j2Processor(), new LogProcessor(), new Slf4jProcessor(), new XSlf4jProcessor(), new FloggerProcessor(),
Expand Down
Expand Up @@ -5,6 +5,7 @@
import de.plushnikov.intellij.plugin.processor.clazz.ToStringProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.ValueProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.AllArgsConstructorProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.NoArgsConstructorProcessor;
import de.plushnikov.intellij.plugin.processor.field.GetterFieldProcessor;

public class DelombokValueAction extends BaseDelombokAction {
Expand All @@ -14,6 +15,6 @@ public DelombokValueAction() {
new GetterProcessor(new GetterFieldProcessor()),
new EqualsAndHashCodeProcessor(),
new ToStringProcessor(),
new AllArgsConstructorProcessor())));
new AllArgsConstructorProcessor(), new NoArgsConstructorProcessor())));
}
}
Expand Up @@ -29,7 +29,8 @@ public LombokConfigCompletionContributor() {
final Collection<String> booleanOptions = new HashSet<String>(Arrays.asList(
"config.stopBubbling", "lombok.accessors.chain", "lombok.accessors.fluent",
"lombok.anyConstructor.suppressConstructorProperties", "lombok.equalsAndHashCode.doNotUseGetters", "lombok.getter.noIsPrefix",
"lombok.log.fieldIsStatic", "lombok.toString.doNotUseGetters", "lombok.toString.includeFieldNames"));
"lombok.log.fieldIsStatic", "lombok.toString.doNotUseGetters", "lombok.toString.includeFieldNames",
ConfigKey.NO_ARGS_CONSTRUCTOR_EXTRA_PRIVATE.getConfigKey()));

final Collection<String> flagUsageOptions = new HashSet<String>(Arrays.asList(
"lombok.accessors.flagUsage", "lombok.allArgsConstructor.flagUsage", "lombok.anyConstructor.flagUsage",
Expand Down
Expand Up @@ -33,6 +33,8 @@ public enum ConfigKey {
FIELD_NAME_CONSTANTS_PREFIX("lombok.fieldNameConstants.prefix", "FIELD_"),
FIELD_NAME_CONSTANTS_SUFFIX("lombok.fieldNameConstants.suffix", ""),

NO_ARGS_CONSTRUCTOR_EXTRA_PRIVATE("lombok.noArgsConstructor.extraPrivate", "false"),

ACCESSORS_FLAG_USAGE("lombok.accessors.flagUsage", ""),
ALLARGSCONSTRUCTOR_FLAG_USAGE("lombok.allArgsConstructor.flagUsage", ""),
ANYCONSTRUCTOR_FLAG_USAGE("lombok.anyConstructor.flagUsage", ""),
Expand Down
Expand Up @@ -8,20 +8,26 @@
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.util.PsiTreeUtil;
import de.plushnikov.intellij.plugin.lombokconfig.ConfigDiscovery;
import de.plushnikov.intellij.plugin.lombokconfig.ConfigKey;
import de.plushnikov.intellij.plugin.problem.LombokProblem;
import de.plushnikov.intellij.plugin.problem.ProblemBuilder;
import de.plushnikov.intellij.plugin.problem.ProblemEmptyBuilder;
import de.plushnikov.intellij.plugin.problem.ProblemNewBuilder;
import de.plushnikov.intellij.plugin.processor.AbstractProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.AbstractConstructorClassProcessor;
import de.plushnikov.intellij.plugin.quickfix.PsiQuickFixFactory;
import de.plushnikov.intellij.plugin.thirdparty.LombokUtils;
import de.plushnikov.intellij.plugin.util.LombokProcessorUtil;
import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil;
import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil;
import de.plushnikov.intellij.plugin.util.PsiClassUtil;
import de.plushnikov.intellij.plugin.util.PsiMethodUtil;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.Value;
import org.jetbrains.annotations.NotNull;

Expand Down Expand Up @@ -207,6 +213,23 @@ protected String buildAttributeNameString(boolean doNotUseGetters, @NotNull PsiF
}
}

protected boolean shouldGenerateNoArgsConstructor(@NotNull PsiClass psiClass, @NotNull AbstractConstructorClassProcessor argsConstructorProcessor) {
boolean result = ConfigDiscovery.getInstance().getBooleanLombokConfigProperty(ConfigKey.NO_ARGS_CONSTRUCTOR_EXTRA_PRIVATE, psiClass);
if (result) {
result = PsiAnnotationSearchUtil.isNotAnnotatedWith(psiClass, NoArgsConstructor.class);
}
if (result && PsiAnnotationSearchUtil.isAnnotatedWith(psiClass, AllArgsConstructor.class)) {
result = argsConstructorProcessor.getAllFields(psiClass).isEmpty();
}
if (result && PsiAnnotationSearchUtil.isAnnotatedWith(psiClass, RequiredArgsConstructor.class)) {
result = argsConstructorProcessor.getRequiredFields(psiClass).isEmpty();
}
if (result) {
result = !PsiClassUtil.hasSuperClass(psiClass);
}
return result;
}

private Collection<String> makeSet(@NotNull Collection<String> exclude) {
if (exclude.isEmpty()) {
return Collections.emptySet();
Expand Down
Expand Up @@ -9,6 +9,7 @@
import de.plushnikov.intellij.plugin.problem.ProblemBuilder;
import de.plushnikov.intellij.plugin.problem.ProblemEmptyBuilder;
import de.plushnikov.intellij.plugin.processor.LombokPsiElementUsage;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.NoArgsConstructorProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.RequiredArgsConstructorProcessor;
import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil;
import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil;
Expand Down Expand Up @@ -38,15 +39,17 @@ public class DataProcessor extends AbstractClassProcessor {
private final EqualsAndHashCodeProcessor equalsAndHashCodeProcessor;
private final ToStringProcessor toStringProcessor;
private final RequiredArgsConstructorProcessor requiredArgsConstructorProcessor;
private final NoArgsConstructorProcessor noArgsConstructorProcessor;

public DataProcessor(GetterProcessor getterProcessor, SetterProcessor setterProcessor, EqualsAndHashCodeProcessor equalsAndHashCodeProcessor,
ToStringProcessor toStringProcessor, RequiredArgsConstructorProcessor requiredArgsConstructorProcessor) {
ToStringProcessor toStringProcessor, RequiredArgsConstructorProcessor requiredArgsConstructorProcessor, NoArgsConstructorProcessor noArgsConstructorProcessor) {
super(PsiMethod.class, Data.class);
this.getterProcessor = getterProcessor;
this.setterProcessor = setterProcessor;
this.equalsAndHashCodeProcessor = equalsAndHashCodeProcessor;
this.toStringProcessor = toStringProcessor;
this.requiredArgsConstructorProcessor = requiredArgsConstructorProcessor;
this.noArgsConstructorProcessor = noArgsConstructorProcessor;
}

@Override
Expand Down Expand Up @@ -91,6 +94,10 @@ protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnot
if (shouldGenerateRequiredArgsConstructor(psiClass, staticName)) {
target.addAll(requiredArgsConstructorProcessor.createRequiredArgsConstructor(psiClass, PsiModifier.PUBLIC, psiAnnotation, staticName));
}

if (shouldGenerateNoArgsConstructor(psiClass, requiredArgsConstructorProcessor)) {
target.addAll(noArgsConstructorProcessor.createNoArgsConstructor(psiClass, PsiModifier.PRIVATE, psiAnnotation));
}
}

private boolean shouldGenerateRequiredArgsConstructor(@NotNull PsiClass psiClass, @Nullable String staticName) {
Expand Down
Expand Up @@ -10,6 +10,7 @@
import de.plushnikov.intellij.plugin.problem.ProblemEmptyBuilder;
import de.plushnikov.intellij.plugin.processor.LombokPsiElementUsage;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.AllArgsConstructorProcessor;
import de.plushnikov.intellij.plugin.processor.clazz.constructor.NoArgsConstructorProcessor;
import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil;
import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil;
import de.plushnikov.intellij.plugin.util.PsiClassUtil;
Expand All @@ -34,16 +35,18 @@ public class ValueProcessor extends AbstractClassProcessor {
private final EqualsAndHashCodeProcessor equalsAndHashCodeProcessor;
private final ToStringProcessor toStringProcessor;
private final AllArgsConstructorProcessor allArgsConstructorProcessor;
private final NoArgsConstructorProcessor noArgsConstructorProcessor;

@SuppressWarnings({"deprecation", "unchecked"})
public ValueProcessor(GetterProcessor getterProcessor, EqualsAndHashCodeProcessor equalsAndHashCodeProcessor,
ToStringProcessor toStringProcessor, AllArgsConstructorProcessor allArgsConstructorProcessor) {
ToStringProcessor toStringProcessor, AllArgsConstructorProcessor allArgsConstructorProcessor, NoArgsConstructorProcessor noArgsConstructorProcessor) {
super(PsiMethod.class, Value.class, lombok.experimental.Value.class);

this.getterProcessor = getterProcessor;
this.equalsAndHashCodeProcessor = equalsAndHashCodeProcessor;
this.toStringProcessor = toStringProcessor;
this.allArgsConstructorProcessor = allArgsConstructorProcessor;
this.noArgsConstructorProcessor = noArgsConstructorProcessor;
}

@Override
Expand Down Expand Up @@ -92,8 +95,14 @@ protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnot
}
}
}

if (shouldGenerateNoArgsConstructor(psiClass, allArgsConstructorProcessor)) {
target.addAll(noArgsConstructorProcessor.createNoArgsConstructor(psiClass, PsiModifier.PRIVATE, psiAnnotation));
}
}



@Override
public LombokPsiElementUsage checkFieldUsage(@NotNull PsiField psiField, @NotNull PsiAnnotation psiAnnotation) {
return LombokPsiElementUsage.READ_WRITE;
Expand Down
Expand Up @@ -196,6 +196,11 @@ protected Collection<PsiField> getAllNotInitializedAndNotStaticFields(@NotNull P
return allNotInitializedNotStaticFields;
}

@NotNull
public Collection<PsiField> getAllFields(@NotNull PsiClass psiClass) {
return getAllNotInitializedAndNotStaticFields(psiClass);
}

@NotNull
@SuppressWarnings("deprecation")
public Collection<PsiField> getRequiredFields(@NotNull PsiClass psiClass) {
Expand Down
Expand Up @@ -58,11 +58,6 @@ private Collection<PsiMethod> createAllArgsConstructor(PsiClass psiClass, String
return createAllArgsConstructor(psiClass, methodVisibility, psiAnnotation, staticName, allNotInitializedNotStaticFields);
}

@NotNull
public Collection<PsiField> getAllFields(@NotNull PsiClass psiClass) {
return getAllNotInitializedAndNotStaticFields(psiClass);
}

@NotNull
public Collection<PsiMethod> createAllArgsConstructor(@NotNull PsiClass psiClass, @PsiModifier.ModifierConstant @NotNull String methodModifier, @NotNull PsiAnnotation psiAnnotation, String staticName, Collection<PsiField> allNotInitializedNotStaticFields) {
return createConstructorMethod(psiClass, methodModifier, psiAnnotation, false, allNotInitializedNotStaticFields, staticName);
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/messages/lombokBundle.properties
Expand Up @@ -21,6 +21,8 @@ config.warn.dependency.outdated.message=<br>\
daemon.donate.title=Lombok support plugin updated to v{0}
daemon.donate.content=\
- Fixed (<a href="https://github.com/mplushnikov/lombok-intellij-plugin/issues/475">#475</a>): Added support for @FieldNameConstants<br>\
- Fixed (<a href="https://github.com/mplushnikov/lombok-intellij-plugin/issues/488">#488</a>): Added support for @Flogger annotation<br>\
- Fixed (<a href="https://github.com/mplushnikov/lombok-intellij-plugin/issues/490">#490</a>): Added support for lombok.noArgsConstructor.extraPrivate<br>\
- Fixed (<a href="https://github.com/mplushnikov/lombok-intellij-plugin/issues/473">#473</a>): Warning about Wither requiring AllArgsConstructor, although Builder provides one<br>\
<br>\
<span style="font-size: 140%">If you find my plugin helpful, donate me using \
Expand Down

0 comments on commit d276071

Please sign in to comment.