Skip to content

Commit

Permalink
possibility to disable other generators
Browse files Browse the repository at this point in the history
  • Loading branch information
jyrimatti committed Jan 4, 2024
1 parent a9197d4 commit 0710971
Show file tree
Hide file tree
Showing 10 changed files with 135 additions and 59 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>fi.solita.utils</groupId>
<artifactId>meta-utils</artifactId>
<version>0.12.27</version>
<version>0.12.31</version>
<build>
<resources>
<resource>
Expand Down
57 changes: 42 additions & 15 deletions src/main/java/fi/solita/utils/meta/CommonMetadataProcessor.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,10 @@
"CommonMetadataProcessor." + CommonMetadataProcessor.Options.includesAnnotation,
"CommonMetadataProcessor." + CommonMetadataProcessor.Options.excludesAnnotation,
"CommonMetadataProcessor." + CommonMetadataProcessor.Options.methodsAsFunctionsEnabled,
"CommonMetadataProcessor." + CommonMetadataProcessor.Options.constructorsAsFunctionsEnabled})
"CommonMetadataProcessor." + CommonMetadataProcessor.Options.constructorsAsFunctionsEnabled,
"CommonMetadataProcessor." + CommonMetadataProcessor.Options.instanceFieldsAsEnumEnabled,
"CommonMetadataProcessor." + CommonMetadataProcessor.Options.instanceFieldsAsFunctionsEnabled,
"CommonMetadataProcessor." + CommonMetadataProcessor.Options.instanceFieldsAsTupleEnabled})
public class CommonMetadataProcessor<OPTIONS extends CommonMetadataProcessor.CombinedGeneratorOptions> extends AbstractProcessor {

private static final int version = 1;
Expand All @@ -91,6 +94,9 @@ public static class Options {
public static final String excludesAnnotation = "excludesAnnotation";
public static final String methodsAsFunctionsEnabled = "methodsAsFunctionsEnabled";
public static final String constructorsAsFunctionsEnabled = "constructorsAsFunctionsEnabled";
public static final String instanceFieldsAsEnumEnabled = "instanceFieldsAsEnumEnabled";
public static final String instanceFieldsAsFunctionsEnabled = "instanceFieldsAsFunctionsEnabled";
public static final String instanceFieldsAsTupleEnabled = "instanceFieldsAsTupleEnabled";
}

public Map<String, String> options() { return processingEnv.getOptions(); }
Expand All @@ -99,18 +105,21 @@ protected boolean enabledByDefault() {
return true;
}

public boolean enabled() { return Boolean.parseBoolean(findOption(Options.enabled, Boolean.toString(enabledByDefault()))); }
public Pattern includesRegex() { return Pattern.compile(findOption(Options.includesRegex, ".*")); }
public Pattern excludesRegex() { return Pattern.compile(findOption(Options.excludesRegex, ".*_")); }
public boolean onlyPublicMembers() { return Boolean.parseBoolean(findOption(Options.onlyPublicMembers, "false")); }
public boolean includePrivateMembers() { return Boolean.parseBoolean(findOption(Options.includePrivateMembers, "false")); }
public String generatedClassNamePattern() { return findOption(Options.generatedClassNamePattern, "{}_"); }
public String generatedPackagePattern() { return findOption(Options.generatedPackagePattern, "{}"); }
public String includesAnnotation() { return findOption(Options.includesAnnotation, ""); }
public String excludesAnnotation() { return findOption(Options.excludesAnnotation, mkString(",", newList("javax.annotation.processing.Generated", "javax.annotation.Generated", "javax.persistence.Entity", "javax.persistence.MappedSuperclass", "javax.persistence.Embeddable", NoMetadataGeneration.class.getName()))); }
public Pattern extendClassNamePattern() { return Pattern.compile("<not enabled>"); }
public boolean methodsAsFunctionsEnabled(){ return Boolean.parseBoolean(findOption(Options.methodsAsFunctionsEnabled, "true")); }
public boolean constructorsAsFunctionsEnabled(){ return Boolean.parseBoolean(findOption(Options.constructorsAsFunctionsEnabled, "true")); }
public boolean enabled() { return Boolean.parseBoolean(findOption(Options.enabled, Boolean.toString(enabledByDefault()))); }
public Pattern includesRegex() { return Pattern.compile(findOption(Options.includesRegex, ".*")); }
public Pattern excludesRegex() { return Pattern.compile(findOption(Options.excludesRegex, ".*_")); }
public boolean onlyPublicMembers() { return Boolean.parseBoolean(findOption(Options.onlyPublicMembers, "false")); }
public boolean includePrivateMembers() { return Boolean.parseBoolean(findOption(Options.includePrivateMembers, "false")); }
public String generatedClassNamePattern() { return findOption(Options.generatedClassNamePattern, "{}_"); }
public String generatedPackagePattern() { return findOption(Options.generatedPackagePattern, "{}"); }
public String includesAnnotation() { return findOption(Options.includesAnnotation, ""); }
public String excludesAnnotation() { return findOption(Options.excludesAnnotation, mkString(",", newList("javax.annotation.processing.Generated", "javax.annotation.Generated", "javax.persistence.Entity", "javax.persistence.MappedSuperclass", "javax.persistence.Embeddable", NoMetadataGeneration.class.getName()))); }
public Pattern extendClassNamePattern() { return Pattern.compile("<not enabled>"); }
public boolean methodsAsFunctionsEnabled() { return Boolean.parseBoolean(findOption(Options.methodsAsFunctionsEnabled, "true")); }
public boolean constructorsAsFunctionsEnabled() { return Boolean.parseBoolean(findOption(Options.constructorsAsFunctionsEnabled, "true")); }
public boolean instanceFieldsAsEnumEnabled() { return Boolean.parseBoolean(findOption(Options.instanceFieldsAsEnumEnabled, "true")); }
public boolean instanceFieldsAsFunctionsEnabled() { return Boolean.parseBoolean(findOption(Options.instanceFieldsAsFunctionsEnabled, "true")); }
public boolean instanceFieldsAsTupleEnabled() { return Boolean.parseBoolean(findOption(Options.instanceFieldsAsTupleEnabled, "true")); }

public String findOption(String option, String defaultIfNotFound) {
return find(getClass().getSimpleName() + "." + option, options()).getOrElse(defaultIfNotFound);
Expand Down Expand Up @@ -169,6 +178,9 @@ public OPTIONS generatorOptions() {
final String generatedClassNamePattern = CommonMetadataProcessor.this.generatedClassNamePattern();
final boolean methodsAsFunctionsEnabled = CommonMetadataProcessor.this.methodsAsFunctionsEnabled();
final boolean constructorsAsFunctionsEnabled = CommonMetadataProcessor.this.constructorsAsFunctionsEnabled();
final boolean instanceFieldsAsEnumEnabled = CommonMetadataProcessor.this.instanceFieldsAsEnumEnabled();
final boolean instanceFieldsAsFunctionsEnabled = CommonMetadataProcessor.this.instanceFieldsAsFunctionsEnabled();
final boolean instanceFieldsAsTupleEnabled = CommonMetadataProcessor.this.instanceFieldsAsTupleEnabled();
return (OPTIONS) new CombinedGeneratorOptions() {
public boolean onlyPublicMembers() {
return onlyPublicMembers;
Expand All @@ -192,6 +204,18 @@ public boolean methodsAsFunctionsEnabled() {
public boolean constructorsAsFunctionsEnabled() {
return constructorsAsFunctionsEnabled;
}
@Override
public boolean instanceFieldsAsEnumEnabled() {
return instanceFieldsAsEnumEnabled;
}
@Override
public boolean instanceFieldsAsFunctionsEnabled() {
return instanceFieldsAsFunctionsEnabled;
}
@Override
public boolean instanceFieldsAsTupleEnabled() {
return instanceFieldsAsTupleEnabled;
}
};
}

Expand Down Expand Up @@ -272,14 +296,17 @@ public boolean doProcess(RoundEnvironment roundEnv) {
}
List<Pair<List<Long>, List<String>>> nestedData = newList(map(nestedDataProducer, filter(Predicate.of(Function.<Element,Boolean>constant(true)), nestedToProcess)));
long time3 = System.nanoTime();
Iterable<String> content = map(padding, concat(flatMap(Helpers.<List<String>>right(), elemData), flatMap(Helpers.<List<String>>right(), nestedData)));
List<String> content = newList(map(padding, concat(flatMap(Helpers.<List<String>>right(), elemData), flatMap(Helpers.<List<String>>right(), nestedData))));

String genPackage = genPackagePat.replace("{}", getPackageName(element));
String genClassName = genClassNamePat.replace("{}", element.getSimpleName().toString());
String superclassName = removeGenericPart.apply(element.getSuperclass().toString());
Option<String> extendedClassName = extendClassNamePattern.matcher(superclassName).matches() ? Some(genClassNamePat.replace("{}", superclassName)) : Option.<String>None();
long time4 = System.nanoTime();
ClassFileWriter.writeClassFile(genPackage, genClassName, extendedClassName, content, clazz, filer, element, Option.of(element.getAnnotation(SuppressWarnings.class)), element.getAnnotation(Deprecated.class) != null);
if (!content.isEmpty() || Helpers.isAbstract(element)) {
// always produce metaclass for abstract classes in case they are inherited
ClassFileWriter.writeClassFile(genPackage, genClassName, extendedClassName, content, clazz, filer, element, Option.of(element.getAnnotation(SuppressWarnings.class)), element.getAnnotation(Deprecated.class) != null);
}

generation += time2 - time;
nestedGeneration += time3 - time2;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,7 @@
public @interface ForceMetadataGeneration {
boolean constructorsAsFunctions() default false;
boolean methodsAsFunctions() default false;
boolean instanceFieldsAsEnum() default false;
boolean instanceFieldsAsFunctions() default false;
boolean instanceFieldsAsTuple() default false;
}
38 changes: 32 additions & 6 deletions src/main/java/fi/solita/utils/meta/Helpers.java
Original file line number Diff line number Diff line change
Expand Up @@ -303,11 +303,19 @@ public String visitPackage(PackageElement e, Object p) {
}
};

public static final Function1<Element, Iterable<VariableElement>> element2Fields = new Transformer<Element, Iterable<VariableElement>>() {
public static final Function1<Element, Iterable<Element>> element2Fields = new Transformer<Element, Iterable<Element>>() {
@SuppressWarnings("unchecked")
@Override
public Iterable<VariableElement> transform(Element source) {
return (Iterable<VariableElement>) filter(fields, Workaround.getEnclosedElementsDeclarationOrder(source));
public Iterable<Element> transform(Element source) {
return (Iterable<Element>) filter(fields, Workaround.getEnclosedElementsDeclarationOrder(source));
}
};

public static final Function1<Element, Iterable<Element>> element2RecordComponents = new Transformer<Element, Iterable<Element>>() {
@SuppressWarnings("unchecked")
@Override
public Iterable<Element> transform(Element source) {
return (Iterable<Element>) filter(recordComponents, Workaround.getEnclosedElementsDeclarationOrder(source));
}
};

Expand Down Expand Up @@ -370,6 +378,13 @@ public boolean accept(Element candidate) {
}
};

public static final Predicate<Element> recordComponents = new Predicate<Element>() {
@Override
public boolean accept(Element candidate) {
return candidate.getKind().name().equals("RECORD_COMPONENT");
}
};

public static final Predicate<Element> classes = new Predicate<Element>() {
@Override
public boolean accept(Element candidate) {
Expand Down Expand Up @@ -477,6 +492,10 @@ public static final boolean isFinal(Element e) {
return e.getModifiers().contains(Modifier.FINAL);
}

public static final boolean isAbstract(Element e) {
return e.getModifiers().contains(Modifier.ABSTRACT);
}

public static final boolean returnsVoid(ExecutableElement method) {
return method.getReturnType().getKind() == TypeKind.VOID;
}
Expand Down Expand Up @@ -765,6 +784,7 @@ private boolean acc(final Element e, final Set<Element> visited) {
Iterable<AnnotationMirror> constructorAnnotations;
Iterable<AnnotationMirror> methodAnnotations;
Iterable<AnnotationMirror> fieldAnnotations;
Iterable<AnnotationMirror> recordComponentAnnotations;
if (includeNested) {
for (TypeElement n: element2NestedClasses.apply(e)) {
if (acc(n, visited)) {
Expand All @@ -782,23 +802,29 @@ public List<? extends AnnotationMirror> transform(ExecutableElement source) {
public List<? extends AnnotationMirror> transform(ExecutableElement source) {
return source.getAnnotationMirrors();
}}, element2Methods.apply(e));
fieldAnnotations = flatMap(new Transformer<VariableElement,List<? extends AnnotationMirror>>() {
fieldAnnotations = flatMap(new Transformer<Element,List<? extends AnnotationMirror>>() {
@Override
public List<? extends AnnotationMirror> transform(VariableElement source) {
public List<? extends AnnotationMirror> transform(Element source) {
return source.getAnnotationMirrors();
}}, element2Fields.apply(e));
recordComponentAnnotations = flatMap(new Transformer<Element,List<? extends AnnotationMirror>>() {
@Override
public List<? extends AnnotationMirror> transform(Element source) {
return source.getAnnotationMirrors();
}}, element2RecordComponents.apply(e));
} else {
constructorAnnotations = Collections.emptyList();
methodAnnotations = Collections.emptyList();
fieldAnnotations = Collections.emptyList();
recordComponentAnnotations = Collections.emptyList();
}
return exists(new Predicate<AnnotationMirror>() {
@Override
public boolean accept(AnnotationMirror m) {
Element elem = m.getAnnotationType().asElement();
return className.contains(qualifiedName.apply(elem)) || !elem.equals(e) && acc(elem, visited);
}
}, concat(e.getAnnotationMirrors(), constructorAnnotations, methodAnnotations, fieldAnnotations));
}, concat(e.getAnnotationMirrors(), constructorAnnotations, methodAnnotations, fieldAnnotations, recordComponentAnnotations));
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
import fi.solita.utils.functional.Apply;
import fi.solita.utils.functional.Function1;
import fi.solita.utils.functional.Function3;
import fi.solita.utils.functional.Option;
import fi.solita.utils.meta.ForceMetadataGeneration;
import fi.solita.utils.meta.Helpers;

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/fi/solita/utils/meta/generators/Content.java
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ public Pair<List<Long>,List<String>> apply(CommonMetadataProcessor.CombinedGener

Iterable<Long> generatorTimesForContent = map(Helpers.<Long>left(), elemData);
Iterable<List<Long>> generatorTimesForNestedClasses = map(Helpers.<List<Long>>left(), nestedData);
Iterable<String> elemContents = flatMap(Helpers.<List<String>>right(), elemData);
List<String> elemContents = newList(flatMap(Helpers.<List<String>>right(), elemData));
Iterable<String> nestedContents = flatMap(Helpers.<List<String>>right(), nestedData);

List<Long> totalTimesPerGenerator = newList(map(Helpers.iterableSum, transpose(cons(generatorTimesForContent, generatorTimesForNestedClasses))));
Expand All @@ -172,7 +172,7 @@ public Pair<List<Long>,List<String>> apply(CommonMetadataProcessor.CombinedGener
elemContents,
map(padding, nestedContents),
Some("}")));
return Pair.of(totalTimesPerGenerator, allContents);
return Pair.of(totalTimesPerGenerator, !Helpers.isAbstract(source) && elemContents.isEmpty() && nestedData.isEmpty() ? Collections.<String>emptyList() : allContents);
}
};
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,5 @@
package fi.solita.utils.meta.generators;

import static fi.solita.utils.meta.Helpers.element2Fields;
import static fi.solita.utils.meta.Helpers.padding;
import static fi.solita.utils.meta.Helpers.privateElement;
import static fi.solita.utils.meta.Helpers.publicElement;
import static fi.solita.utils.meta.Helpers.simpleName;
import static fi.solita.utils.meta.Helpers.staticElements;
import static fi.solita.utils.functional.Collections.emptyList;
import static fi.solita.utils.functional.Collections.newList;
import static fi.solita.utils.functional.Functional.filter;
Expand All @@ -14,12 +8,20 @@
import static fi.solita.utils.functional.Option.Some;
import static fi.solita.utils.functional.Predicates.not;
import static fi.solita.utils.functional.Transformers.append;
import static fi.solita.utils.meta.Helpers.element2Fields;
import static fi.solita.utils.meta.Helpers.padding;
import static fi.solita.utils.meta.Helpers.privateElement;
import static fi.solita.utils.meta.Helpers.publicElement;
import static fi.solita.utils.meta.Helpers.simpleName;
import static fi.solita.utils.meta.Helpers.staticElements;

import java.util.List;

import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;

import fi.solita.utils.meta.ForceMetadataGeneration;

public class InstanceFieldsAsEnum extends Generator<InstanceFieldsAsEnum.Options>{

Expand All @@ -28,18 +30,23 @@ public class InstanceFieldsAsEnum extends Generator<InstanceFieldsAsEnum.Options
public static interface Options extends GeneratorOptions {
boolean onlyPublicMembers();
boolean includePrivateMembers();
boolean instanceFieldsAsEnumEnabled();
}

@Override
public Iterable<String> apply(ProcessingEnvironment processingEnv, Options options, TypeElement source) {
Iterable<VariableElement> elements = element2Fields.apply(source);
if (!options.instanceFieldsAsEnumEnabled() && (source.getAnnotation(ForceMetadataGeneration.class) == null || !source.getAnnotation(ForceMetadataGeneration.class).instanceFieldsAsEnum())) {
return emptyList();
}

Iterable<Element> elements = element2Fields.apply(source);
if (options.onlyPublicMembers()) {
elements = filter(publicElement, elements);
} else if (!options.includePrivateMembers()) {
elements = filter(not(privateElement), elements);
}

List<VariableElement> fieldsToInclude = newList(filter(not(staticElements), elements));
List<Element> fieldsToInclude = newList(filter(not(staticElements), elements));
if (fieldsToInclude.isEmpty()) {
return emptyList();
}
Expand Down
Loading

0 comments on commit 0710971

Please sign in to comment.