diff options
author | Liam Miller-Cushon <cushon@google.com> | 2021-11-10 12:45:01 -0800 |
---|---|---|
committer | Javac Team <javac-team+copybara@google.com> | 2021-11-10 12:45:40 -0800 |
commit | 972d62a80cd12dab2362ac2a71282ec56264f4e3 (patch) | |
tree | 555cd41d00b1950e01da561b6820e5e2985b072e /java/com/google/turbine/binder | |
parent | 157c07649fff9b6b2056807063f82996a45e896a (diff) | |
download | turbine-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.java | 34 |
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; |