Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added support for @builder on classes with partial Builder implementa…
…tion #33
- Loading branch information
Michail Plushnikov
committed
Feb 22, 2015
1 parent
a75b04f
commit 8847144
Showing
22 changed files
with
337 additions
and
101 deletions.
There are no files selected for viewing
8 changes: 4 additions & 4 deletions
8
...in/src/main/java/de/plushnikov/intellij/plugin/action/delombok/DelombokBuilderAction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
4 changes: 2 additions & 2 deletions
4
...src/main/java/de/plushnikov/intellij/plugin/action/delombok/DelombokEverythingAction.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
65 changes: 65 additions & 0 deletions
65
...intellij/plugin/processor/clazz/builder/AbstractBuilderPreDefinedInnerClassProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
package de.plushnikov.intellij.plugin.processor.clazz.builder; | ||
|
||
import com.intellij.psi.PsiAnnotation; | ||
import com.intellij.psi.PsiClass; | ||
import com.intellij.psi.PsiElement; | ||
import com.intellij.psi.PsiType; | ||
import de.plushnikov.intellij.plugin.problem.ProblemBuilder; | ||
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.psi.LombokLightClass; | ||
import de.plushnikov.intellij.plugin.util.PsiAnnotationUtil; | ||
import de.plushnikov.intellij.plugin.util.PsiClassUtil; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.lang.annotation.Annotation; | ||
import java.util.ArrayList; | ||
import java.util.Collections; | ||
import java.util.List; | ||
|
||
public abstract class AbstractBuilderPreDefinedInnerClassProcessor extends AbstractClassProcessor { | ||
protected final BuilderHandler builderHandler = new BuilderHandler(); | ||
|
||
public AbstractBuilderPreDefinedInnerClassProcessor(Class<? extends Annotation> supportedAnnotationClass, Class<? extends PsiElement> supportedClass) { | ||
super(supportedAnnotationClass, supportedClass); | ||
} | ||
|
||
@NotNull | ||
@Override | ||
public List<? super PsiElement> process(@NotNull PsiClass psiClass) { | ||
List<? super PsiElement> result = Collections.emptyList(); | ||
|
||
final PsiElement parentElement = psiClass.getParent(); | ||
if (parentElement instanceof PsiClass && !(parentElement instanceof LombokLightClass)) { | ||
final PsiClass psiParentClass = (PsiClass) parentElement; | ||
PsiAnnotation psiAnnotation = PsiAnnotationUtil.findAnnotation(psiParentClass, getSupportedAnnotation()); | ||
if (null != psiAnnotation) { | ||
final PsiType psiBuilderType = PsiClassUtil.getTypeWithGenerics(psiParentClass); | ||
final String builderClassName = builderHandler.getBuilderClassName(psiParentClass, psiAnnotation, psiBuilderType); | ||
|
||
// apply only to inner BuilderClass | ||
if (builderClassName.equals(psiClass.getName())) { | ||
if (validate(psiAnnotation, psiClass, ProblemEmptyBuilder.getInstance())) { | ||
result = new ArrayList<PsiElement>(); | ||
generatePsiElements(psiParentClass, psiClass, psiAnnotation, result); | ||
} | ||
} | ||
} | ||
} | ||
|
||
return result; | ||
} | ||
|
||
protected abstract void generatePsiElements(@NotNull PsiClass psiParentClass, @NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @NotNull List<? super PsiElement> target); | ||
|
||
@Override | ||
protected boolean validate(@NotNull PsiAnnotation psiAnnotation, @NotNull PsiClass psiClass, @NotNull ProblemBuilder builder) { | ||
return true; | ||
} | ||
|
||
@Override | ||
protected void generatePsiElements(@NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @NotNull List<? super PsiElement> target) { | ||
//do nothing | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
...zz/BuilderExperimentalClassProcessor.java → ...er/BuilderExperimentalClassProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
10 changes: 10 additions & 0 deletions
10
...plugin/processor/clazz/builder/BuilderExperimentalPreDefinedInnerClassFieldProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package de.plushnikov.intellij.plugin.processor.clazz.builder; | ||
|
||
import lombok.experimental.Builder; | ||
|
||
public class BuilderExperimentalPreDefinedInnerClassFieldProcessor extends BuilderPreDefinedInnerClassFieldProcessor { | ||
@SuppressWarnings("deprecation") | ||
public BuilderExperimentalPreDefinedInnerClassFieldProcessor() { | ||
super(Builder.class); | ||
} | ||
} |
10 changes: 10 additions & 0 deletions
10
...lugin/processor/clazz/builder/BuilderExperimentalPreDefinedInnerClassMethodProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
package de.plushnikov.intellij.plugin.processor.clazz.builder; | ||
|
||
import lombok.experimental.Builder; | ||
|
||
public class BuilderExperimentalPreDefinedInnerClassMethodProcessor extends BuilderPreDefinedInnerClassMethodProcessor { | ||
@SuppressWarnings("deprecation") | ||
public BuilderExperimentalPreDefinedInnerClassMethodProcessor() { | ||
super(Builder.class); | ||
} | ||
} |
2 changes: 1 addition & 1 deletion
2
...r/clazz/BuilderExperimentalProcessor.java → ...builder/BuilderExperimentalProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
36 changes: 36 additions & 0 deletions
36
...ov/intellij/plugin/processor/clazz/builder/BuilderPreDefinedInnerClassFieldProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package de.plushnikov.intellij.plugin.processor.clazz.builder; | ||
|
||
import com.intellij.psi.PsiAnnotation; | ||
import com.intellij.psi.PsiClass; | ||
import com.intellij.psi.PsiElement; | ||
import com.intellij.psi.PsiField; | ||
import de.plushnikov.intellij.plugin.processor.handler.BuilderHandler; | ||
import de.plushnikov.intellij.plugin.util.PsiClassUtil; | ||
import lombok.Builder; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.lang.annotation.Annotation; | ||
import java.util.List; | ||
|
||
/** | ||
* Creates methods for a builder inner class if it is predefined. | ||
* | ||
* @author Michail Plushnikov | ||
*/ | ||
public class BuilderPreDefinedInnerClassFieldProcessor extends AbstractBuilderPreDefinedInnerClassProcessor { | ||
|
||
private final BuilderHandler builderHandler = new BuilderHandler(); | ||
|
||
public BuilderPreDefinedInnerClassFieldProcessor() { | ||
this(Builder.class); | ||
} | ||
|
||
protected BuilderPreDefinedInnerClassFieldProcessor(@NotNull Class<? extends Annotation> builderClass) { | ||
super(builderClass, PsiField.class); | ||
} | ||
|
||
@Override | ||
protected void generatePsiElements(@NotNull PsiClass psiParentClass, @NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @NotNull List<? super PsiElement> target) { | ||
target.addAll(builderHandler.createFields(psiParentClass, PsiClassUtil.collectClassFieldsIntern(psiClass))); | ||
} | ||
} |
39 changes: 39 additions & 0 deletions
39
...v/intellij/plugin/processor/clazz/builder/BuilderPreDefinedInnerClassMethodProcessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package de.plushnikov.intellij.plugin.processor.clazz.builder; | ||
|
||
import com.intellij.psi.PsiAnnotation; | ||
import com.intellij.psi.PsiClass; | ||
import com.intellij.psi.PsiElement; | ||
import com.intellij.psi.PsiField; | ||
import com.intellij.psi.PsiMethod; | ||
import com.intellij.psi.PsiType; | ||
import de.plushnikov.intellij.plugin.util.PsiClassUtil; | ||
import lombok.Builder; | ||
import org.jetbrains.annotations.NotNull; | ||
|
||
import java.lang.annotation.Annotation; | ||
import java.util.Collection; | ||
import java.util.List; | ||
|
||
/** | ||
* Creates methods for a builder inner class if it is predefined. | ||
* | ||
* @author Michail Plushnikov | ||
*/ | ||
public class BuilderPreDefinedInnerClassMethodProcessor extends AbstractBuilderPreDefinedInnerClassProcessor { | ||
|
||
public BuilderPreDefinedInnerClassMethodProcessor() { | ||
this(Builder.class); | ||
} | ||
|
||
protected BuilderPreDefinedInnerClassMethodProcessor(@NotNull Class<? extends Annotation> builderClass) { | ||
super(builderClass, PsiMethod.class); | ||
} | ||
|
||
protected void generatePsiElements(@NotNull PsiClass psiParentClass, @NotNull PsiClass psiClass, @NotNull PsiAnnotation psiAnnotation, @NotNull List<? super PsiElement> target) { | ||
final Collection<PsiField> tmpFields = builderHandler.createFields(psiParentClass); | ||
final PsiType psiBuilderType = PsiClassUtil.getTypeWithGenerics(psiParentClass); | ||
target.addAll(builderHandler.createConstructors(psiClass, psiAnnotation)); | ||
target.addAll(builderHandler.createMethods(psiClass, tmpFields, psiAnnotation, psiBuilderType, psiClass)); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.