From 9d8f9560f2fcbef555d71a51c1494f841c0153cc Mon Sep 17 00:00:00 2001 From: Rico Yao Date: Tue, 5 Mar 2019 17:19:42 -0800 Subject: [PATCH] Rebase and do `make format` --- .../Java/Sources/VariableSubtitution.java | 172 +++++++++++++++--- Sources/Core/JavaIR.swift | 6 +- Sources/Core/JavaModelRenderer.swift | 109 +++++------ 3 files changed, 207 insertions(+), 80 deletions(-) diff --git a/Examples/Java/Sources/VariableSubtitution.java b/Examples/Java/Sources/VariableSubtitution.java index 30c81db0..e11aa489 100644 --- a/Examples/Java/Sources/VariableSubtitution.java +++ b/Examples/Java/Sources/VariableSubtitution.java @@ -12,7 +12,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringDef; -import com.google.auto.value.AutoValue; import com.google.gson.Gson; import com.google.gson.TypeAdapter; import com.google.gson.annotations.SerializedName; @@ -21,32 +20,159 @@ import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; -@AutoValue -public abstract class VariableSubtitution { +public class VariableSubtitution { - - public abstract @SerializedName("alloc_prop") @Nullable Integer allocProp(); - public abstract @SerializedName("copy_prop") @Nullable Integer copyProp(); - public abstract @SerializedName("mutable_copy_prop") @Nullable Integer mutableCopyProp(); - public abstract @SerializedName("new_prop") @Nullable Integer newProp(); - public static Builder builder() { - return new AutoValue_VariableSubtitution.Builder(); - } - abstract Builder toBuilder(); - public static TypeAdapter jsonAdapter(Gson gson) { - return new AutoValue_VariableSubtitution.GsonTypeAdapter(gson); - } - @AutoValue.Builder - public abstract static class Builder { - + @SerializedName("alloc_prop") private @Nullable Integer allocProp; + @SerializedName("copy_prop") private @Nullable Integer copyProp; + @SerializedName("mutable_copy_prop") private @Nullable Integer mutableCopyProp; + @SerializedName("new_prop") private @Nullable Integer newProp; + static final private int ALLOC_PROP_SET = 1 << 0; + static final private int COPY_PROP_SET = 1 << 1; + static final private int MUTABLE_COPY_PROP_SET = 1 << 2; + static final private int NEW_PROP_SET = 1 << 3; + private int _bits = 0; + private VariableSubtitution(@Nullable Integer allocProp, + @Nullable Integer copyProp, + @Nullable Integer mutableCopyProp, + @Nullable Integer newProp, + int _bits) { + this.allocProp = allocProp; + this.copyProp = copyProp; + this.mutableCopyProp = mutableCopyProp; + this.newProp = newProp; + this._bits = _bits; + } + public static VariableSubtitution.Builder builder() { + return new VariableSubtitution.Builder(); + } + public VariableSubtitution.Builder toBuilder() { + return new VariableSubtitution.Builder(this); + } + public VariableSubtitution mergeFrom(VariableSubtitution model) { + VariableSubtitution.Builder builder = this.toBuilder(); + builder.mergeFrom(model); + return builder.build(); + } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + VariableSubtitution that = (VariableSubtitution) o; + return Objects.equals(this.allocProp, that.allocProp) && + Objects.equals(this.copyProp, that.copyProp) && + Objects.equals(this.mutableCopyProp, that.mutableCopyProp) && + Objects.equals(this.newProp, that.newProp); + } + @Override + public int hashCode() { + return Objects.hash(allocProp, + copyProp, + mutableCopyProp, + newProp); + } + public @Nullable Integer getAllocProp() { + return this.allocProp; + } + public @Nullable Integer getCopyProp() { + return this.copyProp; + } + public @Nullable Integer getMutableCopyProp() { + return this.mutableCopyProp; + } + public @Nullable Integer getNewProp() { + return this.newProp; + } + public boolean getAllocPropIsSet() { + return (this._bits & ALLOC_PROP_SET) == ALLOC_PROP_SET; + } + public boolean getCopyPropIsSet() { + return (this._bits & COPY_PROP_SET) == COPY_PROP_SET; + } + public boolean getMutableCopyPropIsSet() { + return (this._bits & MUTABLE_COPY_PROP_SET) == MUTABLE_COPY_PROP_SET; + } + public boolean getNewPropIsSet() { + return (this._bits & NEW_PROP_SET) == NEW_PROP_SET; + } + public static class Builder { - public abstract Builder setAllocProp(@Nullable Integer value); - public abstract Builder setCopyProp(@Nullable Integer value); - public abstract Builder setMutableCopyProp(@Nullable Integer value); - public abstract Builder setNewProp(@Nullable Integer value); - public abstract VariableSubtitution build(); + @SerializedName("alloc_prop") private @Nullable Integer allocProp; + @SerializedName("copy_prop") private @Nullable Integer copyProp; + @SerializedName("mutable_copy_prop") private @Nullable Integer mutableCopyProp; + @SerializedName("new_prop") private @Nullable Integer newProp; + private int _bits = 0; + private Builder() { + + } + private Builder(@NonNull VariableSubtitution model) { + this.allocProp = model.allocProp; + this.copyProp = model.copyProp; + this.mutableCopyProp = model.mutableCopyProp; + this.newProp = model.newProp; + this._bits = model._bits; + } + public Builder setAllocProp(@Nullable Integer value) { + this.allocProp = value; + this._bits |= ALLOC_PROP_SET; + return this; + } + public Builder setCopyProp(@Nullable Integer value) { + this.copyProp = value; + this._bits |= COPY_PROP_SET; + return this; + } + public Builder setMutableCopyProp(@Nullable Integer value) { + this.mutableCopyProp = value; + this._bits |= MUTABLE_COPY_PROP_SET; + return this; + } + public Builder setNewProp(@Nullable Integer value) { + this.newProp = value; + this._bits |= NEW_PROP_SET; + return this; + } + public @Nullable Integer getAllocProp() { + return this.allocProp; + } + public @Nullable Integer getCopyProp() { + return this.copyProp; + } + public @Nullable Integer getMutableCopyProp() { + return this.mutableCopyProp; + } + public @Nullable Integer getNewProp() { + return this.newProp; + } + public VariableSubtitution build() { + return new VariableSubtitution( + this.allocProp, + this.copyProp, + this.mutableCopyProp, + this.newProp, + this._bits + ); + } + public void mergeFrom(VariableSubtitution model) { + if (model.getAllocPropIsSet()) { + this.allocProp = model.allocProp; + } + if (model.getCopyPropIsSet()) { + this.copyProp = model.copyProp; + } + if (model.getMutableCopyPropIsSet()) { + this.mutableCopyProp = model.mutableCopyProp; + } + if (model.getNewPropIsSet()) { + this.newProp = model.newProp; + } + } } } diff --git a/Sources/Core/JavaIR.swift b/Sources/Core/JavaIR.swift index 0ab16e75..ac25d27a 100644 --- a/Sources/Core/JavaIR.swift +++ b/Sources/Core/JavaIR.swift @@ -57,7 +57,7 @@ public struct JavaIR { func render() -> String { var prop = "\(annotations.map { "@\($0)" }.joined(separator: " ")) \(modifiers.render()) \(type) \(name)" - if initialValue.count > 0 { + if !initialValue.isEmpty { prop.append(" = " + initialValue) } prop.append(";") @@ -68,12 +68,12 @@ public struct JavaIR { static func method(annotations: Set = [], _ modifiers: JavaModifier, _ signature: String, body: () -> [String]) -> JavaIR.Method { return JavaIR.Method(annotations: annotations, modifiers: modifiers, body: body(), signature: signature) } - + static func ifBlock(condition: String, body: [String]) -> String { return [ "if (" + condition + ") {", -->body, - "}" + "}", ].joined(separator: "\n") } diff --git a/Sources/Core/JavaModelRenderer.swift b/Sources/Core/JavaModelRenderer.swift index 3b715281..06702ccc 100644 --- a/Sources/Core/JavaModelRenderer.swift +++ b/Sources/Core/JavaModelRenderer.swift @@ -17,11 +17,11 @@ public struct JavaModelRenderer: JavaFileRenderer { } func renderModelConstructor() -> JavaIR.Method { - let args = (self.transitiveProperties.map { param, schemaObj in + let args = (transitiveProperties.map { param, schemaObj in self.typeFromSchema(param, schemaObj) + " " + param.snakeCaseToPropertyName() } + ["int _bits"]).joined(separator: ",\n") - return JavaIR.method([.private], self.className + "(" + args + ")") { + return JavaIR.method([.private], className + "(" + args + ")") { self.transitiveProperties.map { param, _ in "this." + param.snakeCaseToPropertyName() + " = " + param.snakeCaseToPropertyName() + ";" } + ["this._bits = _bits;"] @@ -29,32 +29,32 @@ public struct JavaModelRenderer: JavaFileRenderer { } func renderModelHashCode() -> JavaIR.Method { - let bodyHashCode = self.transitiveProperties.map { param, _ in + let bodyHashCode = transitiveProperties.map { param, _ in param.snakeCaseToPropertyName() - }.joined(separator: ",\n") + }.joined(separator: ",\n") - return JavaIR.method(annotations: ["Override"], [.public], "int hashCode()") {[ - "return Objects.hash(" + bodyHashCode + ");" - ] + return JavaIR.method(annotations: ["Override"], [.public], "int hashCode()") { [ + "return Objects.hash(" + bodyHashCode + ");", + ] } } func renderModelEquals() -> JavaIR.Method { - let bodyEquals = self.transitiveProperties.map { param, _ in + let bodyEquals = transitiveProperties.map { param, _ in "Objects.equals(this." + param.snakeCaseToPropertyName() + ", that." + param.snakeCaseToPropertyName() + ")" - }.joined(separator: " &&\n") + }.joined(separator: " &&\n") - return JavaIR.method(annotations: ["Override"], [.public], "boolean equals(Object o)") {[ + return JavaIR.method(annotations: ["Override"], [.public], "boolean equals(Object o)") { [ JavaIR.ifBlock(condition: "this == o", body: ["return true;"]), JavaIR.ifBlock(condition: "o == null || getClass() != o.getClass()", body: ["return false;"]), self.className + " that = (" + self.className + ") o;", - "return " + bodyEquals + ";" - ] + "return " + bodyEquals + ";", + ] } } - func renderModelProperties(modifiers: JavaModifier = [.private]) -> [JavaIR.Property] { - let props = self.transitiveProperties.map { param, schemaObj in + func renderModelProperties(modifiers _: JavaModifier = [.private]) -> [JavaIR.Property] { + let props = transitiveProperties.map { param, schemaObj in JavaIR.Property(annotations: ["SerializedName(\"\(param)\")"], modifiers: [.private], type: self.typeFromSchema(param, schemaObj), name: param.snakeCaseToPropertyName(), initialValue: "") } @@ -62,7 +62,7 @@ public struct JavaModelRenderer: JavaFileRenderer { var bitmasks: [JavaIR.Property] = [] var index = 0 - self.transitiveProperties.forEach { param, _ in + transitiveProperties.forEach { param, _ in bitmasks.append(JavaIR.Property(annotations: [], modifiers: [.private, .static, .final], type: "int", name: param.uppercased() + "_SET", initialValue: "1 << " + String(index))) index += 1 } @@ -71,45 +71,45 @@ public struct JavaModelRenderer: JavaFileRenderer { } func renderModelGetters(modifiers: JavaModifier = [.public]) -> [JavaIR.Method] { - let getters = self.transitiveProperties.map { param, schemaObj in - JavaIR.method(modifiers, self.typeFromSchema(param, schemaObj) + " get" + param.snakeCaseToCapitalizedPropertyName() + "()") {[ - "return this." + param.snakeCaseToPropertyName() + ";" - ]} + let getters = transitiveProperties.map { param, schemaObj in + JavaIR.method(modifiers, self.typeFromSchema(param, schemaObj) + " get" + param.snakeCaseToCapitalizedPropertyName() + "()") { [ + "return this." + param.snakeCaseToPropertyName() + ";", + ] } } return getters } func renderModelIsSetCheckers(modifiers: JavaModifier = [.public]) -> [JavaIR.Method] { - let getters = self.transitiveProperties.map { param, _ in - JavaIR.method(modifiers, "boolean get" + param.snakeCaseToCapitalizedPropertyName() + "IsSet()") {[ - "return (this._bits & " + param.uppercased() + "_SET) == " + param.uppercased() + "_SET;" - ]} + let getters = transitiveProperties.map { param, _ in + JavaIR.method(modifiers, "boolean get" + param.snakeCaseToCapitalizedPropertyName() + "IsSet()") { [ + "return (this._bits & " + param.uppercased() + "_SET) == " + param.uppercased() + "_SET;", + ] } } return getters } func renderModelMergeFrom() -> JavaIR.Method { - return JavaIR.method([.public], self.className + " mergeFrom(" + self.className + " model)") {[ + return JavaIR.method([.public], className + " mergeFrom(" + className + " model)") { [ self.className + ".Builder builder = this.toBuilder();", "builder.mergeFrom(model);", - "return builder.build();" - ]} + "return builder.build();", + ] } } func renderModelToBuilder() -> JavaIR.Method { - return JavaIR.method([.public], self.className + ".Builder toBuilder()") {["return new " + self.className + ".Builder(this);"]} + return JavaIR.method([.public], className + ".Builder toBuilder()") { ["return new " + self.className + ".Builder(this);"] } } func renderModelBuilder() -> JavaIR.Method { - return JavaIR.method([.public, .static], self.className + ".Builder builder()") {[ - "return new \(className).Builder();" - ]} + return JavaIR.method([.public, .static], className + ".Builder builder()") { [ + "return new \(className).Builder();", + ] } } func renderBuilderConstructors() -> [JavaIR.Method] { - let emptyConstructor = JavaIR.method([.private], "Builder()") {[]} + let emptyConstructor = JavaIR.method([.private], "Builder()") { [] } - let privateConstructor = JavaIR.method([.private], "Builder(@NonNull " + self.className + " model)") { + let privateConstructor = JavaIR.method([.private], "Builder(@NonNull " + className + " model)") { self.transitiveProperties.map { param, _ in "this." + param.snakeCaseToPropertyName() + " = model." + param.snakeCaseToPropertyName() + ";" } + ["this._bits = model._bits;"] @@ -119,41 +119,41 @@ public struct JavaModelRenderer: JavaFileRenderer { } func renderBuilderBuild() -> JavaIR.Method { - let params = (self.transitiveProperties.map { param, _ in + let params = (transitiveProperties.map { param, _ in "this." + param.snakeCaseToPropertyName() } + ["this._bits"]).joined(separator: ",\n") - return JavaIR.method([.public], "\(self.className) build()") {["return new " + self.className + "(", params, ");"]} + return JavaIR.method([.public], "\(className) build()") { ["return new " + self.className + "(", params, ");"] } } func renderBuilderGetters(modifiers: JavaModifier = [.public]) -> [JavaIR.Method] { - let getters = self.transitiveProperties.map { param, schemaObj in - JavaIR.method(modifiers, self.typeFromSchema(param, schemaObj) + " get" + param.snakeCaseToCapitalizedPropertyName() + "()") {[ - "return this." + param.snakeCaseToPropertyName() + ";" - ]} + let getters = transitiveProperties.map { param, schemaObj in + JavaIR.method(modifiers, self.typeFromSchema(param, schemaObj) + " get" + param.snakeCaseToCapitalizedPropertyName() + "()") { [ + "return this." + param.snakeCaseToPropertyName() + ";", + ] } } return getters } func renderBuilderSetters(modifiers: JavaModifier = [.public]) -> [JavaIR.Method] { - let setters = self.transitiveProperties.map { param, schemaObj in - JavaIR.method(modifiers, "Builder set\(param.snakeCaseToCamelCase())(\(self.typeFromSchema(param, schemaObj)) value)") {[ + let setters = transitiveProperties.map { param, schemaObj in + JavaIR.method(modifiers, "Builder set\(param.snakeCaseToCamelCase())(\(self.typeFromSchema(param, schemaObj)) value)") { [ "this." + param.snakeCaseToPropertyName() + " = value;", "this._bits |= " + param.uppercased() + "_SET;", - "return this;" - ]} + "return this;", + ] } } return setters } func renderBuilderMerge() -> JavaIR.Method { - let body = (self.transitiveProperties.map { param, _ in + let body = (transitiveProperties.map { param, _ in JavaIR.ifBlock(condition: "model.get" + param.snakeCaseToCapitalizedPropertyName() + "IsSet()", body: ["this." + param.snakeCaseToPropertyName() + " = model." + param.snakeCaseToPropertyName() + ";"]) }) - return JavaIR.method([.public], "void mergeFrom(" + self.className + " model)") { body } + return JavaIR.method([.public], "void mergeFrom(" + className + " model)") { body } } - func renderBuilderProperties(modifiers: JavaModifier = [.private]) -> [JavaIR.Property] { - let props = self.transitiveProperties.map { param, schemaObj in + func renderBuilderProperties(modifiers _: JavaModifier = [.private]) -> [JavaIR.Property] { + let props = transitiveProperties.map { param, schemaObj in JavaIR.Property(annotations: ["SerializedName(\"\(param)\")"], modifiers: [.private], type: self.typeFromSchema(param, schemaObj), name: param.snakeCaseToPropertyName(), initialValue: "") } @@ -228,13 +228,13 @@ public struct JavaModelRenderer: JavaFileRenderer { extends: nil, implements: nil, name: "Builder", - methods: self.renderBuilderConstructors() + self.renderBuilderSetters() + self.renderBuilderGetters() + [ + methods: renderBuilderConstructors() + renderBuilderSetters() + renderBuilderGetters() + [ self.renderBuilderBuild(), - self.renderBuilderMerge() + self.renderBuilderMerge(), ], enums: [], innerClasses: [], - properties: self.renderBuilderProperties() + properties: renderBuilderProperties() ) let modelClass = JavaIR.Root.classDecl( @@ -243,21 +243,22 @@ public struct JavaModelRenderer: JavaFileRenderer { modifiers: [.public], extends: nil, implements: nil, - name: self.className, + name: className, methods: [ self.renderModelConstructor(), self.renderModelBuilder(), self.renderModelToBuilder(), self.renderModelMergeFrom(), self.renderModelEquals(), - self.renderModelHashCode()] + - self.renderModelGetters() + - self.renderModelIsSetCheckers(), + self.renderModelHashCode(), + ] + + renderModelGetters() + + renderModelIsSetCheckers(), enums: enumProps, innerClasses: [ builderClass, ], - properties: self.renderModelProperties() + properties: renderModelProperties() ) )