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

Add record support #17

Closed
wants to merge 20 commits into from
33 changes: 33 additions & 0 deletions javapoet/src/main/java/com/palantir/javapoet/CodeWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
Expand Down Expand Up @@ -224,6 +225,38 @@ public void emitTypeVariables(List<TypeVariableName> typeVariables) throws IOExc
emit(">");
}

public void emitParameters(Iterable<ParameterSpec> parameters, boolean varargs) throws IOException {
emit(CodeBlock.of("($Z"));

boolean firstParameter = true;
for (Iterator<ParameterSpec> parameterSpec = parameters.iterator(); parameterSpec.hasNext(); ) {
ParameterSpec parameter = parameterSpec.next();
if (!firstParameter) {
emit(",").emitWrappingSpace();
}
parameter.emit(this, !parameterSpec.hasNext() && varargs);
firstParameter = false;
}

emit(")");
}

public void emitJavadocWithParameters(CodeBlock javadoc, Iterable<ParameterSpec> parameters) throws IOException {
CodeBlock.Builder builder = javadoc.toBuilder();
boolean emitTagNewline = true;
for (ParameterSpec parameterSpec : parameters) {
if (!parameterSpec.javadoc().isEmpty()) {
// Emit a new line before @param section only if the method javadoc is present.
if (emitTagNewline && !javadoc.isEmpty()) {
builder.add("\n");
}
emitTagNewline = false;
builder.add("@param $L $L", parameterSpec.name(), parameterSpec.javadoc());
}
}
emitJavadoc(builder.build());
}

public void popTypeVariables(List<TypeVariableName> typeVariables) {
typeVariables.forEach(typeVariable -> currentTypeVariables.remove(typeVariable.name()));
}
Expand Down
59 changes: 21 additions & 38 deletions javapoet/src/main/java/com/palantir/javapoet/MethodSpec.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
Expand All @@ -43,7 +42,6 @@
/** A generated constructor or method declaration. */
public final class MethodSpec {
private static final String CONSTRUCTOR = "<init>";

private final String name;
private final CodeBlock javadoc;
private final List<AnnotationSpec> annotations;
Expand All @@ -55,6 +53,7 @@ public final class MethodSpec {
private final List<TypeName> exceptions;
private final CodeBlock code;
private final CodeBlock defaultValue;
private final boolean compactConstructor;

private MethodSpec(Builder builder) {
CodeBlock code = builder.code.build();
Expand All @@ -78,6 +77,7 @@ private MethodSpec(Builder builder) {
this.exceptions = Util.immutableList(builder.exceptions);
this.defaultValue = builder.defaultValue;
this.code = code;
this.compactConstructor = builder.compactConstructor;
}

public String name() {
Expand Down Expand Up @@ -134,7 +134,7 @@ private boolean lastParameterIsArray(List<ParameterSpec> parameters) {
}

void emit(CodeWriter codeWriter, String enclosingName, Set<Modifier> implicitModifiers) throws IOException {
codeWriter.emitJavadoc(javadocWithParameters());
codeWriter.emitJavadocWithParameters(javadoc, parameters);
codeWriter.emitAnnotations(annotations, false);
codeWriter.emitModifiers(modifiers, implicitModifiers);

Expand All @@ -143,24 +143,16 @@ void emit(CodeWriter codeWriter, String enclosingName, Set<Modifier> implicitMod
codeWriter.emit(" ");
}

if (isConstructor()) {
codeWriter.emit("$L($Z", enclosingName);
if (compactConstructor) {
codeWriter.emit("$L", enclosingName);
} else if (isConstructor()) {
codeWriter.emit("$L", enclosingName);
codeWriter.emitParameters(parameters, varargs);
} else {
codeWriter.emit("$T $L($Z", returnType, name);
}

boolean firstParameter = true;
for (Iterator<ParameterSpec> i = parameters.iterator(); i.hasNext(); ) {
ParameterSpec parameter = i.next();
if (!firstParameter) {
codeWriter.emit(",").emitWrappingSpace();
}
parameter.emit(codeWriter, !i.hasNext() && varargs);
firstParameter = false;
codeWriter.emit("$T $L", returnType, name);
codeWriter.emitParameters(parameters, varargs);
}

codeWriter.emit(")");

if (defaultValue != null && !defaultValue.isEmpty()) {
codeWriter.emit(" default ");
codeWriter.emit(defaultValue);
Expand Down Expand Up @@ -196,22 +188,6 @@ void emit(CodeWriter codeWriter, String enclosingName, Set<Modifier> implicitMod
codeWriter.popTypeVariables(typeVariables);
}

private CodeBlock javadocWithParameters() {
CodeBlock.Builder builder = javadoc.toBuilder();
boolean emitTagNewline = true;
for (ParameterSpec parameterSpec : parameters) {
if (!parameterSpec.javadoc().isEmpty()) {
// Emit a new line before @param section only if the method javadoc is present.
if (emitTagNewline && !javadoc.isEmpty()) {
builder.add("\n");
}
emitTagNewline = false;
builder.add("@param $L $L", parameterSpec.name(), parameterSpec.javadoc());
}
}
return builder.build();
}

@Override
public boolean equals(Object o) {
if (this == o) {
Expand Down Expand Up @@ -244,11 +220,15 @@ public String toString() {
}

public static Builder methodBuilder(String name) {
return new Builder(name);
return new Builder(name, false);
}

public static Builder constructorBuilder() {
return new Builder(CONSTRUCTOR);
return new Builder(CONSTRUCTOR, false);
}

public static Builder compactConstructorBuilder() {
return new Builder(CONSTRUCTOR, true);
}

/**
Expand Down Expand Up @@ -336,7 +316,7 @@ public static Builder overriding(ExecutableElement method, DeclaredType enclosin
}

public Builder toBuilder() {
Builder builder = new Builder(name);
Builder builder = new Builder(name, compactConstructor);
builder.javadoc.add(javadoc);
builder.annotations.addAll(annotations);
builder.modifiers.addAll(modifiers);
Expand Down Expand Up @@ -365,8 +345,11 @@ public static final class Builder {
private final List<Modifier> modifiers = new ArrayList<>();
private final List<ParameterSpec> parameters = new ArrayList<>();

private Builder(String name) {
private final boolean compactConstructor;

private Builder(String name, boolean compactConstructor) {
setName(name);
this.compactConstructor = compactConstructor;
}

public Builder setName(String name) {
Expand Down
Loading