Skip to content

Commit 5cc68fd

Browse files
cushonJavac Team
authored andcommitted
Optimize flattening of of ClassTy trees
Qualified class names are represented recursively, and need to be flattened in several places during binding. Add a recursive method to ClassTy to do the flattening, and avoid some garbage from using ArrayDeque and doing a copy. PiperOrigin-RevId: 841646029
1 parent fa5ad86 commit 5cc68fd

File tree

4 files changed

+32
-22
lines changed

4 files changed

+32
-22
lines changed

java/com/google/turbine/binder/ConstEvaluator.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@
6161
import com.google.turbine.tree.TurbineOperatorKind;
6262
import com.google.turbine.type.AnnoInfo;
6363
import com.google.turbine.type.Type;
64-
import java.util.ArrayDeque;
6564
import java.util.Iterator;
6665
import java.util.LinkedHashMap;
6766
import java.util.Map;
@@ -170,11 +169,8 @@ private Type evalClassLiteralType(Tree.Type type) {
170169
* isn't completed during the hierarchy phase).
171170
*/
172171
private Type resolveClass(ClassTy classTy) {
173-
ArrayDeque<Ident> flat = new ArrayDeque<>();
174-
for (ClassTy curr = classTy; curr != null; curr = curr.base().orElse(null)) {
175-
flat.addFirst(curr.name());
176-
}
177-
LookupResult result = scope.lookup(new LookupKey(ImmutableList.copyOf(flat)));
172+
ImmutableList<Ident> flat = classTy.qualifiedName();
173+
LookupResult result = scope.lookup(new LookupKey(flat));
178174
if (result == null) {
179175
log.error(classTy.position(), ErrorKind.CANNOT_RESOLVE, flat.getFirst());
180176
return Type.ErrorTy.create(flat, ImmutableList.of());

java/com/google/turbine/binder/HierarchyBinder.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import com.google.turbine.model.TurbineTyKind;
3434
import com.google.turbine.tree.Tree;
3535
import com.google.turbine.tree.Tree.ClassTy;
36-
import java.util.ArrayDeque;
3736
import java.util.LinkedHashMap;
3837
import org.jspecify.annotations.Nullable;
3938

@@ -122,12 +121,9 @@ private SourceHeaderBoundClass bind() {
122121
private @Nullable ClassSymbol resolveClass(Tree.ClassTy ty) {
123122
// flatten a left-recursive qualified type name to its component simple names
124123
// e.g. Foo<Bar>.Baz -> ["Foo", "Bar"]
125-
ArrayDeque<Tree.Ident> flat = new ArrayDeque<>();
126-
for (Tree.ClassTy curr = ty; curr != null; curr = curr.base().orElse(null)) {
127-
flat.addFirst(curr.name());
128-
}
124+
ImmutableList<Tree.Ident> flat = ty.qualifiedName();
129125
// Resolve the base symbol in the qualified name.
130-
LookupResult result = lookup(ty, new LookupKey(ImmutableList.copyOf(flat)));
126+
LookupResult result = lookup(ty, new LookupKey(flat));
131127
if (result == null) {
132128
log.error(ty.position(), ErrorKind.CANNOT_RESOLVE, Joiner.on('.').join(flat));
133129
return null;

java/com/google/turbine/binder/TypeBinder.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
import com.google.turbine.type.Type;
6161
import com.google.turbine.type.Type.IntersectionTy;
6262
import com.google.turbine.types.Deannotate;
63-
import java.util.ArrayDeque;
6463
import java.util.ArrayList;
6564
import java.util.HashSet;
6665
import java.util.LinkedHashMap;
@@ -942,14 +941,7 @@ private Type bindTy(CompoundScope scope, Tree t) {
942941

943942
private Type bindClassTy(CompoundScope scope, Tree.ClassTy t) {
944943
// flatten the components of a qualified class type
945-
ArrayList<Tree.ClassTy> flat;
946-
{
947-
ArrayDeque<Tree.ClassTy> builder = new ArrayDeque<>();
948-
for (Tree.ClassTy curr = t; curr != null; curr = curr.base().orElse(null)) {
949-
builder.addFirst(curr);
950-
}
951-
flat = new ArrayList<>(builder);
952-
}
944+
ImmutableList<Tree.ClassTy> flat = t.flatten();
953945
// the simple names of all classes in the qualified name
954946
ImmutableList.Builder<Tree.Ident> nameBuilder = ImmutableList.builder();
955947
for (Tree.ClassTy curr : flat) {
@@ -982,7 +974,7 @@ private Type bindClassTy(CompoundScope scope, Tree.ClassTy t) {
982974

983975
private Type bindClassTyRest(
984976
CompoundScope scope,
985-
ArrayList<ClassTy> flat,
977+
ImmutableList<ClassTy> flat,
986978
ImmutableList<Tree.Ident> bits,
987979
LookupResult result,
988980
ClassSymbol sym,

java/com/google/turbine/tree/Tree.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,32 @@ public Ident name() {
307307
public ImmutableList<Type> tyargs() {
308308
return tyargs;
309309
}
310+
311+
public ImmutableList<ClassTy> flatten() {
312+
ImmutableList.Builder<ClassTy> builder = ImmutableList.builder();
313+
flatten(builder);
314+
return builder.build();
315+
}
316+
317+
private void flatten(ImmutableList.Builder<ClassTy> builder) {
318+
if (base.isPresent()) {
319+
base.get().flatten(builder);
320+
}
321+
builder.add(this);
322+
}
323+
324+
public ImmutableList<Ident> qualifiedName() {
325+
ImmutableList.Builder<Ident> builder = ImmutableList.builder();
326+
qualifiedName(builder);
327+
return builder.build();
328+
}
329+
330+
private void qualifiedName(ImmutableList.Builder<Ident> builder) {
331+
if (base.isPresent()) {
332+
base.get().qualifiedName(builder);
333+
}
334+
builder.add(name());
335+
}
310336
}
311337

312338
/** A JLS 3.10 literal expression. */

0 commit comments

Comments
 (0)