From 48220971c6dd52d6ce865f4bef8170df04f46e44 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Wed, 24 Apr 2024 11:50:41 -0700 Subject: [PATCH] Don't emit duplicate record component getters Check if record component getters have been explicitly declared, and don't emit the synthetic methods if they have. https://github.com/bazelbuild/bazel/issues/22105 PiperOrigin-RevId: 627802539 --- .../com/google/turbine/binder/TypeBinder.java | 12 ++++++++- .../turbine/lower/LowerIntegrationTest.java | 25 +++++++++++-------- .../testdata/record_getter_override.test | 10 ++++++++ 3 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 javatests/com/google/turbine/lower/testdata/record_getter_override.test diff --git a/java/com/google/turbine/binder/TypeBinder.java b/java/com/google/turbine/binder/TypeBinder.java index 36114750..a7e1a0d6 100644 --- a/java/com/google/turbine/binder/TypeBinder.java +++ b/java/com/google/turbine/binder/TypeBinder.java @@ -302,6 +302,10 @@ private ImmutableList recordMethods( boolean hasEquals = false; boolean hasHashCode = false; boolean hasPrimaryConstructor = false; + Set componentNamesToDeclare = new HashSet<>(); + for (RecordComponentInfo c : components) { + componentNamesToDeclare.add(c.name()); + } for (MethodInfo m : boundMethods) { if (m.name().equals("")) { if (isPrimaryConstructor(m, components)) { @@ -321,7 +325,10 @@ private ImmutableList recordMethods( case "hashCode": hasHashCode = m.parameters().isEmpty(); break; - default: // fall out + default: + if (m.parameters().isEmpty()) { + componentNamesToDeclare.remove(m.name()); + } } boundNonConstructors.add(m); } @@ -383,6 +390,9 @@ private ImmutableList recordMethods( null)); } for (RecordComponentInfo c : components) { + if (!componentNamesToDeclare.contains(c.name())) { + continue; + } MethodSymbol componentMethod = syntheticMethods.create(owner, c.name()); methods.add( new MethodInfo( diff --git a/javatests/com/google/turbine/lower/LowerIntegrationTest.java b/javatests/com/google/turbine/lower/LowerIntegrationTest.java index 32b7fb3c..c54311f8 100644 --- a/javatests/com/google/turbine/lower/LowerIntegrationTest.java +++ b/javatests/com/google/turbine/lower/LowerIntegrationTest.java @@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.TruthJUnit.assume; import static com.google.turbine.testing.TestResources.getResource; +import static java.util.Map.entry; import static java.util.stream.Collectors.toList; import com.google.common.collect.ImmutableList; @@ -53,17 +54,18 @@ public class LowerIntegrationTest { private static final ImmutableMap SOURCE_VERSION = - ImmutableMap.of( - "record.test", 16, // - "record2.test", 16, - "record_tostring.test", 16, - "record_ctor.test", 16, - "sealed.test", 17, - "sealed_nested.test", 17, - "textblock.test", 15, - "textblock2.test", 15, - "B306423115.test", 15, - "string_template.test", 21); + ImmutableMap.ofEntries( + entry("record.test", 16), + entry("record2.test", 16), + entry("record_tostring.test", 16), + entry("record_ctor.test", 16), + entry("record_getter_override.test", 16), + entry("sealed.test", 17), + entry("sealed_nested.test", 17), + entry("textblock.test", 15), + entry("textblock2.test", 15), + entry("B306423115.test", 15), + entry("string_template.test", 21)); private static final ImmutableSet SOURCE_VERSION_PREVIEW = ImmutableSet.of("string_template.test"); @@ -288,6 +290,7 @@ public static Iterable parameters() { "record.test", "record2.test", "record_ctor.test", + "record_getter_override.test", "record_tostring.test", "rek.test", "samepkg.test", diff --git a/javatests/com/google/turbine/lower/testdata/record_getter_override.test b/javatests/com/google/turbine/lower/testdata/record_getter_override.test new file mode 100644 index 00000000..b08f13fa --- /dev/null +++ b/javatests/com/google/turbine/lower/testdata/record_getter_override.test @@ -0,0 +1,10 @@ +=== Foo.java === +import java.util.ArrayList; +import java.util.List; + +public record Foo(int bar, List baz) { + /** This should override the default baz() getter. */ + public List baz() { + return baz == null ? new ArrayList<>() : baz; + } +} \ No newline at end of file