aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com
diff options
context:
space:
mode:
authorZac Sweers <zac.sweers@gmail.com>2020-01-01 08:37:31 -0500
committerEgor Andreevich <andreevich.egor@gmail.com>2020-01-01 08:37:31 -0500
commit4272265a319a562bceaa537fc1b9b6b40236a881 (patch)
tree442e2e7c7bcfc418a04b24685bbd32d9835314b4 /src/main/java/com
parent3f5386230e12b8e9d3baf760ae3563b3f303f60c (diff)
downloadjavapoet-4272265a319a562bceaa537fc1b9b6b40236a881.tar.gz
Mutable builder list fields (#650)
* Make modifiers and annotations in FieldSpec public * Make AnnotationSpec members public * Make JavaFile staticImports public * Make modifiers and annotations in parameterspec public * Make methodspec modifiers, params, typevars, and annotations public * Make typespec builder lists public * Move TypeSpec.Builder validations to build() where appropriate * Move AnnotationSpec.Builder validations to build() where appropriate * Fix line length style
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/squareup/javapoet/AnnotationSpec.java9
-rw-r--r--src/main/java/com/squareup/javapoet/FieldSpec.java5
-rw-r--r--src/main/java/com/squareup/javapoet/JavaFile.java3
-rw-r--r--src/main/java/com/squareup/javapoet/MethodSpec.java9
-rw-r--r--src/main/java/com/squareup/javapoet/ParameterSpec.java4
-rw-r--r--src/main/java/com/squareup/javapoet/TypeSpec.java122
6 files changed, 94 insertions, 58 deletions
diff --git a/src/main/java/com/squareup/javapoet/AnnotationSpec.java b/src/main/java/com/squareup/javapoet/AnnotationSpec.java
index d1c5e53..5525d7b 100644
--- a/src/main/java/com/squareup/javapoet/AnnotationSpec.java
+++ b/src/main/java/com/squareup/javapoet/AnnotationSpec.java
@@ -192,7 +192,8 @@ public final class AnnotationSpec {
public static final class Builder {
private final TypeName type;
- private final Map<String, List<CodeBlock>> members = new LinkedHashMap<>();
+
+ public final Map<String, List<CodeBlock>> members = new LinkedHashMap<>();
private Builder(TypeName type) {
this.type = type;
@@ -203,8 +204,6 @@ public final class AnnotationSpec {
}
public Builder addMember(String name, CodeBlock codeBlock) {
- checkNotNull(name, "name == null");
- checkArgument(SourceVersion.isName(name), "not a valid name: %s", name);
List<CodeBlock> values = members.computeIfAbsent(name, k -> new ArrayList<>());
values.add(codeBlock);
return this;
@@ -238,6 +237,10 @@ public final class AnnotationSpec {
}
public AnnotationSpec build() {
+ for (String name : members.keySet()) {
+ checkNotNull(name, "name == null");
+ checkArgument(SourceVersion.isName(name), "not a valid name: %s", name);
+ }
return new AnnotationSpec(this);
}
}
diff --git a/src/main/java/com/squareup/javapoet/FieldSpec.java b/src/main/java/com/squareup/javapoet/FieldSpec.java
index 851b36d..f530d6e 100644
--- a/src/main/java/com/squareup/javapoet/FieldSpec.java
+++ b/src/main/java/com/squareup/javapoet/FieldSpec.java
@@ -111,10 +111,11 @@ public final class FieldSpec {
private final String name;
private final CodeBlock.Builder javadoc = CodeBlock.builder();
- private final List<AnnotationSpec> annotations = new ArrayList<>();
- private final List<Modifier> modifiers = new ArrayList<>();
private CodeBlock initializer = null;
+ public final List<AnnotationSpec> annotations = new ArrayList<>();
+ public final List<Modifier> modifiers = new ArrayList<>();
+
private Builder(TypeName type, String name) {
this.type = type;
this.name = name;
diff --git a/src/main/java/com/squareup/javapoet/JavaFile.java b/src/main/java/com/squareup/javapoet/JavaFile.java
index 41f6439..d5747a8 100644
--- a/src/main/java/com/squareup/javapoet/JavaFile.java
+++ b/src/main/java/com/squareup/javapoet/JavaFile.java
@@ -225,10 +225,11 @@ public final class JavaFile {
private final String packageName;
private final TypeSpec typeSpec;
private final CodeBlock.Builder fileComment = CodeBlock.builder();
- private final Set<String> staticImports = new TreeSet<>();
private boolean skipJavaLangImports;
private String indent = " ";
+ public final Set<String> staticImports = new TreeSet<>();
+
private Builder(String packageName, TypeSpec typeSpec) {
this.packageName = packageName;
this.typeSpec = typeSpec;
diff --git a/src/main/java/com/squareup/javapoet/MethodSpec.java b/src/main/java/com/squareup/javapoet/MethodSpec.java
index 850e537..b06290f 100644
--- a/src/main/java/com/squareup/javapoet/MethodSpec.java
+++ b/src/main/java/com/squareup/javapoet/MethodSpec.java
@@ -295,16 +295,17 @@ public final class MethodSpec {
private String name;
private final CodeBlock.Builder javadoc = CodeBlock.builder();
- private final List<AnnotationSpec> annotations = new ArrayList<>();
- private final List<Modifier> modifiers = new ArrayList<>();
- private List<TypeVariableName> typeVariables = new ArrayList<>();
private TypeName returnType;
- private final List<ParameterSpec> parameters = new ArrayList<>();
private final Set<TypeName> exceptions = new LinkedHashSet<>();
private final CodeBlock.Builder code = CodeBlock.builder();
private boolean varargs;
private CodeBlock defaultValue;
+ public final List<TypeVariableName> typeVariables = new ArrayList<>();
+ public final List<AnnotationSpec> annotations = new ArrayList<>();
+ public final List<Modifier> modifiers = new ArrayList<>();
+ public final List<ParameterSpec> parameters = new ArrayList<>();
+
private Builder(String name) {
setName(name);
}
diff --git a/src/main/java/com/squareup/javapoet/ParameterSpec.java b/src/main/java/com/squareup/javapoet/ParameterSpec.java
index 386ed1a..b8f3129 100644
--- a/src/main/java/com/squareup/javapoet/ParameterSpec.java
+++ b/src/main/java/com/squareup/javapoet/ParameterSpec.java
@@ -136,8 +136,8 @@ public final class ParameterSpec {
private final String name;
private final CodeBlock.Builder javadoc = CodeBlock.builder();
- private final List<AnnotationSpec> annotations = new ArrayList<>();
- private final List<Modifier> modifiers = new ArrayList<>();
+ public final List<AnnotationSpec> annotations = new ArrayList<>();
+ public final List<Modifier> modifiers = new ArrayList<>();
private Builder(TypeName type, String name) {
this.type = type;
diff --git a/src/main/java/com/squareup/javapoet/TypeSpec.java b/src/main/java/com/squareup/javapoet/TypeSpec.java
index cf65bcf..2b695c2 100644
--- a/src/main/java/com/squareup/javapoet/TypeSpec.java
+++ b/src/main/java/com/squareup/javapoet/TypeSpec.java
@@ -400,18 +400,19 @@ public final class TypeSpec {
private final CodeBlock anonymousTypeArguments;
private final CodeBlock.Builder javadoc = CodeBlock.builder();
- private final List<AnnotationSpec> annotations = new ArrayList<>();
- private final List<Modifier> modifiers = new ArrayList<>();
- private final List<TypeVariableName> typeVariables = new ArrayList<>();
private TypeName superclass = ClassName.OBJECT;
- private final List<TypeName> superinterfaces = new ArrayList<>();
- private final Map<String, TypeSpec> enumConstants = new LinkedHashMap<>();
- private final List<FieldSpec> fieldSpecs = new ArrayList<>();
private final CodeBlock.Builder staticBlock = CodeBlock.builder();
private final CodeBlock.Builder initializerBlock = CodeBlock.builder();
- private final List<MethodSpec> methodSpecs = new ArrayList<>();
- private final List<TypeSpec> typeSpecs = new ArrayList<>();
- private final List<Element> originatingElements = new ArrayList<>();
+
+ public final Map<String, TypeSpec> enumConstants = new LinkedHashMap<>();
+ public final List<AnnotationSpec> annotations = new ArrayList<>();
+ public final List<Modifier> modifiers = new ArrayList<>();
+ public final List<TypeVariableName> typeVariables = new ArrayList<>();
+ public final List<TypeName> superinterfaces = new ArrayList<>();
+ public final List<FieldSpec> fieldSpecs = new ArrayList<>();
+ public final List<MethodSpec> methodSpecs = new ArrayList<>();
+ public final List<TypeSpec> typeSpecs = new ArrayList<>();
+ public final List<Element> originatingElements = new ArrayList<>();
private Builder(Kind kind, String name,
CodeBlock anonymousTypeArguments) {
@@ -454,16 +455,11 @@ public final class TypeSpec {
}
public Builder addModifiers(Modifier... modifiers) {
- checkState(anonymousTypeArguments == null, "forbidden on anonymous types.");
- for (Modifier modifier : modifiers) {
- checkArgument(modifier != null, "modifiers contain null");
- this.modifiers.add(modifier);
- }
+ Collections.addAll(this.modifiers, modifiers);
return this;
}
public Builder addTypeVariables(Iterable<TypeVariableName> typeVariables) {
- checkState(anonymousTypeArguments == null, "forbidden on anonymous types.");
checkArgument(typeVariables != null, "typeVariables == null");
for (TypeVariableName typeVariable : typeVariables) {
this.typeVariables.add(typeVariable);
@@ -472,7 +468,6 @@ public final class TypeSpec {
}
public Builder addTypeVariable(TypeVariableName typeVariable) {
- checkState(anonymousTypeArguments == null, "forbidden on anonymous types.");
typeVariables.add(typeVariable);
return this;
}
@@ -513,10 +508,6 @@ public final class TypeSpec {
}
public Builder addEnumConstant(String name, TypeSpec typeSpec) {
- checkState(kind == Kind.ENUM, "%s is not enum", this.name);
- checkArgument(typeSpec.anonymousTypeArguments != null,
- "enum constants must have anonymous type arguments");
- checkArgument(SourceVersion.isName(name), "not a valid enum constant: %s", name);
enumConstants.put(name, typeSpec);
return this;
}
@@ -530,12 +521,6 @@ public final class TypeSpec {
}
public Builder addField(FieldSpec fieldSpec) {
- if (kind == Kind.INTERFACE || kind == Kind.ANNOTATION) {
- requireExactlyOneOf(fieldSpec.modifiers, Modifier.PUBLIC, Modifier.PRIVATE);
- Set<Modifier> check = EnumSet.of(Modifier.STATIC, Modifier.FINAL);
- checkState(fieldSpec.modifiers.containsAll(check), "%s %s.%s requires modifiers %s",
- kind, name, fieldSpec.name, check);
- }
fieldSpecs.add(fieldSpec);
return this;
}
@@ -574,23 +559,6 @@ public final class TypeSpec {
}
public Builder addMethod(MethodSpec methodSpec) {
- if (kind == Kind.INTERFACE) {
- requireExactlyOneOf(methodSpec.modifiers, Modifier.ABSTRACT, Modifier.STATIC,
- Modifier.DEFAULT);
- requireExactlyOneOf(methodSpec.modifiers, Modifier.PUBLIC, Modifier.PRIVATE);
- } else if (kind == Kind.ANNOTATION) {
- checkState(methodSpec.modifiers.equals(kind.implicitMethodModifiers),
- "%s %s.%s requires modifiers %s",
- kind, name, methodSpec.name, kind.implicitMethodModifiers);
- }
- if (kind != Kind.ANNOTATION) {
- checkState(methodSpec.defaultValue == null, "%s %s.%s cannot have a default value",
- kind, name, methodSpec.name);
- }
- if (kind != Kind.INTERFACE) {
- checkState(!methodSpec.hasModifier(Modifier.DEFAULT), "%s %s.%s cannot be default",
- kind, name, methodSpec.name);
- }
methodSpecs.add(methodSpec);
return this;
}
@@ -604,9 +572,6 @@ public final class TypeSpec {
}
public Builder addType(TypeSpec typeSpec) {
- checkArgument(typeSpec.modifiers.containsAll(kind.implicitTypeModifiers),
- "%s %s.%s requires modifiers %s", kind, name, typeSpec.name,
- kind.implicitTypeModifiers);
typeSpecs.add(typeSpec);
return this;
}
@@ -617,9 +582,74 @@ public final class TypeSpec {
}
public TypeSpec build() {
+ for (AnnotationSpec annotationSpec : annotations) {
+ checkNotNull(annotationSpec, "annotationSpec == null");
+ }
+
+ if (!modifiers.isEmpty()) {
+ checkState(anonymousTypeArguments == null, "forbidden on anonymous types.");
+ for (Modifier modifier : modifiers) {
+ checkArgument(modifier != null, "modifiers contain null");
+ }
+ }
+
checkArgument(kind != Kind.ENUM || !enumConstants.isEmpty(),
"at least one enum constant is required for %s", name);
+ for (TypeName superinterface : superinterfaces) {
+ checkArgument(superinterface != null, "superinterfaces contains null");
+ }
+
+ if (!typeVariables.isEmpty()) {
+ checkState(anonymousTypeArguments == null,
+ "typevariables are forbidden on anonymous types.");
+ for (TypeVariableName typeVariableName : typeVariables) {
+ checkArgument(typeVariableName != null, "typeVariables contain null");
+ }
+ }
+
+ for (Map.Entry<String, TypeSpec> enumConstant : enumConstants.entrySet()) {
+ checkState(kind == Kind.ENUM, "%s is not enum", this.name);
+ checkArgument(enumConstant.getValue().anonymousTypeArguments != null,
+ "enum constants must have anonymous type arguments");
+ checkArgument(SourceVersion.isName(name), "not a valid enum constant: %s", name);
+ }
+
+ for (FieldSpec fieldSpec : fieldSpecs) {
+ if (kind == Kind.INTERFACE || kind == Kind.ANNOTATION) {
+ requireExactlyOneOf(fieldSpec.modifiers, Modifier.PUBLIC, Modifier.PRIVATE);
+ Set<Modifier> check = EnumSet.of(Modifier.STATIC, Modifier.FINAL);
+ checkState(fieldSpec.modifiers.containsAll(check), "%s %s.%s requires modifiers %s",
+ kind, name, fieldSpec.name, check);
+ }
+ }
+
+ for (MethodSpec methodSpec : methodSpecs) {
+ if (kind == Kind.INTERFACE) {
+ requireExactlyOneOf(methodSpec.modifiers, Modifier.ABSTRACT, Modifier.STATIC,
+ Modifier.DEFAULT);
+ requireExactlyOneOf(methodSpec.modifiers, Modifier.PUBLIC, Modifier.PRIVATE);
+ } else if (kind == Kind.ANNOTATION) {
+ checkState(methodSpec.modifiers.equals(kind.implicitMethodModifiers),
+ "%s %s.%s requires modifiers %s",
+ kind, name, methodSpec.name, kind.implicitMethodModifiers);
+ }
+ if (kind != Kind.ANNOTATION) {
+ checkState(methodSpec.defaultValue == null, "%s %s.%s cannot have a default value",
+ kind, name, methodSpec.name);
+ }
+ if (kind != Kind.INTERFACE) {
+ checkState(!methodSpec.hasModifier(Modifier.DEFAULT), "%s %s.%s cannot be default",
+ kind, name, methodSpec.name);
+ }
+ }
+
+ for (TypeSpec typeSpec : typeSpecs) {
+ checkArgument(typeSpec.modifiers.containsAll(kind.implicitTypeModifiers),
+ "%s %s.%s requires modifiers %s", kind, name, typeSpec.name,
+ kind.implicitTypeModifiers);
+ }
+
boolean isAbstract = modifiers.contains(Modifier.ABSTRACT) || kind != Kind.CLASS;
for (MethodSpec methodSpec : methodSpecs) {
checkArgument(isAbstract || !methodSpec.hasModifier(Modifier.ABSTRACT),