aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiam Miller-Cushon <cushon@google.com>2021-11-10 12:45:01 -0800
committerJavac Team <javac-team+copybara@google.com>2021-11-10 12:45:40 -0800
commit972d62a80cd12dab2362ac2a71282ec56264f4e3 (patch)
tree555cd41d00b1950e01da561b6820e5e2985b072e
parent157c07649fff9b6b2056807063f82996a45e896a (diff)
downloadturbine-972d62a80cd12dab2362ac2a71282ec56264f4e3.tar.gz
Handle compact record constructors
https://github.com/bazelbuild/bazel/issues/14249 PiperOrigin-RevId: 408952084
-rw-r--r--java/com/google/turbine/binder/TypeBinder.java34
-rw-r--r--java/com/google/turbine/model/TurbineFlag.java3
-rw-r--r--java/com/google/turbine/parse/Parser.java19
-rw-r--r--java/com/google/turbine/tree/Pretty.java1
-rw-r--r--java/com/google/turbine/tree/TurbineModifier.java3
-rw-r--r--javatests/com/google/turbine/lower/LowerIntegrationTest.java5
-rw-r--r--javatests/com/google/turbine/lower/testdata/record2.test27
7 files changed, 82 insertions, 10 deletions
diff --git a/java/com/google/turbine/binder/TypeBinder.java b/java/com/google/turbine/binder/TypeBinder.java
index ccc0ad3..e2011e2 100644
--- a/java/com/google/turbine/binder/TypeBinder.java
+++ b/java/com/google/turbine/binder/TypeBinder.java
@@ -251,7 +251,7 @@ public class TypeBinder {
ImmutableList.Builder<MethodInfo> methods =
ImmutableList.<MethodInfo>builder()
.addAll(syntheticMethods(syntheticMethods, components))
- .addAll(bindMethods(scope, base.decl().members()));
+ .addAll(bindMethods(scope, base.decl().members(), components));
if (base.kind().equals(TurbineTyKind.RECORD)) {
methods.addAll(syntheticRecordMethods(syntheticMethods, components));
}
@@ -563,18 +563,22 @@ public class TypeBinder {
return result.build();
}
- private List<MethodInfo> bindMethods(CompoundScope scope, ImmutableList<Tree> members) {
+ private List<MethodInfo> bindMethods(
+ CompoundScope scope,
+ ImmutableList<Tree> members,
+ ImmutableList<RecordComponentInfo> components) {
List<MethodInfo> methods = new ArrayList<>();
int idx = 0;
for (Tree member : members) {
if (member.kind() == Tree.Kind.METH_DECL) {
- methods.add(bindMethod(idx++, scope, (Tree.MethDecl) member));
+ methods.add(bindMethod(idx++, scope, (MethDecl) member, components));
}
}
return methods;
}
- private MethodInfo bindMethod(int idx, CompoundScope scope, Tree.MethDecl t) {
+ private MethodInfo bindMethod(
+ int idx, CompoundScope scope, MethDecl t, ImmutableList<RecordComponentInfo> components) {
MethodSymbol sym = new MethodSymbol(idx, owner, t.name().value());
@@ -604,8 +608,26 @@ public class TypeBinder {
if (name.equals("<init>")) {
if (hasEnclosingInstance(base)) {
parameters.add(enclosingInstanceParameter(sym));
- } else if (base.kind() == TurbineTyKind.ENUM && name.equals("<init>")) {
- parameters.addAll(enumCtorParams(sym));
+ } else {
+ switch (base.kind()) {
+ case ENUM:
+ parameters.addAll(enumCtorParams(sym));
+ break;
+ case RECORD:
+ if (t.mods().contains(TurbineModifier.COMPACT_CTOR)) {
+ for (RecordComponentInfo component : components) {
+ parameters.add(
+ new ParamInfo(
+ new ParamSymbol(sym, component.name()),
+ component.type(),
+ component.annotations(),
+ component.access()));
+ }
+ }
+ break;
+ default:
+ break;
+ }
}
}
ParamInfo receiver = null;
diff --git a/java/com/google/turbine/model/TurbineFlag.java b/java/com/google/turbine/model/TurbineFlag.java
index 6e8d64b..3e68a5e 100644
--- a/java/com/google/turbine/model/TurbineFlag.java
+++ b/java/com/google/turbine/model/TurbineFlag.java
@@ -58,5 +58,8 @@ public final class TurbineFlag {
public static final int ACC_SEALED = 1 << 19;
public static final int ACC_NON_SEALED = 1 << 20;
+ /** Compact record constructor. */
+ public static final int ACC_COMPACT_CTOR = 1 << 21;
+
private TurbineFlag() {}
}
diff --git a/java/com/google/turbine/parse/Parser.java b/java/com/google/turbine/parse/Parser.java
index ed8958e..c370ad8 100644
--- a/java/com/google/turbine/parse/Parser.java
+++ b/java/com/google/turbine/parse/Parser.java
@@ -846,6 +846,25 @@ public class Parser {
name = ident;
return ImmutableList.of(methodRest(pos, access, annos, typaram, null, name));
}
+ case LBRACE:
+ {
+ dropBlocks();
+ name = new Ident(position, CTOR_NAME);
+ String javadoc = lexer.javadoc();
+ access.add(TurbineModifier.COMPACT_CTOR);
+ return ImmutableList.<Tree>of(
+ new MethDecl(
+ pos,
+ access,
+ annos,
+ typaram,
+ /* ret= */ Optional.empty(),
+ name,
+ /* params= */ ImmutableList.of(),
+ /* exntys= */ ImmutableList.of(),
+ /* defaultValue= */ Optional.empty(),
+ javadoc));
+ }
case IDENT:
{
result =
diff --git a/java/com/google/turbine/tree/Pretty.java b/java/com/google/turbine/tree/Pretty.java
index 788ab58..4ebc04f 100644
--- a/java/com/google/turbine/tree/Pretty.java
+++ b/java/com/google/turbine/tree/Pretty.java
@@ -544,6 +544,7 @@ public class Pretty implements Tree.Visitor<@Nullable Void, @Nullable Void> {
case ACC_ANNOTATION:
case ACC_SYNTHETIC:
case ACC_BRIDGE:
+ case COMPACT_CTOR:
break;
}
}
diff --git a/java/com/google/turbine/tree/TurbineModifier.java b/java/com/google/turbine/tree/TurbineModifier.java
index e5153b9..2bfe53e 100644
--- a/java/com/google/turbine/tree/TurbineModifier.java
+++ b/java/com/google/turbine/tree/TurbineModifier.java
@@ -47,7 +47,8 @@ public enum TurbineModifier {
DEFAULT(TurbineFlag.ACC_DEFAULT),
TRANSITIVE(TurbineFlag.ACC_TRANSITIVE),
SEALED(TurbineFlag.ACC_SEALED),
- NON_SEALED(TurbineFlag.ACC_NON_SEALED);
+ NON_SEALED(TurbineFlag.ACC_NON_SEALED),
+ COMPACT_CTOR(TurbineFlag.ACC_COMPACT_CTOR);
private final int flag;
diff --git a/javatests/com/google/turbine/lower/LowerIntegrationTest.java b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
index db73ec0..b45559f 100644
--- a/javatests/com/google/turbine/lower/LowerIntegrationTest.java
+++ b/javatests/com/google/turbine/lower/LowerIntegrationTest.java
@@ -44,9 +44,7 @@ import org.junit.runners.Parameterized.Parameters;
public class LowerIntegrationTest {
private static final ImmutableMap<String, Integer> SOURCE_VERSION =
- ImmutableMap.of(
- "record.test", 16,
- "sealed.test", 17);
+ ImmutableMap.of("record.test", 16, "record2.test", 16, "sealed.test", 17);
@Parameters(name = "{index}: {0}")
public static Iterable<Object[]> parameters() {
@@ -265,6 +263,7 @@ public class LowerIntegrationTest {
"rawfbound.test",
"receiver_param.test",
"record.test",
+ "record2.test",
"rek.test",
"samepkg.test",
"sealed.test",
diff --git a/javatests/com/google/turbine/lower/testdata/record2.test b/javatests/com/google/turbine/lower/testdata/record2.test
new file mode 100644
index 0000000..af4093e
--- /dev/null
+++ b/javatests/com/google/turbine/lower/testdata/record2.test
@@ -0,0 +1,27 @@
+=== Records.java ===
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+import java.util.Objects;
+
+class Records {
+ public record R1(String one) {
+ public R1 {
+ Objects.requireNonNull(one);
+ }
+ }
+
+ public record R2(String one) {
+ @Deprecated
+ public R2 {
+ Objects.requireNonNull(one);
+ }
+ }
+
+ public record R3<T>(T x) {
+ @Deprecated
+ public R3 {
+ Objects.requireNonNull(x);
+ }
+ }
+}