diff options
author | Zac Sweers <zac.sweers@gmail.com> | 2020-01-01 08:37:31 -0500 |
---|---|---|
committer | Egor Andreevich <andreevich.egor@gmail.com> | 2020-01-01 08:37:31 -0500 |
commit | 4272265a319a562bceaa537fc1b9b6b40236a881 (patch) | |
tree | 442e2e7c7bcfc418a04b24685bbd32d9835314b4 /src/main/java/com | |
parent | 3f5386230e12b8e9d3baf760ae3563b3f303f60c (diff) | |
download | javapoet-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')
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), |