Skip to content

Commit

Permalink
Make MethodGenerator.generate return an Optional
Browse files Browse the repository at this point in the history
Remove SkipGenerationException.
  • Loading branch information
olim7t committed Jun 21, 2019
1 parent 91f45a0 commit fef5c9f
Show file tree
Hide file tree
Showing 16 changed files with 261 additions and 152 deletions.
Expand Up @@ -16,8 +16,15 @@
package com.datastax.oss.driver.internal.mapper.processor;

import com.squareup.javapoet.MethodSpec;
import java.util.Optional;

/** A component that generates a single method. */
public interface MethodGenerator {
MethodSpec.Builder generate();

/**
* @return empty if an error occurred during generation. In that case, the caller doesn't have
* anything to do: it's the generator's responsibility to report the error via {@link
* DecoratedMessager}.
*/
Optional<MethodSpec> generate();
}

This file was deleted.

Expand Up @@ -25,10 +25,10 @@
import com.datastax.oss.driver.api.mapper.annotations.GetEntity;
import com.datastax.oss.driver.internal.mapper.processor.MethodGenerator;
import com.datastax.oss.driver.internal.mapper.processor.ProcessorContext;
import com.datastax.oss.driver.internal.mapper.processor.SkipGenerationException;
import com.datastax.oss.driver.internal.mapper.processor.util.generation.GeneratedCodePatterns;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.MethodSpec;
import java.util.Optional;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
Expand Down Expand Up @@ -64,15 +64,15 @@ public DaoGetEntityMethodGenerator(
}

