Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extension APIs #68

Closed
jbgi opened this issue May 1, 2017 · 1 comment
Closed

Extension APIs #68

jbgi opened this issue May 1, 2017 · 1 comment
Milestone

Comments

@jbgi
Copy link
Member

jbgi commented May 1, 2017

Derive4J should allow two types for extension mechanisms:

  1. for type class derivations.
  2. for modification / enhancement of generated code before writing the main class file.

Eg. demonstration of an extension that remove the private modifier of implementation classes:

import com.google.auto.service.AutoService;
import com.squareup.javapoet.TypeSpec;
import java.util.List;
import java.util.Set;
import javax.lang.model.element.Modifier;
import org.derive4j.processor.api.DeriveResult;
import org.derive4j.processor.api.DeriveUtils;
import org.derive4j.processor.api.Extension;
import org.derive4j.processor.api.ExtensionFactory;
import org.derive4j.processor.api.TypeSpecModifier;
import org.derive4j.processor.api.model.DataConstructor;

import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;

@AutoService(ExtensionFactory.class)
public final class ExtensionFactoryImpl implements ExtensionFactory {
  @Override
  public List<Extension> extensions(DeriveUtils deriveUtils) {
    return singletonList((adtModel, codeGenSpec) -> {

      Set<String> strictConstructors = adtModel.dataConstruction()
          .constructors()
          .stream()
          .map(DataConstructor::name)
          .map(String::toLowerCase)
          .collect(toSet());

      return DeriveResult.result(new TypeSpecModifier(codeGenSpec).modTypes(typeSpecs ->
          typeSpecs.stream().map(ts ->
              strictConstructors.contains(ts.name.toLowerCase())
                ? removePrivateModifier(ts)
                : ts)
          .collect(toList())).build());

    });
  }

  private static TypeSpec removePrivateModifier(TypeSpec ts) {
    return new TypeSpecModifier(ts).modModifiers(
        modifiers -> modifiers.stream().filter(m -> m != Modifier.PRIVATE).collect(toSet())
    ).build();
  }
}
@jbgi jbgi added this to the 0.11.0 milestone May 1, 2017
@jbgi
Copy link
Member Author

jbgi commented May 1, 2017

implemented by 7795795

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant