From b0245fb530413372f8100da4e2425daa35d0b35e Mon Sep 17 00:00:00 2001 From: Alexej Kubarev Date: Sat, 9 Apr 2016 18:05:20 +0200 Subject: [PATCH] WIP: Modifier processors for different types --- .../LombokProcessorExtensionPoint.java | 4 +- .../processor/modifier/ModifierProcessor.java | 13 +++++ .../modifier/ValueModifierProcessor.java | 58 +++++++++++++++++++ .../provider/LombokAugmentProvider.java | 22 +++++++ .../provider/LombokProcessorProvider.java | 4 +- src/main/resources/META-INF/plugin.xml | 3 + 6 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/plushnikov/intellij/plugin/processor/modifier/ModifierProcessor.java create mode 100644 src/main/java/de/plushnikov/intellij/plugin/processor/modifier/ValueModifierProcessor.java diff --git a/src/main/java/de/plushnikov/intellij/plugin/extension/LombokProcessorExtensionPoint.java b/src/main/java/de/plushnikov/intellij/plugin/extension/LombokProcessorExtensionPoint.java index eed31098f..5ef3e59d6 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/extension/LombokProcessorExtensionPoint.java +++ b/src/main/java/de/plushnikov/intellij/plugin/extension/LombokProcessorExtensionPoint.java @@ -2,10 +2,12 @@ import com.intellij.openapi.extensions.ExtensionPointName; import de.plushnikov.intellij.plugin.processor.Processor; +import de.plushnikov.intellij.plugin.processor.modifier.ModifierProcessor; /** * Date: 21.07.13 Time: 12:54 */ public class LombokProcessorExtensionPoint { - public static final ExtensionPointName EP_NAME = ExtensionPointName.create("Lombook Plugin.processor"); + public static final ExtensionPointName EP_NAME_PROCESSOR = ExtensionPointName.create("Lombook Plugin.processor"); + public static final ExtensionPointName EP_NAME_MODIFIER_PROCESSOR = ExtensionPointName.create("Lombook Plugin.modifierProcessor"); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/modifier/ModifierProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/modifier/ModifierProcessor.java new file mode 100644 index 000000000..4689c5580 --- /dev/null +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/modifier/ModifierProcessor.java @@ -0,0 +1,13 @@ +package de.plushnikov.intellij.plugin.processor.modifier; + +import com.intellij.psi.PsiModifierList; +import org.jetbrains.annotations.NotNull; + +/** + * @author Alexej Kubarev + */ +public interface ModifierProcessor { + + boolean isSupported(@NotNull PsiModifierList modifierList, @NotNull String name); + Boolean hasModifierProperty(@NotNull PsiModifierList modifierList, @NotNull String name); +} diff --git a/src/main/java/de/plushnikov/intellij/plugin/processor/modifier/ValueModifierProcessor.java b/src/main/java/de/plushnikov/intellij/plugin/processor/modifier/ValueModifierProcessor.java new file mode 100644 index 000000000..f5e333f3c --- /dev/null +++ b/src/main/java/de/plushnikov/intellij/plugin/processor/modifier/ValueModifierProcessor.java @@ -0,0 +1,58 @@ +package de.plushnikov.intellij.plugin.processor.modifier; + +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiModifierList; +import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; +import org.jetbrains.annotations.NotNull; + +/** + * @author Alexej Kubarev + */ +public class ValueModifierProcessor implements ModifierProcessor { + + + @Override + public boolean isSupported(@NotNull PsiModifierList modifierList, @NotNull String name) { + + // Fast check if the requested modifier is even supported + if (!PsiModifier.FINAL.equals(name) || PsiModifier.PRIVATE.equals(name)) { + return false; + } + + PsiElement parent = modifierList.getParent(); + PsiClass searchableClass = null; + + if (parent instanceof PsiClass) { + searchableClass = (PsiClass) parent; + } else if (parent instanceof PsiField) { + searchableClass = ((PsiField) parent).getContainingClass(); + } + + if (null != searchableClass) { + + return PsiAnnotationSearchUtil.isAnnotatedWith(searchableClass, lombok.Value.class, lombok.experimental.Value.class); + } + + return false; + } + + @Override + public Boolean hasModifierProperty(@NotNull PsiModifierList modifierList, @NotNull String name) { + + if (PsiModifier.FINAL.equals(name)) { + return Boolean.TRUE; + } + + if (PsiModifier.PRIVATE.equals(name)) { + if (modifierList.getParent() instanceof PsiField) { + return Boolean.TRUE; + } + } + + return null; + } +} 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 a3456be97..0bc43a45a 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAugmentProvider.java @@ -3,6 +3,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiField; @@ -15,13 +16,17 @@ import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; +import de.plushnikov.intellij.plugin.extension.LombokProcessorExtensionPoint; 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.processor.modifier.ValueModifierProcessor; import de.plushnikov.intellij.plugin.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -35,19 +40,36 @@ public class LombokAugmentProvider extends PsiAugmentProvider { private static final Logger log = Logger.getInstance(LombokAugmentProvider.class.getName()); private ValProcessor valProcessor; + private Collection modifierProcessors; public LombokAugmentProvider() { log.debug("LombokAugmentProvider created"); valProcessor = new ValProcessor(); + modifierProcessors = Arrays.asList(LombokProcessorExtensionPoint.EP_NAME_MODIFIER_PROCESSOR.getExtensions()); } @Nullable //@Override //May cause issues with older versions of IDEA SDK that are currently supported protected Boolean hasModifierProperty(@NotNull PsiModifierList modifierList, @NotNull String name) { + if (DumbService.isDumb(modifierList.getProject()) || !valProcessor.isEnabled(modifierList.getProject())) { return null; } + PsiElement parent = modifierList.getParent(); + + // Loop through all available processors and give all of them a chance to respond + for (ModifierProcessor processor: modifierProcessors) { + if (processor.isSupported(modifierList)) { + Boolean valueProcessorResult = processor.hasModifierProperty(modifierList, name); + + // We found a match (non-null value = authoritative response) + if (valueProcessorResult != null) { + return valueProcessorResult; + } + } + } + return valProcessor.hasModifierProperty(modifierList, name); } diff --git a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokProcessorProvider.java b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokProcessorProvider.java index 2a8b4c9fb..679110581 100644 --- a/src/main/java/de/plushnikov/intellij/plugin/provider/LombokProcessorProvider.java +++ b/src/main/java/de/plushnikov/intellij/plugin/provider/LombokProcessorProvider.java @@ -12,12 +12,14 @@ import com.intellij.psi.PsiModifierList; import de.plushnikov.intellij.plugin.extension.LombokProcessorExtensionPoint; import de.plushnikov.intellij.plugin.processor.Processor; +import de.plushnikov.intellij.plugin.processor.modifier.ModifierProcessor; import de.plushnikov.intellij.plugin.util.PsiAnnotationSearchUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil; import org.jetbrains.annotations.NotNull; import java.lang.annotation.Annotation; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -69,7 +71,7 @@ public void initProcessors() { @NotNull private Processor[] getLombokProcessors() { - return LombokProcessorExtensionPoint.EP_NAME.getExtensions(); + return LombokProcessorExtensionPoint.EP_NAME_PROCESSOR.getExtensions(); } private void putProcessor(final Map> map, final K key, final V value) { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 9ae0139a4..56891c46e 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -66,6 +66,7 @@ + @@ -149,6 +150,8 @@ + +