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

Commit 20168fa

Browse files
authored
#427 Issue compiler error if put overridden
2 parents efb5572 + e7f9984 commit 20168fa

File tree

2 files changed

+68
-16
lines changed

2 files changed

+68
-16
lines changed

src/main/java/org/inferred/freebuilder/processor/property/BiMapProperty.java

+42-16
Original file line numberDiff line numberDiff line change
@@ -27,39 +27,42 @@
2727
import static org.inferred.freebuilder.processor.model.ModelUtils.erasesToAnyOf;
2828
import static org.inferred.freebuilder.processor.model.ModelUtils.maybeDeclared;
2929
import static org.inferred.freebuilder.processor.model.ModelUtils.maybeUnbox;
30+
import static org.inferred.freebuilder.processor.model.ModelUtils.override;
3031
import static org.inferred.freebuilder.processor.model.ModelUtils.overrides;
3132
import static org.inferred.freebuilder.processor.model.ModelUtils.upperBound;
3233
import static org.inferred.freebuilder.processor.property.MergeAction.appendingToCollections;
3334
import static org.inferred.freebuilder.processor.source.FunctionalType.consumer;
3435
import static org.inferred.freebuilder.processor.source.FunctionalType.functionalTypeAcceptedByMethod;
3536

37+
import com.google.common.base.Preconditions;
38+
import com.google.common.collect.BiMap;
39+
import com.google.common.collect.HashBiMap;
40+
import com.google.common.collect.ImmutableBiMap;
41+
import com.google.common.collect.ImmutableSet;
42+
import com.google.common.collect.Maps;
43+
44+
import org.inferred.freebuilder.processor.Datatype;
45+
import org.inferred.freebuilder.processor.Declarations;
46+
import org.inferred.freebuilder.processor.excerpt.CheckedBiMap;
47+
import org.inferred.freebuilder.processor.source.Excerpt;
48+
import org.inferred.freebuilder.processor.source.FunctionalType;
49+
import org.inferred.freebuilder.processor.source.SourceBuilder;
50+
import org.inferred.freebuilder.processor.source.Type;
51+
import org.inferred.freebuilder.processor.source.Variable;
52+
3653
import java.util.Collection;
3754
import java.util.Map;
3855
import java.util.Objects;
3956
import java.util.Optional;
4057
import java.util.Set;
4158

59+
import javax.lang.model.element.ExecutableElement;
4260
import javax.lang.model.element.TypeElement;
4361
import javax.lang.model.type.DeclaredType;
4462
import javax.lang.model.type.TypeMirror;
4563
import javax.lang.model.util.Elements;
4664
import javax.lang.model.util.Types;
47-
48-
import org.inferred.freebuilder.processor.Datatype;
49-
import org.inferred.freebuilder.processor.Declarations;
50-
import org.inferred.freebuilder.processor.excerpt.CheckedBiMap;
51-
import org.inferred.freebuilder.processor.source.Excerpt;
52-
import org.inferred.freebuilder.processor.source.FunctionalType;
53-
import org.inferred.freebuilder.processor.source.SourceBuilder;
54-
import org.inferred.freebuilder.processor.source.Type;
55-
import org.inferred.freebuilder.processor.source.Variable;
56-
57-
import com.google.common.base.Preconditions;
58-
import com.google.common.collect.BiMap;
59-
import com.google.common.collect.HashBiMap;
60-
import com.google.common.collect.ImmutableBiMap;
61-
import com.google.common.collect.ImmutableSet;
62-
import com.google.common.collect.Maps;
65+
import javax.tools.Diagnostic.Kind;
6366

6467
/**
6568
* {@link PropertyCodeGenerator} providing fluent methods for {@link BiMap} properties.
@@ -79,8 +82,21 @@ public Optional<BiMapProperty> create(Config config) {
7982
TypeMirror valueType = upperBound(config.getElements(), type.getTypeArguments().get(1));
8083
Optional<TypeMirror> unboxedKeyType = maybeUnbox(keyType, config.getTypes());
8184
Optional<TypeMirror> unboxedValueType = maybeUnbox(valueType, config.getTypes());
85+
Optional<ExecutableElement> putMethodOverride = putMethodOverride(
86+
config, unboxedKeyType.orElse(keyType), unboxedValueType.orElse(valueType));
8287
boolean overridesForcePutMethod = hasForcePutMethodOverride(
8388
config, unboxedKeyType.orElse(keyType), unboxedValueType.orElse(valueType));
89+
90+
if (putMethodOverride.isPresent() && !overridesForcePutMethod) {
91+
config.getEnvironment().getMessager().printMessage(
92+
Kind.ERROR,
93+
"Overriding "
94+
+ putMethod(property)
95+
+ " will not correctly validate all inputs. Please override "
96+
+ forcePutMethod(property)
97+
+ ".",
98+
putMethodOverride.get());
99+
}
84100

85101
FunctionalType mutatorType = functionalTypeAcceptedByMethod(
86102
config.getBuilder(),
@@ -100,6 +116,16 @@ public Optional<BiMapProperty> create(Config config) {
100116
mutatorType));
101117
}
102118

119+
private static Optional<ExecutableElement> putMethodOverride(
120+
Config config, TypeMirror keyType, TypeMirror valueType) {
121+
return override(
122+
config.getBuilder(),
123+
config.getTypes(),
124+
putMethod(config.getProperty()),
125+
keyType,
126+
valueType);
127+
}
128+
103129
private static boolean hasForcePutMethodOverride(
104130
Config config, TypeMirror keyType, TypeMirror valueType) {
105131
return overrides(

src/test/java/org/inferred/freebuilder/processor/property/BiMapPropertyTest.java

+26
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,32 @@ public void testEquality() {
668668
.runTest();
669669
}
670670

671+
@Test
672+
public void testCompileErrorIfOnlyPutOverridden() {
673+
behaviorTester
674+
.with(SourceBuilder.forTesting()
675+
.addLine("package com.example;")
676+
.addLine("@%s", FreeBuilder.class)
677+
.addLine("public interface DataType {")
678+
.addLine(" %s<%s, %s> %s;", BiMap.class, keys.type(), values.type(), convention.get())
679+
.addLine("")
680+
.addLine(" class Builder extends DataType_Builder {")
681+
.addLine(" @Override public Builder putItems(%s key, %s value) {",
682+
keys.unwrappedType(), values.unwrappedType())
683+
.addLine(" %s.checkArgument(%s, \"%s\");",
684+
Preconditions.class, keys.validation("key"), keys.errorMessage("key"))
685+
.addLine(" %s.checkArgument(%s, \"%s\");",
686+
Preconditions.class, values.validation("value"), values.errorMessage("value"))
687+
.addLine(" return super.putItems(key, value);")
688+
.addLine(" }")
689+
.addLine(" }")
690+
.addLine("}"))
691+
.failsToCompile()
692+
.withErrorThat(subject -> subject
693+
.hasMessage("Overriding putItems will not correctly validate all inputs. "
694+
+ "Please override forcePutItems."));
695+
}
696+
671697
@Test
672698
public void testJacksonInteroperability() {
673699
// See also https://github.com/google/FreeBuilder/issues/68

0 commit comments

Comments
 (0)