Skip to content
This repository has been archived by the owner on Oct 16, 2024. It is now read-only.

Share ImmutableSets #203

Merged
merged 2 commits into from
Oct 11, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,13 @@ static class CodeGenerator extends PropertyCodeGenerator {

@Override
public void addBuilderFieldDeclaration(SourceBuilder code) {
code.addLine("private final %1$s<%2$s> %3$s = new %1$s%4$s();",
LinkedHashSet.class, elementType, property.getName(), diamondOperator(elementType));
if (code.feature(GUAVA).isAvailable()) {
code.addLine("private %s<%s> %s = %s.of();",
Set.class, elementType, property.getName(), ImmutableSet.class);
} else {
code.addLine("private final %1$s<%2$s> %3$s = new %1$s%4$s();",
LinkedHashSet.class, elementType, property.getName(), diamondOperator(elementType));
}
}

@Override
Expand Down Expand Up @@ -138,6 +143,12 @@ private void addAdd(SourceBuilder code, Metadata metadata) {
metadata.getBuilder(),
addMethod(property),
unboxedType.or(elementType));
if (code.feature(GUAVA).isAvailable()) {
code.addLine(" if (this.%s instanceof %s) {", property.getName(), ImmutableSet.class)
.addLine(" this.%1$s = new %2$s%3$s(this.%1$s);",
property.getName(), LinkedHashSet.class, diamondOperator(elementType))
.addLine(" }");
}
if (unboxedType.isPresent()) {
code.addLine(" this.%s.add(element);", property.getName());
} else {
Expand Down Expand Up @@ -214,6 +225,12 @@ private void addRemove(SourceBuilder code, Metadata metadata) {
metadata.getBuilder(),
removeMethod(property),
unboxedType.or(elementType));
if (code.feature(GUAVA).isAvailable()) {
code.addLine(" if (this.%s instanceof %s) {", property.getName(), ImmutableSet.class)
.addLine(" this.%1$s = new %2$s%3$s(this.%1$s);",
property.getName(), LinkedHashSet.class, diamondOperator(elementType))
.addLine(" }");
}
if (unboxedType.isPresent()) {
code.addLine(" this.%s.remove(element);", property.getName());
} else {
Expand Down Expand Up @@ -246,6 +263,12 @@ private void addMutator(SourceBuilder code, Metadata metadata) {
consumer.get().getQualifiedName(),
Set.class,
elementType);
if (code.feature(GUAVA).isAvailable()) {
code.addLine(" if (%s instanceof %s) {", property.getName(), ImmutableSet.class)
.addLine(" %1$s = new %2$s%3$s(%1$s);",
property.getName(), LinkedHashSet.class, diamondOperator(elementType))
.addLine(" }");
}
if (overridesAddMethod) {
code.addLine(" mutator.accept(new CheckedSet<%s>(%s, this::%s));",
elementType, property.getName(), addMethod(property));
Expand All @@ -267,9 +290,17 @@ private void addClear(SourceBuilder code, Metadata metadata) {
.addLine(" *")
.addLine(" * @return this {@code %s} object", metadata.getBuilder().getSimpleName())
.addLine(" */")
.addLine("public %s %s() {", metadata.getBuilder(), clearMethod(property))
.addLine(" %s.clear();", property.getName())
.addLine(" return (%s) this;", metadata.getBuilder())
.addLine("public %s %s() {", metadata.getBuilder(), clearMethod(property));
if (code.feature(GUAVA).isAvailable()) {
code.addLine("if (%s instanceof %s) {", property.getName(), ImmutableSet.class)
.addLine(" %s = %s.of();", property.getName(), ImmutableSet.class)
.addLine("} else {");
}
code.addLine("%s.clear();", property.getName());
if (code.feature(GUAVA).isAvailable()) {
code.addLine("}");
}
code.addLine(" return (%s) this;", metadata.getBuilder())
.addLine("}");
}

Expand All @@ -280,8 +311,14 @@ private void addGetter(SourceBuilder code, Metadata metadata) {
.addLine(" * %s.", metadata.getType().javadocNoArgMethodLink(property.getGetterName()))
.addLine(" * Changes to this builder will be reflected in the view.")
.addLine(" */")
.addLine("public %s<%s> %s() {", Set.class, elementType, getter(property))
.addLine(" return %s.unmodifiableSet(%s);", Collections.class, property.getName())
.addLine("public %s<%s> %s() {", Set.class, elementType, getter(property));
if (code.feature(GUAVA).isAvailable()) {
code.addLine(" if (%s instanceof %s) {", property.getName(), ImmutableSet.class)
.addLine(" %1$s = new %2$s%3$s(%1$s);",
property.getName(), LinkedHashSet.class, diamondOperator(elementType))
.addLine(" }");
}
code.addLine(" return %s.unmodifiableSet(%s);", Collections.class, property.getName())
.addLine("}");
}

Expand All @@ -298,7 +335,16 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin

@Override
public void addMergeFromValue(Block code, String value) {
if (code.feature(GUAVA).isAvailable()) {
code.addLine("if (%s instanceof %s && %s == %s.<%s>of()) {",
value, metadata.getValueType(), property.getName(), ImmutableSet.class, elementType)
.addLine(" %s = %s.%s();", property.getName(), value, property.getGetterName())
.addLine("} else {");
}
code.addLine("%s(%s.%s());", addAllMethod(property), value, property.getGetterName());
if (code.feature(GUAVA).isAvailable()) {
code.addLine("}");
}
}

@Override
Expand All @@ -317,7 +363,7 @@ public void addSetFromResult(SourceBuilder code, String builder, String variable

@Override
public void addClearField(Block code) {
code.addLine("%s.clear();", property.getName());
code.addLine("%s();", clearMethod(property));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
*/
package org.inferred.freebuilder.processor;

import static org.inferred.freebuilder.processor.util.feature.FunctionPackage.FUNCTION_PACKAGE;
import static org.junit.Assume.assumeTrue;

import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;

Expand Down Expand Up @@ -204,4 +207,22 @@ public void mutateAndAddDelegatesToAddMethodForValidation() {
.runTest();
}

@Test
public void modifyAndMutateModifiesUnderlyingProperty() {
assumeTrue(features.get(FUNCTION_PACKAGE).consumer().isPresent());
behaviorTester
.with(new Processor(features))
.with(CHECKED_SET_TYPE)
.with(new TestBuilder()
.addImport("com.example.DataType")
.addLine("DataType value = new DataType.Builder().addProperties(1, 2).build();")
.addLine("DataType copy = DataType.Builder")
.addLine(" .from(value)")
.addLine(" .mutateProperties(set -> set.remove(1))")
.addLine(" .build();")
.addLine("assertThat(copy.getProperties()).containsExactly(2);")
.build())
.runTest();
}

}
Loading