Skip to content

Commit

Permalink
WIP: Modifier processors for different types
Browse files Browse the repository at this point in the history
  • Loading branch information
alexejk committed Apr 9, 2016
1 parent 91e65b1 commit b0245fb
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 2 deletions.
Expand Up @@ -2,10 +2,12 @@


import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.ExtensionPointName;
import de.plushnikov.intellij.plugin.processor.Processor; import de.plushnikov.intellij.plugin.processor.Processor;
import de.plushnikov.intellij.plugin.processor.modifier.ModifierProcessor;


/** /**
* Date: 21.07.13 Time: 12:54 * Date: 21.07.13 Time: 12:54
*/ */
public class LombokProcessorExtensionPoint { public class LombokProcessorExtensionPoint {
public static final ExtensionPointName<Processor> EP_NAME = ExtensionPointName.create("Lombook Plugin.processor"); public static final ExtensionPointName<Processor> EP_NAME_PROCESSOR = ExtensionPointName.create("Lombook Plugin.processor");
public static final ExtensionPointName<ModifierProcessor> EP_NAME_MODIFIER_PROCESSOR = ExtensionPointName.create("Lombook Plugin.modifierProcessor");
} }
@@ -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);
}
@@ -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;
}
}
Expand Up @@ -3,6 +3,7 @@
import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiField; import com.intellij.psi.PsiField;
Expand All @@ -15,13 +16,17 @@
import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker; 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.Processor;
import de.plushnikov.intellij.plugin.processor.ValProcessor; 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 de.plushnikov.intellij.plugin.settings.ProjectSettings;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;


import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
Expand All @@ -35,19 +40,36 @@ public class LombokAugmentProvider extends PsiAugmentProvider {
private static final Logger log = Logger.getInstance(LombokAugmentProvider.class.getName()); private static final Logger log = Logger.getInstance(LombokAugmentProvider.class.getName());


private ValProcessor valProcessor; private ValProcessor valProcessor;
private Collection<ModifierProcessor> modifierProcessors;


public LombokAugmentProvider() { public LombokAugmentProvider() {
log.debug("LombokAugmentProvider created"); log.debug("LombokAugmentProvider created");
valProcessor = new ValProcessor(); valProcessor = new ValProcessor();
modifierProcessors = Arrays.asList(LombokProcessorExtensionPoint.EP_NAME_MODIFIER_PROCESSOR.getExtensions());
} }


@Nullable @Nullable
//@Override //May cause issues with older versions of IDEA SDK that are currently supported //@Override //May cause issues with older versions of IDEA SDK that are currently supported
protected Boolean hasModifierProperty(@NotNull PsiModifierList modifierList, @NotNull String name) { protected Boolean hasModifierProperty(@NotNull PsiModifierList modifierList, @NotNull String name) {

if (DumbService.isDumb(modifierList.getProject()) || !valProcessor.isEnabled(modifierList.getProject())) { if (DumbService.isDumb(modifierList.getProject()) || !valProcessor.isEnabled(modifierList.getProject())) {
return null; 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); return valProcessor.hasModifierProperty(modifierList, name);
} }


Expand Down
Expand Up @@ -12,12 +12,14 @@
import com.intellij.psi.PsiModifierList; import com.intellij.psi.PsiModifierList;
import de.plushnikov.intellij.plugin.extension.LombokProcessorExtensionPoint; import de.plushnikov.intellij.plugin.extension.LombokProcessorExtensionPoint;
import de.plushnikov.intellij.plugin.processor.Processor; 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.PsiAnnotationSearchUtil;
import de.plushnikov.intellij.plugin.util.PsiClassUtil; import de.plushnikov.intellij.plugin.util.PsiClassUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;


import java.lang.annotation.Annotation; import java.lang.annotation.Annotation;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
Expand Down Expand Up @@ -69,7 +71,7 @@ public void initProcessors() {


@NotNull @NotNull
private Processor[] getLombokProcessors() { private Processor[] getLombokProcessors() {
return LombokProcessorExtensionPoint.EP_NAME.getExtensions(); return LombokProcessorExtensionPoint.EP_NAME_PROCESSOR.getExtensions();
} }


private <K, V> void putProcessor(final Map<K, Collection<V>> map, final K key, final V value) { private <K, V> void putProcessor(final Map<K, Collection<V>> map, final K key, final V value) {
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/META-INF/plugin.xml
Expand Up @@ -66,6 +66,7 @@


<extensionPoints> <extensionPoints>
<extensionPoint name="processor" interface="de.plushnikov.intellij.plugin.processor.Processor"/> <extensionPoint name="processor" interface="de.plushnikov.intellij.plugin.processor.Processor"/>
<extensionPoint name="modifierProcessor" interface="de.plushnikov.intellij.plugin.processor.modifier.ModifierProcessor"/>
</extensionPoints> </extensionPoints>


<extensions defaultExtensionNs="com.intellij"> <extensions defaultExtensionNs="com.intellij">
Expand Down Expand Up @@ -149,6 +150,8 @@
<!-- hrisey --> <!-- hrisey -->
<processor implementation="pl.mg6.hrisey.intellij.plugin.processor.clazz.ParcelableMethodsProcessor"/> <processor implementation="pl.mg6.hrisey.intellij.plugin.processor.clazz.ParcelableMethodsProcessor"/>
<processor implementation="pl.mg6.hrisey.intellij.plugin.processor.clazz.ParcelableFieldsProcessor"/> <processor implementation="pl.mg6.hrisey.intellij.plugin.processor.clazz.ParcelableFieldsProcessor"/>

<modifierProcessor implementation="de.plushnikov.intellij.plugin.processor.modifier.ValueModifierProcessor" />
</extensions> </extensions>


<actions> <actions>
Expand Down

0 comments on commit b0245fb

Please sign in to comment.