Skip to content

Commit 7f2a83e

Browse files
BenchMaker: collect used type parameters
Change-Id: If6c18e66eded0ebe73575cca28dd77e5ae374890 Reviewed-on: https://dart-review.googlesource.com/c/93950 Commit-Queue: Peter von der Ahé <[email protected]> Reviewed-by: Jens Johansen <[email protected]>
1 parent b3c9aa6 commit 7f2a83e

File tree

2 files changed

+78
-41
lines changed

2 files changed

+78
-41
lines changed

pkg/front_end/test/fasta/types/kernel_type_parser.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ class KernelFromParsedType implements Visitor<Node, KernelEnvironment> {
291291
typeParameter
292292
..bound = type
293293
// The default type will be overridden below, but we need to set it
294-
// so [calculateBounds] can destinquish between explicit and implicit
294+
// so [calculateBounds] can distinguish between explicit and implicit
295295
// bounds.
296296
..defaultType = type;
297297
}

pkg/front_end/tool/_fasta/bench_maker.dart

Lines changed: 77 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,16 @@ Iterable<String> nameGenerator() sync* {
3636
class BenchMaker implements DartTypeVisitor1<void, StringBuffer> {
3737
final List<Object> checks = <Object>[];
3838

39-
final Map<Class, String> classNames = <Class, String>{};
39+
final Map<TreeNode, String> nodeNames = <TreeNode, String>{};
4040

4141
final Set<String> usedNames = new Set<String>();
4242

4343
final Iterator<String> names = nameGenerator().iterator..moveNext();
4444

4545
final List<String> classes = <String>[];
4646

47+
final List<TypeParameter> usedTypeParameters = <TypeParameter>[];
48+
4749
String serializeTypeChecks(List<Object> typeChecks) {
4850
for (List<Object> list in typeChecks) {
4951
writeTypeCheck(list[0], list[1], list[2]);
@@ -53,24 +55,66 @@ class BenchMaker implements DartTypeVisitor1<void, StringBuffer> {
5355
}
5456

5557
void writeTypeCheck(DartType s, DartType t, bool expected) {
56-
List<String> arguments = new List<String>(2);
57-
Map<String, dynamic> typeCheck = <String, dynamic>{
58-
"kind": expected ? "isSubtype" : "isNotSubtype",
59-
"arguments": arguments,
60-
};
58+
assert(usedTypeParameters.isEmpty);
59+
usedTypeParameters.clear();
6160
StringBuffer sb = new StringBuffer();
6261
s.accept1(this, sb);
63-
arguments[0] = "$sb";
62+
String sString = "$sb";
6463
sb.clear();
6564
t.accept1(this, sb);
66-
arguments[1] = "$sb";
67-
checks.add(typeCheck);
65+
String tString = "$sb";
66+
List<Object> arguments = <Object>[sString, tString];
67+
Set<TypeParameter> seenTypeParameters = new Set<TypeParameter>();
68+
List<String> parameterStrings = <String>[];
69+
while (usedTypeParameters.isNotEmpty) {
70+
List<TypeParameter> typeParameters = usedTypeParameters.toList();
71+
usedTypeParameters.clear();
72+
for (TypeParameter parameter in typeParameters) {
73+
if (seenTypeParameters.add(parameter)) {
74+
sb.clear();
75+
writeTypeParameter(parameter, sb);
76+
parameterStrings.add("$sb");
77+
}
78+
}
79+
}
80+
if (parameterStrings.isNotEmpty) {
81+
arguments.add(parameterStrings);
82+
}
83+
checks.add(<String, dynamic>{
84+
"kind": expected ? "isSubtype" : "isNotSubtype",
85+
"arguments": arguments,
86+
});
87+
}
88+
89+
void writeTypeParameter(TypeParameter parameter, StringBuffer sb) {
90+
sb.write(computeName(parameter));
91+
if (parameter.defaultType is! DynamicType ||
92+
parameter.bound is DynamicType) {
93+
sb.write(" extends ");
94+
parameter.bound.accept1(this, sb);
95+
}
96+
}
97+
98+
void writeTypeParameters(
99+
List<TypeParameter> typeParameters, StringBuffer sb) {
100+
if (typeParameters.isNotEmpty) {
101+
sb.write("<");
102+
bool first = true;
103+
for (TypeParameter p in typeParameters) {
104+
if (!first) sb.write(", ");
105+
writeTypeParameter(p, sb);
106+
first = false;
107+
}
108+
sb.write(">");
109+
}
68110
}
69111

70112
void writeClasses() {
71113
Set<Class> writtenClasses = new Set<Class>();
72-
for (Class cls in classNames.keys.toList()) {
73-
writeClass(cls, writtenClasses);
114+
for (TreeNode node in nodeNames.keys.toList()) {
115+
if (node is Class) {
116+
writeClass(node, writtenClasses);
117+
}
74118
}
75119
}
76120

@@ -86,6 +130,7 @@ class BenchMaker implements DartTypeVisitor1<void, StringBuffer> {
86130
StringBuffer sb = new StringBuffer();
87131
sb.write("class ");
88132
sb.write(computeName(cls));
133+
writeTypeParameters(cls.typeParameters, sb);
89134
if (supertype != null) {
90135
sb.write(" extends ");
91136
supertype.asInterfaceType.accept1(this, sb);
@@ -120,23 +165,23 @@ class BenchMaker implements DartTypeVisitor1<void, StringBuffer> {
120165
classes.add("$sb");
121166
}
122167

123-
String computeName(Class cls) {
124-
String name = classNames[cls];
168+
String computeName(TreeNode node) {
169+
String name = nodeNames[node];
125170
if (name != null) return name;
126-
Library library = cls.enclosingLibrary;
127-
if ("${library.importUri}" == "dart:core") {
128-
if (!usedNames.add(cls.name)) {
129-
throw "Class name conflict for $cls";
130-
}
131-
return classNames[cls] = cls.name;
132-
} else {
133-
String name;
134-
while (!usedNames.add(name = names.current)) {
135-
names.moveNext();
171+
if (node is Class) {
172+
Library library = node.enclosingLibrary;
173+
if ("${library?.importUri}" == "dart:core") {
174+
if (!usedNames.add(node.name)) {
175+
throw "Class name conflict for $node";
176+
}
177+
return nodeNames[node] = node.name;
136178
}
179+
}
180+
while (!usedNames.add(name = names.current)) {
137181
names.moveNext();
138-
return classNames[cls] = name;
139182
}
183+
names.moveNext();
184+
return nodeNames[node] = name;
140185
}
141186

142187
@override
@@ -185,18 +230,7 @@ class BenchMaker implements DartTypeVisitor1<void, StringBuffer> {
185230

186231
@override
187232
void visitFunctionType(FunctionType node, StringBuffer sb) {
188-
if (node.typeParameters.isNotEmpty) {
189-
sb.write("<");
190-
bool first = true;
191-
for (TypeParameter p in node.typeParameters) {
192-
if (!first) sb.write(", ");
193-
sb.write(p.name);
194-
sb.write(" extends ");
195-
p.bound.accept1(this, sb);
196-
first = false;
197-
}
198-
sb.write(">");
199-
}
233+
writeTypeParameters(node.typeParameters, sb);
200234
sb.write("(");
201235
bool first = true;
202236
for (int i = 0; i < node.requiredParameterCount; i++) {
@@ -238,10 +272,13 @@ class BenchMaker implements DartTypeVisitor1<void, StringBuffer> {
238272

239273
@override
240274
void visitTypeParameterType(TypeParameterType node, StringBuffer sb) {
241-
// TODO(ahe): We need to collect used type parameters. See
242-
// pkg/front_end/test/fasta/types/shared_type_tests.dart for how they can
243-
// be used in testing subtype checks.
244-
sb.write(node.parameter.name);
275+
String name = computeName(node.parameter);
276+
usedTypeParameters.add(node.parameter);
277+
sb.write(name);
278+
if (node.promotedBound != null) {
279+
sb.write(" & ");
280+
node.promotedBound.accept1(this, sb);
281+
}
245282
}
246283

247284
@override

0 commit comments

Comments
 (0)