use of io.sundr.builder.Visitor in project sundrio by sundrio.
the class BuildableProcessor method process.
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
Elements elements = processingEnv.getElementUtils();
Types types = processingEnv.getTypeUtils();
Filer filer = processingEnv.getFiler();
BuilderContext ctx = null;
// First pass register all buildables
Set<TypeDef> buildables = new HashSet<>();
for (TypeElement typeElement : annotations) {
for (Element element : env.getElementsAnnotatedWith(typeElement)) {
Buildable buildable = element.getAnnotation(Buildable.class);
if (buildable == null) {
continue;
}
AptContext aptContext = AptContext.create(elements, types, DefinitionRepository.getRepository());
ctx = BuilderContextManager.create(elements, types, buildable.validationEnabled(), buildable.generateBuilderPackage(), buildable.builderPackage());
TypeDef b = new TypeDefBuilder(Adapters.adaptType(Apt.getClassElement(element), aptContext)).addToAttributes(BUILDABLE, buildable).addToAttributes(EDITABLE_ENABLED, buildable.editableEnabled()).addToAttributes(VALIDATION_ENABLED, buildable.validationEnabled()).accept(new Visitor<PropertyBuilder>() {
@Override
public void visit(PropertyBuilder builder) {
builder.addToAttributes(LAZY_COLLECTIONS_INIT_ENABLED, buildable.lazyCollectionInitEnabled());
builder.addToAttributes(LAZY_MAP_INIT_ENABLED, buildable.lazyMapInitEnabled());
}
}).build();
ctx.getDefinitionRepository().register(b);
ctx.getBuildableRepository().register(b);
buildables.add(b);
for (TypeElement ref : BuilderUtils.getBuildableReferences(ctx, buildable)) {
TypeDef r = new TypeDefBuilder(Adapters.adaptType(Apt.getClassElement(ref), aptContext)).addToAttributes(BUILDABLE, buildable).addToAttributes(EDITABLE_ENABLED, buildable.editableEnabled()).addToAttributes(VALIDATION_ENABLED, buildable.validationEnabled()).accept(new Visitor<PropertyBuilder>() {
@Override
public void visit(PropertyBuilder builder) {
builder.addToAttributes(LAZY_COLLECTIONS_INIT_ENABLED, buildable.lazyCollectionInitEnabled());
builder.addToAttributes(LAZY_MAP_INIT_ENABLED, buildable.lazyMapInitEnabled());
}
}).build();
ctx.getDefinitionRepository().register(r);
ctx.getBuildableRepository().register(r);
buildables.add(r);
}
}
}
if (ctx == null) {
return true;
}
generateLocalDependenciesIfNeeded();
ctx.getDefinitionRepository().updateReferenceMap();
generateBuildables(ctx, buildables);
generatePojos(ctx, buildables);
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, String.format("%-120s", "100%: Builder generation complete."));
return false;
}
use of io.sundr.builder.Visitor in project sundrio by sundrio.
the class ExternalBuildableProcessor method process.
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment env) {
Elements elements = processingEnv.getElementUtils();
Types types = processingEnv.getTypeUtils();
Filer filer = processingEnv.getFiler();
BuilderContext ctx = null;
Set<TypeDef> buildables = new HashSet<>();
// First pass register all externals
for (TypeElement annotation : annotations) {
for (Element element : env.getElementsAnnotatedWith(annotation)) {
final ExternalBuildables generated = element.getAnnotation(ExternalBuildables.class);
if (generated == null) {
continue;
}
ctx = BuilderContextManager.create(elements, types, generated.validationEnabled(), generated.generateBuilderPackage(), generated.builderPackage());
for (String name : generated.value()) {
PackageElement packageElement = elements.getPackageElement(name);
List<TypeElement> typeElements = new ArrayList<>();
if (packageElement != null) {
for (Element e : packageElement.getEnclosedElements()) {
if (e instanceof TypeElement) {
typeElements.add((TypeElement) e);
}
}
} else {
TypeElement e = elements.getTypeElement(name);
if (e != null) {
typeElements.add(e);
}
}
for (TypeElement typeElement : typeElements) {
final boolean isLazyCollectionInitEnabled = generated.lazyCollectionInitEnabled();
final boolean isLazyMapInitEnabled = generated.lazyMapInitEnabled();
final boolean includeInterfaces = generated.includeInterfaces();
final boolean includeAbstractClasses = generated.includeAbstractClasses();
AptContext aptContext = AptContext.create(ctx.getElements(), ctx.getTypes(), ctx.getDefinitionRepository());
TypeDef original = Adapters.adaptType(typeElement, aptContext);
String fqcn = original.getFullyQualifiedName();
boolean isBuildable = original.getKind() != Kind.ENUM && (includeAbstractClasses || !original.isAbstract()) && (includeInterfaces || original.getKind() != Kind.INTERFACE) && isIncluded(fqcn, generated.includes()) && !isExcluded(fqcn, generated.excludes());
TypeDef b = new TypeDefBuilder(original).accept(new Visitor<PropertyBuilder>() {
@Override
public void visit(PropertyBuilder builder) {
if (isBuildable) {
builder.addToAttributes(EXTERNAL_BUILDABLE, generated);
builder.addToAttributes(EDITABLE_ENABLED, generated.editableEnabled());
builder.addToAttributes(VALIDATION_ENABLED, generated.validationEnabled());
builder.addToAttributes(LAZY_COLLECTIONS_INIT_ENABLED, isLazyCollectionInitEnabled);
builder.addToAttributes(LAZY_MAP_INIT_ENABLED, isLazyMapInitEnabled);
}
}
}).build();
if (b.getKind() == Kind.ENUM) {
continue;
}
if (b.isAbstract() && !includeAbstractClasses) {
continue;
}
if (b.getKind() == Kind.INTERFACE && !includeInterfaces) {
continue;
}
if (!isIncluded(b.getFullyQualifiedName(), generated.includes())) {
continue;
}
if (isExcluded(b.getFullyQualifiedName(), generated.excludes())) {
continue;
}
ctx.getDefinitionRepository().register(b);
ctx.getBuildableRepository().register(b);
buildables.add(b);
}
}
for (TypeElement ref : BuilderUtils.getBuildableReferences(ctx, generated)) {
final boolean isLazyCollectionInitEnabled = generated.lazyCollectionInitEnabled();
final boolean isLazyMapInitEnabled = generated.lazyMapInitEnabled();
final boolean includeInterfaces = generated.includeInterfaces();
final boolean includeAbstractClasses = generated.includeAbstractClasses();
AptContext aptContext = AptContext.create(ctx.getElements(), ctx.getTypes(), ctx.getDefinitionRepository());
TypeDef original = Adapters.adaptType(Apt.getClassElement(ref), aptContext);
String fqcn = original.getFullyQualifiedName();
boolean isBuildable = original.getKind() != Kind.ENUM && !original.isAbstract() && isIncluded(fqcn, generated.includes()) && !isExcluded(fqcn, generated.excludes());
TypeDef r = new TypeDefBuilder(original).accept(new Visitor<PropertyBuilder>() {
@Override
public void visit(PropertyBuilder builder) {
if (isBuildable) {
builder.addToAttributes(EXTERNAL_BUILDABLE, generated);
builder.addToAttributes(EDITABLE_ENABLED, generated.editableEnabled());
builder.addToAttributes(VALIDATION_ENABLED, generated.validationEnabled());
builder.addToAttributes(LAZY_COLLECTIONS_INIT_ENABLED, isLazyCollectionInitEnabled);
builder.addToAttributes(LAZY_MAP_INIT_ENABLED, isLazyMapInitEnabled);
}
}
}).build();
if (r.getKind() == Kind.ENUM || r.isAbstract()) {
continue;
}
if (r.getKind() == Kind.ENUM) {
continue;
}
if (r.isAbstract() && !includeAbstractClasses) {
continue;
}
if (r.getKind() == Kind.INTERFACE && !includeInterfaces) {
continue;
}
if (!isIncluded(r.getFullyQualifiedName(), generated.includes())) {
continue;
}
if (isExcluded(r.getFullyQualifiedName(), generated.excludes())) {
continue;
}
ctx.getDefinitionRepository().register(r);
ctx.getBuildableRepository().register(r);
buildables.add(r);
}
}
}
if (ctx == null) {
return true;
}
generateLocalDependenciesIfNeeded();
ctx.getDefinitionRepository().updateReferenceMap();
generateBuildables(ctx, buildables);
generatePojos(ctx, buildables);
processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, String.format("%-120s", "100%: Builder generation complete."));
return true;
}
Aggregations