From 68315dde20cfc2369806b5b3148a418e32c75c53 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 26 Dec 2020 16:48:18 +0100 Subject: [PATCH 01/47] Bump mockito-core from 3.6.0 to 3.6.28 (#985) Bumps [mockito-core](https://github.com/mockito/mockito) from 3.6.0 to 3.6.28. - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.6.0...v3.6.28) Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 73ffa2477..07d32519d 100644 --- a/build.gradle +++ b/build.gradle @@ -84,7 +84,7 @@ dependencies { lombok group: 'org.projectlombok', name: 'lombok', version: '1.18.16', classifier: 'sources', ext: 'jar' testImplementation("junit:junit:4.13.1") - testImplementation("org.mockito:mockito-core:3.6.0") + testImplementation("org.mockito:mockito-core:3.6.28") testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.7.0") } From 9186e0b40bf6b93cd5c82494c6b2eec8344f5c6f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sat, 26 Dec 2020 16:48:32 +0100 Subject: [PATCH 02/47] Bump org.jetbrains.intellij from 0.6.3 to 0.6.5 (#986) Bumps org.jetbrains.intellij from 0.6.3 to 0.6.5. Signed-off-by: dependabot-preview[bot] Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 07d32519d..0208d571a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id "org.jetbrains.intellij" version "0.6.3" + id "org.jetbrains.intellij" version "0.6.5" id "org.jetbrains.grammarkit" version "2020.2.1" id "com.github.ManifestClasspath" version "0.1.0-RELEASE" } From 092ee2a13557ebdf9b8291c561f2add96506038c Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 26 Dec 2020 19:47:50 +0100 Subject: [PATCH 03/47] updated change list --- parts/pluginChanges.html | 10 +++++++--- src/main/resources/messages/LombokBundle.properties | 7 +++++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/parts/pluginChanges.html b/parts/pluginChanges.html index 8e5e73fa5..a7d78c3ea 100644 --- a/parts/pluginChanges.html +++ b/parts/pluginChanges.html @@ -1,15 +1,19 @@
  • 0.34
      -
    1. Rework and simplified plugin setting page
    2. -
    3. Updated all icons
    4. +
    5. Updated all lombok icons
    6. +
    7. Reworked and simplified plugin settings page
    8. +
    9. Automatically activate annotation processing if lombok library is present in background
    10. +
    11. Automatically suggestion to add lombok library if not present in project with lombok annotations
    12. +
    13. Fixed #21: Experimental support for @ExtensionMethods, thanks to @NekoCaffeine
    14. Fixed #919: Builder ignores visibility of XArgsConstructor
  • 0.33
    1. Implemented new intention actions to replace explicit getter and setter by lombok annotation, thanks to - @Lekanich (Aleksandr Zhelezniak)
    2. + @Lekanich (Aleksandr Zhelezniak) +
    3. Fixed #799: @SneakyThrows mistakenly swallow checked exception in lambda without "throws", thanks to @Lekanich (Aleksandr Zhelezniak)
    4. diff --git a/src/main/resources/messages/LombokBundle.properties b/src/main/resources/messages/LombokBundle.properties index 4d8af40f7..acb13a129 100644 --- a/src/main/resources/messages/LombokBundle.properties +++ b/src/main/resources/messages/LombokBundle.properties @@ -171,8 +171,11 @@ daemon.donate.title=Lombok support plugin updated to v{0} daemon.donate.content=
      \ Helpful? Donate with PayPal

      \ Fixes:
      \ -- Updated all icons
      \ -- Reworked and simplified plugin-settings options
      \ +- Updated all lombok icons
      \ +- Reworked and simplified plugin-settings page
      \ +- Automatically activate annotation processing if lombok library is present in background
      \ +- Automatically suggestion to add lombok library if not present in project with lombok annotations
      \ +- Fixed (#21): Experimental support for @ExtensionMethod, thanks to @NekoCaffeine
      \ - Fixed (#919): Builder ignores visibility of XArgsConstructor
      \
      \ If you find my plugin helpful, donate me using
      \ From d66a267d5e0268ba814dd2d0a5a98087c36836b7 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 3 Oct 2020 23:04:16 +0200 Subject: [PATCH 04/47] First steps to implement nameHint handling: - added nameHint parameter to processors methods - removed own caching and recursive handling TODO: - implement all of possibleToGenerateElementNamed() logic --- .../intellij/plugin/processor/Processor.java | 6 ++ .../clazz/AbstractClassProcessor.java | 26 ++++-- ...tBuilderPreDefinedInnerClassProcessor.java | 21 +++-- ...rBuilderPreDefinedInnerClassProcessor.java | 12 +-- ...ntsPredefinedInnerClassFieldProcessor.java | 16 ++-- .../field/AbstractFieldProcessor.java | 18 +++- .../method/AbstractMethodProcessor.java | 18 +++- .../provider/LombokAugmentProvider.java | 90 +++---------------- 8 files changed, 97 insertions(+), 110 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java index d95ec3cca..7f530c0c7 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java @@ -7,6 +7,7 @@ import com.intellij.psi.PsiField; import de.plushnikov.intellij.plugin.problem.LombokProblem; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.Collections; @@ -27,6 +28,11 @@ public interface Processor { @NotNull default List process(@NotNull PsiClass psiClass) { + return process(psiClass, null); + } + + @NotNull + default List process(@NotNull PsiClass psiClass, @Nullable String nameHint) { return Collections.emptyList(); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index 022f6f99c..4d51dcd9c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -44,21 +44,33 @@ protected AbstractClassProcessor(@NotNull Class supportedC @NotNull @Override - public List process(@NotNull PsiClass psiClass) { + public List process(@NotNull PsiClass psiClass, @Nullable String nameHint) { List result = Collections.emptyList(); PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiClass, getSupportedAnnotationClasses()); - if (null != psiAnnotation) { - if (supportAnnotationVariant(psiAnnotation) && validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance())) { - result = new ArrayList<>(); - generatePsiElements(psiClass, psiAnnotation, result); - } + if (null != psiAnnotation + && supportAnnotationVariant(psiAnnotation) + && possibleToGenerateElementNamed(nameHint) + && validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance())) { + + result = new ArrayList<>(); + generatePsiElements(psiClass, psiAnnotation, result); } return result; } - @Override + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { + if (null == nameHint) { + return true; + } + + //TODO: implement handling + + return true; + } + @NotNull + @Override public Collection collectProcessedAnnotations(@NotNull PsiClass psiClass) { Collection result = new ArrayList<>(); PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiClass, getSupportedAnnotationClasses()); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java index f099dc494..55b71e904 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java @@ -27,7 +27,7 @@ public abstract class AbstractBuilderPreDefinedInnerClassProcessor extends Abstr @NotNull @Override - public List process(@NotNull PsiClass psiClass) { + public List process(@NotNull PsiClass psiClass, @Nullable String nameHint) { final Optional parentClass = getSupportedParentClass(psiClass); final Optional builderAnnotation = parentClass.map(this::getSupportedAnnotation); if (builderAnnotation.isPresent()) { @@ -35,7 +35,7 @@ public List process(@NotNull PsiClass psiClass) { final PsiAnnotation psiBuilderAnnotation = builderAnnotation.get(); // use parent class as source! if (validate(psiBuilderAnnotation, psiParentClass, ProblemEmptyBuilder.getInstance())) { - return processAnnotation(psiParentClass, null, psiBuilderAnnotation, psiClass); + return processAnnotation(psiParentClass, null, psiBuilderAnnotation, psiClass, nameHint); } } else if (parentClass.isPresent()) { final PsiClass psiParentClass = parentClass.get(); @@ -46,7 +46,7 @@ public List process(@NotNull PsiClass psiClass) { final String builderClassNameOfThisMethod = getBuilderHandler().getBuilderClassName(psiParentClass, psiBuilderAnnotation, psiMethod); // check we found right method for this existing builder class if (Objects.equals(builderClassNameOfThisMethod, psiClass.getName())) { - return processAnnotation(psiParentClass, psiMethod, psiBuilderAnnotation, psiClass); + return processAnnotation(psiParentClass, psiMethod, psiBuilderAnnotation, psiClass, nameHint); } } } @@ -55,18 +55,29 @@ public List process(@NotNull PsiClass psiClass) { } private List processAnnotation(@NotNull PsiClass psiParentClass, @Nullable PsiMethod psiParentMethod, - @NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass) { + @NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass, + @Nullable String nameHint) { // use parent class as source! final String builderClassName = getBuilderHandler().getBuilderClassName(psiParentClass, psiAnnotation, psiParentMethod); List result = new ArrayList<>(); // apply only to inner BuilderClass - if (builderClassName.equals(psiClass.getName())) { + if (builderClassName.equals(psiClass.getName()) && possibleToGenerateElementNamed(nameHint)) { result.addAll(generatePsiElements(psiParentClass, psiParentMethod, psiAnnotation, psiClass)); } return result; } + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { + if (null == nameHint) { + return true; + } + + //TODO: implement handling + + return true; + } + protected abstract BuilderHandler getBuilderHandler(); protected abstract Collection generatePsiElements(@NotNull PsiClass psiParentClass, @Nullable PsiMethod psiParentMethod, @NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiBuilderClass); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java index 02c0913c4..b9e50b1f2 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java @@ -11,6 +11,7 @@ import de.plushnikov.intellij.plugin.processor.handler.SuperBuilderHandler; import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -25,7 +26,7 @@ public abstract class AbstractSuperBuilderPreDefinedInnerClassProcessor extends @NotNull @Override - public List process(@NotNull PsiClass psiClass) { + public List process(@NotNull PsiClass psiClass, @Nullable String nameHint) { final Optional parentClass = getSupportedParentClass(psiClass); final Optional psiAnnotation = parentClass.map(this::getSupportedAnnotation); if (psiAnnotation.isPresent()) { @@ -33,13 +34,14 @@ public List process(@NotNull PsiClass psiClass) { final PsiAnnotation psiBuilderAnnotation = psiAnnotation.get(); // use parent class as source! if (validate(psiBuilderAnnotation, psiParentClass, ProblemEmptyBuilder.getInstance())) { - return processAnnotation(psiParentClass, psiBuilderAnnotation, psiClass); + return processAnnotation(psiParentClass, psiBuilderAnnotation, psiClass, nameHint); } } return Collections.emptyList(); } - private List processAnnotation(@NotNull PsiClass psiParentClass, @NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass) { + private List processAnnotation(@NotNull PsiClass psiParentClass, @NotNull PsiAnnotation psiAnnotation, + @NotNull PsiClass psiClass, @Nullable String nameHint) { SuperBuilderHandler builderHandler = getBuilderHandler(); // use parent class as source! final String builderBaseClassName = builderHandler.getBuilderClassName(psiParentClass); @@ -47,12 +49,12 @@ private List processAnnotation(@NotNull PsiClass psiParentCl List result = new ArrayList<>(); // apply only to inner BuilderClass final String psiClassName = psiClass.getName(); - if (builderBaseClassName.equals(psiClassName)) { + if (builderBaseClassName.equals(psiClassName) && possibleToGenerateElementNamed(nameHint)) { result.addAll(generatePsiElementsOfBaseBuilderClass(psiParentClass, psiAnnotation, psiClass)); } else { // use parent class as source! final String builderImplClassName = builderHandler.getBuilderImplClassName(psiParentClass); - if (builderImplClassName.equals(psiClassName)) { + if (builderImplClassName.equals(psiClassName) && possibleToGenerateElementNamed(nameHint)) { result.addAll(generatePsiElementsOfImplBuilderClass(psiParentClass, psiAnnotation, psiClass)); } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsPredefinedInnerClassFieldProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsPredefinedInnerClassFieldProcessor.java index 86de5af71..ec6e0f78c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsPredefinedInnerClassFieldProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsPredefinedInnerClassFieldProcessor.java @@ -13,6 +13,7 @@ import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; @@ -29,7 +30,7 @@ public FieldNameConstantsPredefinedInnerClassFieldProcessor() { @NotNull @Override - public List process(@NotNull PsiClass psiClass) { + public List process(@NotNull PsiClass psiClass, @Nullable String nameHint) { if (psiClass.getParent() instanceof PsiClass) { PsiClass parentClass = (PsiClass) psiClass.getParent(); PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(parentClass, getSupportedAnnotationClasses()); @@ -37,12 +38,13 @@ public List process(@NotNull PsiClass psiClass) { ProblemEmptyBuilder problemBuilder = ProblemEmptyBuilder.getInstance(); if (super.validate(psiAnnotation, parentClass, problemBuilder)) { final String typeName = FieldNameConstantsHandler.getTypeName(parentClass, psiAnnotation); - if (typeName.equals(psiClass.getName())) { - if (validate(psiAnnotation, parentClass, problemBuilder)) { - List result = new ArrayList<>(); - generatePsiElements(parentClass, psiClass, psiAnnotation, result); - return result; - } + if (typeName.equals(psiClass.getName()) + && possibleToGenerateElementNamed(nameHint) + && validate(psiAnnotation, parentClass, problemBuilder)) { + + List result = new ArrayList<>(); + generatePsiElements(parentClass, psiClass, psiAnnotation, result); + return result; } } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java index 015626198..eb9079735 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java @@ -11,6 +11,7 @@ import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -38,12 +39,13 @@ public abstract class AbstractFieldProcessor extends AbstractProcessor implement @NotNull @Override - public List process(@NotNull PsiClass psiClass) { + public List process(@NotNull PsiClass psiClass, @Nullable String nameHint) { List result = new ArrayList<>(); for (PsiField psiField : PsiClassUtil.collectClassFieldsIntern(psiClass)) { PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiField, getSupportedAnnotationClasses()); if (null != psiAnnotation) { - if (validate(psiAnnotation, psiField, ProblemEmptyBuilder.getInstance())) { + if (possibleToGenerateElementNamed(nameHint) && + validate(psiAnnotation, psiField, ProblemEmptyBuilder.getInstance())) { generatePsiElements(psiField, psiAnnotation, result); } } @@ -51,8 +53,18 @@ public List process(@NotNull PsiClass psiClass) { return result; } - @Override + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { + if (null == nameHint) { + return true; + } + + //TODO: implement handling + + return true; + } + @NotNull + @Override public Collection collectProcessedAnnotations(@NotNull PsiClass psiClass) { List result = new ArrayList<>(); for (PsiField psiField : PsiClassUtil.collectClassFieldsIntern(psiClass)) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java index 956c9aee6..eda33f4ea 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java @@ -13,6 +13,7 @@ import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -39,12 +40,13 @@ public abstract class AbstractMethodProcessor extends AbstractProcessor implemen @NotNull @Override - public List process(@NotNull PsiClass psiClass) { + public List process(@NotNull PsiClass psiClass, @Nullable String nameHint) { List result = new ArrayList<>(); for (PsiMethod psiMethod : PsiClassUtil.collectClassMethodsIntern(psiClass)) { PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiMethod, getSupportedAnnotationClasses()); if (null != psiAnnotation) { - if (validate(psiAnnotation, psiMethod, ProblemEmptyBuilder.getInstance())) { + if (possibleToGenerateElementNamed(nameHint) && + validate(psiAnnotation, psiMethod, ProblemEmptyBuilder.getInstance())) { processIntern(psiMethod, psiAnnotation, result); } } @@ -52,8 +54,18 @@ public List process(@NotNull PsiClass psiClass) { return result; } - @Override + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { + if (null == nameHint) { + return true; + } + + //TODO: implement handling + + return true; + } + @NotNull + @Override public Collection collectProcessedAnnotations(@NotNull PsiClass psiClass) { List result = new ArrayList<>(); for (PsiMethod psiMethod : PsiClassUtil.collectClassMethodsIntern(psiClass)) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java index 4d5b7e37b..5fb464bab 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java @@ -2,15 +2,9 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.ModificationTracker; -import com.intellij.openapi.util.RecursionGuard; -import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.*; import com.intellij.psi.augment.PsiAugmentProvider; import com.intellij.psi.impl.source.PsiExtensibleClass; -import com.intellij.psi.util.CachedValueProvider; -import com.intellij.psi.util.CachedValuesManager; import de.plushnikov.intellij.plugin.activity.LombokProjectValidatorActivity; import de.plushnikov.intellij.plugin.processor.LombokProcessorManager; import de.plushnikov.intellij.plugin.processor.Processor; @@ -20,7 +14,6 @@ import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.atomic.AtomicLong; /** * Provides support for lombok generated elements @@ -33,17 +26,6 @@ public class LombokAugmentProvider extends PsiAugmentProvider { private final ValProcessor valProcessor; private final Collection modifierProcessors; - private final AtomicLong configChangeCount = new AtomicLong(); - private final ModificationTracker configChangeTracker = configChangeCount::get; - - public static void onConfigChange() { - for (PsiAugmentProvider provider : EP_NAME.getExtensionList()) { - if (provider instanceof LombokAugmentProvider) { - ((LombokAugmentProvider) provider).configChangeCount.incrementAndGet(); - } - } - } - public LombokAugmentProvider() { log.debug("LombokAugmentProvider created"); @@ -83,7 +65,9 @@ protected PsiType inferType(@NotNull PsiTypeElement typeElement) { @NotNull @Override - public List getAugments(@NotNull PsiElement element, @NotNull final Class type) { + public List getAugments(@NotNull PsiElement element, + @NotNull final Class type, + @Nullable String nameHint) { final List emptyResult = Collections.emptyList(); if ((type != PsiClass.class && type != PsiField.class && type != PsiMethod.class) || !(element instanceof PsiExtensibleClass)) { return emptyResult; @@ -99,76 +83,22 @@ public List getAugments(@NotNull PsiElement elemen return emptyResult; } - final List cachedValue; - if (type == PsiField.class) { - cachedValue = CachedValuesManager.getCachedValue(element, new FieldLombokCachedValueProvider<>(type, psiClass, configChangeTracker)); - } else if (type == PsiMethod.class) { - cachedValue = CachedValuesManager.getCachedValue(element, new MethodLombokCachedValueProvider<>(type, psiClass, configChangeTracker)); - } else { - cachedValue = CachedValuesManager.getCachedValue(element, new ClassLombokCachedValueProvider<>(type, psiClass, configChangeTracker)); - } - return null != cachedValue ? cachedValue : emptyResult; - } + // All invoker of AugmentProvider already make caching + // and we want to try to skip recursive calls completely - private static class FieldLombokCachedValueProvider extends LombokCachedValueProvider { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("lombok.augment.field"); - - FieldLombokCachedValueProvider(Class type, PsiClass psiClass, ModificationTracker configChangeTracker) { - super(type, psiClass, ourGuard, configChangeTracker); - } - } - - private static class MethodLombokCachedValueProvider extends LombokCachedValueProvider { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("lombok.augment.method"); - - MethodLombokCachedValueProvider(Class type, PsiClass psiClass, ModificationTracker configChangeTracker) { - super(type, psiClass, ourGuard, configChangeTracker); - } - } - - private static class ClassLombokCachedValueProvider extends LombokCachedValueProvider { - private static final RecursionGuard ourGuard = RecursionManager.createGuard("lombok.augment.class"); - - ClassLombokCachedValueProvider(Class type, PsiClass psiClass, ModificationTracker configChangeTracker) { - super(type, psiClass, ourGuard, configChangeTracker); - } - } - - private abstract static class LombokCachedValueProvider implements CachedValueProvider> { - private final Class type; - private final PsiClass psiClass; - private final RecursionGuard recursionGuard; - private final ModificationTracker configChangeTracker; - - LombokCachedValueProvider(Class type, PsiClass psiClass, RecursionGuard recursionGuard, ModificationTracker configChangeTracker) { - this.type = type; - this.psiClass = psiClass; - this.recursionGuard = recursionGuard; - this.configChangeTracker = configChangeTracker; - } - - @Nullable - @Override - public Result> compute() { -// return computeIntern(); - return recursionGuard.doPreventingRecursion(psiClass, true, this::computeIntern); - } - - private Result> computeIntern() { -// final String message = String.format("Process call for type: %s class: %s", type.getSimpleName(), psiClass.getQualifiedName()); +/// final String message = String.format("Process call for type: %s class: %s", type.getSimpleName(), psiClass.getQualifiedName()); // log.info(">>>" + message); - final List result = getPsis(psiClass, type); + final List result = getPsis(psiClass, type, nameHint); // log.info("<<<" + message); - return Result.create(result, psiClass, configChangeTracker); - } + return result; } @NotNull - private static List getPsis(PsiClass psiClass, Class type) { + private static List getPsis(PsiClass psiClass, Class type, String nameHint) { final List result = new ArrayList<>(); final Collection lombokProcessors = LombokProcessorProvider.getInstance(psiClass.getProject()).getLombokProcessors(type); for (Processor processor : lombokProcessors) { - final List generatedElements = processor.process(psiClass); + final List generatedElements = processor.process(psiClass, nameHint); for (Object psiElement : generatedElements) { result.add((Psi) psiElement); } From 254d10c4907c4f9962c79fdb74da976543e55f0c Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 3 Oct 2020 23:46:31 +0200 Subject: [PATCH 05/47] Next steps to implement nameHint handling: - removed disableMissedCacheAssertions - implemented first possibleToGenerateElementNamed for generation of InnerBuilderClasses for @Builder on methods - fixed/improved annotationAttributeValue handling by checking first for presence of attribute TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../method/AbstractMethodProcessor.java | 7 +++---- .../method/BuilderClassMethodProcessor.java | 20 +++++++++++++++++-- .../plugin/util/LombokProcessorUtil.java | 2 +- .../plugin/util/PsiAnnotationUtil.java | 9 +++++++-- .../intellij/plugin/processor/ValTest.java | 9 --------- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java index eda33f4ea..8a5f2eaf1 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java @@ -45,7 +45,7 @@ public List process(@NotNull PsiClass psiClass, @Nullable St for (PsiMethod psiMethod : PsiClassUtil.collectClassMethodsIntern(psiClass)) { PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiMethod, getSupportedAnnotationClasses()); if (null != psiAnnotation) { - if (possibleToGenerateElementNamed(nameHint) && + if (possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation, psiMethod) && validate(psiAnnotation, psiMethod, ProblemEmptyBuilder.getInstance())) { processIntern(psiMethod, psiAnnotation, result); } @@ -54,13 +54,12 @@ public List process(@NotNull PsiClass psiClass, @Nullable St return result; } - protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @NotNull PsiClass psiClass, + @NotNull PsiAnnotation psiAnnotation, @NotNull PsiMethod psiMethod) { if (null == nameHint) { return true; } - //TODO: implement handling - return true; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderClassMethodProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderClassMethodProcessor.java index 645f9c46d..e87f0568d 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderClassMethodProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderClassMethodProcessor.java @@ -11,8 +11,10 @@ import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Objects; /** * Inspect and validate @Builder lombok annotation on a method @@ -27,17 +29,31 @@ public BuilderClassMethodProcessor() { super(PsiClass.class, LombokClassNames.BUILDER); } + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @NotNull PsiClass psiClass, + @NotNull PsiAnnotation psiAnnotation, @NotNull PsiMethod psiMethod) { + if (null == nameHint) { + return true; + } + + final String innerBuilderClassName = getHandler().getBuilderClassName(psiClass, psiAnnotation, psiMethod); + return Objects.equals(nameHint, innerBuilderClassName); + } + @Override protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiMethod psiMethod, @NotNull ProblemBuilder builder) { - return ApplicationManager.getApplication().getService(BuilderHandler.class).validate(psiMethod, psiAnnotation, builder); + return getHandler().validate(psiMethod, psiAnnotation, builder); } @Override protected void processIntern(@NotNull PsiMethod psiMethod, @NotNull PsiAnnotation psiAnnotation, @NotNull List target) { final PsiClass psiClass = psiMethod.getContainingClass(); if (null != psiClass) { - final BuilderHandler builderHandler = ApplicationManager.getApplication().getService(BuilderHandler.class); + final BuilderHandler builderHandler = getHandler(); builderHandler.createBuilderClassIfNotExist(psiClass, psiMethod, psiAnnotation).ifPresent(target::add); } } + + private BuilderHandler getHandler() { + return ApplicationManager.getApplication().getService(BuilderHandler.class); + } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java index 185a32d15..aa5706080 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java @@ -68,7 +68,7 @@ public static boolean isLevelVisible(@NotNull PsiAnnotation psiAnnotation) { } public static Collection getOnX(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameterName) { - PsiAnnotationMemberValue onXValue = psiAnnotation.findAttributeValue(parameterName); + PsiAnnotationMemberValue onXValue = psiAnnotation.hasAttribute(parameterName) ? psiAnnotation.findAttributeValue(parameterName) : null; if (!(onXValue instanceof PsiAnnotation)) { return Collections.emptyList(); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java index 5f2ff6ea0..973d6f8fa 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java @@ -62,16 +62,21 @@ public static boolean hasDeclaredProperty(@NotNull PsiAnnotation psiAnnotation, } public static boolean getBooleanAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter, boolean defaultValue) { - PsiAnnotationMemberValue attrValue = psiAnnotation.findAttributeValue(parameter); + PsiAnnotationMemberValue attrValue = getAnnotationAttribute(psiAnnotation, parameter); final Boolean result = null != attrValue ? resolveElementValue(attrValue, Boolean.class) : null; return result == null ? defaultValue : result; } public static String getStringAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - PsiAnnotationMemberValue attrValue = psiAnnotation.findAttributeValue(parameter); + PsiAnnotationMemberValue attrValue = getAnnotationAttribute(psiAnnotation, parameter); return null != attrValue ? resolveElementValue(attrValue, String.class) : null; } + @Nullable + private static PsiAnnotationMemberValue getAnnotationAttribute(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { + return psiAnnotation.hasAttribute(parameter) ? psiAnnotation.findAttributeValue(parameter) : null; + } + @Nullable private static T resolveElementValue(@NotNull PsiElement psiElement, @NotNull Class asClass) { T value = null; diff --git a/src/test/java/de/plushnikov/intellij/plugin/processor/ValTest.java b/src/test/java/de/plushnikov/intellij/plugin/processor/ValTest.java index 0b6ea46f5..7b4a9d99e 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/processor/ValTest.java +++ b/src/test/java/de/plushnikov/intellij/plugin/processor/ValTest.java @@ -1,20 +1,11 @@ package de.plushnikov.intellij.plugin.processor; -import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import de.plushnikov.intellij.plugin.AbstractLombokLightCodeInsightTestCase; public class ValTest extends AbstractLombokLightCodeInsightTestCase { - @Override - public void setUp() throws Exception { - super.setUp(); - - //TODO disable assertions for the moment - RecursionManager.disableMissedCacheAssertions(myFixture.getProjectDisposable()); - } - public void testSimpleInt() { configureClass("100"); verifyLocalVariableType("int"); From 02cc19a63ddc2b624c94a18862fb01a734ad8752 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 3 Oct 2020 23:58:21 +0200 Subject: [PATCH 06/47] Next steps to implement nameHint handling: - fixed Cleanup annotation handling TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests - provide defaultValues explicitly for all of lombok annotations --- .../intellij/plugin/processor/CleanupProcessor.java | 2 +- .../plushnikov/intellij/plugin/util/PsiAnnotationUtil.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/CleanupProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/CleanupProcessor.java index c9e70b19b..d371d7638 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/CleanupProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/CleanupProcessor.java @@ -38,7 +38,7 @@ public Collection verifyAnnotation(@NotNull PsiAnnotation psiAnno PsiLocalVariable psiVariable = PsiTreeUtil.getParentOfType(psiAnnotation, PsiLocalVariable.class); if (null != psiVariable) { - final String cleanupName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value"); + final String cleanupName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value", "close"); if (StringUtil.isEmptyOrSpaces(cleanupName)) { problemNewBuilder.addError(LombokBundle.message("inspection.message.cleanup.value.cannot.be.empty.string")); diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java index 973d6f8fa..7e3b58862 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java @@ -67,6 +67,11 @@ public static boolean getBooleanAnnotationValue(@NotNull PsiAnnotation psiAnnota return result == null ? defaultValue : result; } + public static String getStringAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter, @NotNull String defaultValue) { + String result = getStringAnnotationValue(psiAnnotation, parameter); + return result != null ? result : defaultValue; + } + public static String getStringAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { PsiAnnotationMemberValue attrValue = getAnnotationAttribute(psiAnnotation, parameter); return null != attrValue ? resolveElementValue(attrValue, String.class) : null; From 4af99d895fd9d47f2bd3b65291f4d81c0f80f99b Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 4 Oct 2020 12:55:48 +0200 Subject: [PATCH 07/47] Next steps to implement nameHint handling: - optimize annotation value handling by using declared value and manually provided default values - droped broken getAndCacheFQN implementation TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../processor/SynchronizedProcessor.java | 2 +- .../clazz/AbstractClassProcessor.java | 5 +- .../plugin/processor/clazz/DataProcessor.java | 4 +- .../processor/clazz/ToStringProcessor.java | 4 +- .../processor/clazz/ValueProcessor.java | 2 +- ...tBuilderPreDefinedInnerClassProcessor.java | 13 +---- ...rBuilderPreDefinedInnerClassProcessor.java | 4 +- .../clazz/builder/BuilderClassProcessor.java | 12 +++++ .../AbstractConstructorClassProcessor.java | 2 +- ...ntsPredefinedInnerClassFieldProcessor.java | 2 +- .../clazz/log/AbstractLogProcessor.java | 2 +- .../clazz/log/CustomLogProcessor.java | 2 +- .../field/AbstractFieldProcessor.java | 8 +-- .../FieldNameConstantsFieldProcessor.java | 15 +++++- .../processor/handler/BuilderHandler.java | 11 ++-- .../plugin/processor/handler/BuilderInfo.java | 4 +- .../EqualsAndHashCodeToStringHandler.java | 14 ++--- .../handler/FieldNameConstantsHandler.java | 5 +- .../singular/AbstractSingularHandler.java | 4 +- .../singular/SingularHandlerFactory.java | 20 +++++--- .../plugin/util/LombokProcessorUtil.java | 10 ++-- .../plugin/util/PsiAnnotationSearchUtil.java | 51 +++++++++++-------- .../plugin/util/PsiAnnotationUtil.java | 34 ++++++++----- .../plugin/AbstractLombokParsingTestCase.java | 22 ++++---- 24 files changed, 142 insertions(+), 110 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/SynchronizedProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/SynchronizedProcessor.java index a12fa41b7..d81937f95 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/SynchronizedProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/SynchronizedProcessor.java @@ -45,7 +45,7 @@ public Collection verifyAnnotation(@NotNull PsiAnnotation psiAnno ); } - @NlsSafe final String lockFieldName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value"); + @NlsSafe final String lockFieldName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "value", ""); if (StringUtil.isNotEmpty(lockFieldName)) { final PsiClass containingClass = psiMethod.getContainingClass(); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index 4d51dcd9c..c8505e418 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -50,7 +50,7 @@ public List process(@NotNull PsiClass psiClass, @Nullable St PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiClass, getSupportedAnnotationClasses()); if (null != psiAnnotation && supportAnnotationVariant(psiAnnotation) - && possibleToGenerateElementNamed(nameHint) + && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation) && validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance())) { result = new ArrayList<>(); @@ -59,7 +59,8 @@ && validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance())) { return result; } - protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @NotNull PsiClass psiClass, + @NotNull PsiAnnotation psiAnnotation) { if (null == nameHint) { return true; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/DataProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/DataProcessor.java index b131b6a10..a01bdff7a 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/DataProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/DataProcessor.java @@ -58,7 +58,7 @@ protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiCla getEqualsAndHashCodeProcessor().validateCallSuperParamExtern(psiAnnotation, psiClass, builder); } - final String staticName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticConstructor"); + final String staticName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticConstructor", ""); if (shouldGenerateRequiredArgsConstructor(psiClass, staticName)) { getRequiredArgsConstructorProcessor().validateBaseClassConstructor(psiClass, builder); } @@ -93,7 +93,7 @@ protected void generatePsiElements(@NotNull PsiClass psiClass, } final boolean hasConstructorWithoutParamaters; - final String staticName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticConstructor"); + final String staticName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticConstructor", ""); if (shouldGenerateRequiredArgsConstructor(psiClass, staticName)) { target.addAll( getRequiredArgsConstructorProcessor().createRequiredArgsConstructor(psiClass, PsiModifier.PUBLIC, psiAnnotation, staticName, true)); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/ToStringProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/ToStringProcessor.java index 25f9fb880..cbed4ddb0 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/ToStringProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/ToStringProcessor.java @@ -144,8 +144,8 @@ private String createParamString(@NotNull PsiClass psiClass, @NotNull Collection paramString.append("super=\" + super.toString() + \", "); } + final EqualsAndHashCodeToStringHandler handler = getEqualsAndHashCodeToStringHandler(); for (MemberInfo memberInfo : memberInfos) { - if (includeFieldNames) { paramString.append(memberInfo.getName()).append('='); } @@ -161,7 +161,7 @@ private String createParamString(@NotNull PsiClass psiClass, @NotNull Collection } } - final String memberAccessor = getEqualsAndHashCodeToStringHandler().getMemberAccessorName(memberInfo, doNotUseGetters, psiClass); + final String memberAccessor = handler.getMemberAccessorName(memberInfo, doNotUseGetters, psiClass); paramString.append("this.").append(memberAccessor); if (classFieldType instanceof PsiArrayType) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/ValueProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/ValueProcessor.java index c67acb45e..dc8d12828 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/ValueProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/ValueProcessor.java @@ -82,7 +82,7 @@ protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnot final Collection definedConstructors = PsiClassUtil.collectClassConstructorIntern(psiClass); filterToleratedElements(definedConstructors); - final String staticName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticConstructor"); + final String staticName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticConstructor", ""); final Collection requiredFields = getAllArgsConstructorProcessor().getAllFields(psiClass); if (getAllArgsConstructorProcessor().validateIsConstructorNotDefined(psiClass, staticName, requiredFields, ProblemEmptyBuilder.getInstance())) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java index 55b71e904..1f5527a4c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java @@ -62,22 +62,13 @@ private List processAnnotation(@NotNull PsiClass psiParentCl List result = new ArrayList<>(); // apply only to inner BuilderClass - if (builderClassName.equals(psiClass.getName()) && possibleToGenerateElementNamed(nameHint)) { + if (builderClassName.equals(psiClass.getName()) + && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation)) { result.addAll(generatePsiElements(psiParentClass, psiParentMethod, psiAnnotation, psiClass)); } return result; } - protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { - if (null == nameHint) { - return true; - } - - //TODO: implement handling - - return true; - } - protected abstract BuilderHandler getBuilderHandler(); protected abstract Collection generatePsiElements(@NotNull PsiClass psiParentClass, @Nullable PsiMethod psiParentMethod, @NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiBuilderClass); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java index b9e50b1f2..119de8a5f 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java @@ -49,12 +49,12 @@ private List processAnnotation(@NotNull PsiClass psiParentCl List result = new ArrayList<>(); // apply only to inner BuilderClass final String psiClassName = psiClass.getName(); - if (builderBaseClassName.equals(psiClassName) && possibleToGenerateElementNamed(nameHint)) { + if (builderBaseClassName.equals(psiClassName) && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation)) { result.addAll(generatePsiElementsOfBaseBuilderClass(psiParentClass, psiAnnotation, psiClass)); } else { // use parent class as source! final String builderImplClassName = builderHandler.getBuilderImplClassName(psiParentClass); - if (builderImplClassName.equals(psiClassName) && possibleToGenerateElementNamed(nameHint)) { + if (builderImplClassName.equals(psiClassName) && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation)) { result.addAll(generatePsiElementsOfImplBuilderClass(psiParentClass, psiAnnotation, psiClass)); } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderClassProcessor.java index 73f3fbdea..eb27b7b19 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderClassProcessor.java @@ -11,8 +11,10 @@ import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Objects; /** * Inspect and validate @Builder lombok annotation on a class @@ -31,6 +33,16 @@ private BuilderHandler getBuilderHandler() { return ApplicationManager.getApplication().getService(BuilderHandler.class); } + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @NotNull PsiClass psiClass, + @NotNull PsiAnnotation psiAnnotation) { + if (null == nameHint) { + return true; + } + + final String innerBuilderClassName = getBuilderHandler().getBuilderClassName(psiClass, psiAnnotation, null); + return Objects.equals(nameHint, innerBuilderClassName); + } + @Override protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass, @NotNull ProblemBuilder builder) { return getBuilderHandler().validate(psiClass, psiAnnotation, builder); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/constructor/AbstractConstructorClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/constructor/AbstractConstructorClassProcessor.java index c1326ba07..6458bf7f0 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/constructor/AbstractConstructorClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/constructor/AbstractConstructorClassProcessor.java @@ -222,7 +222,7 @@ protected Collection createConstructorMethod(@NotNull PsiClass psiCla } protected String getStaticConstructorName(@NotNull PsiAnnotation psiAnnotation) { - return PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticName"); + return PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "staticName", ""); } private boolean isStaticConstructor(@Nullable String staticName) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsPredefinedInnerClassFieldProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsPredefinedInnerClassFieldProcessor.java index ec6e0f78c..021678d7a 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsPredefinedInnerClassFieldProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsPredefinedInnerClassFieldProcessor.java @@ -39,7 +39,7 @@ public List process(@NotNull PsiClass psiClass, @Nullable St if (super.validate(psiAnnotation, parentClass, problemBuilder)) { final String typeName = FieldNameConstantsHandler.getTypeName(parentClass, psiAnnotation); if (typeName.equals(psiClass.getName()) - && possibleToGenerateElementNamed(nameHint) + && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation) && validate(psiAnnotation, parentClass, problemBuilder)) { List result = new ArrayList<>(); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/AbstractLogProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/AbstractLogProcessor.java index bd8bdf57e..10a8a613e 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/AbstractLogProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/AbstractLogProcessor.java @@ -132,7 +132,7 @@ private LombokLightFieldBuilder createLoggerField(@NotNull PsiClass psiClass, @N @NotNull private String createLoggerInitializeParameters(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation) { final StringBuilder parametersBuilder = new StringBuilder(); - final String topic = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "topic"); + final String topic = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "topic", ""); final boolean topicPresent = !StringUtil.isEmptyOrSpaces(topic); final List loggerInitializerParameters = getLoggerInitializerParameters(psiClass, topicPresent); for (LoggerInitializerParameter loggerInitializerParameter : loggerInitializerParameters) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/CustomLogProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/CustomLogProcessor.java index f484d3dd0..7cffa83c2 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/CustomLogProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/log/CustomLogProcessor.java @@ -72,7 +72,7 @@ protected boolean validate( builder.addError(LombokBundle.message("inspection.message.custom.log.not.configured.correctly")); return false; } - final String topic = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "topic"); + final String topic = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "topic", ""); final boolean topicPresent = !StringUtil.isEmptyOrSpaces(topic); if (topicPresent) { if (!declaration.hasWithTopic()) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java index eb9079735..c479985b5 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java @@ -44,8 +44,9 @@ public List process(@NotNull PsiClass psiClass, @Nullable St for (PsiField psiField : PsiClassUtil.collectClassFieldsIntern(psiClass)) { PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiField, getSupportedAnnotationClasses()); if (null != psiAnnotation) { - if (possibleToGenerateElementNamed(nameHint) && - validate(psiAnnotation, psiField, ProblemEmptyBuilder.getInstance())) { + if (possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation, psiField) + && validate(psiAnnotation, psiField, ProblemEmptyBuilder.getInstance())) { + generatePsiElements(psiField, psiAnnotation, result); } } @@ -53,7 +54,8 @@ public List process(@NotNull PsiClass psiClass, @Nullable St return result; } - protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @NotNull PsiClass psiClass, + @NotNull PsiAnnotation psiAnnotation, @NotNull PsiField psiField) { if (null == nameHint) { return true; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/field/FieldNameConstantsFieldProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/field/FieldNameConstantsFieldProcessor.java index ddc662796..b49abc400 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/field/FieldNameConstantsFieldProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/field/FieldNameConstantsFieldProcessor.java @@ -13,8 +13,10 @@ import de.plushnikov.intellij.plugin.util.LombokProcessorUtil; import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Objects; /** * Inspect and validate @FieldNameConstants lombok annotation on a field @@ -37,6 +39,15 @@ protected boolean supportAnnotationVariant(@NotNull PsiAnnotation psiAnnotation) return null != psiAnnotation.findAttributeValue("prefix"); } + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @NotNull PsiClass psiClass, + @NotNull PsiAnnotation psiAnnotation, @NotNull PsiField psiField) { + if (null == nameHint) { + return true; + } + final String generatedElementName = calcFieldConstantName(psiField, psiAnnotation, psiClass); + return Objects.equals(nameHint, generatedElementName); + } + @Override protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiField psiField, @NotNull ProblemBuilder builder) { return LombokProcessorUtil.isLevelVisible(psiAnnotation) && checkIfFieldNameIsValidAndWarn(psiAnnotation, psiField, builder); @@ -92,8 +103,8 @@ public PsiField createFieldNameConstant(@NotNull PsiField psiField, @NotNull Psi @NotNull private String calcFieldConstantName(@NotNull PsiField psiField, @NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass) { - String prefix = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "prefix"); - String suffix = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "suffix"); + String prefix = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "prefix", CONFIG_DEFAULT); + String suffix = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, "suffix", CONFIG_DEFAULT); final ConfigDiscovery configDiscovery = ConfigDiscovery.getInstance(); if (CONFIG_DEFAULT.equals(prefix)) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java index 3b7c19210..3d5e63e1c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java @@ -6,6 +6,7 @@ import com.intellij.psi.*; import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.LombokClassNames; +import com.intellij.psi.impl.source.PsiClassReferenceType; import de.plushnikov.intellij.plugin.lombokconfig.ConfigDiscovery; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; import de.plushnikov.intellij.plugin.processor.clazz.ToStringProcessor; @@ -139,7 +140,7 @@ private boolean validateSingular(Collection builderInfos, @NotNull builderInfos.stream().filter(BuilderInfo::hasSingularAnnotation).forEach(builderInfo -> { final PsiType psiVariableType = builderInfo.getVariable().getType(); - final String qualifiedName = PsiTypeUtil.getQualifiedName(psiVariableType); + final String qualifiedName = ((PsiClassReferenceType) psiVariableType).getClassName();//PsiTypeUtil.getQualifiedName(psiVariableType); if (SingularHandlerFactory.isInvalidSingularType(qualifiedName)) { problemBuilder.addError(LombokBundle.message("inspection.message.lombok.does.not.know"), qualifiedName != null ? qualifiedName : psiVariableType.getCanonicalText()); result.set(false); @@ -218,19 +219,19 @@ PsiType getReturnTypeOfBuildMethod(@NotNull PsiClass psiClass, @Nullable PsiMeth @NotNull public String getBuildMethodName(@NotNull PsiAnnotation psiAnnotation) { - final String buildMethodName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILD_METHOD_NAME); + final String buildMethodName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILD_METHOD_NAME, BUILD_METHOD_NAME); return StringUtil.isEmptyOrSpaces(buildMethodName) ? BUILD_METHOD_NAME : buildMethodName; } @NotNull String getBuilderMethodName(@NotNull PsiAnnotation psiAnnotation) { - final String builderMethodName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_METHOD_NAME); + final String builderMethodName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_METHOD_NAME, BUILDER_METHOD_NAME); return null == builderMethodName ? BUILDER_METHOD_NAME : builderMethodName; } @NotNull private String getSetterPrefix(@NotNull PsiAnnotation psiAnnotation) { - final String setterPrefix = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_SETTER_PREFIX); + final String setterPrefix = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_SETTER_PREFIX, ""); return null == setterPrefix ? "" : setterPrefix; } @@ -255,7 +256,7 @@ private String getBuilderClassName(@NotNull PsiClass psiClass, @NotNull PsiAnnot @NotNull public String getBuilderClassName(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @Nullable PsiMethod psiMethod) { - final String builderClassName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_CLASS_NAME); + final String builderClassName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_CLASS_NAME, ""); if (!StringUtil.isEmptyOrSpaces(builderClassName)) { return builderClassName; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderInfo.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderInfo.java index 4b0b62254..c542819ee 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderInfo.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderInfo.java @@ -127,8 +127,8 @@ public BuilderInfo withBuilderChainResult(@NotNull String builderChainResult) { public BuilderInfo withObtainVia() { obtainViaAnnotation = PsiAnnotationSearchUtil.findAnnotation(variableInClass, BUILDER_OBTAIN_VIA_ANNOTATION); if (null != obtainViaAnnotation) { - viaFieldName = PsiAnnotationUtil.getStringAnnotationValue(obtainViaAnnotation, BUILDER_OBTAIN_VIA_FIELD); - viaMethodName = PsiAnnotationUtil.getStringAnnotationValue(obtainViaAnnotation, BUILDER_OBTAIN_VIA_METHOD); + viaFieldName = PsiAnnotationUtil.getStringAnnotationValue(obtainViaAnnotation, BUILDER_OBTAIN_VIA_FIELD, ""); + viaMethodName = PsiAnnotationUtil.getStringAnnotationValue(obtainViaAnnotation, BUILDER_OBTAIN_VIA_METHOD, ""); viaStaticCall = PsiAnnotationUtil.getBooleanAnnotationValue(obtainViaAnnotation, BUILDER_OBTAIN_VIA_STATIC, false); } return this; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/EqualsAndHashCodeToStringHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/EqualsAndHashCodeToStringHandler.java index e521a9f04..f6c29aaee 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/EqualsAndHashCodeToStringHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/EqualsAndHashCodeToStringHandler.java @@ -80,7 +80,8 @@ public int compareTo(@NotNull MemberInfo other) { } } - public Collection filterFields(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, boolean filterTransient, String includeAnnotationProperty) { + public Collection filterFields(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, + boolean filterTransient, String includeAnnotationProperty) { final boolean explicitOf = PsiAnnotationUtil.hasDeclaredProperty(psiAnnotation, "of"); final boolean onlyExplicitlyIncluded = PsiAnnotationUtil.getBooleanAnnotationValue(psiAnnotation, "onlyExplicitlyIncluded", false); @@ -144,7 +145,7 @@ public Collection filterFields(@NotNull PsiClass psiClass, @NotNull } result.add(new MemberInfo(psiField, fieldName, true)); } else { - final String includeNameValue = PsiAnnotationUtil.getStringAnnotationValue(includeAnnotation, includeAnnotationProperty); + final String includeNameValue = PsiAnnotationUtil.getStringAnnotationValue(includeAnnotation, includeAnnotationProperty, ""); final String newMemberName; if (StringUtil.isEmptyOrSpaces(includeNameValue)) { newMemberName = psiMember.getName(); @@ -176,14 +177,7 @@ public Collection filterFields(@NotNull PsiClass psiClass, @NotNull } private int calcMemberRank(@NotNull PsiAnnotation includeAnnotation) { - final String includeRankValue = PsiAnnotationUtil.getStringAnnotationValue(includeAnnotation, TO_STRING_RANK_ANNOTATION_PARAMETER); - if (!StringUtil.isEmptyOrSpaces(includeRankValue)) { - try { - return Integer.parseInt(includeRankValue); - } catch (NumberFormatException ignore) { - } - } - return 0; + return PsiAnnotationUtil.getIntAnnotationValue(includeAnnotation, TO_STRING_RANK_ANNOTATION_PARAMETER, 0); } public String getMemberAccessorName(@NotNull MemberInfo memberInfo, boolean doNotUseGetters, @NotNull PsiClass psiClass) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/FieldNameConstantsHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/FieldNameConstantsHandler.java index bac2d9fe3..6a5d261a9 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/FieldNameConstantsHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/FieldNameConstantsHandler.java @@ -1,5 +1,6 @@ package de.plushnikov.intellij.plugin.processor.handler; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import de.plushnikov.intellij.plugin.lombokconfig.ConfigDiscovery; @@ -24,8 +25,8 @@ public final class FieldNameConstantsHandler { public static String getTypeName(@NotNull PsiClass containingClass, @NotNull PsiAnnotation fieldNameConstants) { - String typeName = PsiAnnotationUtil.getStringAnnotationValue(fieldNameConstants, "innerTypeName"); - if (typeName == null || typeName.equals("")) { + String typeName = PsiAnnotationUtil.getStringAnnotationValue(fieldNameConstants, "innerTypeName", ""); + if (StringUtil.isEmptyOrSpaces(typeName)) { final ConfigDiscovery configDiscovery = ConfigDiscovery.getInstance(); typeName = configDiscovery.getStringLombokConfigProperty(ConfigKey.FIELD_NAME_CONSTANTS_TYPENAME, containingClass); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/AbstractSingularHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/AbstractSingularHandler.java index 748daac2c..52df79703 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/AbstractSingularHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/AbstractSingularHandler.java @@ -125,7 +125,7 @@ public String renderToBuilderCall(@NotNull BuilderInfo info) { @Override public String createSingularName(@NotNull PsiAnnotation singularAnnotation, String psiFieldName) { - String singularName = PsiAnnotationUtil.getStringAnnotationValue(singularAnnotation, "value"); + String singularName = PsiAnnotationUtil.getStringAnnotationValue(singularAnnotation, "value", ""); if (StringUtil.isEmptyOrSpaces(singularName)) { singularName = Singulars.autoSingularize(psiFieldName); if (singularName == null) { @@ -136,7 +136,7 @@ public String createSingularName(@NotNull PsiAnnotation singularAnnotation, Stri } public static boolean validateSingularName(PsiAnnotation singularAnnotation, String psiFieldName) { - String singularName = PsiAnnotationUtil.getStringAnnotationValue(singularAnnotation, "value"); + String singularName = PsiAnnotationUtil.getStringAnnotationValue(singularAnnotation, "value", ""); if (StringUtil.isEmptyOrSpaces(singularName)) { singularName = Singulars.autoSingularize(psiFieldName); return singularName != null; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java index 06a151491..570409daf 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java @@ -4,7 +4,7 @@ import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiType; import com.intellij.psi.PsiVariable; -import de.plushnikov.intellij.plugin.util.PsiTypeUtil; +import com.intellij.psi.impl.source.PsiClassReferenceType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,7 +53,11 @@ private static Set toSet(String... from) { } public static boolean isInvalidSingularType(@Nullable String qualifiedName) { - return qualifiedName == null || !VALID_SINGULAR_TYPES.contains(qualifiedName); + return qualifiedName == null || !containsOrAnyEndsWith(VALID_SINGULAR_TYPES, qualifiedName); + } + + private static boolean containsOrAnyEndsWith(@NotNull Set elements, @NotNull String className) { + return elements.contains(className) || elements.stream().anyMatch(t -> t.endsWith("." + className)); } @NotNull @@ -63,21 +67,21 @@ public static BuilderElementHandler getHandlerFor(@NotNull PsiVariable psiVariab } final PsiType psiType = psiVariable.getType(); - final String qualifiedName = PsiTypeUtil.getQualifiedName(psiType); + final String qualifiedName = ((PsiClassReferenceType) psiType).getClassName();//PsiTypeUtil.getQualifiedName(psiType); if (!isInvalidSingularType(qualifiedName)) { - if (COLLECTION_TYPES.contains(qualifiedName)) { + if (containsOrAnyEndsWith(COLLECTION_TYPES, qualifiedName)) { return new SingularCollectionHandler(qualifiedName); } - if (MAP_TYPES.contains(qualifiedName)) { + if (containsOrAnyEndsWith(MAP_TYPES, qualifiedName)) { return new SingularMapHandler(qualifiedName); } - if (GUAVA_COLLECTION_TYPES.contains(qualifiedName)) { + if (containsOrAnyEndsWith(GUAVA_COLLECTION_TYPES, qualifiedName)) { return new SingularGuavaCollectionHandler(qualifiedName, qualifiedName.contains("Sorted")); } - if (GUAVA_MAP_TYPES.contains(qualifiedName)) { + if (containsOrAnyEndsWith(GUAVA_MAP_TYPES, qualifiedName)) { return new SingularGuavaMapHandler(qualifiedName, qualifiedName.contains("Sorted")); } - if (GUAVA_TABLE_TYPES.contains(qualifiedName)) { + if (containsOrAnyEndsWith(GUAVA_TABLE_TYPES, qualifiedName)) { return new SingularGuavaTableHandler(qualifiedName, false); } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java index aa5706080..7038f461c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java @@ -54,13 +54,13 @@ public static String getLevelVisibility(@NotNull PsiAnnotation psiAnnotation) { @Nullable @PsiModifier.ModifierConstant private static String getLevelVisibility(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, parameter)); + return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, AccessLevel.PUBLIC)); } - @Nullable - public static String getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - final String annotationValue = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, parameter); - return annotationValue == null ? null : VALUE_ACCESS_LEVEL_MAP.get(annotationValue); + @NotNull + public static AccessLevel getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { + final String annotationValue = PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, AccessLevel.NONE); + return VALUE_ACCESS_LEVEL_MAP.computeIfAbsent(annotationValue, p -> AccessLevel.NONE); } public static boolean isLevelVisible(@NotNull PsiAnnotation psiAnnotation) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java index 4f4a7561e..7d829e9e7 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin.util; -import com.intellij.openapi.util.Key; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.SourceJavaCodeReference; @@ -11,19 +10,39 @@ import java.util.Collection; import java.util.regex.Pattern; -public final class PsiAnnotationSearchUtil { - private static final Key LOMBOK_ANNOTATION_FQN_KEY = Key.create("LOMBOK_ANNOTATION_FQN"); +public class PsiAnnotationSearchUtil { @Nullable public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationFQN) { +// return AnnotationUtil.findAnnotation(psiModifierListOwner, annotationFQN); return findAnnotationQuick(psiModifierListOwner.getModifierList(), annotationFQN); } @Nullable public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String... annotationFQNs) { +// return AnnotationUtil.findAnnotation(psiModifierListOwner, annotationFQNs); return findAnnotationQuick(psiModifierListOwner.getModifierList(), annotationFQNs); } + @Nullable + public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class annotationType) { +// return AnnotationUtil.findAnnotation(psiModifierListOwner, annotationType.getName()); + return findAnnotationQuick(psiModifierListOwner.getModifierList(), annotationType.getName()); + } + + @Nullable + public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class... annotationTypes) { + if (annotationTypes.length == 1) { + return findAnnotation(psiModifierListOwner, annotationTypes[0]); + } + + final String[] qualifiedNames = new String[annotationTypes.length]; + for (int i = 0; i < annotationTypes.length; i++) { + qualifiedNames[i] = annotationTypes[i].getName(); + } + return findAnnotation(psiModifierListOwner, qualifiedNames); + } + @Nullable private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner annotationOwner, @NotNull String qualifiedName) { if (annotationOwner == null) { @@ -50,8 +69,7 @@ private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner an } } - final String annotationQualifiedName = getAndCacheFQN(annotation, referenceName); - if (null != annotationQualifiedName && qualifiedName.endsWith(annotationQualifiedName)) { + if (qualifiedName.endsWith(annotation.getQualifiedName())) { return annotation; } } @@ -91,8 +109,7 @@ private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner an } } - final String annotationQualifiedName = getAndCacheFQN(annotation, referenceName); - if (ArrayUtil.find(qualifiedNames, annotationQualifiedName) > -1) { + if (ArrayUtil.find(qualifiedNames, annotation.getQualifiedName()) > -1) { return annotation; } } @@ -102,21 +119,14 @@ private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner an return null; } - @Nullable - private static String getAndCacheFQN(@NotNull PsiAnnotation annotation, @Nullable String referenceName) { - String annotationQualifiedName = annotation.getCopyableUserData(LOMBOK_ANNOTATION_FQN_KEY); - // if not cached or cache is not up to date (because existing annotation was renamed for example) - if (null == annotationQualifiedName || (null != referenceName && !annotationQualifiedName.endsWith(".".concat(referenceName)))) { - annotationQualifiedName = annotation.getQualifiedName(); - if (null != annotationQualifiedName && annotationQualifiedName.indexOf('.') > -1) { - annotation.putCopyableUserData(LOMBOK_ANNOTATION_FQN_KEY, annotationQualifiedName); - } - } - return annotationQualifiedName; + public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class annotationType) { +// return psiModifierListOwner.hasAnnotation(annotationType.getName()); + return null != findAnnotation(psiModifierListOwner, annotationType.getName()); } - public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationTypeName) { - return null != findAnnotation(psiModifierListOwner, annotationTypeName); + public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationFQN) { +// return psiModifierListOwner.hasAnnotation(annotationFQN); + return null != findAnnotation(psiModifierListOwner, annotationFQN); } public static boolean isNotAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, String annotationTypeName) { @@ -124,6 +134,7 @@ public static boolean isNotAnnotatedWith(@NotNull PsiModifierListOwner psiModifi } public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final String... annotationTypes) { + // return Arrays.stream(annotationTypes).map(Class::getName).anyMatch(psiModifierListOwner::hasAnnotation); return null != findAnnotation(psiModifierListOwner, annotationTypes); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java index 7e3b58862..aa76ba83f 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java @@ -1,5 +1,6 @@ package de.plushnikov.intellij.plugin.util; +import com.intellij.codeInsight.AnnotationUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; @@ -62,24 +63,32 @@ public static boolean hasDeclaredProperty(@NotNull PsiAnnotation psiAnnotation, } public static boolean getBooleanAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter, boolean defaultValue) { - PsiAnnotationMemberValue attrValue = getAnnotationAttribute(psiAnnotation, parameter); - final Boolean result = null != attrValue ? resolveElementValue(attrValue, Boolean.class) : null; + final Boolean result = psiAnnotation.hasAttribute(parameter) ? AnnotationUtil.getBooleanAttributeValue(psiAnnotation, parameter) : null; return result == null ? defaultValue : result; } public static String getStringAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter, @NotNull String defaultValue) { - String result = getStringAnnotationValue(psiAnnotation, parameter); + final String result = AnnotationUtil.getDeclaredStringAttributeValue(psiAnnotation, parameter); +// PsiAnnotationMemberValue attrValue = getAnnotationAttribute(psiAnnotation, parameter); +// return null != attrValue ? AnnotationUtil.getStringAttributeValue(attrValue) : null; return result != null ? result : defaultValue; } - public static String getStringAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - PsiAnnotationMemberValue attrValue = getAnnotationAttribute(psiAnnotation, parameter); - return null != attrValue ? resolveElementValue(attrValue, String.class) : null; + public static String getEnumAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String attributeName, @NotNull Enum defaultValue) { + PsiAnnotationMemberValue attrValue = psiAnnotation.findDeclaredAttributeValue(attributeName); + String result = attrValue != null ? resolveElementValue(attrValue, String.class) : null; + return result != null ? result : defaultValue.name(); + // doesn't work for definition using static import for Enum.value for example +// PsiConstantEvaluationHelper evaluationHelper = JavaPsiFacade.getInstance(psiAnnotation.getProject()).getConstantEvaluationHelper(); +// Object result = evaluationHelper.computeConstantExpression(attrValue); +// return result instanceof Enum ? ((Enum) result).name() : defaultValue.name(); } - @Nullable - private static PsiAnnotationMemberValue getAnnotationAttribute(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - return psiAnnotation.hasAttribute(parameter) ? psiAnnotation.findAttributeValue(parameter) : null; + public static int getIntAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String attributeName, int defaultValue) { + PsiAnnotationMemberValue attrValue = psiAnnotation.findDeclaredAttributeValue(attributeName); + PsiConstantEvaluationHelper evaluationHelper = JavaPsiFacade.getInstance(psiAnnotation.getProject()).getConstantEvaluationHelper(); + Object result = evaluationHelper.computeConstantExpression(attrValue); + return result instanceof Number ? ((Number) result).intValue() : defaultValue; } @Nullable @@ -128,11 +137,8 @@ private static T resolveElementValue(@NotNull PsiElement psiElement, @NotNul @Nullable public static Boolean getDeclaredBooleanAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { PsiAnnotationMemberValue attributeValue = psiAnnotation.findDeclaredAttributeValue(parameter); - Object constValue = null; - if (null != attributeValue) { - final JavaPsiFacade javaPsiFacade = JavaPsiFacade.getInstance(psiAnnotation.getProject()); - constValue = javaPsiFacade.getConstantEvaluationHelper().computeConstantExpression(attributeValue); - } + final JavaPsiFacade javaPsiFacade = JavaPsiFacade.getInstance(psiAnnotation.getProject()); + Object constValue = javaPsiFacade.getConstantEvaluationHelper().computeConstantExpression(attributeValue); return constValue instanceof Boolean ? (Boolean) constValue : null; } diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java index c6a8f5e1f..5de89c22e 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java @@ -3,7 +3,6 @@ import com.google.common.base.Objects; import com.intellij.pom.PomNamedTarget; import com.intellij.psi.*; -import com.intellij.psi.util.PsiTreeUtil; import de.plushnikov.intellij.plugin.util.PsiElementUtil; import org.apache.log4j.Logger; import org.jetbrains.annotations.NotNull; @@ -99,7 +98,7 @@ private void compareTwoClasses(PsiClass beforeClass, PsiClass afterClass) { PsiModifierList afterFieldModifierList = afterClass.getModifierList(); compareContainingClasses(beforeClass, afterClass); - compareModifiers(beforeFieldModifierList, afterFieldModifierList); + compareModifiers(beforeFieldModifierList, afterFieldModifierList, afterClass.getName()); compareFields(beforeClass, afterClass); compareMethods(beforeClass, afterClass); compareConstructors(beforeClass, afterClass); @@ -125,7 +124,7 @@ private void compareFields(PsiClass beforeClass, PsiClass afterClass) { if (Objects.equal(afterField.getName(), beforeField.getName())) { final PsiModifierList beforeFieldModifierList = beforeField.getModifierList(); - compareModifiers(beforeFieldModifierList, afterFieldModifierList); + compareModifiers(beforeFieldModifierList, afterFieldModifierList, afterField.getName()); compareType(beforeField.getType(), afterField.getType(), afterField); compareInitializers(beforeField.getInitializer(), afterField.getInitializer()); compared = true; @@ -143,8 +142,9 @@ private void compareInitializers(PsiExpression beforeInitializer, PsiExpression private void compareType(PsiType beforeType, PsiType afterType, PomNamedTarget whereTarget) { if (null != beforeType && null != afterType) { - final String afterText = stripJavaLang(afterType.getCanonicalText()); - final String beforeText = stripJavaLang(beforeType.getCanonicalText()); + //TODO fix me ? + final String afterText = stripJavaLang(afterType.toString()); + final String beforeText = stripJavaLang(beforeType.toString()); assertEquals(String.format("Types are not equal for element: %s", whereTarget.getName()), afterText, beforeText); } } @@ -157,15 +157,13 @@ private String stripJavaLang(String canonicalText) { return canonicalText; } - private void compareModifiers(PsiModifierList beforeModifierList, PsiModifierList afterModifierList) { + private void compareModifiers(PsiModifierList beforeModifierList, PsiModifierList afterModifierList, String elementName) { assertNotNull(beforeModifierList); assertNotNull(afterModifierList); for (String modifier : PsiModifier.MODIFIERS) { boolean haveSameModifiers = afterModifierList.hasModifierProperty(modifier) == beforeModifierList.hasModifierProperty(modifier); - final PsiMethod afterModifierListParentMethod = PsiTreeUtil.getParentOfType(afterModifierList, PsiMethod.class); - final PsiClass afterModifierListParentClass = PsiTreeUtil.getParentOfType(afterModifierList, PsiClass.class); - assertTrue(modifier + " Modifier is not equal for " + (null == afterModifierListParentMethod ? afterModifierListParentClass.getName() : afterModifierListParentMethod.getText()), haveSameModifiers); + assertTrue(modifier + " Modifier is not equal for " + elementName, haveSameModifiers); } if (shouldCompareAnnotations()) { @@ -205,9 +203,9 @@ private void compareMethods(PsiClass beforeClass, PsiClass afterClass) { private void compareMethod(PsiClass beforeClass, PsiClass afterClass, PsiMethod afterMethod, PsiMethod beforeMethod) { final PsiModifierList afterModifierList = afterMethod.getModifierList(); - PsiModifierList beforeModifierList = beforeMethod.getModifierList(); + final PsiModifierList beforeModifierList = beforeMethod.getModifierList(); - compareModifiers(beforeModifierList, afterModifierList); + compareModifiers(beforeModifierList, afterModifierList, afterMethod.getName()); compareType(beforeMethod.getReturnType(), afterMethod.getReturnType(), afterMethod); compareParams(beforeMethod.getParameterList(), afterMethod.getParameterList()); compareThrows(beforeMethod.getThrowsList(), afterMethod.getThrowsList(), afterMethod); @@ -297,7 +295,7 @@ private void compareConstructors(PsiClass beforeClass, PsiClass afterClass) { for (PsiMethod beforeConstructor : beforeConstructors) { if (PsiElementUtil.methodMatches(beforeConstructor, null, null, afterConstructor.getName(), afterConstructorParameterTypes)) { final PsiModifierList intellijConstructorModifierList = beforeConstructor.getModifierList(); - compareModifiers(intellijConstructorModifierList, theirsFieldModifierList); + compareModifiers(intellijConstructorModifierList, theirsFieldModifierList, afterConstructor.getName()); compared = true; break; From fc14fb02efccff2e22ee76d65dc7605472f08755 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 4 Oct 2020 12:58:15 +0200 Subject: [PATCH 08/47] Next steps to implement nameHint handling: - make LAP backward compatible for < 2020.2 TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../intellij/plugin/provider/LombokAugmentProvider.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java index 5fb464bab..c18e8cd38 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java @@ -65,6 +65,13 @@ protected PsiType inferType(@NotNull PsiTypeElement typeElement) { @NotNull @Override + public List getAugments(@NotNull PsiElement element, + @NotNull final Class type) { + return getAugments(element, type, null); + } + + @NotNull +// @Override available from 2020.2 public List getAugments(@NotNull PsiElement element, @NotNull final Class type, @Nullable String nameHint) { From fc04df744fb435eac3b1c900ea5a9a7f34fec91f Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 4 Oct 2020 20:07:56 +0200 Subject: [PATCH 09/47] Next steps to implement nameHint handling: - implement possibleToGenerateElementNamed for SuperBuilder TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../builder/SuperBuilderClassProcessor.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderClassProcessor.java index 411e1a488..612e41149 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderClassProcessor.java @@ -13,8 +13,10 @@ import de.plushnikov.intellij.plugin.settings.ProjectSettings; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Objects; import java.util.Optional; /** @@ -33,6 +35,22 @@ protected SuperBuilderHandler getBuilderHandler() { return ApplicationManager.getApplication().getService(SuperBuilderHandler.class); } + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @NotNull PsiClass psiClass, + @NotNull PsiAnnotation psiAnnotation) { + if (null == nameHint) { + return true; + } + final SuperBuilderHandler builderHandler = getBuilderHandler(); + + final String builderClassName = builderHandler.getBuilderClassName(psiClass); + boolean foundPossibleMath = Objects.equals(nameHint, builderClassName); + if (!foundPossibleMath && !psiClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + final String builderImplClassName = builderHandler.getBuilderImplClassName(psiClass); + return Objects.equals(nameHint, builderImplClassName); + } + return foundPossibleMath; + } + @Override protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass, @NotNull ProblemBuilder builder) { return getBuilderHandler().validate(psiClass, psiAnnotation, builder); From 1011a97229a8b18cbbc175e2c1cd067aff3c8f64 Mon Sep 17 00:00:00 2001 From: mplushnikov Date: Mon, 5 Oct 2020 20:55:04 +0200 Subject: [PATCH 10/47] Next steps to implement nameHint handling: - implemented skipping entire processor if nameHint is eqaul to simplename of corresponding annotation - implemented Lazy fields and methods calculations of generated PsiClasses (Builder/SuperBuilder and FieldNameConstants) TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests - optimize lazy builder implementation --- .../plugin/processor/AbstractProcessor.java | 5 +- .../intellij/plugin/processor/Processor.java | 7 +- .../clazz/AbstractClassProcessor.java | 6 +- .../FieldNameConstantsProcessor.java | 3 +- .../processor/handler/BuilderHandler.java | 41 +++--- .../handler/FieldNameConstantsHandler.java | 64 ++++----- .../handler/SuperBuilderHandler.java | 27 ++-- .../singular/SingularHandlerFactory.java | 4 +- .../provider/LombokAugmentProvider.java | 8 +- .../plugin/psi/LombokLightClassBuilder.java | 121 ++++++++---------- .../plugin/util/PsiAnnotationSearchUtil.java | 2 +- .../plugin/AbstractLombokParsingTestCase.java | 2 +- 12 files changed, 150 insertions(+), 140 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/AbstractProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/AbstractProcessor.java index 4b7d7f53f..18732fefd 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/AbstractProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/AbstractProcessor.java @@ -33,7 +33,8 @@ public abstract class AbstractProcessor implements Processor { /** * Constructor for all Lombok-Processors - * @param supportedClass kind of output elements this processor supports + * + * @param supportedClass kind of output elements this processor supports * @param supportedAnnotationClasses annotations this processor supports */ protected AbstractProcessor(@NotNull Class supportedClass, @@ -66,7 +67,7 @@ protected void filterToleratedElements(@NotNull Collection verifyAnnotation(@NotNull PsiAnnotation psiAnnotation); + default boolean notNameHintIsEqualToSupportedAnnotation(@Nullable String nameHint) { + return null == nameHint || Arrays.stream(getSupportedAnnotationClasses()).map(Class::getSimpleName).noneMatch(nameHint::equals); + } + @NotNull default List process(@NotNull PsiClass psiClass) { return process(psiClass, null); @@ -37,5 +41,4 @@ default List process(@NotNull PsiClass psiClass, @Nullable S } LombokPsiElementUsage checkFieldUsage(@NotNull PsiField psiField, @NotNull PsiAnnotation psiAnnotation); - } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index c8505e418..4c4d4f353 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -8,7 +8,6 @@ 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.psi.LombokLightClassBuilder; @@ -46,13 +45,12 @@ protected AbstractClassProcessor(@NotNull Class supportedC @Override public List process(@NotNull PsiClass psiClass, @Nullable String nameHint) { List result = Collections.emptyList(); - PsiAnnotation psiAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiClass, getSupportedAnnotationClasses()); if (null != psiAnnotation && supportAnnotationVariant(psiAnnotation) && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation) - && validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance())) { - + //ToDo check it && validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance()) + ) { result = new ArrayList<>(); generatePsiElements(psiClass, psiAnnotation, result); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsProcessor.java index 5397e723e..8375d1f58 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/fieldnameconstants/FieldNameConstantsProcessor.java @@ -35,7 +35,8 @@ protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnot if (existingClass.isEmpty()) { LombokLightClassBuilder innerClassOrEnum = FieldNameConstantsHandler.createInnerClassOrEnum(typeName, psiClass, psiAnnotation); if (innerClassOrEnum != null) { - FieldNameConstantsHandler.createFields(innerClassOrEnum, psiFields).forEach(innerClassOrEnum::withField); + innerClassOrEnum.withFieldSupplier(() -> FieldNameConstantsHandler.createFields(innerClassOrEnum, psiFields)); + target.add(innerClassOrEnum); } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java index 3d5e63e1c..b8ed4d454 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java @@ -400,32 +400,41 @@ public List createBuilderInfos(@NotNull PsiAnnotation psiAnnotation @NotNull public PsiClass createBuilderClass(@NotNull PsiClass psiClass, @Nullable PsiMethod psiMethod, @NotNull PsiAnnotation psiAnnotation) { - LombokLightClassBuilder builderClass; + final LombokLightClassBuilder builderClass; if (null != psiMethod) { builderClass = createEmptyBuilderClass(psiClass, psiMethod, psiAnnotation); } else { builderClass = createEmptyBuilderClass(psiClass, psiAnnotation); } - builderClass.withMethods(createConstructors(builderClass, psiAnnotation)); - final List builderInfos = createBuilderInfos(psiAnnotation, psiClass, psiMethod, builderClass); + builderClass.withFieldSupplier(() -> { + final List builderInfos = createBuilderInfos(psiAnnotation, psiClass, psiMethod, builderClass); + // create builder Fields + return builderInfos.stream() + .map(BuilderInfo::renderBuilderFields) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + }); + + builderClass.withMethodSupplier(() -> { + Collection psiMethods = new ArrayList<>( + createConstructors(builderClass, psiAnnotation)); - // create builder Fields - builderInfos.stream() - .map(BuilderInfo::renderBuilderFields) - .forEach(builderClass::withFields); + final List builderInfos = createBuilderInfos(psiAnnotation, psiClass, psiMethod, builderClass); + // create builder methods + builderInfos.stream() + .map(BuilderInfo::renderBuilderMethods) + .forEach(psiMethods::addAll); - // create builder methods - builderInfos.stream() - .map(BuilderInfo::renderBuilderMethods) - .forEach(builderClass::withMethods); + // create 'build' method + final String buildMethodName = getBuildMethodName(psiAnnotation); + psiMethods.add(createBuildMethod(psiAnnotation, psiClass, psiMethod, builderClass, buildMethodName, builderInfos)); - // create 'build' method - final String buildMethodName = getBuildMethodName(psiAnnotation); - builderClass.addMethod(createBuildMethod(psiAnnotation, psiClass, psiMethod, builderClass, buildMethodName, builderInfos)); + // create 'toString' method + psiMethods.add(createToStringMethod(psiAnnotation, builderClass)); - // create 'toString' method - builderClass.addMethod(createToStringMethod(psiAnnotation, builderClass)); + return psiMethods; + }); return builderClass; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/FieldNameConstantsHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/FieldNameConstantsHandler.java index 6a5d261a9..14942b54f 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/FieldNameConstantsHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/FieldNameConstantsHandler.java @@ -17,6 +17,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Set; @@ -69,41 +70,42 @@ public static List createFields(@NotNull PsiClass containingClass, @No @NotNull private static LombokLightClassBuilder createEnum(@NotNull String name, @NotNull PsiClass containingClass, @NotNull String accessLevel, @NotNull PsiElement navigationElement) { final String innerClassQualifiedName = containingClass.getQualifiedName() + "." + name; - final LombokLightClassBuilder classBuilder = new LombokLightClassBuilder(containingClass, name, innerClassQualifiedName); - classBuilder.withContainingClass(containingClass) + final LombokLightClassBuilder lazyClassBuilder = new LombokLightClassBuilder(containingClass, name, innerClassQualifiedName); + lazyClassBuilder.withContainingClass(containingClass) .withNavigationElement(navigationElement) .withEnum(true) .withModifier(accessLevel) .withImplicitModifier(PsiModifier.STATIC) .withImplicitModifier(PsiModifier.FINAL); - //add enum methods like here: ClassInnerStuffCache.calcMethods - final PsiManager psiManager = containingClass.getManager(); - final PsiClassType enumClassType = PsiClassUtil.getTypeWithGenerics(classBuilder); + lazyClassBuilder.withMethodSupplier(()-> { + //add enum methods like here: ClassInnerStuffCache.calcMethods + final PsiManager psiManager = containingClass.getManager(); + final PsiClassType enumClassType = PsiClassUtil.getTypeWithGenerics(lazyClassBuilder); // "public static " + myClass.getName() + "[] values() { }" - final LombokLightMethodBuilder valuesEnumMethod = new LombokLightMethodBuilder(psiManager, "values") - .withModifier(PsiModifier.PUBLIC) - .withModifier(PsiModifier.STATIC) - .withContainingClass(containingClass) - .withNavigationElement(navigationElement) - .withMethodReturnType(new PsiArrayType(enumClassType)); - valuesEnumMethod.withBody(PsiMethodUtil.createCodeBlockFromText("", valuesEnumMethod)); - - // "public static " + myClass.getName() + " valueOf(java.lang.String name) throws java.lang.IllegalArgumentException { }" - final LombokLightMethodBuilder valueOfEnumMethod = new LombokLightMethodBuilder(psiManager, "valueOf") - .withModifier(PsiModifier.PUBLIC) - .withModifier(PsiModifier.STATIC) - .withContainingClass(containingClass) - .withNavigationElement(navigationElement) - .withParameter("name", PsiType.getJavaLangString(psiManager, containingClass.getResolveScope())) - .withException(PsiType.getTypeByName("java.lang.IllegalArgumentException", containingClass.getProject(), containingClass.getResolveScope())) - .withMethodReturnType(enumClassType); - valueOfEnumMethod.withBody(PsiMethodUtil.createCodeBlockFromText("", valueOfEnumMethod)); - - classBuilder.addMethod(valuesEnumMethod); - classBuilder.addMethod(valueOfEnumMethod); - - return classBuilder; + final LombokLightMethodBuilder valuesEnumMethod = new LombokLightMethodBuilder(psiManager, "values") + .withModifier(PsiModifier.PUBLIC) + .withModifier(PsiModifier.STATIC) + .withContainingClass(containingClass) + .withNavigationElement(navigationElement) + .withMethodReturnType(new PsiArrayType(enumClassType)); + valuesEnumMethod.withBody(PsiMethodUtil.createCodeBlockFromText("", valuesEnumMethod)); + + // "public static " + myClass.getName() + " valueOf(java.lang.String name) throws java.lang.IllegalArgumentException { }" + final LombokLightMethodBuilder valueOfEnumMethod = new LombokLightMethodBuilder(psiManager, "valueOf") + .withModifier(PsiModifier.PUBLIC) + .withModifier(PsiModifier.STATIC) + .withContainingClass(containingClass) + .withNavigationElement(navigationElement) + .withParameter("name", PsiType.getJavaLangString(psiManager, containingClass.getResolveScope())) + .withException(PsiType.getTypeByName("java.lang.IllegalArgumentException", containingClass.getProject(), containingClass.getResolveScope())) + .withMethodReturnType(enumClassType); + valueOfEnumMethod.withBody(PsiMethodUtil.createCodeBlockFromText("", valueOfEnumMethod)); + + return Arrays.asList(valuesEnumMethod, valueOfEnumMethod); + }); + + return lazyClassBuilder; } private static PsiField createEnumConstant(@NotNull PsiField field, boolean makeUppercased, @NotNull PsiClass containingClass, PsiClassType classType) { @@ -123,13 +125,13 @@ private static String makeFieldNameConstant(@NotNull PsiField field, boolean mak @NotNull private static LombokLightClassBuilder createInnerClass(@NotNull String name, @NotNull PsiClass containingClass, @NotNull String accessLevel, @NotNull PsiElement navigationElement) { final String innerClassQualifiedName = containingClass.getQualifiedName() + "." + name; - final LombokLightClassBuilder classBuilder = new LombokLightClassBuilder(containingClass, name, innerClassQualifiedName); - classBuilder.withContainingClass(containingClass) + final LombokLightClassBuilder lazyClassBuilder = new LombokLightClassBuilder(containingClass, name, innerClassQualifiedName); + lazyClassBuilder.withContainingClass(containingClass) .withNavigationElement(navigationElement) .withModifier(accessLevel) .withModifier(PsiModifier.STATIC) .withModifier(PsiModifier.FINAL); - return classBuilder; + return lazyClassBuilder; } @NotNull diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/SuperBuilderHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/SuperBuilderHandler.java index fc94db992..2a2190f62 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/SuperBuilderHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/SuperBuilderHandler.java @@ -205,17 +205,24 @@ public PsiClass createBuilderBaseClass(@NotNull PsiClass psiClass, @NotNull PsiA } } - final List builderInfos = createBuilderInfos(psiClass, psiAnnotation, baseClassBuilder); - initBuilderInfosBuilderClassType(builderInfos, bType); + baseClassBuilder.withFieldSupplier(() -> { + final List builderInfos = createBuilderInfos(psiClass, psiAnnotation, baseClassBuilder); + initBuilderInfosBuilderClassType(builderInfos, bType); - // create builder Fields - builderInfos.stream() - .map(BuilderInfo::renderBuilderFields) - .forEach(baseClassBuilder::withFields); + // create builder Fields + return builderInfos.stream() + .map(BuilderInfo::renderBuilderFields) + .flatMap(Collection::stream) + .collect(Collectors.toList()); + }); - // create all methods - baseClassBuilder.withMethods( - addAllMethodsForBaseBuilderClass(psiClass, psiAnnotation, baseClassBuilder, builderInfos, bType, cType)); + baseClassBuilder.withMethodSupplier(() -> { + final List builderInfos = createBuilderInfos(psiClass, psiAnnotation, baseClassBuilder); + initBuilderInfosBuilderClassType(builderInfos, bType); + + // create all methods + return addAllMethodsForBaseBuilderClass(psiClass, psiAnnotation, baseClassBuilder, builderInfos, bType, cType); + }); return baseClassBuilder; } @@ -369,7 +376,7 @@ public PsiClass createBuilderImplClass(@NotNull PsiClass psiClass, @NotNull PsiC PsiClassUtil.getTypeWithGenerics(psiClass), PsiClassUtil.getTypeWithGenerics(implClassBuilder)); implClassBuilder.withExtends(extendsType); - implClassBuilder.withMethods(createAllMethodsOfImplBuilder(psiClass, psiAnnotation, implClassBuilder)); + implClassBuilder.withMethodSupplier(() -> createAllMethodsOfImplBuilder(psiClass, psiAnnotation, implClassBuilder)); return implClassBuilder; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java index 570409daf..567564a2a 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java @@ -4,7 +4,7 @@ import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiType; import com.intellij.psi.PsiVariable; -import com.intellij.psi.impl.source.PsiClassReferenceType; +import de.plushnikov.intellij.plugin.util.PsiTypeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -67,7 +67,7 @@ public static BuilderElementHandler getHandlerFor(@NotNull PsiVariable psiVariab } final PsiType psiType = psiVariable.getType(); - final String qualifiedName = ((PsiClassReferenceType) psiType).getClassName();//PsiTypeUtil.getQualifiedName(psiType); + final String qualifiedName = PsiTypeUtil.getQualifiedName(psiType); if (!isInvalidSingularType(qualifiedName)) { if (containsOrAnyEndsWith(COLLECTION_TYPES, qualifiedName)) { return new SingularCollectionHandler(qualifiedName); diff --git a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java index c18e8cd38..4c4e6be1b 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java @@ -105,9 +105,11 @@ private static List getPsis(PsiClass psiClass, Cla final List result = new ArrayList<>(); final Collection lombokProcessors = LombokProcessorProvider.getInstance(psiClass.getProject()).getLombokProcessors(type); for (Processor processor : lombokProcessors) { - final List generatedElements = processor.process(psiClass, nameHint); - for (Object psiElement : generatedElements) { - result.add((Psi) psiElement); + if (processor.notNameHintIsEqualToSupportedAnnotation(nameHint)) { + final List generatedElements = processor.process(psiClass, nameHint); + for (Object psiElement : generatedElements) { + result.add((Psi) psiElement); + } } } return result; diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java index 0d5ddca47..4d910cf94 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java @@ -2,7 +2,6 @@ import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; -import com.intellij.psi.impl.light.LightFieldBuilder; import com.intellij.psi.impl.light.LightPsiClassBuilder; import com.intellij.psi.impl.source.PsiExtensibleClass; import de.plushnikov.intellij.plugin.icon.LombokIcons; @@ -12,14 +11,21 @@ import javax.swing.*; import java.util.*; +import java.util.function.*; import java.util.stream.Stream; public class LombokLightClassBuilder extends LightPsiClassBuilder implements PsiExtensibleClass, SyntheticElement { - private boolean myIsEnum; + private final String myQualifiedName; private final Icon myBaseIcon; private final LombokLightModifierList myModifierList; - private final Collection myFields = new ArrayList<>(); + + private boolean myIsEnum; + private PsiField[] myFields; + private PsiMethod[] myMethods; + + private Supplier> fieldSupplier = Collections::emptyList; + private Supplier> methodSupplier = Collections::emptyList; public LombokLightClassBuilder(@NotNull PsiElement context, @NotNull String simpleName, @NotNull String qualifiedName) { super(context, simpleName); @@ -35,19 +41,6 @@ public LombokLightModifierList getModifierList() { return myModifierList; } - @Override - @NotNull - public PsiField[] getFields() { - return myFields.toArray(PsiField.EMPTY_ARRAY); - } - - private void addField(PsiField field) { - if (field instanceof LightFieldBuilder) { - ((LightFieldBuilder) field).setContainingClass(this); - } - myFields.add(field); - } - @Override public PsiElement getScope() { if (getContainingClass() != null) { @@ -91,6 +84,51 @@ public boolean isEnum() { return myIsEnum; } + @Override + public @NotNull PsiField[] getFields() { + if (null == myFields) { + Collection generatedFields = fieldSupplier.get(); + myFields = generatedFields.toArray(new PsiField[0]); + fieldSupplier = Collections::emptyList; + } + return myFields; + } + + @Override + public @NotNull PsiMethod[] getMethods() { + if (null == myMethods) { + Collection generatedMethods = methodSupplier.get(); + myMethods = generatedMethods.toArray(new PsiMethod[0]); + methodSupplier = Collections::emptyList; + } + return myMethods; + } + + @Override + public @NotNull List getOwnFields() { + return Collections.emptyList(); + } + + @Override + public @NotNull List getOwnMethods() { + return Collections.emptyList(); + } + + @Override + public @NotNull List getOwnInnerClasses() { + return Collections.emptyList(); + } + + public LombokLightClassBuilder withFieldSupplier(final Supplier> fieldSupplier) { + this.fieldSupplier = fieldSupplier; + return this; + } + + public LombokLightClassBuilder withMethodSupplier(final Supplier> methodSupplier) { + this.methodSupplier = methodSupplier; + return this; + } + public LombokLightClassBuilder withEnum(boolean isEnum) { myIsEnum = isEnum; return this; @@ -116,35 +154,11 @@ public LombokLightClassBuilder withNavigationElement(PsiElement navigationElemen return this; } - public LombokLightClassBuilder withExtends(PsiClass baseClass) { - getExtendsList().addReference(baseClass); - return this; - } - public LombokLightClassBuilder withExtends(PsiClassType baseClassType) { getExtendsList().addReference(baseClassType); return this; } - public LombokLightClassBuilder withField(@NotNull PsiField psiField) { - addField(psiField); - return this; - } - - public LombokLightClassBuilder withFields(@NotNull Collection fields) { - for (PsiField field : fields) { - addField(field); - } - return this; - } - - public LombokLightClassBuilder withMethods(@NotNull Collection methods) { - for (PsiMethod method : methods) { - addMethod(method); - } - return this; - } - public LombokLightClassBuilder withParameterTypes(@Nullable PsiTypeParameterList parameterList) { if (parameterList != null) { Stream.of(parameterList.getTypeParameters()).forEach(this::withParameterType); @@ -157,24 +171,6 @@ public LombokLightClassBuilder withParameterType(@NotNull PsiTypeParameter psiTy return this; } - @NotNull - @Override - public List getOwnFields() { - return Arrays.asList(getFields()); - } - - @NotNull - @Override - public List getOwnMethods() { - return Arrays.asList(getMethods()); - } - - @NotNull - @Override - public List getOwnInnerClasses() { - return Arrays.asList(getInnerClasses()); - } - @Override public boolean equals(Object o) { if (this == o) { @@ -195,13 +191,4 @@ public int hashCode() { return myQualifiedName.hashCode(); } - @Override - public boolean isValid() { - return super.isValid() && areAllFieldsAndMethodsValid(); - } - - private boolean areAllFieldsAndMethodsValid() { - return Arrays.stream(getFields()).allMatch(PsiElement::isValid) - && Arrays.stream(getMethods()).allMatch(PsiElement::isValid); - } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java index 7d829e9e7..6ff620962 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java @@ -69,7 +69,7 @@ private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner an } } - if (qualifiedName.endsWith(annotation.getQualifiedName())) { + if (annotation.hasQualifiedName(qualifiedName)) { return annotation; } } diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java index 5de89c22e..4012bb892 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java @@ -163,7 +163,7 @@ private void compareModifiers(PsiModifierList beforeModifierList, PsiModifierLis for (String modifier : PsiModifier.MODIFIERS) { boolean haveSameModifiers = afterModifierList.hasModifierProperty(modifier) == beforeModifierList.hasModifierProperty(modifier); - assertTrue(modifier + " Modifier is not equal for " + elementName, haveSameModifiers); + assertTrue("'" + modifier + "' Modifier is not equal for: " + elementName, haveSameModifiers); } if (shouldCompareAnnotations()) { From 687493043e11d8d7e2cc606a7c39431ceac30f18 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Fri, 16 Oct 2020 20:00:49 +0200 Subject: [PATCH 11/47] Next steps to implement nameHint handling: - tried with new fix intellij version from peter gromov, all exceptions gone! TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../LombokRenameFieldReferenceProcessor.java | 2 +- .../clazz/AbstractClassProcessor.java | 3 ++- .../clazz/builder/BuilderProcessor.java | 19 +++++++++++++++++++ .../processor/handler/BuilderHandler.java | 4 ++-- .../plugin/processor/handler/BuilderInfo.java | 4 ++-- .../singular/SingularHandlerFactory.java | 5 ++--- 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/extension/LombokRenameFieldReferenceProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/extension/LombokRenameFieldReferenceProcessor.java index 47b31ac2e..83123e129 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/extension/LombokRenameFieldReferenceProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/extension/LombokRenameFieldReferenceProcessor.java @@ -64,7 +64,7 @@ public void prepareRenaming(@NotNull PsiElement element, @NotNull String newFiel 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, singularAnnotation); + final BuilderElementHandler handler = SingularHandlerFactory.getHandlerFor(psiField, null!=singularAnnotation); final List currentBuilderMethodNames = handler.getBuilderMethodNames(accessorsInfo.removePrefix(currentFieldName), singularAnnotation); final List newBuilderMethodNames = handler.getBuilderMethodNames(accessorsInfo.removePrefix(newFieldName), singularAnnotation); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index 4c4d4f353..75e174684 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -8,6 +8,7 @@ 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.psi.LombokLightClassBuilder; @@ -49,7 +50,7 @@ public List process(@NotNull PsiClass psiClass, @Nullable St if (null != psiAnnotation && supportAnnotationVariant(psiAnnotation) && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation) - //ToDo check it && validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance()) + && validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance()) ) { result = new ArrayList<>(); generatePsiElements(psiClass, psiAnnotation, result); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderProcessor.java index ad0cf7ec8..3a2b98cf4 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderProcessor.java @@ -13,9 +13,11 @@ import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.List; +import java.util.Objects; /** * Inspect and validate @Builder lombok annotation on a class. @@ -41,6 +43,23 @@ private AllArgsConstructorProcessor getAllArgsConstructorProcessor() { return ApplicationManager.getApplication().getService(AllArgsConstructorProcessor.class); } + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @NotNull PsiClass psiClass, + @NotNull PsiAnnotation psiAnnotation) { + if (null == nameHint) { + return true; + } + + boolean possibleMatchFound = Objects.equals(nameHint, psiClass.getName()); + if (!possibleMatchFound) { + possibleMatchFound = Objects.equals(nameHint, BuilderHandler.TO_BUILDER_METHOD_NAME); + if (!possibleMatchFound) { + final String builderMethodName = getBuilderHandler().getBuilderMethodName(psiAnnotation); + possibleMatchFound = Objects.equals(nameHint, builderMethodName); + } + } + return possibleMatchFound; + } + @NotNull @Override public Collection collectProcessedAnnotations(@NotNull PsiClass psiClass) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java index b8ed4d454..f0c4be16b 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java @@ -42,7 +42,7 @@ public class BuilderHandler { private final static String BUILD_METHOD_NAME = "build"; private final static String BUILDER_METHOD_NAME = "builder"; - private static final String TO_BUILDER_METHOD_NAME = "toBuilder"; + public static final String TO_BUILDER_METHOD_NAME = "toBuilder"; static final String TO_BUILDER_ANNOTATION_KEY = "toBuilder"; private static final Collection INVALID_ON_BUILDERS = Stream.of(LombokClassNames.GETTER, @@ -224,7 +224,7 @@ public String getBuildMethodName(@NotNull PsiAnnotation psiAnnotation) { } @NotNull - String getBuilderMethodName(@NotNull PsiAnnotation psiAnnotation) { + public String getBuilderMethodName(@NotNull PsiAnnotation psiAnnotation) { final String builderMethodName = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, ANNOTATION_BUILDER_METHOD_NAME, BUILDER_METHOD_NAME); return null == builderMethodName ? BUILDER_METHOD_NAME : builderMethodName; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderInfo.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderInfo.java index c542819ee..86ac3804c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderInfo.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderInfo.java @@ -62,7 +62,7 @@ public static BuilderInfo fromPsiParameter(@NotNull PsiParameter psiParameter) { result.fieldInBuilderName = psiParameter.getName(); result.singularAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiParameter, LombokClassNames.SINGULAR); - result.builderElementHandler = SingularHandlerFactory.getHandlerFor(psiParameter, result.singularAnnotation); + result.builderElementHandler = SingularHandlerFactory.getHandlerFor(psiParameter, null!=result.singularAnnotation); return result; } @@ -84,7 +84,7 @@ public static BuilderInfo fromPsiField(@NotNull PsiField psiField) { result.fieldInBuilderName = accessorsInfo.removePrefix(psiField.getName()); result.singularAnnotation = PsiAnnotationSearchUtil.findAnnotation(psiField, LombokClassNames.SINGULAR); - result.builderElementHandler = SingularHandlerFactory.getHandlerFor(psiField, result.singularAnnotation); + result.builderElementHandler = SingularHandlerFactory.getHandlerFor(psiField, null!=result.singularAnnotation); return result; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java index 567564a2a..0b1ddd878 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java @@ -1,7 +1,6 @@ package de.plushnikov.intellij.plugin.processor.handler.singular; import com.intellij.psi.CommonClassNames; -import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiType; import com.intellij.psi.PsiVariable; import de.plushnikov.intellij.plugin.util.PsiTypeUtil; @@ -61,8 +60,8 @@ private static boolean containsOrAnyEndsWith(@NotNull Set elements, @Not } @NotNull - public static BuilderElementHandler getHandlerFor(@NotNull PsiVariable psiVariable, @Nullable PsiAnnotation singularAnnotation) { - if (null == singularAnnotation) { + public static BuilderElementHandler getHandlerFor(@NotNull PsiVariable psiVariable, boolean hasSingularAnnotation) { + if (!hasSingularAnnotation) { return new NonSingularHandler(); } From edca85ed696ca1d4e34ae1c45ca721b1d206562b Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Fri, 16 Oct 2020 20:54:58 +0200 Subject: [PATCH 12/47] -Updated expected qualified builder class names TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../delombok/builder/afterBuilderAtConstructorSimple.java | 4 ++-- .../action/delombok/builder/afterBuilderAtMethodSimple.java | 4 ++-- .../action/delombok/builder/afterBuilderSingularMap.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/testData/action/delombok/builder/afterBuilderAtConstructorSimple.java b/testData/action/delombok/builder/afterBuilderAtConstructorSimple.java index 0092be3b2..9132ce654 100644 --- a/testData/action/delombok/builder/afterBuilderAtConstructorSimple.java +++ b/testData/action/delombok/builder/afterBuilderAtConstructorSimple.java @@ -23,12 +23,12 @@ public static class BuilderAtConstructorSimpleBuilder { BuilderAtConstructorSimpleBuilder() { } - public BuilderAtConstructorSimpleBuilder myInt(int myInt) { + public BuilderAtConstructorSimple.BuilderAtConstructorSimpleBuilder myInt(int myInt) { this.myInt = myInt; return this; } - public BuilderAtConstructorSimpleBuilder myString(String myString) { + public BuilderAtConstructorSimple.BuilderAtConstructorSimpleBuilder myString(String myString) { this.myString = myString; return this; } diff --git a/testData/action/delombok/builder/afterBuilderAtMethodSimple.java b/testData/action/delombok/builder/afterBuilderAtMethodSimple.java index 60bb5dd56..c7c49b521 100644 --- a/testData/action/delombok/builder/afterBuilderAtMethodSimple.java +++ b/testData/action/delombok/builder/afterBuilderAtMethodSimple.java @@ -25,12 +25,12 @@ public static class BuilderAtMethodSimpleBuilder { BuilderAtMethodSimpleBuilder() { } - public BuilderAtMethodSimpleBuilder myInt(int myInt) { + public BuilderAtMethodSimple.BuilderAtMethodSimpleBuilder myInt(int myInt) { this.myInt = myInt; return this; } - public BuilderAtMethodSimpleBuilder myString(String myString) { + public BuilderAtMethodSimple.BuilderAtMethodSimpleBuilder myString(String myString) { this.myString = myString; return this; } diff --git a/testData/action/delombok/builder/afterBuilderSingularMap.java b/testData/action/delombok/builder/afterBuilderSingularMap.java index adcc02b56..95f6ad335 100644 --- a/testData/action/delombok/builder/afterBuilderSingularMap.java +++ b/testData/action/delombok/builder/afterBuilderSingularMap.java @@ -20,7 +20,7 @@ public static class BuilderSingularMapBuilder { BuilderSingularMapBuilder() { } - public BuilderSingularMapBuilder myMap(String myMapKey, String myMapValue) { + public BuilderSingularMap.BuilderSingularMapBuilder myMap(String myMapKey, String myMapValue) { if (this.myMap$key == null) { this.myMap$key = new ArrayList(); this.myMap$value = new ArrayList(); @@ -30,7 +30,7 @@ public BuilderSingularMapBuilder myMap(String myMapKey, String myMapValue) { return this; } - public BuilderSingularMapBuilder myMap(Map myMap) { + public BuilderSingularMap.BuilderSingularMapBuilder myMap(Map myMap) { if (this.myMap$key == null) { this.myMap$key = new ArrayList(); this.myMap$value = new ArrayList(); @@ -42,7 +42,7 @@ public BuilderSingularMapBuilder myMap(Map m return this; } - public BuilderSingularMapBuilder clearMyMap() { + public BuilderSingularMap.BuilderSingularMapBuilder clearMyMap() { if (this.myMap$key != null) { this.myMap$key.clear(); this.myMap$value.clear(); From 61ef5ba65c1c314edc6161a3d099ad14fccfd2c8 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Fri, 16 Oct 2020 21:27:35 +0200 Subject: [PATCH 13/47] - fixed all failing tests TODO: - implement all of possibleToGenerateElementNamed() logic --- .../plugin/AbstractLombokParsingTestCase.java | 5 ++--- testData/after/builder/BuilderInstanceMethod.java | 3 ++- .../EqualsAndHashCodeWithSomeExistingMethods.java | 11 +++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java index 4012bb892..6294869a8 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java @@ -142,9 +142,8 @@ private void compareInitializers(PsiExpression beforeInitializer, PsiExpression private void compareType(PsiType beforeType, PsiType afterType, PomNamedTarget whereTarget) { if (null != beforeType && null != afterType) { - //TODO fix me ? - final String afterText = stripJavaLang(afterType.toString()); - final String beforeText = stripJavaLang(beforeType.toString()); + final String afterText = stripJavaLang(afterType.getCanonicalText()); + final String beforeText = stripJavaLang(beforeType.getCanonicalText()); assertEquals(String.format("Types are not equal for element: %s", whereTarget.getName()), afterText, beforeText); } } diff --git a/testData/after/builder/BuilderInstanceMethod.java b/testData/after/builder/BuilderInstanceMethod.java index 6efa06d46..9567e489d 100644 --- a/testData/after/builder/BuilderInstanceMethod.java +++ b/testData/after/builder/BuilderInstanceMethod.java @@ -60,8 +60,9 @@ public java.lang.String toString() { } @java.lang.SuppressWarnings("all") + // removed '' from original file // added 'BuilderInstanceMethod.' because Builder-class is not static - public StringBuilder builder() { + public BuilderInstanceMethod.StringBuilder builder() { return new BuilderInstanceMethod.StringBuilder(); } } diff --git a/testData/before/equalsandhashcode/EqualsAndHashCodeWithSomeExistingMethods.java b/testData/before/equalsandhashcode/EqualsAndHashCodeWithSomeExistingMethods.java index 0f5b0ffa3..bd20cdcbe 100644 --- a/testData/before/equalsandhashcode/EqualsAndHashCodeWithSomeExistingMethods.java +++ b/testData/before/equalsandhashcode/EqualsAndHashCodeWithSomeExistingMethods.java @@ -1,7 +1,6 @@ //CONF: lombok.addGeneratedAnnotation = false -import lombok.AccessLevel; -import lombok.Data; +import lombok.*; import static lombok.AccessLevel.NONE; @@ -10,7 +9,7 @@ @Setter(NONE) class EqualsAndHashCodeWithSomeExistingMethods { int x; - + public int hashCode() { return 42; } @@ -21,7 +20,7 @@ public int hashCode() { @Setter(NONE) class EqualsAndHashCodeWithSomeExistingMethods2 { int x; - + protected boolean canEqual(Object other) { return false; } @@ -32,11 +31,11 @@ protected boolean canEqual(Object other) { @Setter(NONE) class EqualsAndHashCodeWithAllExistingMethods { int x; - + public int hashCode() { return 42; } - + public boolean equals(Object other) { return false; } From 96792701e7a641349f33a46316a0895fe3454a8d Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Fri, 16 Oct 2020 22:36:20 +0200 Subject: [PATCH 14/47] - now we can use original annotation handling instead of custom workarounds - skip processing for "lombok" nameHint TODO: - implement all of possibleToGenerateElementNamed() logic --- .../intellij/plugin/processor/Processor.java | 2 +- .../plugin/util/PsiAnnotationSearchUtil.java | 103 +++--------------- 2 files changed, 14 insertions(+), 91 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java index 2539a2ac4..df347629b 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java @@ -27,7 +27,7 @@ public interface Processor { Collection verifyAnnotation(@NotNull PsiAnnotation psiAnnotation); default boolean notNameHintIsEqualToSupportedAnnotation(@Nullable String nameHint) { - return null == nameHint || Arrays.stream(getSupportedAnnotationClasses()).map(Class::getSimpleName).noneMatch(nameHint::equals); + return null == nameHint || (!"lombok".equals(nameHint) && Arrays.stream(getSupportedAnnotationClasses()).map(Class::getSimpleName).noneMatch(nameHint::equals)); } @NotNull diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java index 6ff620962..0e0a287e5 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java @@ -1,33 +1,35 @@ package de.plushnikov.intellij.plugin.util; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.*; -import com.intellij.psi.impl.source.SourceJavaCodeReference; -import com.intellij.util.ArrayUtil; +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiJavaCodeReferenceElement; +import com.intellij.psi.PsiModifierList; +import com.intellij.psi.PsiModifierListOwner; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.annotation.Annotation; +import java.util.Arrays; import java.util.Collection; +import java.util.Objects; import java.util.regex.Pattern; +import java.util.stream.Stream; public class PsiAnnotationSearchUtil { @Nullable public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationFQN) { -// return AnnotationUtil.findAnnotation(psiModifierListOwner, annotationFQN); - return findAnnotationQuick(psiModifierListOwner.getModifierList(), annotationFQN); + return psiModifierListOwner.getAnnotation(annotationFQN); } @Nullable public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String... annotationFQNs) { -// return AnnotationUtil.findAnnotation(psiModifierListOwner, annotationFQNs); - return findAnnotationQuick(psiModifierListOwner.getModifierList(), annotationFQNs); + return Stream.of(annotationFQNs).map(psiModifierListOwner::getAnnotation).filter(Objects::nonNull).findAny().orElse(null); } @Nullable public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class annotationType) { -// return AnnotationUtil.findAnnotation(psiModifierListOwner, annotationType.getName()); - return findAnnotationQuick(psiModifierListOwner.getModifierList(), annotationType.getName()); + return findAnnotation(psiModifierListOwner, annotationType.getName()); } @Nullable @@ -43,90 +45,12 @@ public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModi return findAnnotation(psiModifierListOwner, qualifiedNames); } - @Nullable - private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner annotationOwner, @NotNull String qualifiedName) { - if (annotationOwner == null) { - return null; - } - - PsiAnnotation[] annotations = annotationOwner.getAnnotations(); - if (annotations.length == 0) { - return null; - } - - final String shortName = StringUtil.getShortName(qualifiedName); - - for (PsiAnnotation annotation : annotations) { - PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement(); - if (null != referenceElement) { - final String referenceName = referenceElement.getReferenceName(); - if (shortName.equals(referenceName)) { - - if (referenceElement.isQualified() && referenceElement instanceof SourceJavaCodeReference) { - String possibleFullQualifiedName = ((SourceJavaCodeReference) referenceElement).getClassNameText(); - if (qualifiedName.equals(possibleFullQualifiedName)) { - return annotation; - } - } - - if (annotation.hasQualifiedName(qualifiedName)) { - return annotation; - } - } - } - } - - return null; - } - - @Nullable - private static PsiAnnotation findAnnotationQuick(@Nullable PsiAnnotationOwner annotationOwner, @NotNull String... qualifiedNames) { - if (annotationOwner == null || qualifiedNames.length == 0) { - return null; - } - - PsiAnnotation[] annotations = annotationOwner.getAnnotations(); - if (annotations.length == 0) { - return null; - } - - final String[] shortNames = new String[qualifiedNames.length]; - for (int i = 0; i < qualifiedNames.length; i++) { - shortNames[i] = StringUtil.getShortName(qualifiedNames[i]); - } - - for (PsiAnnotation annotation : annotations) { - final PsiJavaCodeReferenceElement referenceElement = annotation.getNameReferenceElement(); - if (null != referenceElement) { - final String referenceName = referenceElement.getReferenceName(); - if (ArrayUtil.find(shortNames, referenceName) > -1) { - - if (referenceElement.isQualified() && referenceElement instanceof SourceJavaCodeReference) { - final String possibleFullQualifiedName = ((SourceJavaCodeReference) referenceElement).getClassNameText(); - - if (ArrayUtil.find(qualifiedNames, possibleFullQualifiedName) > -1) { - return annotation; - } - } - - if (ArrayUtil.find(qualifiedNames, annotation.getQualifiedName()) > -1) { - return annotation; - } - } - } - } - - return null; - } - public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class annotationType) { -// return psiModifierListOwner.hasAnnotation(annotationType.getName()); - return null != findAnnotation(psiModifierListOwner, annotationType.getName()); + return psiModifierListOwner.hasAnnotation(annotationType.getName()); } public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationFQN) { -// return psiModifierListOwner.hasAnnotation(annotationFQN); - return null != findAnnotation(psiModifierListOwner, annotationFQN); + return psiModifierListOwner.hasAnnotation(annotationFQN); } public static boolean isNotAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, String annotationTypeName) { @@ -134,7 +58,6 @@ public static boolean isNotAnnotatedWith(@NotNull PsiModifierListOwner psiModifi } public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final String... annotationTypes) { - // return Arrays.stream(annotationTypes).map(Class::getName).anyMatch(psiModifierListOwner::hasAnnotation); return null != findAnnotation(psiModifierListOwner, annotationTypes); } From d3ddc77e2cf358aebf6aaa1882995d92dc5bff6a Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 9 Oct 2020 15:56:19 +0300 Subject: [PATCH 15/47] IJI-460 zero tolerance inspections fix GitOrigin-RevId: f810c2b803644f1008099c7f8e495356e23d5fb3 --- .../de/plushnikov/intellij/plugin/action/BaseRefactorHandler.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/java/de/plushnikov/intellij/plugin/action/BaseRefactorHandler.java diff --git a/src/main/java/de/plushnikov/intellij/plugin/action/BaseRefactorHandler.java b/src/main/java/de/plushnikov/intellij/plugin/action/BaseRefactorHandler.java new file mode 100644 index 000000000..e69de29bb From 80dc829ed83237224900bf4440b693b4975a5962 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 16 Oct 2020 12:05:45 +0200 Subject: [PATCH 16/47] cleanup (get rid of ServiceManager.get) GitOrigin-RevId: 7f6a905353889c9795e5d40a8aa60f6251000f05 --- .../plugin/processor/clazz/builder/BuilderClassProcessor.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderClassProcessor.java index eb27b7b19..e56ab8f0e 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderClassProcessor.java @@ -1,7 +1,6 @@ package de.plushnikov.intellij.plugin.processor.clazz.builder; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -9,7 +8,6 @@ import de.plushnikov.intellij.plugin.problem.ProblemBuilder; import de.plushnikov.intellij.plugin.processor.clazz.AbstractClassProcessor; import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; From 698adb63531b84ab8c6d5bd06f72c0b9532d6707 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Thu, 15 Oct 2020 21:11:58 +0200 Subject: [PATCH 17/47] reduce lombok generated sources (IDEA-252860) GitOrigin-RevId: 6b86f2066f1142aec3a6df9f6abd5a0f126c0cce --- .../plugin/processor/clazz/AbstractClassProcessor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index 75e174684..eef0dde53 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -5,6 +5,7 @@ import com.intellij.psi.util.PsiTreeUtil; import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.LombokClassNames; +import de.plushnikov.intellij.plugin.LombokNames; import de.plushnikov.intellij.plugin.lombokconfig.ConfigKey; import de.plushnikov.intellij.plugin.problem.LombokProblem; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; @@ -176,7 +177,7 @@ boolean shouldGenerateExtraNoArgsConstructor(@NotNull PsiClass psiClass) { } if (result) { result = PsiAnnotationSearchUtil.isNotAnnotatedWith(psiClass, LombokClassNames.NO_ARGS_CONSTRUCTOR, LombokClassNames.ALL_ARGS_CONSTRUCTOR, - LombokClassNames.REQUIRED_ARGS_CONSTRUCTOR); + LombokClassNames.REQUIRED_ARGS_CONSTRUCTOR); } return result; } From 7310fa830bc96df86179f024ee32165a85467a60 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 16 Oct 2020 20:13:59 +0200 Subject: [PATCH 18/47] lombok: add test to check hard coded class names exists in the latest supported jar GitOrigin-RevId: 184f66fb3b96f79b29e00c6be802c6374bb57573 --- .../plushnikov/intellij/plugin/util/LombokProcessorUtil.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java index 7038f461c..75599e80c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java @@ -19,6 +19,11 @@ public final class LombokProcessorUtil { @NonNls private static final String ACCESS_LEVEL_PACKAGE_LOCAL = "PACKAGE"; @NonNls private static final String ACCESS_LEVEL_PUBLIC = "PUBLIC"; + @NonNls private static final String ACCESS_LEVEL_PRIVATE = "PRIVATE"; + @NonNls private static final String ACCESS_LEVEL_PROTECTED = "PROTECTED"; + @NonNls private static final String ACCESS_LEVEL_PACKAGE_LOCAL = "PACKAGE"; + @NonNls private static final String ACCESS_LEVEL_PUBLIC = "PUBLIC"; + private static final Map ACCESS_LEVEL_MAP = new HashMap() {{ put(PsiUtil.ACCESS_LEVEL_PUBLIC, ACCESS_LEVEL_PUBLIC); put(PsiUtil.ACCESS_LEVEL_PACKAGE_LOCAL, ACCESS_LEVEL_PACKAGE_LOCAL); From e913a8355a5dac33fcd590edce7b0ec50358a77d Mon Sep 17 00:00:00 2001 From: Sergey Patrikeev Date: Fri, 16 Oct 2020 02:37:56 +0300 Subject: [PATCH 19/47] cleanuped and merged changes from jetbrains --- ...tractReplaceVariableWithExplicitTypeIntentionAction.java | 1 + .../plushnikov/intellij/plugin/processor/ValProcessor.java | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/from/AbstractReplaceVariableWithExplicitTypeIntentionAction.java b/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/from/AbstractReplaceVariableWithExplicitTypeIntentionAction.java index 41a24d19d..32c2df821 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/from/AbstractReplaceVariableWithExplicitTypeIntentionAction.java +++ b/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/from/AbstractReplaceVariableWithExplicitTypeIntentionAction.java @@ -7,6 +7,7 @@ import com.intellij.psi.util.PsiTypesUtil; import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.LombokClassNames; +import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.intention.valvar.AbstractValVarIntentionAction; import de.plushnikov.intellij.plugin.processor.ValProcessor; import org.jetbrains.annotations.Nls; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java index 577e556e6..fae7166e7 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java @@ -5,6 +5,12 @@ import com.intellij.codeInspection.ProblemsHolder; import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.codeInsight.daemon.impl.analysis.JavaGenericsUtil; +import com.intellij.codeInspection.ProblemHighlightType; +import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.RecursionManager; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.JavaVarTypeUtil; import de.plushnikov.intellij.plugin.LombokBundle; From 152a3cd304a029b271f37a98bcb767bfe4557c05 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Mon, 26 Oct 2020 21:17:23 +0100 Subject: [PATCH 20/47] [lombok] using hasInitializer() where possible and reduced test setup code GitOrigin-RevId: 626f13e5d07caf613d9d025afea01bb8c6730d74 --- .../plugin/AbstractLombokLightCodeInsightTestCase.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java index 342aca30a..90945f362 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java @@ -45,6 +45,14 @@ protected void loadLombokLibrary() { LombokTestUtil.loadLombokLibrary(myFixture.getProjectDisposable(), getModule()); } + @Override + public void setUp() throws Exception { + super.setUp(); + + //TODO disable assertions for the moment + RecursionManager.disableMissedCacheAssertions(myFixture.getProjectDisposable()); + } + protected PsiFile loadToPsiFile(String fileName) { final String sourceFilePath = getBasePath() + "/" + fileName; VirtualFile virtualFile = myFixture.copyFileToProject(sourceFilePath, fileName); From 1004d1172a7ee105fd532a69e9abd2fc0febb443 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Tue, 27 Oct 2020 18:35:57 +0100 Subject: [PATCH 21/47] fix merge --- .../plugin/AbstractLombokLightCodeInsightTestCase.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java index 90945f362..342aca30a 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java @@ -45,14 +45,6 @@ protected void loadLombokLibrary() { LombokTestUtil.loadLombokLibrary(myFixture.getProjectDisposable(), getModule()); } - @Override - public void setUp() throws Exception { - super.setUp(); - - //TODO disable assertions for the moment - RecursionManager.disableMissedCacheAssertions(myFixture.getProjectDisposable()); - } - protected PsiFile loadToPsiFile(String fileName) { final String sourceFilePath = getBasePath() + "/" + fileName; VirtualFile virtualFile = myFixture.copyFileToProject(sourceFilePath, fileName); From 0fb83a6e7208c6add56340d877c0d041f29dfce4 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 3 Oct 2020 23:04:16 +0200 Subject: [PATCH 22/47] First steps to implement nameHint handling: - added nameHint parameter to processors methods - removed own caching and recursive handling TODO: - implement all of possibleToGenerateElementNamed() logic --- .../AbstractBuilderPreDefinedInnerClassProcessor.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java index 1f5527a4c..5eaa8397c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java @@ -69,6 +69,16 @@ && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation)) { return result; } + protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { + if (null == nameHint) { + return true; + } + + //TODO: implement handling + + return true; + } + protected abstract BuilderHandler getBuilderHandler(); protected abstract Collection generatePsiElements(@NotNull PsiClass psiParentClass, @Nullable PsiMethod psiParentMethod, @NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiBuilderClass); From 96444b8de6a7c44b99234a74402ec69869aae928 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 3 Oct 2020 23:46:31 +0200 Subject: [PATCH 23/47] Next steps to implement nameHint handling: - removed disableMissedCacheAssertions - implemented first possibleToGenerateElementNamed for generation of InnerBuilderClasses for @Builder on methods - fixed/improved annotationAttributeValue handling by checking first for presence of attribute TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../plushnikov/intellij/plugin/util/PsiAnnotationUtil.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java index aa76ba83f..5313a30d4 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java @@ -91,6 +91,11 @@ public static int getIntAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @N return result instanceof Number ? ((Number) result).intValue() : defaultValue; } + @Nullable + private static PsiAnnotationMemberValue getAnnotationAttribute(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { + return psiAnnotation.hasAttribute(parameter) ? psiAnnotation.findAttributeValue(parameter) : null; + } + @Nullable private static T resolveElementValue(@NotNull PsiElement psiElement, @NotNull Class asClass) { T value = null; From b8913d02ed2f64606ce75cb0a6f28a2a4a1cad33 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 4 Oct 2020 12:55:48 +0200 Subject: [PATCH 24/47] Next steps to implement nameHint handling: - optimize annotation value handling by using declared value and manually provided default values - droped broken getAndCacheFQN implementation TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../AbstractBuilderPreDefinedInnerClassProcessor.java | 10 ---------- .../handler/singular/SingularHandlerFactory.java | 4 ++-- .../intellij/plugin/util/LombokProcessorUtil.java | 6 ++++++ .../intellij/plugin/AbstractLombokParsingTestCase.java | 7 ++++--- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java index 5eaa8397c..1f5527a4c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java @@ -69,16 +69,6 @@ && possibleToGenerateElementNamed(nameHint, psiClass, psiAnnotation)) { return result; } - protected boolean possibleToGenerateElementNamed(@Nullable String nameHint) { - if (null == nameHint) { - return true; - } - - //TODO: implement handling - - return true; - } - protected abstract BuilderHandler getBuilderHandler(); protected abstract Collection generatePsiElements(@NotNull PsiClass psiParentClass, @Nullable PsiMethod psiParentMethod, @NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiBuilderClass); diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java index 0b1ddd878..df519407f 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java @@ -3,7 +3,7 @@ import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiType; import com.intellij.psi.PsiVariable; -import de.plushnikov.intellij.plugin.util.PsiTypeUtil; +import com.intellij.psi.impl.source.PsiClassReferenceType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -66,7 +66,7 @@ public static BuilderElementHandler getHandlerFor(@NotNull PsiVariable psiVariab } final PsiType psiType = psiVariable.getType(); - final String qualifiedName = PsiTypeUtil.getQualifiedName(psiType); + final String qualifiedName = ((PsiClassReferenceType) psiType).getClassName();//PsiTypeUtil.getQualifiedName(psiType); if (!isInvalidSingularType(qualifiedName)) { if (containsOrAnyEndsWith(COLLECTION_TYPES, qualifiedName)) { return new SingularCollectionHandler(qualifiedName); diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java index 75599e80c..ea603aa2e 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java @@ -68,6 +68,12 @@ public static AccessLevel getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @ return VALUE_ACCESS_LEVEL_MAP.computeIfAbsent(annotationValue, p -> AccessLevel.NONE); } +// @Nullable +// public static String getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { +// final String annotationValue = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, parameter); +// return annotationValue == null ? null : VALUE_ACCESS_LEVEL_MAP.get(annotationValue); +// } + public static boolean isLevelVisible(@NotNull PsiAnnotation psiAnnotation) { return null != getLevelVisibility(psiAnnotation); } diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java index 6294869a8..5de89c22e 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java @@ -142,8 +142,9 @@ private void compareInitializers(PsiExpression beforeInitializer, PsiExpression private void compareType(PsiType beforeType, PsiType afterType, PomNamedTarget whereTarget) { if (null != beforeType && null != afterType) { - final String afterText = stripJavaLang(afterType.getCanonicalText()); - final String beforeText = stripJavaLang(beforeType.getCanonicalText()); + //TODO fix me ? + final String afterText = stripJavaLang(afterType.toString()); + final String beforeText = stripJavaLang(beforeType.toString()); assertEquals(String.format("Types are not equal for element: %s", whereTarget.getName()), afterText, beforeText); } } @@ -162,7 +163,7 @@ private void compareModifiers(PsiModifierList beforeModifierList, PsiModifierLis for (String modifier : PsiModifier.MODIFIERS) { boolean haveSameModifiers = afterModifierList.hasModifierProperty(modifier) == beforeModifierList.hasModifierProperty(modifier); - assertTrue("'" + modifier + "' Modifier is not equal for: " + elementName, haveSameModifiers); + assertTrue(modifier + " Modifier is not equal for " + elementName, haveSameModifiers); } if (shouldCompareAnnotations()) { From 95849269326ee1d74be3eb0309649197a0612da8 Mon Sep 17 00:00:00 2001 From: mplushnikov Date: Mon, 5 Oct 2020 20:55:04 +0200 Subject: [PATCH 25/47] Next steps to implement nameHint handling: - implemented skipping entire processor if nameHint is eqaul to simplename of corresponding annotation - implemented Lazy fields and methods calculations of generated PsiClasses (Builder/SuperBuilder and FieldNameConstants) TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests - optimize lazy builder implementation --- .../plushnikov/intellij/plugin/processor/Processor.java | 2 ++ .../intellij/plugin/processor/ValProcessor.java | 9 +++++++++ .../plugin/processor/clazz/AbstractClassProcessor.java | 1 - .../handler/singular/SingularHandlerFactory.java | 4 ++-- .../intellij/plugin/AbstractLombokParsingTestCase.java | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java index df347629b..3de56f2ae 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java @@ -8,6 +8,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.annotation.Annotation; +import java.util.Arrays; import java.util.Arrays; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java index fae7166e7..46b2f508c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java @@ -11,6 +11,10 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.codeInsight.daemon.impl.analysis.*; +import com.intellij.codeInspection.*; +import com.intellij.openapi.project.*; +import com.intellij.openapi.util.*; import com.intellij.psi.*; import com.intellij.psi.impl.source.JavaVarTypeUtil; import de.plushnikov.intellij.plugin.LombokBundle; @@ -18,6 +22,11 @@ import de.plushnikov.intellij.plugin.problem.LombokProblem; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import com.intellij.psi.impl.source.*; +import de.plushnikov.intellij.plugin.problem.*; +import de.plushnikov.intellij.plugin.settings.*; +import lombok.*; +import org.jetbrains.annotations.*; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index eef0dde53..d40530471 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -9,7 +9,6 @@ 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.psi.LombokLightClassBuilder; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java index df519407f..0b1ddd878 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/singular/SingularHandlerFactory.java @@ -3,7 +3,7 @@ import com.intellij.psi.CommonClassNames; import com.intellij.psi.PsiType; import com.intellij.psi.PsiVariable; -import com.intellij.psi.impl.source.PsiClassReferenceType; +import de.plushnikov.intellij.plugin.util.PsiTypeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -66,7 +66,7 @@ public static BuilderElementHandler getHandlerFor(@NotNull PsiVariable psiVariab } final PsiType psiType = psiVariable.getType(); - final String qualifiedName = ((PsiClassReferenceType) psiType).getClassName();//PsiTypeUtil.getQualifiedName(psiType); + final String qualifiedName = PsiTypeUtil.getQualifiedName(psiType); if (!isInvalidSingularType(qualifiedName)) { if (containsOrAnyEndsWith(COLLECTION_TYPES, qualifiedName)) { return new SingularCollectionHandler(qualifiedName); diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java index 5de89c22e..4012bb892 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java @@ -163,7 +163,7 @@ private void compareModifiers(PsiModifierList beforeModifierList, PsiModifierLis for (String modifier : PsiModifier.MODIFIERS) { boolean haveSameModifiers = afterModifierList.hasModifierProperty(modifier) == beforeModifierList.hasModifierProperty(modifier); - assertTrue(modifier + " Modifier is not equal for " + elementName, haveSameModifiers); + assertTrue("'" + modifier + "' Modifier is not equal for: " + elementName, haveSameModifiers); } if (shouldCompareAnnotations()) { From 270c56b754fe807f85df5edf8f0ddda9ddd8a97e Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Fri, 16 Oct 2020 20:00:49 +0200 Subject: [PATCH 26/47] Next steps to implement nameHint handling: - tried with new fix intellij version from peter gromov, all exceptions gone! TODO: - implement all of possibleToGenerateElementNamed() logic - fix all failing tests --- .../intellij/plugin/processor/clazz/AbstractClassProcessor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index d40530471..eef0dde53 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -9,6 +9,7 @@ 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.psi.LombokLightClassBuilder; From d834cdc7d66bbea2f2cd435e1bffb0dbf1cf41ff Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 18 Oct 2020 17:16:55 +0200 Subject: [PATCH 27/47] rebased on master and removed obsolete code TODO: One Test is failing --- .../intellij/plugin/processor/Processor.java | 6 +++-- .../plugin/processor/ValProcessor.java | 9 -------- .../processor/handler/BuilderHandler.java | 1 + .../plugin/psi/LombokLightClassBuilder.java | 6 +++-- .../plugin/util/LombokProcessorUtil.java | 13 ++++------- .../plugin/util/PsiAnnotationSearchUtil.java | 22 ------------------- .../plugin/util/PsiAnnotationUtil.java | 4 ++-- .../configsystem/FieldDefaultsTest.java | 18 +++++++-------- 8 files changed, 23 insertions(+), 56 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java index 3de56f2ae..7cd887051 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java @@ -1,5 +1,7 @@ package de.plushnikov.intellij.plugin.processor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -8,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.Arrays; import java.util.Collection; @@ -29,7 +30,8 @@ public interface Processor { Collection verifyAnnotation(@NotNull PsiAnnotation psiAnnotation); default boolean notNameHintIsEqualToSupportedAnnotation(@Nullable String nameHint) { - return null == nameHint || (!"lombok".equals(nameHint) && Arrays.stream(getSupportedAnnotationClasses()).map(Class::getSimpleName).noneMatch(nameHint::equals)); + return null == nameHint || (!"lombok".equals(nameHint) && Arrays.stream(getSupportedAnnotationClasses()) + .map(StringUtil::getShortName).noneMatch(nameHint::equals)); } @NotNull diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java index 46b2f508c..fae7166e7 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java @@ -11,10 +11,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.codeInsight.daemon.impl.analysis.*; -import com.intellij.codeInspection.*; -import com.intellij.openapi.project.*; -import com.intellij.openapi.util.*; import com.intellij.psi.*; import com.intellij.psi.impl.source.JavaVarTypeUtil; import de.plushnikov.intellij.plugin.LombokBundle; @@ -22,11 +18,6 @@ import de.plushnikov.intellij.plugin.problem.LombokProblem; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import com.intellij.psi.impl.source.*; -import de.plushnikov.intellij.plugin.problem.*; -import de.plushnikov.intellij.plugin.settings.*; -import lombok.*; -import org.jetbrains.annotations.*; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java index f0c4be16b..5b5c03509 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java @@ -7,6 +7,7 @@ import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.LombokClassNames; import com.intellij.psi.impl.source.PsiClassReferenceType; +import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.lombokconfig.ConfigDiscovery; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; import de.plushnikov.intellij.plugin.processor.clazz.ToStringProcessor; diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java index 4d910cf94..450889819 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java @@ -10,8 +10,10 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; -import java.util.*; -import java.util.function.*; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.function.Supplier; import java.util.stream.Stream; public class LombokLightClassBuilder extends LightPsiClassBuilder implements PsiExtensibleClass, SyntheticElement { diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java index ea603aa2e..1558cd1c0 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java @@ -23,15 +23,16 @@ public final class LombokProcessorUtil { @NonNls private static final String ACCESS_LEVEL_PROTECTED = "PROTECTED"; @NonNls private static final String ACCESS_LEVEL_PACKAGE_LOCAL = "PACKAGE"; @NonNls private static final String ACCESS_LEVEL_PUBLIC = "PUBLIC"; + @NonNls private static final String ACCESS_LEVEL_NONE = "NONE"; - private static final Map ACCESS_LEVEL_MAP = new HashMap() {{ + private static final Map ACCESS_LEVEL_MAP = new HashMap<>() {{ put(PsiUtil.ACCESS_LEVEL_PUBLIC, ACCESS_LEVEL_PUBLIC); put(PsiUtil.ACCESS_LEVEL_PACKAGE_LOCAL, ACCESS_LEVEL_PACKAGE_LOCAL); put(PsiUtil.ACCESS_LEVEL_PROTECTED, ACCESS_LEVEL_PROTECTED); put(PsiUtil.ACCESS_LEVEL_PRIVATE, ACCESS_LEVEL_PRIVATE); }}; - private static final Map VALUE_ACCESS_LEVEL_MAP = new HashMap() {{ + private static final Map VALUE_ACCESS_LEVEL_MAP = new HashMap<>() {{ put(ACCESS_LEVEL_PUBLIC, PsiModifier.PUBLIC); put(ACCESS_LEVEL_PACKAGE_LOCAL, PsiModifier.PACKAGE_LOCAL); put(ACCESS_LEVEL_PROTECTED, PsiModifier.PROTECTED); @@ -59,7 +60,7 @@ public static String getLevelVisibility(@NotNull PsiAnnotation psiAnnotation) { @Nullable @PsiModifier.ModifierConstant private static String getLevelVisibility(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, AccessLevel.PUBLIC)); + return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, ACCESS_LEVEL_PUBLIC)); } @NotNull @@ -68,12 +69,6 @@ public static AccessLevel getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @ return VALUE_ACCESS_LEVEL_MAP.computeIfAbsent(annotationValue, p -> AccessLevel.NONE); } -// @Nullable -// public static String getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { -// final String annotationValue = PsiAnnotationUtil.getStringAnnotationValue(psiAnnotation, parameter); -// return annotationValue == null ? null : VALUE_ACCESS_LEVEL_MAP.get(annotationValue); -// } - public static boolean isLevelVisible(@NotNull PsiAnnotation psiAnnotation) { return null != getLevelVisibility(psiAnnotation); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java index 0e0a287e5..c1ff32270 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java @@ -27,28 +27,6 @@ public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModi return Stream.of(annotationFQNs).map(psiModifierListOwner::getAnnotation).filter(Objects::nonNull).findAny().orElse(null); } - @Nullable - public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class annotationType) { - return findAnnotation(psiModifierListOwner, annotationType.getName()); - } - - @Nullable - public static PsiAnnotation findAnnotation(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class... annotationTypes) { - if (annotationTypes.length == 1) { - return findAnnotation(psiModifierListOwner, annotationTypes[0]); - } - - final String[] qualifiedNames = new String[annotationTypes.length]; - for (int i = 0; i < annotationTypes.length; i++) { - qualifiedNames[i] = annotationTypes[i].getName(); - } - return findAnnotation(psiModifierListOwner, qualifiedNames); - } - - public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull final Class annotationType) { - return psiModifierListOwner.hasAnnotation(annotationType.getName()); - } - public static boolean isAnnotatedWith(@NotNull PsiModifierListOwner psiModifierListOwner, @NotNull String annotationFQN) { return psiModifierListOwner.hasAnnotation(annotationFQN); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java index 5313a30d4..0716c9ee8 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java @@ -74,10 +74,10 @@ public static String getStringAnnotationValue(@NotNull PsiAnnotation psiAnnotati return result != null ? result : defaultValue; } - public static String getEnumAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String attributeName, @NotNull Enum defaultValue) { + public static String getEnumAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String attributeName, @NotNull String defaultValue) { PsiAnnotationMemberValue attrValue = psiAnnotation.findDeclaredAttributeValue(attributeName); String result = attrValue != null ? resolveElementValue(attrValue, String.class) : null; - return result != null ? result : defaultValue.name(); + return result != null ? result : defaultValue; // doesn't work for definition using static import for Enum.value for example // PsiConstantEvaluationHelper evaluationHelper = JavaPsiFacade.getInstance(psiAnnotation.getProject()).getConstantEvaluationHelper(); // Object result = evaluationHelper.computeConstantExpression(attrValue); diff --git a/src/test/java/de/plushnikov/intellij/plugin/configsystem/FieldDefaultsTest.java b/src/test/java/de/plushnikov/intellij/plugin/configsystem/FieldDefaultsTest.java index 3cf968e4e..5e948af80 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/configsystem/FieldDefaultsTest.java +++ b/src/test/java/de/plushnikov/intellij/plugin/configsystem/FieldDefaultsTest.java @@ -1,7 +1,5 @@ package de.plushnikov.intellij.plugin.configsystem; -import java.io.IOException; - /** * Unit tests for IntelliJPlugin for Lombok with activated config system */ @@ -13,37 +11,37 @@ protected String getBasePath() { } //region DefaultFinal - public void testDefaultFinal$DefaultFinalFieldTest() throws IOException { + public void testDefaultFinal$DefaultFinalFieldTest() { doTest(); } - public void testDefaultFinal$DefaultFinalFieldWithFieldDefaultsTest() throws IOException { + public void testDefaultFinal$DefaultFinalFieldWithFieldDefaultsTest() { doTest(); } - public void testDefaultFinal$DefaultFinalFieldWithNonFinalTest() throws IOException { + public void testDefaultFinal$DefaultFinalFieldWithNonFinalTest() { doTest(); } - public void testDefaultFinal$DefaultFinalFieldWithUnrelatedFieldDefaultsTest() throws IOException { + public void testDefaultFinal$DefaultFinalFieldWithUnrelatedFieldDefaultsTest() { doTest(); } //endregion //region DefaultPrivate - public void testDefaultPrivate$DefaultPrivateFieldTest() throws IOException { + public void testDefaultPrivate$DefaultPrivateFieldTest() { doTest(); } - public void testDefaultPrivate$DefaultPrivateFieldWithFieldDefaultsTest() throws IOException { + public void testDefaultPrivate$DefaultPrivateFieldWithFieldDefaultsTest() { doTest(); } - public void testDefaultPrivate$DefaultPrivateFieldWithPackagePrivateTest() throws IOException { + public void testDefaultPrivate$DefaultPrivateFieldWithPackagePrivateTest() { doTest(); } - public void testDefaultPrivate$DefaultPrivateFieldWithUnrelatedFieldDefaultsTest() throws IOException { + public void testDefaultPrivate$DefaultPrivateFieldWithUnrelatedFieldDefaultsTest() { doTest(); } //endregion From fdb3349b2f4c73920b2048e79828d98354aa5802 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 26 Dec 2020 23:16:26 +0100 Subject: [PATCH 28/47] rebased --- .../processor/clazz/AbstractClassProcessor.java | 1 - .../intellij/plugin/settings/ProjectSettingsPage.java | 3 +-- .../intellij/plugin/util/LombokProcessorUtil.java | 11 +++-------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index eef0dde53..6bd61698c 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -5,7 +5,6 @@ import com.intellij.psi.util.PsiTreeUtil; import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.LombokClassNames; -import de.plushnikov.intellij.plugin.LombokNames; import de.plushnikov.intellij.plugin.lombokconfig.ConfigKey; import de.plushnikov.intellij.plugin.problem.LombokProblem; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; diff --git a/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java b/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java index d191aed44..7bab1a33a 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java +++ b/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java @@ -65,8 +65,7 @@ public void apply() { LombokProcessorProvider lombokProcessorProvider = myProject.getService(LombokProcessorProvider.class); lombokProcessorProvider.initProcessors(); - // Redo code checking and highlighting. - LombokAugmentProvider.onConfigChange(); + PsiManager.getInstance(myProject).dropPsiCaches(); DaemonCodeAnalyzer.getInstance(myProject).restart(); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java index 1558cd1c0..6435f9d5d 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java @@ -14,11 +14,6 @@ */ public final class LombokProcessorUtil { - @NonNls private static final String ACCESS_LEVEL_PRIVATE = "PRIVATE"; - @NonNls private static final String ACCESS_LEVEL_PROTECTED = "PROTECTED"; - @NonNls private static final String ACCESS_LEVEL_PACKAGE_LOCAL = "PACKAGE"; - @NonNls private static final String ACCESS_LEVEL_PUBLIC = "PUBLIC"; - @NonNls private static final String ACCESS_LEVEL_PRIVATE = "PRIVATE"; @NonNls private static final String ACCESS_LEVEL_PROTECTED = "PROTECTED"; @NonNls private static final String ACCESS_LEVEL_PACKAGE_LOCAL = "PACKAGE"; @@ -64,9 +59,9 @@ private static String getLevelVisibility(@NotNull PsiAnnotation psiAnnotation, @ } @NotNull - public static AccessLevel getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - final String annotationValue = PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, AccessLevel.NONE); - return VALUE_ACCESS_LEVEL_MAP.computeIfAbsent(annotationValue, p -> AccessLevel.NONE); + public static String getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { + final String annotationValue = PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, ACCESS_LEVEL_NONE); + return VALUE_ACCESS_LEVEL_MAP.computeIfAbsent(annotationValue, p -> ACCESS_LEVEL_NONE); } public static boolean isLevelVisible(@NotNull PsiAnnotation psiAnnotation) { From 608a61a1927c9a4006e3ef8b952127d4f61c6461 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 27 Dec 2020 00:32:22 +0100 Subject: [PATCH 29/47] fixed test problems --- .../plugin/util/LombokProcessorUtil.java | 23 ++++++++++++------- ...bstractLombokLightCodeInsightTestCase.java | 4 ---- .../plugin/AbstractLombokParsingTestCase.java | 5 ++-- .../inspection/LombokInspectionTest.java | 3 --- .../afterBuilderAtConstructorSimple.java | 4 ++-- .../builder/afterBuilderAtMethodSimple.java | 4 ++-- .../builder/afterBuilderSingularMap.java | 6 ++--- 7 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java index 6435f9d5d..f25adb5d3 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/LombokProcessorUtil.java @@ -14,11 +14,16 @@ */ public final class LombokProcessorUtil { - @NonNls private static final String ACCESS_LEVEL_PRIVATE = "PRIVATE"; - @NonNls private static final String ACCESS_LEVEL_PROTECTED = "PROTECTED"; - @NonNls private static final String ACCESS_LEVEL_PACKAGE_LOCAL = "PACKAGE"; - @NonNls private static final String ACCESS_LEVEL_PUBLIC = "PUBLIC"; - @NonNls private static final String ACCESS_LEVEL_NONE = "NONE"; + @NonNls + private static final String ACCESS_LEVEL_PRIVATE = "PRIVATE"; + @NonNls + private static final String ACCESS_LEVEL_PROTECTED = "PROTECTED"; + @NonNls + private static final String ACCESS_LEVEL_PACKAGE_LOCAL = "PACKAGE"; + @NonNls + private static final String ACCESS_LEVEL_PUBLIC = "PUBLIC"; + @NonNls + private static final String ACCESS_LEVEL_NONE = "NONE"; private static final Map ACCESS_LEVEL_MAP = new HashMap<>() {{ put(PsiUtil.ACCESS_LEVEL_PUBLIC, ACCESS_LEVEL_PUBLIC); @@ -34,6 +39,8 @@ public final class LombokProcessorUtil { put(ACCESS_LEVEL_PRIVATE, PsiModifier.PRIVATE); }}; + private static final String NULL_DEFAULT = "@@@NULL@@@"; + @Nullable @PsiModifier.ModifierConstant public static String getMethodModifier(@NotNull PsiAnnotation psiAnnotation) { @@ -58,10 +65,10 @@ private static String getLevelVisibility(@NotNull PsiAnnotation psiAnnotation, @ return convertAccessLevelToJavaModifier(PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, ACCESS_LEVEL_PUBLIC)); } - @NotNull + @Nullable public static String getAccessLevel(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - final String annotationValue = PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, ACCESS_LEVEL_NONE); - return VALUE_ACCESS_LEVEL_MAP.computeIfAbsent(annotationValue, p -> ACCESS_LEVEL_NONE); + final String annotationValue = PsiAnnotationUtil.getEnumAnnotationValue(psiAnnotation, parameter, NULL_DEFAULT); + return NULL_DEFAULT.equals(annotationValue) ? null : VALUE_ACCESS_LEVEL_MAP.get(annotationValue); } public static boolean isLevelVisible(@NotNull PsiAnnotation psiAnnotation) { diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java index 342aca30a..8c05c8205 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokLightCodeInsightTestCase.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin; -import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -36,9 +35,6 @@ public void setUp() throws Exception { super.setUp(); loadLombokLibrary(); - - //TODO disable assertions for the moment - RecursionManager.disableMissedCacheAssertions(myFixture.getProjectDisposable()); } protected void loadLombokLibrary() { diff --git a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java index 4012bb892..6294869a8 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java +++ b/src/test/java/de/plushnikov/intellij/plugin/AbstractLombokParsingTestCase.java @@ -142,9 +142,8 @@ private void compareInitializers(PsiExpression beforeInitializer, PsiExpression private void compareType(PsiType beforeType, PsiType afterType, PomNamedTarget whereTarget) { if (null != beforeType && null != afterType) { - //TODO fix me ? - final String afterText = stripJavaLang(afterType.toString()); - final String beforeText = stripJavaLang(beforeType.toString()); + final String afterText = stripJavaLang(afterType.getCanonicalText()); + final String beforeText = stripJavaLang(beforeType.getCanonicalText()); assertEquals(String.format("Types are not equal for element: %s", whereTarget.getName()), afterText, beforeText); } } diff --git a/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java b/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java index 2a59b3a44..18b6968d3 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java +++ b/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java @@ -17,9 +17,6 @@ public void setUp() throws Exception { LombokTestUtil.loadLombokLibrary(myFixture.getProjectDisposable(), getModule()); Registry.get("platform.random.idempotence.check.rate").setValue(1, getTestRootDisposable()); - - //TODO disable assertions for the moment - RecursionManager.disableMissedCacheAssertions(myFixture.getProjectDisposable()); } @NotNull diff --git a/testData/action/delombok/builder/afterBuilderAtConstructorSimple.java b/testData/action/delombok/builder/afterBuilderAtConstructorSimple.java index 9132ce654..0092be3b2 100644 --- a/testData/action/delombok/builder/afterBuilderAtConstructorSimple.java +++ b/testData/action/delombok/builder/afterBuilderAtConstructorSimple.java @@ -23,12 +23,12 @@ public static class BuilderAtConstructorSimpleBuilder { BuilderAtConstructorSimpleBuilder() { } - public BuilderAtConstructorSimple.BuilderAtConstructorSimpleBuilder myInt(int myInt) { + public BuilderAtConstructorSimpleBuilder myInt(int myInt) { this.myInt = myInt; return this; } - public BuilderAtConstructorSimple.BuilderAtConstructorSimpleBuilder myString(String myString) { + public BuilderAtConstructorSimpleBuilder myString(String myString) { this.myString = myString; return this; } diff --git a/testData/action/delombok/builder/afterBuilderAtMethodSimple.java b/testData/action/delombok/builder/afterBuilderAtMethodSimple.java index c7c49b521..60bb5dd56 100644 --- a/testData/action/delombok/builder/afterBuilderAtMethodSimple.java +++ b/testData/action/delombok/builder/afterBuilderAtMethodSimple.java @@ -25,12 +25,12 @@ public static class BuilderAtMethodSimpleBuilder { BuilderAtMethodSimpleBuilder() { } - public BuilderAtMethodSimple.BuilderAtMethodSimpleBuilder myInt(int myInt) { + public BuilderAtMethodSimpleBuilder myInt(int myInt) { this.myInt = myInt; return this; } - public BuilderAtMethodSimple.BuilderAtMethodSimpleBuilder myString(String myString) { + public BuilderAtMethodSimpleBuilder myString(String myString) { this.myString = myString; return this; } diff --git a/testData/action/delombok/builder/afterBuilderSingularMap.java b/testData/action/delombok/builder/afterBuilderSingularMap.java index 95f6ad335..adcc02b56 100644 --- a/testData/action/delombok/builder/afterBuilderSingularMap.java +++ b/testData/action/delombok/builder/afterBuilderSingularMap.java @@ -20,7 +20,7 @@ public static class BuilderSingularMapBuilder { BuilderSingularMapBuilder() { } - public BuilderSingularMap.BuilderSingularMapBuilder myMap(String myMapKey, String myMapValue) { + public BuilderSingularMapBuilder myMap(String myMapKey, String myMapValue) { if (this.myMap$key == null) { this.myMap$key = new ArrayList(); this.myMap$value = new ArrayList(); @@ -30,7 +30,7 @@ public BuilderSingularMap.BuilderSingularMapBuilder myMap(String myMapKey, Strin return this; } - public BuilderSingularMap.BuilderSingularMapBuilder myMap(Map myMap) { + public BuilderSingularMapBuilder myMap(Map myMap) { if (this.myMap$key == null) { this.myMap$key = new ArrayList(); this.myMap$value = new ArrayList(); @@ -42,7 +42,7 @@ public BuilderSingularMap.BuilderSingularMapBuilder myMap(Map Date: Sun, 27 Dec 2020 00:33:50 +0100 Subject: [PATCH 30/47] fixed merge problem --- .../de/plushnikov/intellij/plugin/action/BaseRefactorHandler.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/de/plushnikov/intellij/plugin/action/BaseRefactorHandler.java diff --git a/src/main/java/de/plushnikov/intellij/plugin/action/BaseRefactorHandler.java b/src/main/java/de/plushnikov/intellij/plugin/action/BaseRefactorHandler.java deleted file mode 100644 index e69de29bb..000000000 From c2594d7587d71fbe71c772f085f14da45eee41c9 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 27 Dec 2020 00:37:19 +0100 Subject: [PATCH 31/47] cleanup imports --- .../delombok/AbstractDelombokAction.java | 1 - .../action/lombok/LombokGetterHandler.java | 1 - .../action/lombok/LombokSetterHandler.java | 1 - .../intellij/plugin/hack/AgentInjector.java | 13 +++-- .../intellij/plugin/hack/Injector.java | 4 +- .../plushnikov/intellij/plugin/hack/JNI.java | 12 +--- .../extension/ExtensionMethodHandler.java | 56 ++++--------------- .../extension/ExtensionMethodSupport.java | 28 ++++------ .../valvar/AbstractValVarIntentionAction.java | 1 - ...riableWithExplicitTypeIntentionAction.java | 1 - .../plugin/lombokconfig/ConfigDiscovery.java | 1 - .../lombokconfig/LombokConfigIndex.java | 5 +- .../intellij/plugin/processor/Processor.java | 2 - .../plugin/processor/ValProcessor.java | 6 -- ...tBuilderPreDefinedInnerClassProcessor.java | 2 - ...rBuilderPreDefinedInnerClassProcessor.java | 2 - .../clazz/builder/BuilderProcessor.java | 2 - .../builder/SuperBuilderClassProcessor.java | 2 - .../clazz/builder/SuperBuilderProcessor.java | 2 - .../processor/handler/BuilderHandler.java | 3 +- .../method/BuilderClassMethodProcessor.java | 2 - .../method/BuilderMethodProcessor.java | 2 - .../plugin/settings/ProjectSettingsPage.java | 3 - .../plugin/util/PsiAnnotationSearchUtil.java | 2 - 24 files changed, 37 insertions(+), 117 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/action/delombok/AbstractDelombokAction.java b/src/main/java/de/plushnikov/intellij/plugin/action/delombok/AbstractDelombokAction.java index 3cc1bd51a..a52f8d19f 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/action/delombok/AbstractDelombokAction.java +++ b/src/main/java/de/plushnikov/intellij/plugin/action/delombok/AbstractDelombokAction.java @@ -20,7 +20,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.stream.Stream; public abstract class AbstractDelombokAction extends AnAction { private DelombokHandler myHandler; diff --git a/src/main/java/de/plushnikov/intellij/plugin/action/lombok/LombokGetterHandler.java b/src/main/java/de/plushnikov/intellij/plugin/action/lombok/LombokGetterHandler.java index 8a478abc8..1d868a3ec 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/action/lombok/LombokGetterHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/action/lombok/LombokGetterHandler.java @@ -4,7 +4,6 @@ import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; -import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PropertyUtilBase; import de.plushnikov.intellij.plugin.LombokClassNames; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/plushnikov/intellij/plugin/action/lombok/LombokSetterHandler.java b/src/main/java/de/plushnikov/intellij/plugin/action/lombok/LombokSetterHandler.java index f86506933..c2c3ca9db 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/action/lombok/LombokSetterHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/action/lombok/LombokSetterHandler.java @@ -4,7 +4,6 @@ import com.intellij.psi.PsiField; import com.intellij.psi.PsiMethod; import com.intellij.psi.PsiModifier; -import com.intellij.psi.util.PropertyUtil; import com.intellij.psi.util.PropertyUtilBase; import de.plushnikov.intellij.plugin.LombokClassNames; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/plushnikov/intellij/plugin/hack/AgentInjector.java b/src/main/java/de/plushnikov/intellij/plugin/hack/AgentInjector.java index ddad2870b..53499ad0f 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/hack/AgentInjector.java +++ b/src/main/java/de/plushnikov/intellij/plugin/hack/AgentInjector.java @@ -1,9 +1,10 @@ package de.plushnikov.intellij.plugin.hack; +import com.sun.jna.Platform; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.jar.Attributes; @@ -11,13 +12,13 @@ import java.util.jar.JarOutputStream; import java.util.jar.Manifest; -import com.sun.jna.Platform; - -import static java.io.File.*; -import static java.nio.file.StandardOpenOption.*; +import static java.io.File.pathSeparator; +import static java.io.File.separator; +import static java.nio.file.StandardOpenOption.CREATE; +import static java.nio.file.StandardOpenOption.WRITE; public class AgentInjector { - + static { if (Platform.isMac()) { final String key = "jna.library.path", home = System.getProperty("java.home"), lib = home + separator + "lib", server = lib + separator + "server"; diff --git a/src/main/java/de/plushnikov/intellij/plugin/hack/Injector.java b/src/main/java/de/plushnikov/intellij/plugin/hack/Injector.java index 482bd1ca3..83ac7d7b6 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/hack/Injector.java +++ b/src/main/java/de/plushnikov/intellij/plugin/hack/Injector.java @@ -1,10 +1,10 @@ package de.plushnikov.intellij.plugin.hack; +import org.jetbrains.annotations.Nullable; + import java.lang.instrument.Instrumentation; import java.lang.reflect.Field; -import org.jetbrains.annotations.Nullable; - public class Injector { private static volatile transient @Nullable Instrumentation instrumentation; diff --git a/src/main/java/de/plushnikov/intellij/plugin/hack/JNI.java b/src/main/java/de/plushnikov/intellij/plugin/hack/JNI.java index 0ba86026a..f3b4df7e5 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/hack/JNI.java +++ b/src/main/java/de/plushnikov/intellij/plugin/hack/JNI.java @@ -1,18 +1,12 @@ package de.plushnikov.intellij.plugin.hack; -import java.util.function.Function; - -import com.sun.jna.Callback; -import com.sun.jna.LastErrorException; -import com.sun.jna.Library; -import com.sun.jna.Native; -import com.sun.jna.Pointer; -import com.sun.jna.Structure; +import com.sun.jna.*; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.PointerByReference; - import org.jetbrains.annotations.Nullable; +import java.util.function.Function; + public interface JNI extends Library { JNI INSTANCE = Native.load("jvm", JNI.class); diff --git a/src/main/java/de/plushnikov/intellij/plugin/hack/extension/ExtensionMethodHandler.java b/src/main/java/de/plushnikov/intellij/plugin/hack/extension/ExtensionMethodHandler.java index 1ec550540..eac60316b 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/hack/extension/ExtensionMethodHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/hack/extension/ExtensionMethodHandler.java @@ -1,59 +1,17 @@ package de.plushnikov.intellij.plugin.hack.extension; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - +import com.google.common.collect.MapMaker; import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Pair; -import com.intellij.openapi.util.registry.Registry; import com.intellij.pom.java.LanguageLevel; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiAnnotation; -import com.intellij.psi.PsiArrayType; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiClassType; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiMethodCallExpression; -import com.intellij.psi.PsiMethodReferenceExpression; -import com.intellij.psi.PsiModifier; -import com.intellij.psi.PsiParameter; -import com.intellij.psi.PsiPrimitiveType; -import com.intellij.psi.PsiReferenceExpression; -import com.intellij.psi.PsiResolveHelper; -import com.intellij.psi.PsiSubstitutor; -import com.intellij.psi.PsiType; -import com.intellij.psi.PsiTypeParameter; -import com.intellij.psi.PsiTypeVisitor; -import com.intellij.psi.PsiWildcardType; -import com.intellij.psi.ResolveState; +import com.intellij.psi.*; import com.intellij.psi.impl.source.PsiImmediateClassType; import com.intellij.psi.scope.ElementClassHint; import com.intellij.psi.scope.NameHint; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.scope.processor.MethodResolverProcessor; -import com.intellij.psi.util.CachedValueProvider; -import com.intellij.psi.util.CachedValuesManager; -import com.intellij.psi.util.InheritanceUtil; -import com.intellij.psi.util.MethodSignatureBackedByPsiMethod; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiTypesUtil; -import com.intellij.psi.util.PsiUtil; -import com.intellij.psi.util.TypeConversionUtil; - -import com.google.common.collect.MapMaker; +import com.intellij.psi.util.*; import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.psi.LombokLightMethodBuilder; import de.plushnikov.intellij.plugin.psi.LombokLightParameter; @@ -63,8 +21,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + public class ExtensionMethodHandler { - + public static boolean isEnabled(@NotNull Project project) { return ProjectSettings.isEnabled(project, ProjectSettings.IS_EXTENSION_METHOD_ENABLED); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/hack/extension/ExtensionMethodSupport.java b/src/main/java/de/plushnikov/intellij/plugin/hack/extension/ExtensionMethodSupport.java index 5152e9e88..0dfcc41ff 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/hack/extension/ExtensionMethodSupport.java +++ b/src/main/java/de/plushnikov/intellij/plugin/hack/extension/ExtensionMethodSupport.java @@ -1,5 +1,15 @@ package de.plushnikov.intellij.plugin.hack.extension; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.ResolveState; +import com.intellij.psi.impl.PsiClassImplUtil; +import com.intellij.psi.scope.PsiScopeProcessor; +import de.plushnikov.intellij.plugin.hack.Injector; +import org.jetbrains.org.objectweb.asm.ClassReader; +import org.jetbrains.org.objectweb.asm.ClassWriter; +import org.jetbrains.org.objectweb.asm.tree.*; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -16,24 +26,6 @@ import java.util.List; import java.util.ListIterator; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.ResolveState; -import com.intellij.psi.impl.PsiClassImplUtil; -import com.intellij.psi.scope.PsiScopeProcessor; - -import de.plushnikov.intellij.plugin.hack.Injector; -import org.jetbrains.org.objectweb.asm.ClassReader; -import org.jetbrains.org.objectweb.asm.ClassWriter; -import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode; -import org.jetbrains.org.objectweb.asm.tree.ClassNode; -import org.jetbrains.org.objectweb.asm.tree.FieldInsnNode; -import org.jetbrains.org.objectweb.asm.tree.InsnList; -import org.jetbrains.org.objectweb.asm.tree.InsnNode; -import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode; -import org.jetbrains.org.objectweb.asm.tree.MethodNode; -import org.jetbrains.org.objectweb.asm.tree.VarInsnNode; - import static org.jetbrains.org.objectweb.asm.Opcodes.*; public class ExtensionMethodSupport { diff --git a/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/AbstractValVarIntentionAction.java b/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/AbstractValVarIntentionAction.java index 9a10ca77f..afcc754fa 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/AbstractValVarIntentionAction.java +++ b/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/AbstractValVarIntentionAction.java @@ -7,7 +7,6 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import de.plushnikov.intellij.plugin.intention.AbstractLombokIntentionAction; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; public abstract class AbstractValVarIntentionAction extends AbstractLombokIntentionAction implements LowPriorityAction { diff --git a/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/from/AbstractReplaceVariableWithExplicitTypeIntentionAction.java b/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/from/AbstractReplaceVariableWithExplicitTypeIntentionAction.java index 32c2df821..41a24d19d 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/from/AbstractReplaceVariableWithExplicitTypeIntentionAction.java +++ b/src/main/java/de/plushnikov/intellij/plugin/intention/valvar/from/AbstractReplaceVariableWithExplicitTypeIntentionAction.java @@ -7,7 +7,6 @@ import com.intellij.psi.util.PsiTypesUtil; import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.LombokClassNames; -import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.intention.valvar.AbstractValVarIntentionAction; import de.plushnikov.intellij.plugin.processor.ValProcessor; import org.jetbrains.annotations.Nls; diff --git a/src/main/java/de/plushnikov/intellij/plugin/lombokconfig/ConfigDiscovery.java b/src/main/java/de/plushnikov/intellij/plugin/lombokconfig/ConfigDiscovery.java index 2026bdae2..74b428326 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/lombokconfig/ConfigDiscovery.java +++ b/src/main/java/de/plushnikov/intellij/plugin/lombokconfig/ConfigDiscovery.java @@ -4,7 +4,6 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; diff --git a/src/main/java/de/plushnikov/intellij/plugin/lombokconfig/LombokConfigIndex.java b/src/main/java/de/plushnikov/intellij/plugin/lombokconfig/LombokConfigIndex.java index dbdd473f2..2c29db3b6 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/lombokconfig/LombokConfigIndex.java +++ b/src/main/java/de/plushnikov/intellij/plugin/lombokconfig/LombokConfigIndex.java @@ -6,7 +6,10 @@ import com.intellij.util.PathUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.indexing.*; -import com.intellij.util.io.*; +import com.intellij.util.io.DataExternalizer; +import com.intellij.util.io.EnumDataDescriptor; +import com.intellij.util.io.EnumeratorStringDescriptor; +import com.intellij.util.io.KeyDescriptor; import de.plushnikov.intellij.plugin.language.LombokConfigFileType; import de.plushnikov.intellij.plugin.language.psi.LombokConfigCleaner; import de.plushnikov.intellij.plugin.language.psi.LombokConfigFile; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java index 7cd887051..608d26263 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin.processor; -import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; @@ -10,7 +9,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; import java.util.Arrays; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java index fae7166e7..577e556e6 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/ValProcessor.java @@ -5,12 +5,6 @@ import com.intellij.codeInspection.ProblemsHolder; import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.codeInsight.daemon.impl.analysis.JavaGenericsUtil; -import com.intellij.codeInspection.ProblemHighlightType; -import com.intellij.codeInspection.ProblemsHolder; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.RecursionManager; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.impl.source.JavaVarTypeUtil; import de.plushnikov.intellij.plugin.LombokBundle; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java index 1f5527a4c..e43248a27 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin.processor.clazz.builder; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -10,7 +9,6 @@ import de.plushnikov.intellij.plugin.problem.ProblemEmptyBuilder; import de.plushnikov.intellij.plugin.processor.clazz.AbstractClassProcessor; import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java index 119de8a5f..ac65203d5 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/AbstractSuperBuilderPreDefinedInnerClassProcessor.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin.processor.clazz.builder; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -9,7 +8,6 @@ import de.plushnikov.intellij.plugin.problem.ProblemEmptyBuilder; import de.plushnikov.intellij.plugin.processor.clazz.AbstractClassProcessor; import de.plushnikov.intellij.plugin.processor.handler.SuperBuilderHandler; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderProcessor.java index 3a2b98cf4..2c3141498 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/BuilderProcessor.java @@ -1,7 +1,6 @@ package de.plushnikov.intellij.plugin.processor.clazz.builder; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; import com.intellij.psi.*; import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; @@ -9,7 +8,6 @@ import de.plushnikov.intellij.plugin.processor.clazz.AbstractClassProcessor; import de.plushnikov.intellij.plugin.processor.clazz.constructor.AllArgsConstructorProcessor; import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderClassProcessor.java index 612e41149..1f2ad7236 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderClassProcessor.java @@ -1,7 +1,6 @@ package de.plushnikov.intellij.plugin.processor.clazz.builder; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -10,7 +9,6 @@ import de.plushnikov.intellij.plugin.problem.ProblemBuilder; import de.plushnikov.intellij.plugin.processor.clazz.AbstractClassProcessor; import de.plushnikov.intellij.plugin.processor.handler.SuperBuilderHandler; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderProcessor.java index 61cfc76ee..241f224bd 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/builder/SuperBuilderProcessor.java @@ -1,14 +1,12 @@ package de.plushnikov.intellij.plugin.processor.clazz.builder; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; import com.intellij.psi.*; import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; import de.plushnikov.intellij.plugin.processor.LombokPsiElementUsage; import de.plushnikov.intellij.plugin.processor.clazz.AbstractClassProcessor; import de.plushnikov.intellij.plugin.processor.handler.SuperBuilderHandler; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; import java.util.Collection; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java index 5b5c03509..db6ee3a52 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/handler/BuilderHandler.java @@ -4,9 +4,8 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import de.plushnikov.intellij.plugin.LombokBundle; -import de.plushnikov.intellij.plugin.LombokClassNames; import com.intellij.psi.impl.source.PsiClassReferenceType; +import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.lombokconfig.ConfigDiscovery; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderClassMethodProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderClassMethodProcessor.java index e87f0568d..84bc9c145 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderClassMethodProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderClassMethodProcessor.java @@ -1,7 +1,6 @@ package de.plushnikov.intellij.plugin.processor.method; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -9,7 +8,6 @@ import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderMethodProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderMethodProcessor.java index 06451e53b..dfc05e486 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderMethodProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/method/BuilderMethodProcessor.java @@ -1,7 +1,6 @@ package de.plushnikov.intellij.plugin.processor.method; import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; @@ -9,7 +8,6 @@ import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.problem.ProblemBuilder; import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; -import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; import java.util.List; diff --git a/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java b/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java index 7bab1a33a..93011447e 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java +++ b/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java @@ -5,9 +5,6 @@ import com.intellij.openapi.options.SearchableConfigurable; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiManager; - -import de.plushnikov.intellij.plugin.Version; -import de.plushnikov.intellij.plugin.provider.LombokAugmentProvider; import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.provider.LombokProcessorProvider; import org.jetbrains.annotations.Nls; diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java index c1ff32270..0817877f2 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationSearchUtil.java @@ -8,8 +8,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.annotation.Annotation; -import java.util.Arrays; import java.util.Collection; import java.util.Objects; import java.util.regex.Pattern; From 6d074b0494abc5c30aff9a953d89ef0f0821ad91 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 27 Dec 2020 20:34:26 +0100 Subject: [PATCH 32/47] cleanup obsolete todos --- .../plugin/processor/clazz/AbstractClassProcessor.java | 2 -- .../plugin/processor/field/AbstractFieldProcessor.java | 2 -- .../plugin/processor/method/AbstractMethodProcessor.java | 1 - .../intellij/plugin/provider/LombokAugmentProvider.java | 2 +- src/main/resources/META-INF/plugin.xml | 5 ----- 5 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java index 6bd61698c..27edc9876 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/AbstractClassProcessor.java @@ -64,8 +64,6 @@ protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @Not return true; } - //TODO: implement handling - return true; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java index c479985b5..d742ff079 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/field/AbstractFieldProcessor.java @@ -60,8 +60,6 @@ protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @Not return true; } - //TODO: implement handling - return true; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java index 8a5f2eaf1..75da5e266 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/method/AbstractMethodProcessor.java @@ -59,7 +59,6 @@ protected boolean possibleToGenerateElementNamed(@Nullable String nameHint, @Not if (null == nameHint) { return true; } - //TODO: implement handling return true; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java index 4c4e6be1b..bb9551624 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java @@ -71,7 +71,7 @@ public List getAugments(@NotNull PsiElement elemen } @NotNull -// @Override available from 2020.2 + @Override public List getAugments(@NotNull PsiElement element, @NotNull final Class type, @Nullable String nameHint) { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index e9feb2f04..0a0e1dd67 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -290,11 +290,6 @@ - - - - - From e1d4577d6bd3ea0bef9f5b0cb7ad70642be4d164 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 26 Dec 2020 11:48:09 +0100 Subject: [PATCH 33/47] cleanup --- .../LombokProjectValidatorActivity.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java index 9a72b86e4..fe86e4bc7 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java +++ b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java @@ -21,7 +21,7 @@ import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.util.concurrency.AppExecutorUtil; -import com.intellij.util.messages.SimpleMessageBusConnection; +import com.intellij.util.messages.MessageBusConnection; import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.Version; import de.plushnikov.intellij.plugin.provider.LombokProcessorProvider; @@ -42,7 +42,7 @@ public class LombokProjectValidatorActivity implements StartupActivity.DumbAware @Override public void runActivity(@NotNull Project project) { // enable annotationProcessing check - final SimpleMessageBusConnection connection = project.getMessageBus().simpleConnect(); + final MessageBusConnection connection = project.getMessageBus().connect(); connection.subscribe(BuildManagerListener.TOPIC, new LombokBuildManagerListener()); LombokProcessorProvider lombokProcessorProvider = LombokProcessorProvider.getInstance(project); @@ -59,10 +59,9 @@ public void runActivity(@NotNull Project project) { if (null != lombokVersion && Version.compareVersionString(lombokVersion, Version.LAST_LOMBOK_VERSION) < 0) { return getNotificationGroup().createNotification(LombokBundle.message("config.warn.dependency.outdated.title"), - LombokBundle - .message("config.warn.dependency.outdated.message", project.getName(), - module.getName(), lombokVersion, Version.LAST_LOMBOK_VERSION), - NotificationType.WARNING, NotificationListener.URL_OPENING_LISTENER); + LombokBundle.message("config.warn.dependency.outdated.message", project.getName(), + module.getName(), lombokVersion, Version.LAST_LOMBOK_VERSION), + NotificationType.WARNING, NotificationListener.URL_OPENING_LISTENER); } } } @@ -71,7 +70,7 @@ public void runActivity(@NotNull Project project) { .finishOnUiThread(ModalityState.NON_MODAL, notification -> { if (notification != null) { Notifications.Bus.notify(notification, project); - Disposer.register(lombokProcessorProvider, () -> notification.expire()); + Disposer.register(lombokProcessorProvider, notification::expire); } }).submit(AppExecutorUtil.getAppExecutorService()); } @@ -95,11 +94,9 @@ public static boolean isVersionLessThan1_18_16(Project project) { Boolean isVersionLessThan; try { isVersionLessThan = ReadAction.nonBlocking(() -> isVersionLessThan1_18_16_Internal(project)).executeSynchronously(); - } - catch (ProcessCanceledException e) { + } catch (ProcessCanceledException e) { throw e; - } - catch (Throwable e) { + } catch (Throwable e) { isVersionLessThan = false; LOG.error(e); } From e195d1d6a4bfc60e6975a7785fa332b8b2b0ad4b Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 26 Dec 2020 13:52:32 +0100 Subject: [PATCH 34/47] [lombok] cleanup --- .../plushnikov/intellij/plugin/Version.java | 2 ++ .../LombokProjectValidatorActivity.java | 36 ++++++++++--------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/Version.java b/src/main/java/de/plushnikov/intellij/plugin/Version.java index f03cb5172..c1d82c3f9 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/Version.java +++ b/src/main/java/de/plushnikov/intellij/plugin/Version.java @@ -19,6 +19,8 @@ public interface Version { */ @NonNls String LAST_LOMBOK_VERSION = "1.18.16"; + @NonNls String LAST_LOMBOK_VERSION_WITH_JPS_FIX = "1.18.16"; + static boolean isLessThan(@Nullable OrderEntry orderEntry, @NotNull String version) { String lombokVersion = parseLombokVersion(orderEntry); return lombokVersion != null && compareVersionString(lombokVersion, version) < 0; diff --git a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java index fe86e4bc7..3efd07a8a 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java +++ b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java @@ -60,7 +60,7 @@ public void runActivity(@NotNull Project project) { if (null != lombokVersion && Version.compareVersionString(lombokVersion, Version.LAST_LOMBOK_VERSION) < 0) { return getNotificationGroup().createNotification(LombokBundle.message("config.warn.dependency.outdated.title"), LombokBundle.message("config.warn.dependency.outdated.message", project.getName(), - module.getName(), lombokVersion, Version.LAST_LOMBOK_VERSION), + module.getName(), lombokVersion, Version.LAST_LOMBOK_VERSION), NotificationType.WARNING, NotificationListener.URL_OPENING_LISTENER); } } @@ -89,29 +89,31 @@ public static boolean hasLombokLibrary(Project project) { } public static boolean isVersionLessThan1_18_16(Project project) { - return CachedValuesManager.getManager(project) - .getCachedValue(project, () -> { - Boolean isVersionLessThan; - try { - isVersionLessThan = ReadAction.nonBlocking(() -> isVersionLessThan1_18_16_Internal(project)).executeSynchronously(); - } catch (ProcessCanceledException e) { - throw e; - } catch (Throwable e) { - isVersionLessThan = false; - LOG.error(e); - } - return new CachedValueProvider.Result<>(isVersionLessThan, ProjectRootManager.getInstance(project)); - }); + return CachedValuesManager.getManager(project).getCachedValue(project, () -> { + Boolean isVersionLessThan; + try { + isVersionLessThan = ReadAction.nonBlocking( + () -> isVersionLessThanInternal(project, Version.LAST_LOMBOK_VERSION_WITH_JPS_FIX)) + .executeSynchronously(); + } catch (ProcessCanceledException e) { + throw e; + } catch (Throwable e) { + isVersionLessThan = false; + LOG.error(e); + } + return new CachedValueProvider.Result<>(isVersionLessThan, ProjectRootManager.getInstance(project)); + }); } - private static boolean isVersionLessThan1_18_16_Internal(@NotNull Project project) { + private static boolean isVersionLessThanInternal(@NotNull Project project, @NotNull String version) { PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage("lombok.experimental"); if (aPackage != null) { PsiDirectory[] directories = aPackage.getDirectories(); if (directories.length > 0) { - List entries = ProjectRootManager.getInstance(project).getFileIndex().getOrderEntriesForFile(directories[0].getVirtualFile()); + List entries = + ProjectRootManager.getInstance(project).getFileIndex().getOrderEntriesForFile(directories[0].getVirtualFile()); if (!entries.isEmpty()) { - return Version.isLessThan(entries.get(0), "1.18.16"); + return Version.isLessThan(entries.get(0), version); } } } From a46472a80c6996251186d6261671f064c537481f Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 26 Dec 2020 20:14:36 +0100 Subject: [PATCH 35/47] [lombok] IDEA-258295 lombok: inspections are traversing file in a simple project GitOrigin-RevId: 1897417d950c8c6309b3d19fccb1f71d50a8d57b --- .../delombok/AbstractDelombokAction.java | 4 ++-- .../action/lombok/BaseLombokAction.java | 4 ++-- .../activity/LombokBuildManagerListener.java | 3 ++- .../LombokProjectValidatorActivity.java | 12 ++-------- .../extension/LombokHighlightErrorFilter.java | 4 ++-- .../DeprecatedLombokAnnotationInspection.java | 7 ++---- .../plugin/inspection/LombokInspection.java | 7 +++--- .../inspection/LombokJavaInspectionBase.java | 24 +++++++++++++++++++ .../RedundantSlf4jDefinitionInspection.java | 7 +++--- .../LombokRedundantModifierInspection.java | 7 +++--- .../AbstractLombokIntentionAction.java | 4 ++-- .../provider/LombokAugmentProvider.java | 4 ++-- .../plugin/util/LombokLibraryUtil.java | 23 ++++++++++++++++++ 13 files changed, 72 insertions(+), 38 deletions(-) create mode 100644 src/main/java/de/plushnikov/intellij/plugin/inspection/LombokJavaInspectionBase.java create mode 100644 src/main/java/de/plushnikov/intellij/plugin/util/LombokLibraryUtil.java diff --git a/src/main/java/de/plushnikov/intellij/plugin/action/delombok/AbstractDelombokAction.java b/src/main/java/de/plushnikov/intellij/plugin/action/delombok/AbstractDelombokAction.java index a52f8d19f..ebcc5ea15 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/action/delombok/AbstractDelombokAction.java +++ b/src/main/java/de/plushnikov/intellij/plugin/action/delombok/AbstractDelombokAction.java @@ -14,7 +14,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilBase; import com.intellij.util.containers.ContainerUtil; -import de.plushnikov.intellij.plugin.activity.LombokProjectValidatorActivity; +import de.plushnikov.intellij.plugin.util.LombokLibraryUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -115,7 +115,7 @@ public void update(@NotNull AnActionEvent event) { final DataContext dataContext = event.getDataContext(); final Project project = event.getProject(); - if (project == null || !LombokProjectValidatorActivity.hasLombokLibrary(project)) { + if (project == null || !LombokLibraryUtil.hasLombokLibrary(project)) { presentation.setEnabled(false); return; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/action/lombok/BaseLombokAction.java b/src/main/java/de/plushnikov/intellij/plugin/action/lombok/BaseLombokAction.java index b076aa636..7a987bb97 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/action/lombok/BaseLombokAction.java +++ b/src/main/java/de/plushnikov/intellij/plugin/action/lombok/BaseLombokAction.java @@ -5,7 +5,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; -import de.plushnikov.intellij.plugin.activity.LombokProjectValidatorActivity; +import de.plushnikov.intellij.plugin.util.LombokLibraryUtil; import org.jetbrains.annotations.NotNull; public abstract class BaseLombokAction extends BaseGenerateAction { @@ -17,6 +17,6 @@ protected BaseLombokAction(CodeInsightActionHandler handler) { @Override protected boolean isValidForFile(@NotNull Project project, @NotNull Editor editor, @NotNull PsiFile file) { return file.isWritable() && super.isValidForFile(project, editor, file) && - LombokProjectValidatorActivity.hasLombokLibrary(project); + LombokLibraryUtil.hasLombokLibrary(project); } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokBuildManagerListener.java b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokBuildManagerListener.java index 5c9e523f0..d167abda2 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokBuildManagerListener.java +++ b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokBuildManagerListener.java @@ -5,6 +5,7 @@ import com.intellij.compiler.server.BuildManagerListener; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.project.Project; +import de.plushnikov.intellij.plugin.util.LombokLibraryUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.java.compiler.AnnotationProcessingConfiguration; @@ -16,7 +17,7 @@ public class LombokBuildManagerListener implements BuildManagerListener { public void beforeBuildProcessStarted(@NotNull Project project, @NotNull UUID sessionId) { if (!hasAnnotationProcessorsEnabled(project) && - ReadAction.compute(() -> LombokProjectValidatorActivity.hasLombokLibrary(project))) { + ReadAction.compute(() -> LombokLibraryUtil.hasLombokLibrary(project))) { enableAnnotationProcessors(project); } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java index 3efd07a8a..ad89d2544 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java +++ b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java @@ -2,7 +2,6 @@ import com.intellij.compiler.server.BuildManagerListener; import com.intellij.notification.*; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; @@ -26,6 +25,7 @@ import de.plushnikov.intellij.plugin.Version; import de.plushnikov.intellij.plugin.provider.LombokProcessorProvider; import de.plushnikov.intellij.plugin.settings.ProjectSettings; +import de.plushnikov.intellij.plugin.util.LombokLibraryUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,7 +49,7 @@ public void runActivity(@NotNull Project project) { ReadAction.nonBlocking(() -> { if (project.isDisposed()) return null; - final boolean hasLombokLibrary = hasLombokLibrary(project); + final boolean hasLombokLibrary = LombokLibraryUtil.hasLombokLibrary(project); // If dependency is present and out of date notification setting is enabled (defaults to disabled) if (hasLombokLibrary && ProjectSettings.isEnabled(project, ProjectSettings.IS_LOMBOK_VERSION_CHECK_ENABLED, false)) { @@ -80,14 +80,6 @@ private static NotificationGroup getNotificationGroup() { return NotificationGroupManager.getInstance().getNotificationGroup(Version.PLUGIN_NAME); } - public static boolean hasLombokLibrary(Project project) { - ApplicationManager.getApplication().assertReadAccessAllowed(); - return CachedValuesManager.getManager(project).getCachedValue(project, () -> { - PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage("lombok.experimental"); - return new CachedValueProvider.Result<>(aPackage, ProjectRootManager.getInstance(project)); - }) != null; - } - public static boolean isVersionLessThan1_18_16(Project project) { return CachedValuesManager.getManager(project).getCachedValue(project, () -> { Boolean isVersionLessThan; diff --git a/src/main/java/de/plushnikov/intellij/plugin/extension/LombokHighlightErrorFilter.java b/src/main/java/de/plushnikov/intellij/plugin/extension/LombokHighlightErrorFilter.java index 8ba8c175a..18b287895 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/extension/LombokHighlightErrorFilter.java +++ b/src/main/java/de/plushnikov/intellij/plugin/extension/LombokHighlightErrorFilter.java @@ -11,9 +11,9 @@ import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import de.plushnikov.intellij.plugin.LombokClassNames; -import de.plushnikov.intellij.plugin.activity.LombokProjectValidatorActivity; import de.plushnikov.intellij.plugin.handler.*; import de.plushnikov.intellij.plugin.psi.LombokLightMethodBuilder; +import de.plushnikov.intellij.plugin.util.LombokLibraryUtil; import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -52,7 +52,7 @@ public boolean accept(@NotNull HighlightInfo highlightInfo, @Nullable PsiFile fi } Project project = file.getProject(); - if (!LombokProjectValidatorActivity.hasLombokLibrary(project)) { + if (!LombokLibraryUtil.hasLombokLibrary(project)) { return true; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/inspection/DeprecatedLombokAnnotationInspection.java b/src/main/java/de/plushnikov/intellij/plugin/inspection/DeprecatedLombokAnnotationInspection.java index c067a5b04..d41410026 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/inspection/DeprecatedLombokAnnotationInspection.java +++ b/src/main/java/de/plushnikov/intellij/plugin/inspection/DeprecatedLombokAnnotationInspection.java @@ -1,7 +1,6 @@ package de.plushnikov.intellij.plugin.inspection; import com.intellij.codeInsight.intention.AddAnnotationFix; -import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.JavaElementVisitor; @@ -17,16 +16,15 @@ /** * @author Plushnikov Michail */ -public class DeprecatedLombokAnnotationInspection extends AbstractBaseJavaLocalInspectionTool { +public class DeprecatedLombokAnnotationInspection extends LombokJavaInspectionBase { @NotNull @Override - public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) { + protected PsiElementVisitor createVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) { return new LombokElementVisitor(holder); } private static class LombokElementVisitor extends JavaElementVisitor { - private final ProblemsHolder holder; LombokElementVisitor(ProblemsHolder holder) { @@ -58,6 +56,5 @@ private void checkFor(String deprecatedAnnotationFQN, String newAnnotationFQN, P } } } - } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/inspection/LombokInspection.java b/src/main/java/de/plushnikov/intellij/plugin/inspection/LombokInspection.java index 00efacc0d..cf60c1c42 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/inspection/LombokInspection.java +++ b/src/main/java/de/plushnikov/intellij/plugin/inspection/LombokInspection.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin.inspection; -import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.openapi.application.ApplicationManager; @@ -19,7 +18,7 @@ /** * @author Plushnikov Michail */ -public class LombokInspection extends AbstractBaseJavaLocalInspectionTool { +public class LombokInspection extends LombokJavaInspectionBase { private final ValProcessor valProcessor; @@ -29,7 +28,7 @@ public LombokInspection() { @NotNull @Override - public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) { + protected PsiElementVisitor createVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) { return new LombokElementVisitor(holder); } @@ -37,7 +36,7 @@ private class LombokElementVisitor extends JavaElementVisitor { private final ProblemsHolder holder; - public LombokElementVisitor(ProblemsHolder holder) { + LombokElementVisitor(ProblemsHolder holder) { this.holder = holder; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/inspection/LombokJavaInspectionBase.java b/src/main/java/de/plushnikov/intellij/plugin/inspection/LombokJavaInspectionBase.java new file mode 100644 index 000000000..fe1a58636 --- /dev/null +++ b/src/main/java/de/plushnikov/intellij/plugin/inspection/LombokJavaInspectionBase.java @@ -0,0 +1,24 @@ +package de.plushnikov.intellij.plugin.inspection; + +import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool; +import com.intellij.codeInspection.ProblemsHolder; +import com.intellij.psi.PsiElementVisitor; +import de.plushnikov.intellij.plugin.util.LombokLibraryUtil; +import org.jetbrains.annotations.NotNull; + +public abstract class LombokJavaInspectionBase extends AbstractBaseJavaLocalInspectionTool { + @Override + public final @NotNull + PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + if (!LombokLibraryUtil.hasLombokLibrary(holder.getProject())) { + return PsiElementVisitor.EMPTY_VISITOR; + } + + return createVisitor(holder, isOnTheFly); + } + + @NotNull + protected PsiElementVisitor createVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + return super.buildVisitor(holder, isOnTheFly); + } +} diff --git a/src/main/java/de/plushnikov/intellij/plugin/inspection/RedundantSlf4jDefinitionInspection.java b/src/main/java/de/plushnikov/intellij/plugin/inspection/RedundantSlf4jDefinitionInspection.java index df1179d7c..39dbb4652 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/inspection/RedundantSlf4jDefinitionInspection.java +++ b/src/main/java/de/plushnikov/intellij/plugin/inspection/RedundantSlf4jDefinitionInspection.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin.inspection; -import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.*; @@ -11,14 +10,14 @@ import static java.lang.String.format; -public class RedundantSlf4jDefinitionInspection extends AbstractBaseJavaLocalInspectionTool { +public class RedundantSlf4jDefinitionInspection extends LombokJavaInspectionBase { private static final String LOGGER_SLF4J_FQCN = Slf4jProcessor.LOGGER_TYPE; private static final String LOGGER_INITIALIZATION = "LoggerFactory.getLogger(%s.class)"; @NotNull @Override - public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + protected PsiElementVisitor createVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { return new LombokDefinitionVisitor(holder); } @@ -26,7 +25,7 @@ private static class LombokDefinitionVisitor extends JavaElementVisitor { private final ProblemsHolder holder; - public LombokDefinitionVisitor(ProblemsHolder holder) { + LombokDefinitionVisitor(ProblemsHolder holder) { this.holder = holder; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/inspection/modifiers/LombokRedundantModifierInspection.java b/src/main/java/de/plushnikov/intellij/plugin/inspection/modifiers/LombokRedundantModifierInspection.java index a25ebe9e2..71acfd7bc 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/inspection/modifiers/LombokRedundantModifierInspection.java +++ b/src/main/java/de/plushnikov/intellij/plugin/inspection/modifiers/LombokRedundantModifierInspection.java @@ -1,18 +1,18 @@ package de.plushnikov.intellij.plugin.inspection.modifiers; -import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.siyeh.ig.fixes.RemoveModifierFix; +import de.plushnikov.intellij.plugin.inspection.LombokJavaInspectionBase; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Optional; -public abstract class LombokRedundantModifierInspection extends AbstractBaseJavaLocalInspectionTool { +public abstract class LombokRedundantModifierInspection extends LombokJavaInspectionBase { private final String supportedAnnotation; private final RedundantModifiersInfo[] redundantModifiersInfo; @@ -24,12 +24,11 @@ public LombokRedundantModifierInspection(@Nullable String supportedAnnotation, R @NotNull @Override - public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + protected PsiElementVisitor createVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { return new LombokRedundantModifiersVisitor(holder); } private class LombokRedundantModifiersVisitor extends JavaElementVisitor { - private final ProblemsHolder holder; LombokRedundantModifiersVisitor(ProblemsHolder holder) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/intention/AbstractLombokIntentionAction.java b/src/main/java/de/plushnikov/intellij/plugin/intention/AbstractLombokIntentionAction.java index 9c8f4604f..de8053d92 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/intention/AbstractLombokIntentionAction.java +++ b/src/main/java/de/plushnikov/intellij/plugin/intention/AbstractLombokIntentionAction.java @@ -4,13 +4,13 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; -import de.plushnikov.intellij.plugin.activity.LombokProjectValidatorActivity; +import de.plushnikov.intellij.plugin.util.LombokLibraryUtil; import org.jetbrains.annotations.NotNull; public abstract class AbstractLombokIntentionAction extends PsiElementBaseIntentionAction { @Override public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement element) { - return LombokProjectValidatorActivity.hasLombokLibrary(project); + return LombokLibraryUtil.hasLombokLibrary(project); } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java index bb9551624..9730b37c1 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java @@ -5,11 +5,11 @@ import com.intellij.psi.*; import com.intellij.psi.augment.PsiAugmentProvider; import com.intellij.psi.impl.source.PsiExtensibleClass; -import de.plushnikov.intellij.plugin.activity.LombokProjectValidatorActivity; import de.plushnikov.intellij.plugin.processor.LombokProcessorManager; import de.plushnikov.intellij.plugin.processor.Processor; import de.plushnikov.intellij.plugin.processor.ValProcessor; import de.plushnikov.intellij.plugin.processor.modifier.ModifierProcessor; +import de.plushnikov.intellij.plugin.util.LombokLibraryUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -86,7 +86,7 @@ public List getAugments(@NotNull PsiElement elemen return emptyResult; } // skip processing if disabled, or no lombok library is present - if (!LombokProjectValidatorActivity.hasLombokLibrary(element.getProject())) { + if (!LombokLibraryUtil.hasLombokLibrary(element.getProject())) { return emptyResult; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/LombokLibraryUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/LombokLibraryUtil.java new file mode 100644 index 000000000..6a8b73c14 --- /dev/null +++ b/src/main/java/de/plushnikov/intellij/plugin/util/LombokLibraryUtil.java @@ -0,0 +1,23 @@ +package de.plushnikov.intellij.plugin.util; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiPackage; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import org.jetbrains.annotations.NotNull; + +public class LombokLibraryUtil { + + private static final String LOMBOK_PACKAGE = "lombok.experimental"; + + public static boolean hasLombokLibrary(@NotNull Project project) { + ApplicationManager.getApplication().assertReadAccessAllowed(); + return CachedValuesManager.getManager(project).getCachedValue(project, () -> { + PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage(LOMBOK_PACKAGE); + return new CachedValueProvider.Result<>(aPackage, ProjectRootManager.getInstance(project)); + }) != null; + } +} From 159496a78767dcb69d3044c40a4b2881486fdfdf Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 27 Dec 2020 20:52:14 +0100 Subject: [PATCH 36/47] cleanup --- .../LombokProjectValidatorActivity.java | 43 ----------------- .../LombokBuildProcessParametersProvider.java | 47 ++++++++++++++++++- .../provider/LombokImplicitUsageProvider.java | 7 +-- .../plugin/util/PsiAnnotationUtil.java | 11 ----- .../intellij/plugin/util/ReflectionUtil.java | 4 +- 5 files changed, 50 insertions(+), 62 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java index ad89d2544..7d372536f 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java +++ b/src/main/java/de/plushnikov/intellij/plugin/activity/LombokProjectValidatorActivity.java @@ -4,21 +4,13 @@ import com.intellij.notification.*; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ReadAction; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderEntry; -import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.util.Disposer; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiPackage; -import com.intellij.psi.util.CachedValueProvider; -import com.intellij.psi.util.CachedValuesManager; import com.intellij.util.concurrency.AppExecutorUtil; import com.intellij.util.messages.MessageBusConnection; import de.plushnikov.intellij.plugin.LombokBundle; @@ -29,15 +21,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; - /** * Shows notifications about project setup issues, that make the plugin not working. * * @author Alexej Kubarev */ public class LombokProjectValidatorActivity implements StartupActivity.DumbAware { - private static final Logger LOG = Logger.getInstance(LombokProjectValidatorActivity.class); @Override public void runActivity(@NotNull Project project) { @@ -80,38 +69,6 @@ private static NotificationGroup getNotificationGroup() { return NotificationGroupManager.getInstance().getNotificationGroup(Version.PLUGIN_NAME); } - public static boolean isVersionLessThan1_18_16(Project project) { - return CachedValuesManager.getManager(project).getCachedValue(project, () -> { - Boolean isVersionLessThan; - try { - isVersionLessThan = ReadAction.nonBlocking( - () -> isVersionLessThanInternal(project, Version.LAST_LOMBOK_VERSION_WITH_JPS_FIX)) - .executeSynchronously(); - } catch (ProcessCanceledException e) { - throw e; - } catch (Throwable e) { - isVersionLessThan = false; - LOG.error(e); - } - return new CachedValueProvider.Result<>(isVersionLessThan, ProjectRootManager.getInstance(project)); - }); - } - - private static boolean isVersionLessThanInternal(@NotNull Project project, @NotNull String version) { - PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage("lombok.experimental"); - if (aPackage != null) { - PsiDirectory[] directories = aPackage.getDirectories(); - if (directories.length > 0) { - List entries = - ProjectRootManager.getInstance(project).getFileIndex().getOrderEntriesForFile(directories[0].getVirtualFile()); - if (!entries.isEmpty()) { - return Version.isLessThan(entries.get(0), version); - } - } - } - return false; - } - @Nullable private static OrderEntry findLombokEntry(@NotNull ModuleRootManager moduleRootManager) { final OrderEntry[] orderEntries = moduleRootManager.getOrderEntries(); diff --git a/src/main/java/de/plushnikov/intellij/plugin/jps/LombokBuildProcessParametersProvider.java b/src/main/java/de/plushnikov/intellij/plugin/jps/LombokBuildProcessParametersProvider.java index 01dfc5919..e307ec86a 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/jps/LombokBuildProcessParametersProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/jps/LombokBuildProcessParametersProvider.java @@ -2,14 +2,25 @@ package de.plushnikov.intellij.plugin.jps; import com.intellij.compiler.server.BuildProcessParametersProvider; +import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.Project; -import de.plushnikov.intellij.plugin.activity.LombokProjectValidatorActivity; +import com.intellij.openapi.roots.OrderEntry; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiPackage; +import com.intellij.psi.util.CachedValueProvider; +import com.intellij.psi.util.CachedValuesManager; +import de.plushnikov.intellij.plugin.Version; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; public final class LombokBuildProcessParametersProvider extends BuildProcessParametersProvider { + private static final Logger LOG = Logger.getInstance(LombokBuildProcessParametersProvider.class); private final Project myProject; @@ -19,9 +30,41 @@ public LombokBuildProcessParametersProvider(Project project) { @Override public @NotNull List getVMArguments() { - if (LombokProjectValidatorActivity.isVersionLessThan1_18_16(myProject)) { + if (isVersionLessThan1_18_16(myProject)) { return Collections.singletonList("-Djps.track.ap.dependencies=false"); } return super.getVMArguments(); } + + private boolean isVersionLessThan1_18_16(Project project) { + return CachedValuesManager.getManager(project).getCachedValue(project, () -> { + Boolean isVersionLessThan; + try { + isVersionLessThan = ReadAction.nonBlocking( + () -> isVersionLessThanInternal(project, Version.LAST_LOMBOK_VERSION_WITH_JPS_FIX)) + .executeSynchronously(); + } catch (ProcessCanceledException e) { + throw e; + } catch (Throwable e) { + isVersionLessThan = false; + LOG.error(e); + } + return new CachedValueProvider.Result<>(isVersionLessThan, ProjectRootManager.getInstance(project)); + }); + } + + private boolean isVersionLessThanInternal(@NotNull Project project, @NotNull String version) { + PsiPackage aPackage = JavaPsiFacade.getInstance(project).findPackage("lombok.experimental"); + if (aPackage != null) { + PsiDirectory[] directories = aPackage.getDirectories(); + if (directories.length > 0) { + List entries = + ProjectRootManager.getInstance(project).getFileIndex().getOrderEntriesForFile(directories[0].getVirtualFile()); + if (!entries.isEmpty()) { + return Version.isLessThan(entries.get(0), version); + } + } + } + return false; + } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokImplicitUsageProvider.java b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokImplicitUsageProvider.java index 615a6ae24..9aa4b54df 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokImplicitUsageProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokImplicitUsageProvider.java @@ -4,6 +4,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; import de.plushnikov.intellij.plugin.processor.LombokPsiElementUsage; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -13,17 +14,17 @@ public class LombokImplicitUsageProvider implements ImplicitUsageProvider { @Override - public boolean isImplicitUsage(PsiElement element) { + public boolean isImplicitUsage(@NotNull PsiElement element) { return isImplicitWrite(element) || isImplicitRead(element); } @Override - public boolean isImplicitRead(PsiElement element) { + public boolean isImplicitRead(@NotNull PsiElement element) { return checkUsage(element, LombokPsiElementUsage.READ); } @Override - public boolean isImplicitWrite(PsiElement element) { + public boolean isImplicitWrite(@NotNull PsiElement element) { return checkUsage(element, LombokPsiElementUsage.WRITE); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java index 0716c9ee8..c5edc2f47 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/PsiAnnotationUtil.java @@ -69,8 +69,6 @@ public static boolean getBooleanAnnotationValue(@NotNull PsiAnnotation psiAnnota public static String getStringAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter, @NotNull String defaultValue) { final String result = AnnotationUtil.getDeclaredStringAttributeValue(psiAnnotation, parameter); -// PsiAnnotationMemberValue attrValue = getAnnotationAttribute(psiAnnotation, parameter); -// return null != attrValue ? AnnotationUtil.getStringAttributeValue(attrValue) : null; return result != null ? result : defaultValue; } @@ -78,10 +76,6 @@ public static String getEnumAnnotationValue(@NotNull PsiAnnotation psiAnnotation PsiAnnotationMemberValue attrValue = psiAnnotation.findDeclaredAttributeValue(attributeName); String result = attrValue != null ? resolveElementValue(attrValue, String.class) : null; return result != null ? result : defaultValue; - // doesn't work for definition using static import for Enum.value for example -// PsiConstantEvaluationHelper evaluationHelper = JavaPsiFacade.getInstance(psiAnnotation.getProject()).getConstantEvaluationHelper(); -// Object result = evaluationHelper.computeConstantExpression(attrValue); -// return result instanceof Enum ? ((Enum) result).name() : defaultValue.name(); } public static int getIntAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @NotNull String attributeName, int defaultValue) { @@ -91,11 +85,6 @@ public static int getIntAnnotationValue(@NotNull PsiAnnotation psiAnnotation, @N return result instanceof Number ? ((Number) result).intValue() : defaultValue; } - @Nullable - private static PsiAnnotationMemberValue getAnnotationAttribute(@NotNull PsiAnnotation psiAnnotation, @NotNull String parameter) { - return psiAnnotation.hasAttribute(parameter) ? psiAnnotation.findAttributeValue(parameter) : null; - } - @Nullable private static T resolveElementValue(@NotNull PsiElement psiElement, @NotNull Class asClass) { T value = null; diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java index 4ffdca966..e9d1c1061 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java +++ b/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java @@ -19,9 +19,7 @@ public static void setFinalFieldPerReflection(Class clazz, T instance, break; } } - } catch (IllegalArgumentException x) { - LOG.error(x); - } catch (IllegalAccessException x) { + } catch (IllegalArgumentException | IllegalAccessException x) { LOG.error(x); } } From 80d8e8c419003b1c601676f941f537124b600299 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 26 Dec 2020 20:14:36 +0100 Subject: [PATCH 37/47] [lombok] IDEA-258295 lombok: inspections are traversing file in a simple project GitOrigin-RevId: 1897417d950c8c6309b3d19fccb1f71d50a8d57b --- .travis.yml | 1 + gradle.properties | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 0a833d779..314449ad3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,7 @@ before_cache: env: - IDEA_VERSION=LATEST-EAP-SNAPSHOT + - IDEA_VERSION=2020.3 before_install: - chmod +x gradlew diff --git a/gradle.properties b/gradle.properties index c13a3bd66..06af3c1b8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,8 @@ # https://www.jetbrains.com/intellij-repository/releases # https://www.jetbrains.com/intellij-repository/snapshots # -ideaVersion=LATEST-EAP-SNAPSHOT +#ideaVersion=LATEST-EAP-SNAPSHOT +ideaVersion=2020.3.1 # pluginGroup=de.plushnikov.intellij.plugin pluginName=lombok-plugin From 53b687988719f35d11bc83d3af7e9b14413fb021 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sun, 27 Dec 2020 23:18:31 +0100 Subject: [PATCH 38/47] [lombok] using nameHint for processing lombok annotations like Builder/Value/FieldNameConstants, prevent recursive invocations of PsiAugmentProvider, drop all useless lombok custom caches GitOrigin-RevId: d8ed89ff31b6738d56455479332032a4f7c356ec --- .../inspection/DeprecatedLombokAnnotationInspection.java | 7 ++++--- .../intellij/plugin/settings/ProjectSettingsPage.java | 5 ----- .../intellij/plugin/inspection/LombokInspectionTest.java | 1 - 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/inspection/DeprecatedLombokAnnotationInspection.java b/src/main/java/de/plushnikov/intellij/plugin/inspection/DeprecatedLombokAnnotationInspection.java index d41410026..6f9d1f6fc 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/inspection/DeprecatedLombokAnnotationInspection.java +++ b/src/main/java/de/plushnikov/intellij/plugin/inspection/DeprecatedLombokAnnotationInspection.java @@ -9,6 +9,7 @@ import com.intellij.psi.PsiModifierListOwner; import com.intellij.psi.util.PsiTreeUtil; import de.plushnikov.intellij.plugin.LombokBundle; +import de.plushnikov.intellij.plugin.LombokClassNames; import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -33,9 +34,9 @@ private static class LombokElementVisitor extends JavaElementVisitor { @Override public void visitAnnotation(final PsiAnnotation annotation) { - checkFor("lombok.experimental.Builder", "lombok.Builder", annotation); - checkFor("lombok.experimental.Value", "lombok.Value", annotation); - checkFor("lombok.experimental.Wither", "lombok.With", annotation); + checkFor("lombok.experimental.Builder", LombokClassNames.BUILDER, annotation); + checkFor("lombok.experimental.Value", LombokClassNames.VALUE, annotation); + checkFor("lombok.experimental.Wither", LombokClassNames.WITH, annotation); } private void checkFor(String deprecatedAnnotationFQN, String newAnnotationFQN, PsiAnnotation psiAnnotation) { diff --git a/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java b/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java index 93011447e..d4b58ea14 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java +++ b/src/main/java/de/plushnikov/intellij/plugin/settings/ProjectSettingsPage.java @@ -6,7 +6,6 @@ import com.intellij.openapi.project.Project; import com.intellij.psi.PsiManager; import de.plushnikov.intellij.plugin.LombokBundle; -import de.plushnikov.intellij.plugin.provider.LombokProcessorProvider; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; @@ -57,12 +56,8 @@ public boolean isModified() { @Override public void apply() { ProjectSettings.setEnabled(myProject, ProjectSettings.IS_EXTENSION_METHOD_ENABLED, myEnableExtensionMethodSupport.isSelected()); - ProjectSettings.setEnabled(myProject, ProjectSettings.IS_LOMBOK_VERSION_CHECK_ENABLED, myEnableLombokVersionWarning.isSelected()); - LombokProcessorProvider lombokProcessorProvider = myProject.getService(LombokProcessorProvider.class); - lombokProcessorProvider.initProcessors(); - PsiManager.getInstance(myProject).dropPsiCaches(); DaemonCodeAnalyzer.getInstance(myProject).restart(); } diff --git a/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java b/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java index 18b6968d3..12b8cc2ea 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java +++ b/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokInspectionTest.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin.inspection; -import com.intellij.openapi.util.RecursionManager; import com.intellij.openapi.util.registry.Registry; import com.intellij.testFramework.LightProjectDescriptor; import com.siyeh.ig.LightJavaInspectionTestCase; From 22fe1216aa6d68a03e8c2a8c02078f5f51c0daef Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 28 Dec 2020 13:15:39 +0100 Subject: [PATCH 39/47] lombok: distinguish fields from different classes (IDEA-258374) GitOrigin-RevId: f26cf1f49d51c94233a94fbcdb6c32e7f54faa68 --- .../plugin/psi/LombokLightFieldBuilder.java | 5 ++-- .../plugin/usage/LombokUsageTest.java | 26 +++++++++++++++++++ testData/usage/FieldUsages.java | 12 +++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 testData/usage/FieldUsages.java diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java index acdb50cb5..e4a1c637d 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java @@ -155,11 +155,12 @@ public boolean equals(Object o) { return Objects.equals(myName, that.myName) && Objects.equals(myNameIdentifier, that.myNameIdentifier) && - Objects.equals(myModifierList, that.myModifierList); + Objects.equals(myModifierList, that.myModifierList) && + Objects.equals(getContainingClass(), that.getContainingClass()); } @Override public int hashCode() { - return Objects.hash(myName, myNameIdentifier, myModifierList); + return Objects.hash(myName, myNameIdentifier, myModifierList, getContainingClass()); } } diff --git a/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java b/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java index 6eee2bb00..da29cf5ab 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java +++ b/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java @@ -1,6 +1,14 @@ package de.plushnikov.intellij.plugin.usage; +import com.intellij.find.FindManager; +import com.intellij.find.findUsages.FindUsagesHandler; +import com.intellij.find.findUsages.FindUsagesManager; +import com.intellij.find.findUsages.JavaClassFindUsagesOptions; +import com.intellij.find.impl.FindManagerImpl; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiClass; import com.intellij.usageView.UsageInfo; +import com.intellij.util.CommonProcessors; import de.plushnikov.intellij.plugin.AbstractLombokLightCodeInsightTestCase; import org.jetbrains.annotations.NotNull; @@ -39,6 +47,24 @@ public void testFindUsageSingularBuilder() { "FindUsageSingularBuilder.builder().clearBars", "findUsageBuilder.getBars"); } + public void testFieldUsages() { + myFixture.configureByFile(getTestName(false) + ".java"); + PsiClass aClass = myFixture.findClass("Apple"); + JavaClassFindUsagesOptions options = new JavaClassFindUsagesOptions(getProject()); + options.isFieldsUsages=true; + options.isMethodsUsages=true; + options.isUsages=true; + CommonProcessors.CollectProcessor processor = new CommonProcessors.CollectProcessor<>(); + FindUsagesManager findUsagesManager = ((FindManagerImpl)FindManager.getInstance(aClass.getProject())).getFindUsagesManager(); + FindUsagesHandler handler = findUsagesManager.getFindUsagesHandler(aClass, false); + assertNotNull(handler); + handler.processElementUsages(aClass, processor, options); + + Collection usages = processor.getResults(); + + assertEmpty(StringUtil.join(usages, u -> u.getElement().getText() , ","), usages); + } + private void assertUsages(Collection usages, String... usageTexts) { assertEquals(usageTexts.length, usages.size()); List sortedUsages = new ArrayList<>(usages); diff --git a/testData/usage/FieldUsages.java b/testData/usage/FieldUsages.java new file mode 100644 index 000000000..d737afba8 --- /dev/null +++ b/testData/usage/FieldUsages.java @@ -0,0 +1,12 @@ +import lombok.extern.slf4j.Slf4j; + +@Slf4j +class Apple { +} + +@Slf4j +class CherryTree { + public CherryTree() { + log.info("A cherry tree!"); + } +} From 5ce97689f5384466d328ab2f652b89ee77ac8488 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Tue, 29 Dec 2020 12:30:21 +0100 Subject: [PATCH 40/47] [lombok] cleanup @NotNull GitOrigin-RevId: bfe8ac3aa541b477c7d937a0c877c2411e75c2a7 --- .../intellij/plugin/processor/Processor.java | 2 +- .../plugin/psi/LombokLightClassBuilder.java | 19 +++++++++---------- .../plugin/psi/LombokLightModifierList.java | 6 +++--- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java index 608d26263..788d90b41 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/Processor.java @@ -19,7 +19,7 @@ */ public interface Processor { @NotNull - String[] getSupportedAnnotationClasses(); + String @NotNull[] getSupportedAnnotationClasses(); @NotNull Class getSupportedClass(); diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java index 450889819..d0dc8eca8 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java @@ -26,8 +26,8 @@ public class LombokLightClassBuilder extends LightPsiClassBuilder implements Psi private PsiField[] myFields; private PsiMethod[] myMethods; - private Supplier> fieldSupplier = Collections::emptyList; - private Supplier> methodSupplier = Collections::emptyList; + private Supplier> fieldSupplier = Collections::emptyList; + private Supplier> methodSupplier = Collections::emptyList; public LombokLightClassBuilder(@NotNull PsiElement context, @NotNull String simpleName, @NotNull String qualifiedName) { super(context, simpleName); @@ -87,20 +87,20 @@ public boolean isEnum() { } @Override - public @NotNull PsiField[] getFields() { + public PsiField @NotNull [] getFields() { if (null == myFields) { Collection generatedFields = fieldSupplier.get(); - myFields = generatedFields.toArray(new PsiField[0]); + myFields = generatedFields.toArray(PsiField.EMPTY_ARRAY); fieldSupplier = Collections::emptyList; } return myFields; } @Override - public @NotNull PsiMethod[] getMethods() { + public PsiMethod @NotNull [] getMethods() { if (null == myMethods) { Collection generatedMethods = methodSupplier.get(); - myMethods = generatedMethods.toArray(new PsiMethod[0]); + myMethods = generatedMethods.toArray(PsiMethod.EMPTY_ARRAY); methodSupplier = Collections::emptyList; } return myMethods; @@ -121,12 +121,12 @@ public boolean isEnum() { return Collections.emptyList(); } - public LombokLightClassBuilder withFieldSupplier(final Supplier> fieldSupplier) { + public LombokLightClassBuilder withFieldSupplier(final Supplier> fieldSupplier) { this.fieldSupplier = fieldSupplier; return this; } - public LombokLightClassBuilder withMethodSupplier(final Supplier> methodSupplier) { + public LombokLightClassBuilder withMethodSupplier(final Supplier> methodSupplier) { this.methodSupplier = methodSupplier; return this; } @@ -183,7 +183,7 @@ public boolean equals(Object o) { return false; } - LombokLightClassBuilder that = (LombokLightClassBuilder) o; + LombokLightClassBuilder that = (LombokLightClassBuilder)o; return myQualifiedName.equals(that.myQualifiedName); } @@ -192,5 +192,4 @@ public boolean equals(Object o) { public int hashCode() { return myQualifiedName.hashCode(); } - } diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java index 2b497f7ca..6c55d8753 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java @@ -5,6 +5,7 @@ import com.intellij.psi.*; import com.intellij.psi.impl.light.LightModifierList; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -14,7 +15,7 @@ * @author Plushnikov Michail */ public class LombokLightModifierList extends LightModifierList implements SyntheticElement { - private static final Set ALL_MODIFIERS = new HashSet<>(Arrays.asList(PsiModifier.MODIFIERS)); + private static final Set ALL_MODIFIERS = ContainerUtil.set(PsiModifier.MODIFIERS); private final Map myAnnotations; private final Set myImplicitModifiers; @@ -86,8 +87,7 @@ public PsiAnnotation findAnnotation(@NotNull String qualifiedName) { } @Override - @NotNull - public PsiAnnotation[] getAnnotations() { + public PsiAnnotation @NotNull [] getAnnotations() { PsiAnnotation[] result = PsiAnnotation.EMPTY_ARRAY; if (!myAnnotations.isEmpty()) { Collection annotations = myAnnotations.values(); From 8a8948cdf26c058c125071139c101ab7e4bdc471 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Tue, 29 Dec 2020 13:07:29 +0100 Subject: [PATCH 41/47] [lombok] extends some LightPsiImpls to get rid of reflection access in lombok-plugin GitOrigin-RevId: cd4bc3049a4784ebe3c04630966e154888f77d81 --- .../plugin/psi/LombokLightClassBuilder.java | 2 +- .../plugin/psi/LombokLightFieldBuilder.java | 4 +-- .../plugin/psi/LombokLightMethodBuilder.java | 6 ++-- .../plugin/psi/LombokLightModifierList.java | 9 ++++++ .../plugin/psi/LombokLightParameter.java | 29 ++++++++----------- .../intellij/plugin/util/ReflectionUtil.java | 26 ----------------- 6 files changed, 25 insertions(+), 51 deletions(-) delete mode 100644 src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java index d0dc8eca8..bf9bf32fe 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightClassBuilder.java @@ -34,7 +34,7 @@ public LombokLightClassBuilder(@NotNull PsiElement context, @NotNull String simp myIsEnum = false; myQualifiedName = qualifiedName; myBaseIcon = LombokIcons.CLASS_ICON; - myModifierList = new LombokLightModifierList(context.getManager(), context.getLanguage(), Collections.emptyList()); + myModifierList = new LombokLightModifierList(context.getManager(), context.getLanguage()); } @NotNull diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java index e4a1c637d..e4a6a01c5 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java @@ -1,6 +1,5 @@ package de.plushnikov.intellij.plugin.psi; -import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.impl.CheckUtil; @@ -11,7 +10,6 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import java.util.Collections; import java.util.Objects; import java.util.stream.Stream; @@ -27,7 +25,7 @@ public LombokLightFieldBuilder(@NotNull PsiManager manager, @NotNull String name super(manager, name, type); myName = name; myNameIdentifier = new LombokLightIdentifier(manager, name); - myModifierList = new LombokLightModifierList(manager, JavaLanguage.INSTANCE, Collections.emptyList()); + myModifierList = new LombokLightModifierList(manager); setBaseIcon(LombokIcons.FIELD_ICON); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java index 9aa2db0b8..724c65c75 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java @@ -10,13 +10,11 @@ import com.intellij.psi.impl.light.LightTypeParameterListBuilder; import com.intellij.util.IncorrectOperationException; import de.plushnikov.intellij.plugin.icon.LombokIcons; -import de.plushnikov.intellij.plugin.util.ReflectionUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.Collections; import java.util.Objects; /** @@ -32,7 +30,7 @@ public class LombokLightMethodBuilder extends LightMethodBuilder implements Synt public LombokLightMethodBuilder(@NotNull PsiManager manager, @NotNull String name) { super(manager, JavaLanguage.INSTANCE, name, new LombokLightParameterListBuilder(manager, JavaLanguage.INSTANCE), - new LombokLightModifierList(manager, JavaLanguage.INSTANCE, Collections.emptySet()), + new LombokLightModifierList(manager), new LombokLightReferenceListBuilder(manager, JavaLanguage.INSTANCE, PsiReferenceList.Role.THROWS_LIST), new LightTypeParameterListBuilder(manager, JavaLanguage.INSTANCE)); setBaseIcon(LombokIcons.METHOD_ICON); @@ -255,7 +253,7 @@ public PsiElement replace(@NotNull PsiElement newElement) throws IncorrectOperat @Override public PsiElement setName(@NotNull String name) throws IncorrectOperationException { - ReflectionUtil.setFinalFieldPerReflection(LightMethodBuilder.class, this, String.class, name); + setNameIntern(name); return this; } diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java index 6c55d8753..527787165 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightModifierList.java @@ -1,6 +1,7 @@ package de.plushnikov.intellij.plugin.psi; import com.intellij.lang.Language; +import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.impl.light.LightModifierList; @@ -20,6 +21,14 @@ public class LombokLightModifierList extends LightModifierList implements Synthe private final Map myAnnotations; private final Set myImplicitModifiers; + public LombokLightModifierList(@NotNull PsiManager manager) { + this(manager, JavaLanguage.INSTANCE); + } + + public LombokLightModifierList(@NotNull PsiManager manager, @NotNull Language language) { + this(manager, language, Collections.emptyList()); + } + public LombokLightModifierList(PsiManager manager, final Language language, Collection implicitModifiers, String... modifiers) { super(manager, language, modifiers); this.myAnnotations = new HashMap<>(); diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java index ec24e144d..258332c5f 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java @@ -2,40 +2,34 @@ import com.intellij.lang.Language; import com.intellij.openapi.util.TextRange; -import com.intellij.psi.*; -import com.intellij.psi.impl.light.LightModifierList; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiIdentifier; +import com.intellij.psi.PsiType; +import com.intellij.psi.SyntheticElement; import com.intellij.psi.impl.light.LightParameter; -import com.intellij.psi.impl.light.LightVariableBuilder; -import de.plushnikov.intellij.plugin.util.ReflectionUtil; import org.jetbrains.annotations.NotNull; -import java.util.Collections; +import java.util.stream.Stream; /** * @author Plushnikov Michail */ public class LombokLightParameter extends LightParameter implements SyntheticElement { - private String myName; private final LombokLightIdentifier myNameIdentifier; public LombokLightParameter(@NotNull String name, @NotNull PsiType type, PsiElement declarationScope, Language language) { - super(name, type, declarationScope, language); - myName = name; - PsiManager manager = declarationScope.getManager(); - myNameIdentifier = new LombokLightIdentifier(manager, name); - ReflectionUtil.setFinalFieldPerReflection(LightVariableBuilder.class, this, LightModifierList.class, - new LombokLightModifierList(manager, language, Collections.emptySet())); + super(name, type, declarationScope, language, new LombokLightModifierList(declarationScope.getManager(), language)); + myNameIdentifier = new LombokLightIdentifier(declarationScope.getManager(), name); } @NotNull @Override public String getName() { - return myName; + return myNameIdentifier.getText(); } @Override public PsiElement setName(@NotNull String name) { - myName = name; myNameIdentifier.setText(name); return this; } @@ -53,8 +47,9 @@ public TextRange getTextRange() { @Override public LombokLightParameter setModifiers(String... modifiers) { - LombokLightModifierList modifierList = new LombokLightModifierList(getManager(), getLanguage(), Collections.emptySet(), modifiers); - ReflectionUtil.setFinalFieldPerReflection(LightVariableBuilder.class, this, LightModifierList.class, modifierList); + final LombokLightModifierList lombokLightModifierList = (LombokLightModifierList)getModifierList(); + lombokLightModifierList.clearModifiers(); + Stream.of(modifiers).forEach(lombokLightModifierList::addModifier); return this; } @@ -67,7 +62,7 @@ public boolean equals(Object o) { return false; } - LombokLightParameter that = (LombokLightParameter) o; + LombokLightParameter that = (LombokLightParameter)o; final PsiType thisType = getType(); final PsiType thatType = that.getType(); diff --git a/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java b/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java deleted file mode 100644 index e9d1c1061..000000000 --- a/src/main/java/de/plushnikov/intellij/plugin/util/ReflectionUtil.java +++ /dev/null @@ -1,26 +0,0 @@ -package de.plushnikov.intellij.plugin.util; - -import com.intellij.openapi.diagnostic.Logger; - -import java.lang.reflect.Field; - -/** - * @author Plushnikov Michail - */ -public final class ReflectionUtil { - private static final Logger LOG = Logger.getInstance(ReflectionUtil.class.getName()); - - public static void setFinalFieldPerReflection(Class clazz, T instance, Class fieldClass, R newValue) { - try { - for (Field field : clazz.getDeclaredFields()) { - if (field.getType().equals(fieldClass)) { - field.setAccessible(true); - field.set(instance, newValue); - break; - } - } - } catch (IllegalArgumentException | IllegalAccessException x) { - LOG.error(x); - } - } -} From 7c98735eb80813955f466fff12001168483be8a1 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Tue, 29 Dec 2020 16:47:12 +0100 Subject: [PATCH 42/47] [lombok] added new Test for renaming lomboked field GitOrigin-RevId: 6b60466d044df60b7f25d66f30dfe8d5da8d904a --- .../intellij/RenameFieldActionTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/test/java/de/plushnikov/intellij/plugin/action/intellij/RenameFieldActionTest.java diff --git a/src/test/java/de/plushnikov/intellij/plugin/action/intellij/RenameFieldActionTest.java b/src/test/java/de/plushnikov/intellij/plugin/action/intellij/RenameFieldActionTest.java new file mode 100644 index 000000000..348b2eb44 --- /dev/null +++ b/src/test/java/de/plushnikov/intellij/plugin/action/intellij/RenameFieldActionTest.java @@ -0,0 +1,23 @@ +package de.plushnikov.intellij.plugin.action.intellij; + +import de.plushnikov.intellij.plugin.AbstractLombokLightCodeInsightTestCase; + +public class RenameFieldActionTest extends AbstractLombokLightCodeInsightTestCase { + + public void testFieldRename() { + myFixture.configureByText("Main.java", "@lombok.Data\n" + + "public class Main {\n" + + " private String someString;\n" + + "\n" + + " public static void main(String[] args) {\n" + + " final Main main = new Main();\n" + + " main.setSomeString(\"Hello World\");\n" + + " System.out.println(main.getSomeString());\n" + + " }\n" + + "}\n"); + + myFixture.renameElementAtCaretUsingHandler("someString2"); + + myFixture.checkHighlighting(); + } +} From cbed3691c89bcbadb9ccdbd2b6ddfaa0b9cb057f Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Tue, 29 Dec 2020 17:58:19 +0100 Subject: [PATCH 43/47] [lombok] added new test for inspection for unknown fields in EqualsAndHashCode of parameter GitOrigin-RevId: 715edb06355d714a62aaeb965ebaf937e5b6b3cd --- .../plugin/problem/LombokProblem.java | 9 ++++--- .../EqualsAndHashcodeInspectionTest.java | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 src/test/java/de/plushnikov/intellij/plugin/inspection/EqualsAndHashcodeInspectionTest.java diff --git a/src/main/java/de/plushnikov/intellij/plugin/problem/LombokProblem.java b/src/main/java/de/plushnikov/intellij/plugin/problem/LombokProblem.java index ac9f807a5..7e6943a52 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/problem/LombokProblem.java +++ b/src/main/java/de/plushnikov/intellij/plugin/problem/LombokProblem.java @@ -4,6 +4,8 @@ import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.util.InspectionMessage; +import java.util.Objects; + /** * @author Plushnikov Michail */ @@ -12,7 +14,8 @@ public class LombokProblem { private final ProblemHighlightType highlightType; private final LocalQuickFix[] quickFixes; - @InspectionMessage private final String message; + @InspectionMessage + private final String message; public LombokProblem(@InspectionMessage String message) { this(message, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, EMPTY_QUICK_FIX); @@ -56,11 +59,11 @@ public boolean equals(Object o) { LombokProblem that = (LombokProblem) o; - return !(message != null ? !message.equals(that.message) : that.message != null); + return Objects.equals(message, that.message); } @Override public int hashCode() { - return message != null ? message.hashCode() : 0; + return Objects.hashCode(message); } } diff --git a/src/test/java/de/plushnikov/intellij/plugin/inspection/EqualsAndHashcodeInspectionTest.java b/src/test/java/de/plushnikov/intellij/plugin/inspection/EqualsAndHashcodeInspectionTest.java new file mode 100644 index 000000000..f536eebba --- /dev/null +++ b/src/test/java/de/plushnikov/intellij/plugin/inspection/EqualsAndHashcodeInspectionTest.java @@ -0,0 +1,27 @@ +package de.plushnikov.intellij.plugin.inspection; + +import com.intellij.codeInspection.InspectionProfileEntry; + +public class EqualsAndHashcodeInspectionTest extends LombokInspectionTest { + + @Override + protected String getBasePath() { + return super.getBasePath() + "/" + TEST_DATA_INSPECTION_DIRECTORY + "/equalsandhashcode"; + } + + @Override + protected InspectionProfileEntry getInspection() { + return new LombokInspection(); + } + + public void testOfWithUnknownFields() { + myFixture.configureByText("Main.java", "@lombok.EqualsAndHashCode(of={\"a\"})\n" + + "class Main {\n" + + " int i;\n" + + " String s;\n" + + " Float f;\n" + + "}\n"); + myFixture.checkHighlighting(); + } +} + From 459c7541fc2c497ecdeca4b9d80c3a75e1a3038e Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Tue, 29 Dec 2020 19:02:17 +0100 Subject: [PATCH 44/47] [lombok] process only class own fields for constructor generation #978 GitOrigin-RevId: 0f7fe38701c5d1f84d08ec8bd59b34d7cd41d8b6 --- .../AbstractConstructorClassProcessor.java | 65 +++++++++++++------ .../plugin/configsystem/LoggerTest.java | 38 +++++------ .../after/Slf4jWithReqConstructor.java | 14 ++++ .../log/fieldIsStatic/before/Slf4jTest.java | 1 - .../before/Slf4jWithReqConstructor.java | 12 ++++ 5 files changed, 91 insertions(+), 39 deletions(-) create mode 100644 testData/configsystem/log/fieldIsStatic/after/Slf4jWithReqConstructor.java create mode 100644 testData/configsystem/log/fieldIsStatic/before/Slf4jWithReqConstructor.java diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/constructor/AbstractConstructorClassProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/constructor/AbstractConstructorClassProcessor.java index 6458bf7f0..6fa44320a 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/constructor/AbstractConstructorClassProcessor.java +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/clazz/constructor/AbstractConstructorClassProcessor.java @@ -6,6 +6,7 @@ import com.intellij.psi.impl.light.LightReferenceListBuilder; import com.intellij.psi.impl.light.LightTypeParameterBuilder; import com.intellij.psi.util.PsiTypesUtil; +import com.intellij.util.containers.ContainerUtil; import de.plushnikov.intellij.plugin.LombokBundle; import de.plushnikov.intellij.plugin.LombokClassNames; import de.plushnikov.intellij.plugin.lombokconfig.ConfigKey; @@ -88,7 +89,10 @@ public boolean validateBaseClassConstructor(@NotNull PsiClass psiClass, @NotNull return false; } - private boolean validateIsStaticConstructorNotDefined(@NotNull PsiClass psiClass, @Nullable String staticConstructorName, @NotNull Collection params, @NotNull ProblemBuilder builder) { + private boolean validateIsStaticConstructorNotDefined(@NotNull PsiClass psiClass, + @Nullable String staticConstructorName, + @NotNull Collection params, + @NotNull ProblemBuilder builder) { boolean result = true; final List paramTypes = new ArrayList<>(params.size()); @@ -102,9 +106,14 @@ private boolean validateIsStaticConstructorNotDefined(@NotNull PsiClass psiClass final PsiMethod existedStaticMethod = findExistedMethod(definedMethods, staticConstructorName, paramTypes); if (null != existedStaticMethod) { if (paramTypes.isEmpty()) { - builder.addError(LombokBundle.message("inspection.message.method.s.matched.static.constructor.name.already.defined", staticConstructorName), new SafeDeleteFix(existedStaticMethod)); - } else { - builder.addError(LombokBundle.message("inspection.message.method.s.with.d.parameters.matched.static.constructor.name.already.defined", staticConstructorName, paramTypes.size()), new SafeDeleteFix(existedStaticMethod)); + builder.addError( + LombokBundle.message("inspection.message.method.s.matched.static.constructor.name.already.defined", staticConstructorName), + new SafeDeleteFix(existedStaticMethod)); + } + else { + builder.addError(LombokBundle + .message("inspection.message.method.s.with.d.parameters.matched.static.constructor.name.already.defined", + staticConstructorName, paramTypes.size()), new SafeDeleteFix(existedStaticMethod)); } result = false; } @@ -117,23 +126,26 @@ public boolean validateIsConstructorNotDefined(@NotNull PsiClass psiClass, @Null @NotNull Collection params, @NotNull ProblemBuilder builder) { // Constructor not defined or static constructor not defined return validateIsConstructorNotDefined(psiClass, params, builder) || - validateIsStaticConstructorNotDefined(psiClass, staticConstructorName, params, builder); + validateIsStaticConstructorNotDefined(psiClass, staticConstructorName, params, builder); } private boolean validateIsConstructorNotDefined(@NotNull PsiClass psiClass, @NotNull Collection params, @NotNull ProblemBuilder builder) { boolean result = true; - final List paramTypes = params.stream().map(PsiField::getType).collect(Collectors.toList()); + final List paramTypes = ContainerUtil.map(params, PsiField::getType); final Collection definedConstructors = PsiClassUtil.collectClassConstructorIntern(psiClass); final String constructorName = getConstructorName(psiClass); final PsiMethod existedMethod = findExistedMethod(definedConstructors, constructorName, paramTypes); if (null != existedMethod) { if (paramTypes.isEmpty()) { - builder.addError(LombokBundle.message("inspection.message.constructor.without.parameters.already.defined"), new SafeDeleteFix(existedMethod)); - } else { - builder.addError(LombokBundle.message("inspection.message.constructor.with.d.parameters.already.defined", paramTypes.size()), new SafeDeleteFix(existedMethod)); + builder.addError(LombokBundle.message("inspection.message.constructor.without.parameters.already.defined"), + new SafeDeleteFix(existedMethod)); + } + else { + builder.addError(LombokBundle.message("inspection.message.constructor.with.d.parameters.already.defined", paramTypes.size()), + new SafeDeleteFix(existedMethod)); } result = false; } @@ -160,7 +172,7 @@ private PsiMethod findExistedMethod(final Collection definedMethods, protected Collection getAllNotInitializedAndNotStaticFields(@NotNull PsiClass psiClass) { Collection allNotInitializedNotStaticFields = new ArrayList<>(); final boolean classAnnotatedWithValue = PsiAnnotationSearchUtil.isAnnotatedWith(psiClass, LombokClassNames.VALUE); - for (PsiField psiField : psiClass.getFields()) { + for (PsiField psiField : PsiClassUtil.collectClassFieldsIntern(psiClass)) { // skip fields named $ boolean addField = !psiField.getName().startsWith(LombokUtils.LOMBOK_INTERN_FIELD_MARKER); @@ -172,7 +184,7 @@ protected Collection getAllNotInitializedAndNotStaticFields(@NotNull P boolean isFinal = isFieldFinal(psiField, modifierList, classAnnotatedWithValue); // skip initialized final fields addField &= (!isFinal || !psiField.hasInitializer() || - PsiAnnotationSearchUtil.findAnnotation(psiField, BUILDER_DEFAULT_ANNOTATION) != null); + PsiAnnotationSearchUtil.findAnnotation(psiField, BUILDER_DEFAULT_ANNOTATION) != null); } if (addField) { @@ -215,7 +227,11 @@ private boolean isFieldFinal(@NotNull PsiField psiField, @NotNull PsiModifierLis } @NotNull - protected Collection createConstructorMethod(@NotNull PsiClass psiClass, @PsiModifier.ModifierConstant @NotNull String methodModifier, @NotNull PsiAnnotation psiAnnotation, boolean useJavaDefaults, @NotNull Collection params) { + protected Collection createConstructorMethod(@NotNull PsiClass psiClass, + @PsiModifier.ModifierConstant @NotNull String methodModifier, + @NotNull PsiAnnotation psiAnnotation, + boolean useJavaDefaults, + @NotNull Collection params) { final String staticName = getStaticConstructorName(psiAnnotation); return createConstructorMethod(psiClass, methodModifier, psiAnnotation, useJavaDefaults, params, staticName, false); @@ -280,11 +296,13 @@ private PsiMethod createConstructor(@NotNull PsiClass psiClass, @PsiModifier.Mod } if (!fieldNames.isEmpty()) { - boolean addConstructorProperties = configDiscovery.getBooleanLombokConfigProperty(ConfigKey.ANYCONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES, psiClass); - if (addConstructorProperties || !configDiscovery.getBooleanLombokConfigProperty(ConfigKey.ANYCONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES, psiClass)) { + boolean addConstructorProperties = + configDiscovery.getBooleanLombokConfigProperty(ConfigKey.ANYCONSTRUCTOR_ADD_CONSTRUCTOR_PROPERTIES, psiClass); + if (addConstructorProperties || + !configDiscovery.getBooleanLombokConfigProperty(ConfigKey.ANYCONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES, psiClass)) { final String constructorPropertiesAnnotation = "java.beans.ConstructorProperties( {" + - fieldNames.stream().collect(Collectors.joining("\", \"", "\"", "\"")) + - "} ) "; + fieldNames.stream().collect(Collectors.joining("\", \"", "\"", "\"")) + + "} ) "; constructorBuilder.withAnnotation(constructorPropertiesAnnotation); } } @@ -315,7 +333,12 @@ private PsiMethod createConstructor(@NotNull PsiClass psiClass, @PsiModifier.Mod return constructorBuilder; } - private PsiMethod createStaticConstructor(PsiClass psiClass, @PsiModifier.ModifierConstant String methodModifier, String staticName, boolean useJavaDefaults, Collection params, PsiAnnotation psiAnnotation) { + private PsiMethod createStaticConstructor(PsiClass psiClass, + @PsiModifier.ModifierConstant String methodModifier, + String staticName, + boolean useJavaDefaults, + Collection params, + PsiAnnotation psiAnnotation) { LombokLightMethodBuilder methodBuilder = new LombokLightMethodBuilder(psiClass.getManager(), staticName) .withContainingClass(psiClass) .withNavigationElement(psiAnnotation) @@ -354,7 +377,9 @@ private PsiMethod createStaticConstructor(PsiClass psiClass, @PsiModifier.Modifi } @NotNull - private LightTypeParameterBuilder createTypeParameter(LombokLightMethodBuilder method, int index, PsiTypeParameter psiClassTypeParameter) { + private LightTypeParameterBuilder createTypeParameter(LombokLightMethodBuilder method, + int index, + PsiTypeParameter psiClassTypeParameter) { final String nameOfTypeParameter = StringUtil.notNullize(psiClassTypeParameter.getName()); final LightTypeParameterBuilder result = new LightTypeParameterBuilder(nameOfTypeParameter, method, index); @@ -366,7 +391,9 @@ private LightTypeParameterBuilder createTypeParameter(LombokLightMethodBuilder m } @NotNull - private String createStaticCodeBlockText(@NotNull PsiType psiType, boolean useJavaDefaults, @NotNull final PsiParameterList parameterList) { + private String createStaticCodeBlockText(@NotNull PsiType psiType, + boolean useJavaDefaults, + @NotNull final PsiParameterList parameterList) { final String psiClassName = psiType.getPresentableText(); final String paramsText = useJavaDefaults ? "" : joinParameters(parameterList); return String.format("return new %s(%s);", psiClassName, paramsText); diff --git a/src/test/java/de/plushnikov/intellij/plugin/configsystem/LoggerTest.java b/src/test/java/de/plushnikov/intellij/plugin/configsystem/LoggerTest.java index e3165de66..969a94149 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/configsystem/LoggerTest.java +++ b/src/test/java/de/plushnikov/intellij/plugin/configsystem/LoggerTest.java @@ -1,7 +1,5 @@ package de.plushnikov.intellij.plugin.configsystem; -import java.io.IOException; - /** * Unit tests for IntelliJPlugin for Lombok with activated config system */ @@ -12,69 +10,71 @@ protected String getBasePath() { return super.getBasePath() + "/configsystem/log"; } - public void testFieldIsStatic$LogTest() throws IOException { + public void testFieldIsStatic$LogTest() { doTest(); } - public void testFieldIsStatic$Log4jTest() throws IOException { + public void testFieldIsStatic$Log4jTest() { doTest(); } - public void testFieldIsStatic$Log4j2Test() throws IOException { + public void testFieldIsStatic$Log4j2Test() { doTest(); } - public void testFieldIsStatic$CommonsLogTest() throws IOException { + public void testFieldIsStatic$CommonsLogTest() { doTest(); } - public void testFieldIsStatic$Slf4jTest() throws IOException { + public void testFieldIsStatic$Slf4jTest() { doTest(); } - public void testFieldIsStatic$XSlf4jTest() throws IOException { + public void testFieldIsStatic$XSlf4jTest() { doTest(); } - public void testFieldIsStatic$JBossLogTest() throws IOException { + public void testFieldIsStatic$JBossLogTest() { doTest(); } - - public void testFieldName$LogTest() throws IOException { + public void testFieldIsStatic$Slf4jWithReqConstructor() { doTest(); } - public void testFieldName$Log4jTest() throws IOException { + public void testFieldName$LogTest() { doTest(); } - public void testFieldName$Log4j2Test() throws IOException { + public void testFieldName$Log4jTest() { doTest(); } - public void testFieldName$CommonsLogTest() throws IOException { + public void testFieldName$Log4j2Test() { doTest(); } - public void testFieldName$Slf4jTest() throws IOException { + public void testFieldName$CommonsLogTest() { doTest(); } - public void testFieldName$XSlf4jTest() throws IOException { + public void testFieldName$Slf4jTest() { doTest(); } - public void testFieldName$JBossLogTest() throws IOException { + public void testFieldName$XSlf4jTest() { doTest(); } + public void testFieldName$JBossLogTest() { + doTest(); + } - public void testCustomSimple$CustomLogTest() throws IOException { + public void testCustomSimple$CustomLogTest() { doTest(); } - public void testCustomComplex$CustomLogTest() throws IOException { + public void testCustomComplex$CustomLogTest() { doTest(); } } diff --git a/testData/configsystem/log/fieldIsStatic/after/Slf4jWithReqConstructor.java b/testData/configsystem/log/fieldIsStatic/after/Slf4jWithReqConstructor.java new file mode 100644 index 000000000..8335e4520 --- /dev/null +++ b/testData/configsystem/log/fieldIsStatic/after/Slf4jWithReqConstructor.java @@ -0,0 +1,14 @@ + +public class Slf4jWithReqConstructor { + private final String sampleField; + + private final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Slf4jWithReqConstructor.class); + + public Slf4jWithReqConstructor(String sampleField) { + this.sampleField = sampleField; + } + + public static void main(String... args) { + new Slf4jWithReqConstructor("demo"); + } +} diff --git a/testData/configsystem/log/fieldIsStatic/before/Slf4jTest.java b/testData/configsystem/log/fieldIsStatic/before/Slf4jTest.java index 5ff914dc0..7efdd592d 100644 --- a/testData/configsystem/log/fieldIsStatic/before/Slf4jTest.java +++ b/testData/configsystem/log/fieldIsStatic/before/Slf4jTest.java @@ -2,7 +2,6 @@ @Slf4j public class Slf4jTest { - public void logSomething(){ log.info("Hello World!"); } diff --git a/testData/configsystem/log/fieldIsStatic/before/Slf4jWithReqConstructor.java b/testData/configsystem/log/fieldIsStatic/before/Slf4jWithReqConstructor.java new file mode 100644 index 000000000..eef51d939 --- /dev/null +++ b/testData/configsystem/log/fieldIsStatic/before/Slf4jWithReqConstructor.java @@ -0,0 +1,12 @@ +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +public class Slf4jWithReqConstructor { + private final String sampleField; + + public static void main(String... args) { + new Slf4jWithReqConstructor("demo"); + } +} From 79b415f3bdb1592bfeddef3576faf3b641420df6 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Tue, 29 Dec 2020 21:22:54 +0100 Subject: [PATCH 45/47] [lombok] reverted accessing internal state of 'myName' of LightMethodBuilder GitOrigin-RevId: 444515d599ff868de43b1443abbd6d88b50b4404 --- .../intellij/plugin/psi/LombokLightMethodBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java index 724c65c75..e20159312 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightMethodBuilder.java @@ -253,7 +253,7 @@ public PsiElement replace(@NotNull PsiElement newElement) throws IncorrectOperat @Override public PsiElement setName(@NotNull String name) throws IncorrectOperationException { - setNameIntern(name); + //just do nothing here return this; } From 87abf426d98415d76d8fb7f9c43d3f3ff4835035 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 2 Jan 2021 11:29:47 +0100 Subject: [PATCH 46/47] merged changes from IntelliJ-Master --- .../plushnikov/intellij/plugin/psi/LombokLightParameter.java | 3 ++- .../de/plushnikov/intellij/plugin/usage/LombokUsageTest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java index 258332c5f..bfb02a6c2 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java @@ -18,8 +18,9 @@ public class LombokLightParameter extends LightParameter implements SyntheticEle private final LombokLightIdentifier myNameIdentifier; public LombokLightParameter(@NotNull String name, @NotNull PsiType type, PsiElement declarationScope, Language language) { - super(name, type, declarationScope, language, new LombokLightModifierList(declarationScope.getManager(), language)); + super(name, type, declarationScope, language); myNameIdentifier = new LombokLightIdentifier(declarationScope.getManager(), name); + setModifierList(new LombokLightModifierList(declarationScope.getManager(), language)); } @NotNull diff --git a/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java b/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java index da29cf5ab..a8e857d2b 100644 --- a/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java +++ b/src/test/java/de/plushnikov/intellij/plugin/usage/LombokUsageTest.java @@ -48,7 +48,7 @@ public void testFindUsageSingularBuilder() { } public void testFieldUsages() { - myFixture.configureByFile(getTestName(false) + ".java"); + myFixture.configureByFile(getBasePath() + getTestName(false) + ".java"); PsiClass aClass = myFixture.findClass("Apple"); JavaClassFindUsagesOptions options = new JavaClassFindUsagesOptions(getProject()); options.isFieldsUsages=true; From 1b11c3050ed184c489fa5eb884e2804f24027577 Mon Sep 17 00:00:00 2001 From: Michail Plushnikov Date: Sat, 2 Jan 2021 11:44:15 +0100 Subject: [PATCH 47/47] merged changes from IntelliJ-Master --- .../plugin/psi/LombokLightFieldBuilder.java | 35 ++++++------------- .../plugin/psi/LombokLightParameter.java | 9 ++++- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java index e4a6a01c5..5f7edbde2 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightFieldBuilder.java @@ -17,28 +17,20 @@ * @author Plushnikov Michail */ public class LombokLightFieldBuilder extends LightFieldBuilder implements SyntheticElement { - private String myName; private final LombokLightIdentifier myNameIdentifier; - private final LombokLightModifierList myModifierList; public LombokLightFieldBuilder(@NotNull PsiManager manager, @NotNull String name, @NotNull PsiType type) { super(manager, name, type); - myName = name; + super.setModifierList(new LombokLightModifierList(manager)); myNameIdentifier = new LombokLightIdentifier(manager, name); - myModifierList = new LombokLightModifierList(manager); setBaseIcon(LombokIcons.FIELD_ICON); } - @Override - @NotNull - public LombokLightModifierList getModifierList() { - return myModifierList; - } - @Override public LombokLightFieldBuilder setModifiers(String... modifiers) { - myModifierList.clearModifiers(); - Stream.of(modifiers).forEach(myModifierList::addModifier); + final LombokLightModifierList lombokLightModifierList = (LombokLightModifierList)getModifierList(); + lombokLightModifierList.clearModifiers(); + Stream.of(modifiers).forEach(lombokLightModifierList::addModifier); return this; } @@ -48,23 +40,18 @@ public LombokLightFieldBuilder setModifierList(LightModifierList modifierList) { return this; } - @Override - public boolean hasModifierProperty(@NonNls @NotNull String name) { - return myModifierList.hasModifierProperty(name); - } - public LombokLightFieldBuilder withContainingClass(PsiClass psiClass) { setContainingClass(psiClass); return this; } public LombokLightFieldBuilder withImplicitModifier(@PsiModifier.ModifierConstant @NotNull @NonNls String modifier) { - myModifierList.addImplicitModifierProperty(modifier); + ((LombokLightModifierList)getModifierList()).addImplicitModifierProperty(modifier); return this; } public LombokLightFieldBuilder withModifier(@PsiModifier.ModifierConstant @NotNull @NonNls String modifier) { - myModifierList.addModifier(modifier); + ((LombokLightModifierList)getModifierList()).addModifier(modifier); return this; } @@ -76,13 +63,12 @@ public LombokLightFieldBuilder withNavigationElement(PsiElement navigationElemen @NotNull @Override public String getName() { - return myName; + return myNameIdentifier.getText(); } @Override public PsiElement setName(@NotNull String name) { - myName = name; - myNameIdentifier.setText(myName); + myNameIdentifier.setText(name); return this; } @@ -151,14 +137,13 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; LombokLightFieldBuilder that = (LombokLightFieldBuilder) o; return - Objects.equals(myName, that.myName) && Objects.equals(myNameIdentifier, that.myNameIdentifier) && - Objects.equals(myModifierList, that.myModifierList) && + Objects.equals(getModifierList(), that.getModifierList()) && Objects.equals(getContainingClass(), that.getContainingClass()); } @Override public int hashCode() { - return Objects.hash(myName, myNameIdentifier, myModifierList, getContainingClass()); + return Objects.hash(myNameIdentifier, getModifierList(), getContainingClass()); } } diff --git a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java index bfb02a6c2..0a1aa9747 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java +++ b/src/main/java/de/plushnikov/intellij/plugin/psi/LombokLightParameter.java @@ -6,6 +6,7 @@ import com.intellij.psi.PsiIdentifier; import com.intellij.psi.PsiType; import com.intellij.psi.SyntheticElement; +import com.intellij.psi.impl.light.LightModifierList; import com.intellij.psi.impl.light.LightParameter; import org.jetbrains.annotations.NotNull; @@ -19,8 +20,8 @@ public class LombokLightParameter extends LightParameter implements SyntheticEle public LombokLightParameter(@NotNull String name, @NotNull PsiType type, PsiElement declarationScope, Language language) { super(name, type, declarationScope, language); + super.setModifierList(new LombokLightModifierList(declarationScope.getManager(), language)); myNameIdentifier = new LombokLightIdentifier(declarationScope.getManager(), name); - setModifierList(new LombokLightModifierList(declarationScope.getManager(), language)); } @NotNull @@ -54,6 +55,12 @@ public LombokLightParameter setModifiers(String... modifiers) { return this; } + @Override + public LombokLightParameter setModifierList(LightModifierList modifierList) { + setModifiers(modifierList.getModifiers()); + return this; + } + @Override public boolean equals(Object o) { if (this == o) {