From 7646889ded2a74c4377ac8decece3b879209cf35 Mon Sep 17 00:00:00 2001 From: emcmanus Date: Fri, 27 Sep 2019 12:15:01 -0700 Subject: Ensure that types are substituted correctly in property builders. The regression test tickles a bug in Eclipse so this change introduces a new place to put tests like that. I don't know how to work around the Eclipse failure, which is a NullPointerException inside Types.asMemberOf. RELNOTES=Property builders now work correctly when their actual return type is different from the corresponding property type because of type variable substitution. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=271621735 --- .../com/google/auto/value/processor/BuilderMethodClassifier.java | 8 +++++++- .../google/auto/value/processor/PropertyBuilderClassifier.java | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'value/src/main/java/com') diff --git a/value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java b/value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java index 94e26ef0..3b3799b4 100644 --- a/value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java +++ b/value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java @@ -274,7 +274,13 @@ class BuilderMethodClassifier { if (getterToPropertyName.containsValue(property)) { PropertyBuilderClassifier propertyBuilderClassifier = new PropertyBuilderClassifier( - errorReporter, typeUtils, elementUtils, this, getterToPropertyName, eclipseHack); + errorReporter, + typeUtils, + elementUtils, + this, + getterToPropertyName, + getterToPropertyType, + eclipseHack); Optional propertyBuilder = propertyBuilderClassifier.makePropertyBuilder(method, property); if (propertyBuilder.isPresent()) { diff --git a/value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java b/value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java index 41080730..3b8592b8 100644 --- a/value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java +++ b/value/src/main/java/com/google/auto/value/processor/PropertyBuilderClassifier.java @@ -19,6 +19,7 @@ import com.google.auto.common.MoreElements; import com.google.auto.common.MoreTypes; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import java.util.LinkedHashMap; import java.util.List; @@ -52,6 +53,7 @@ class PropertyBuilderClassifier { private final Elements elementUtils; private final BuilderMethodClassifier builderMethodClassifier; private final ImmutableBiMap getterToPropertyName; + private final ImmutableMap getterToPropertyType; private final EclipseHack eclipseHack; PropertyBuilderClassifier( @@ -60,12 +62,14 @@ class PropertyBuilderClassifier { Elements elementUtils, BuilderMethodClassifier builderMethodClassifier, ImmutableBiMap getterToPropertyName, + ImmutableMap getterToPropertyType, EclipseHack eclipseHack) { this.errorReporter = errorReporter; this.typeUtils = typeUtils; this.elementUtils = elementUtils; this.builderMethodClassifier = builderMethodClassifier; this.getterToPropertyName = getterToPropertyName; + this.getterToPropertyType = getterToPropertyType; this.eclipseHack = eclipseHack; } @@ -207,7 +211,7 @@ class PropertyBuilderClassifier { Map barBuilderNoArgMethods = noArgMethodsOf(barBuilderTypeElement); ExecutableElement barGetter = getterToPropertyName.inverse().get(property); - TypeMirror barTypeMirror = barGetter.getReturnType(); + TypeMirror barTypeMirror = getterToPropertyType.get(barGetter); if (barTypeMirror.getKind() != TypeKind.DECLARED) { errorReporter.reportError( "Method looks like a property builder, but the type of property " -- cgit v1.2.3