aboutsummaryrefslogtreecommitdiff
path: root/java/com/google/turbine
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 /java/com/google/turbine
parent157c07649fff9b6b2056807063f82996a45e896a (diff)
downloadturbine-972d62a80cd12dab2362ac2a71282ec56264f4e3.tar.gz
Handle compact record constructors
https://github.com/bazelbuild/bazel/issues/14249 PiperOrigin-RevId: 408952084
Diffstat (limited to 'java/com/google/turbine')
-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
5 files changed, 53 insertions, 7 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;