@Override
public MethodSpec.Builder generate() {
public Optional<MethodSpec> generate() {

// Validate the parameter: there must be exactly one, of type GettableByName or a ResultSet:
if (methodElement.getParameters().size() != 1) {
context
.getMessager()
.error(
methodElement, "%s methods must have one parameter", GetEntity.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}
VariableElement parameterElement = methodElement.getParameters().get(0);
String parameterName = parameterElement.getSimpleName().toString();
Expand All @@ -90,7 +90,7 @@ public MethodSpec.Builder generate() {
GettableByName.class.getSimpleName(),
ResultSet.class.getSimpleName(),
AsyncResultSet.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}

// Validate the return type. Make sure it matches the parameter type
Expand All @@ -112,7 +112,7 @@ public MethodSpec.Builder generate() {
"Invalid return type. Can only return %s if the argument is %s",
PagingIterable.class.getSimpleName(),
ResultSet.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}
entityElement = extractTypeParameter(returnType);
transformation = Transformation.MAP;
Expand All @@ -125,7 +125,7 @@ public MethodSpec.Builder generate() {
"Invalid return type. Can only return %s if the argument is %s",
MappedAsyncPagingIterable.class.getSimpleName(),
AsyncResultSet.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}
entityElement = extractTypeParameter(returnType);
transformation = Transformation.MAP;
Expand All @@ -140,7 +140,7 @@ public MethodSpec.Builder generate() {
Entity.class.getSimpleName(),
PagingIterable.class.getSimpleName(),
MappedAsyncPagingIterable.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}

// Generate the implementation:
Expand All @@ -162,7 +162,7 @@ public MethodSpec.Builder generate() {
"return $L.map($L::get)", parameterName, helperFieldName);
break;
}
return overridingMethodBuilder;
return Optional.of(overridingMethodBuilder.build());
}

/** @return the type argument if it's an annotated entity, otherwise null */
Expand Down
Expand Up @@ -24,7 +24,6 @@
import com.datastax.oss.driver.internal.mapper.processor.MethodGenerator;
import com.datastax.oss.driver.internal.mapper.processor.ProcessorContext;
import com.datastax.oss.driver.internal.mapper.processor.SingleFileCodeGenerator;
import com.datastax.oss.driver.internal.mapper.processor.SkipGenerationException;
import com.datastax.oss.driver.internal.mapper.processor.util.NameIndex;
import com.datastax.oss.driver.internal.mapper.processor.util.generation.GenericTypeConstantGenerator;
import com.squareup.javapoet.ClassName;
Expand Down Expand Up @@ -111,39 +110,32 @@ protected String getFileName() {

@Override
protected JavaFile.Builder getContents() {
List<MethodGenerator> methodGenerators = new ArrayList<>();

TypeSpec.Builder classBuilder =
TypeSpec.classBuilder(implementationName)
.addJavadoc(JAVADOC_GENERATED_WARNING)
.addModifiers(Modifier.PUBLIC)
.superclass(DaoBase.class)
.addSuperinterface(ClassName.get(interfaceElement));

for (Element child : interfaceElement.getEnclosedElements()) {
if (child.getKind() == ElementKind.METHOD) {
ExecutableElement methodElement = (ExecutableElement) child;
Set<Modifier> modifiers = methodElement.getModifiers();
if (!modifiers.contains(Modifier.STATIC) && !modifiers.contains(Modifier.DEFAULT)) {
Optional<MethodGenerator> maybeGenerator =
context.getCodeGeneratorFactory().newDaoImplementationMethod(methodElement, this);
if (maybeGenerator.isPresent()) {
methodGenerators.add(maybeGenerator.get());
} else {
if (!maybeGenerator.isPresent()) {
context
.getMessager()
.error(methodElement, "Don't know what implementation to generate for this method");
} else {
maybeGenerator.flatMap(MethodGenerator::generate).ifPresent(classBuilder::addMethod);
}
}
}
}

TypeSpec.Builder classBuilder =
TypeSpec.classBuilder(implementationName)
.addJavadoc(JAVADOC_GENERATED_WARNING)
.addModifiers(Modifier.PUBLIC)
.superclass(DaoBase.class)
.addSuperinterface(ClassName.get(interfaceElement));

for (MethodGenerator methodGenerator : methodGenerators) {
try {
classBuilder.addMethod(methodGenerator.generate().build());
} catch (SkipGenerationException ignored) {
}
}

genericTypeConstantGenerator.generate(classBuilder);

MethodSpec.Builder initAsyncBuilder = getInitAsyncContents();
Expand Down
Expand Up @@ -23,11 +23,11 @@
import com.datastax.oss.driver.internal.core.util.concurrent.CompletableFutures;
import com.datastax.oss.driver.internal.mapper.processor.MethodGenerator;
import com.datastax.oss.driver.internal.mapper.processor.ProcessorContext;
import com.datastax.oss.driver.internal.mapper.processor.SkipGenerationException;
import com.datastax.oss.driver.internal.mapper.processor.util.generation.GeneratedCodePatterns;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.MethodSpec;
import java.util.List;
import java.util.Optional;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
Expand All @@ -53,7 +53,7 @@ public DaoInsertMethodGenerator(
}

@Override
public MethodSpec.Builder generate() {
public Optional<MethodSpec> generate() {

// Validate the parameters:
// - the first one must be the entity.
Expand All @@ -65,7 +65,7 @@ public MethodSpec.Builder generate() {
methodElement,
"%s methods must have at least one parameter",
Insert.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}
VariableElement firstParameter = methodElement.getParameters().get(0);
TypeElement entityElement = extractEntityElement(firstParameter);
Expand All @@ -76,7 +76,7 @@ public MethodSpec.Builder generate() {
methodElement,
"%s methods must take the entity to insert as the first parameter",
Insert.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}

// Validate the return type:
Expand Down Expand Up @@ -114,7 +114,7 @@ public MethodSpec.Builder generate() {
"%s methods must return either void or the entity class "
+ "(possibly wrapped in a CompletionStage/CompletableFuture)",
Insert.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}

// Generate the method:
Expand Down Expand Up @@ -169,7 +169,7 @@ public MethodSpec.Builder generate() {
"return executeAndMapToSingleEntity(boundStatement, $L)", helperFieldName);
}
}
return insertBuilder;
return Optional.of(insertBuilder.build());
}

private TypeElement extractEntityElement(VariableElement parameter) {
Expand Down
Expand Up @@ -20,10 +20,10 @@
import com.datastax.oss.driver.api.mapper.annotations.SetEntity;
import com.datastax.oss.driver.internal.mapper.processor.MethodGenerator;
import com.datastax.oss.driver.internal.mapper.processor.ProcessorContext;
import com.datastax.oss.driver.internal.mapper.processor.SkipGenerationException;
import com.datastax.oss.driver.internal.mapper.processor.util.generation.GeneratedCodePatterns;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.MethodSpec;
import java.util.Optional;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
Expand All @@ -49,7 +49,7 @@ public DaoSetEntityMethodGenerator(
}

@Override
public MethodSpec.Builder generate() {
public Optional<MethodSpec> generate() {

String entityParameterName = null;
TypeElement entityElement = null;
Expand All @@ -64,7 +64,7 @@ public MethodSpec.Builder generate() {
methodElement,
"%s methods must have two parameters",
SetEntity.class.getSimpleName());
throw new SkipGenerationException();
return Optional.empty();
}
TypeMirror targetParameterType = null;
for (VariableElement parameterElement : methodElement.getParameters()) {
Expand All @@ -88,7 +88,7 @@ public MethodSpec.Builder generate() {
methodElement,
"Could not match parameters, expected a SettableByName "
+ "and an annotated entity (in any order)");
throw new SkipGenerationException();
return Optional.empty();
}

// Validate the return type: either void or the same SettableByName as the parameter
Expand All @@ -113,19 +113,21 @@ public MethodSpec.Builder generate() {
"Invalid return type, should be either void or the same as '%s' (%s)",
targetParameterName,
targetParameterType);
throw new SkipGenerationException();
return Optional.empty();
}

// Generate the method:
String helperFieldName = enclosingClass.addEntityHelperField(ClassName.get(entityElement));

// Forward to the base injector in the helper:
return GeneratedCodePatterns.override(methodElement)
.addStatement(
"$L$L.set($L, $L)",
isVoid ? "" : "return ",
helperFieldName,
entityParameterName,
targetParameterName);
return Optional.of(
GeneratedCodePatterns.override(methodElement)
.addStatement(
"$L$L.set($L, $L)",
isVoid ? "" : "return ",
helperFieldName,
entityParameterName,
targetParameterName)
.build());
}
}
Expand Up @@ -36,7 +36,6 @@
import com.squareup.javapoet.TypeSpec;
import java.beans.Introspector;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
Expand Down Expand Up @@ -87,12 +86,6 @@ public String addEntityHelperField(ClassName childEntityName) {
@Override
protected JavaFile.Builder getContents() {

List<MethodGenerator> methodGenerators =
ImmutableList.of(
new EntityHelperSetMethodGenerator(entityDefinition, this, context),
new EntityHelperGetMethodGenerator(entityDefinition, this, context),
new EntityHelperInsertMethodGenerator(entityDefinition, this, context));

TypeSpec.Builder classContents =
TypeSpec.classBuilder(helperName)
.addJavadoc(JAVADOC_GENERATED_WARNING)
Expand All @@ -111,16 +104,20 @@ protected JavaFile.Builder getContents() {
"$T.fromCql($S)", CqlIdentifier.class, entityDefinition.getCqlName())
.build());

for (MethodGenerator methodGenerator :
ImmutableList.of(
new EntityHelperSetMethodGenerator(entityDefinition, this, context),
new EntityHelperGetMethodGenerator(entityDefinition, this, context),
new EntityHelperInsertMethodGenerator(entityDefinition, this, context))) {
methodGenerator.generate().ifPresent(classContents::addMethod);
}

MethodSpec.Builder constructorContents =
MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC);

GeneratedCodePatterns.addFinalFieldAndConstructorArgument(
ClassName.get(MapperContext.class), "context", classContents, constructorContents);

for (MethodGenerator methodGenerator : methodGenerators) {
classContents.addMethod(methodGenerator.generate().build());
}

genericTypeConstantGenerator.generate(classContents);

for (Map.Entry<ClassName, String> entry : childHelpers.entrySet()) {
Expand Down
Expand Up @@ -32,6 +32,7 @@
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import java.util.Map;
import java.util.Optional;
import javax.lang.model.element.Modifier;

public class EntityHelperGetMethodGenerator implements MethodGenerator {
Expand All @@ -48,7 +49,7 @@ public EntityHelperGetMethodGenerator(
}

@Override
public MethodSpec.Builder generate() {
public Optional<MethodSpec> generate() {
MethodSpec.Builder getBuilder =
MethodSpec.methodBuilder("get")
.addAnnotation(Override.class)
Expand Down Expand Up @@ -136,7 +137,7 @@ public MethodSpec.Builder generate() {
}
}
getBuilder.addStatement("return returnValue");
return getBuilder;
return Optional.of(getBuilder.build());
}

/**
Expand Down
Expand Up @@ -22,6 +22,7 @@
import com.datastax.oss.driver.internal.mapper.processor.MethodGenerator;
import com.datastax.oss.driver.internal.mapper.processor.ProcessorContext;
import com.squareup.javapoet.MethodSpec;
import java.util.Optional;
import javax.lang.model.element.Modifier;

public class EntityHelperInsertMethodGenerator implements MethodGenerator {
Expand All @@ -36,7 +37,7 @@ public EntityHelperInsertMethodGenerator(
}

@Override
public MethodSpec.Builder generate() {
public Optional<MethodSpec> generate() {
MethodSpec.Builder insertBuilder =
MethodSpec.methodBuilder("insert")
.addAnnotation(Override.class)
Expand All @@ -60,6 +61,6 @@ public MethodSpec.Builder generate() {
"\n.value($1S, $2T.bindMarker($1S))", property.getCqlName(), QueryBuilder.class);
}
insertBuilder.addCode("$];\n");
return insertBuilder;
return Optional.of(insertBuilder.build());
}
}

0 comments on commit fef5c9f

Please sign in to comment.