aboutsummaryrefslogtreecommitdiff
path: root/java/com/google/turbine/binder
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/binder
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/binder')
-rw-r--r--java/com/google/turbine/binder/TypeBinder.java34
1 files changed, 28 insertions, 6 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;