Skip to content

Commit 8038eca

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Generate equivalence visitor
+ use it to allow discrepancy in incremental_dart2js_load_from_dill_test Change-Id: I0adad30af1e502d81e870b26eb63a03b70e42333 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/205796 Reviewed-by: Dmitry Stefantsov <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 1e0a1d9 commit 8038eca

19 files changed

+10789
-48
lines changed

pkg/compiler/lib/src/ir/closure.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,11 @@ class TypeVariableTypeWithContext implements ir.Node {
398398
throw new UnsupportedError('TypeVariableTypeWithContext.accept');
399399
}
400400

401+
@override
402+
R accept1<R, A>(ir.Visitor1<R, A> v, A arg) {
403+
throw new UnsupportedError('TypeVariableTypeWithContext.accept1');
404+
}
405+
401406
@override
402407
visitChildren(ir.Visitor v) {
403408
throw new UnsupportedError('TypeVariableTypeWithContext.visitChildren');

pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,8 +1315,7 @@ class ConstantEvaluator implements ExpressionVisitor<Constant> {
13151315
} else {
13161316
bool sentinelInserted = false;
13171317
if (nodeCache.containsKey(node)) {
1318-
bool isRecursiveFunctionCall =
1319-
node is InstanceInvocation ||
1318+
bool isRecursiveFunctionCall = node is InstanceInvocation ||
13201319
node is FunctionInvocation ||
13211320
node is LocalFunctionInvocation ||
13221321
node is StaticInvocation;
@@ -4200,11 +4199,21 @@ class FunctionValue implements Constant {
42004199
throw new UnimplementedError();
42014200
}
42024201

4202+
@override
4203+
R accept1<R, A>(ConstantVisitor1<R, A> v, A arg) {
4204+
throw new UnimplementedError();
4205+
}
4206+
42034207
@override
42044208
R acceptReference<R>(Visitor<R> v) {
42054209
throw new UnimplementedError();
42064210
}
42074211

4212+
@override
4213+
R acceptReference1<R, A>(Visitor1<R, A> v, A arg) {
4214+
throw new UnimplementedError();
4215+
}
4216+
42084217
@override
42094218
Expression asExpression() {
42104219
throw new UnimplementedError();
@@ -4260,11 +4269,21 @@ class _AbortDueToErrorConstant extends AbortConstant {
42604269
throw new UnimplementedError();
42614270
}
42624271

4272+
@override
4273+
R accept1<R, A>(ConstantVisitor1<R, A> v, A arg) {
4274+
throw new UnimplementedError();
4275+
}
4276+
42634277
@override
42644278
R acceptReference<R>(Visitor<R> v) {
42654279
throw new UnimplementedError();
42664280
}
42674281

4282+
@override
4283+
R acceptReference1<R, A>(Visitor1<R, A> v, A arg) {
4284+
throw new UnimplementedError();
4285+
}
4286+
42684287
@override
42694288
Expression asExpression() {
42704289
throw new UnimplementedError();
@@ -4317,11 +4336,21 @@ class _AbortDueToInvalidExpressionConstant extends AbortConstant {
43174336
throw new UnimplementedError();
43184337
}
43194338

4339+
@override
4340+
R accept1<R, A>(ConstantVisitor1<R, A> v, A arg) {
4341+
throw new UnimplementedError();
4342+
}
4343+
43204344
@override
43214345
R acceptReference<R>(Visitor<R> v) {
43224346
throw new UnimplementedError();
43234347
}
43244348

4349+
@override
4350+
R acceptReference1<R, A>(Visitor1<R, A> v, A arg) {
4351+
throw new UnimplementedError();
4352+
}
4353+
43254354
@override
43264355
Expression asExpression() {
43274356
throw new UnimplementedError();
@@ -4374,11 +4403,21 @@ class _AbortDueToThrowConstant extends AbortConstant {
43744403
throw new UnimplementedError();
43754404
}
43764405

4406+
@override
4407+
R accept1<R, A>(ConstantVisitor1<R, A> v, A arg) {
4408+
throw new UnimplementedError();
4409+
}
4410+
43774411
@override
43784412
R acceptReference<R>(Visitor<R> v) {
43794413
throw new UnimplementedError();
43804414
}
43814415

4416+
@override
4417+
R acceptReference1<R, A>(Visitor1<R, A> v, A arg) {
4418+
throw new UnimplementedError();
4419+
}
4420+
43824421
@override
43834422
Expression asExpression() {
43844423
throw new UnimplementedError();

pkg/front_end/test/generated_files_up_to_date_git_test.dart

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,18 @@ import "../tool/_fasta/direct_parser_ast_helper_creator.dart"
1313
as generateDirectParserAstHelper;
1414
import "parser_test_listener_creator.dart" as generateParserTestListener;
1515
import "parser_test_parser_creator.dart" as generateParserTestParser;
16+
import '../tool/generate_ast_equivalence.dart' as generateAstEquivalence;
1617
import 'utils/io_utils.dart' show computeRepoDirUri;
1718

1819
final Uri repoDir = computeRepoDirUri();
1920

20-
main() {
21+
main() async {
2122
messages();
2223
experimentalFlags();
2324
directParserAstHelper();
2425
parserTestListener();
2526
parserTestParser();
27+
await astEquivalence();
2628
}
2729

2830
void parserTestParser() {
@@ -48,6 +50,14 @@ void directParserAstHelper() {
4850
"dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart");
4951
}
5052

53+
Future<void> astEquivalence() async {
54+
Uri generatedFile = generateAstEquivalence.computeEquivalenceUri(repoDir);
55+
String generated =
56+
await generateAstEquivalence.generateAstEquivalence(repoDir);
57+
check(generated, generatedFile,
58+
"dart pkg/front_end/tool/generate_ast_equivalence.dart");
59+
}
60+
5161
void experimentalFlags() {
5262
{
5363
Uri generatedFile =

pkg/front_end/test/incremental_dart2js_load_from_dill_test.dart

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ import 'package:front_end/src/compute_platform_binaries_location.dart'
1313

1414
import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
1515

16-
import 'package:kernel/kernel.dart' show Component;
16+
import 'package:kernel/ast.dart';
17+
import 'package:kernel/src/equivalence.dart';
1718
import 'package:kernel/target/targets.dart';
1819

1920
import 'incremental_suite.dart'
@@ -93,7 +94,19 @@ Future<void> testDart2jsCompile() async {
9394
List<int> normalDillData = new File.fromUri(normalDill).readAsBytesSync();
9495
List<int> initializedDillData =
9596
new File.fromUri(fullDillFromInitialized).readAsBytesSync();
96-
checkIsEqual(normalDillData, initializedDillData);
97+
98+
Component component1 = new Component();
99+
new BinaryBuilder(normalDillData).readComponent(component1);
100+
101+
Component component2 = new Component();
102+
new BinaryBuilder(initializedDillData).readComponent(component2);
103+
EquivalenceResult result =
104+
checkEquivalence(component1, component2, strategy: const Strategy());
105+
Expect.isTrue(result.isEquivalent, result.toString());
106+
107+
// TODO(johnniwinther): Reenable this check when the discrepancies have been
108+
// fixed.
109+
//checkIsEqual(normalDillData, initializedDillData);
97110

98111
// Also try without invalidating anything.
99112
stopwatch.reset();
@@ -110,3 +123,49 @@ Future<void> testDart2jsCompile() async {
110123
checkIsEqual(normalDillData, initializedDillData);
111124
}
112125
}
126+
127+
class Strategy extends EquivalenceStrategy {
128+
const Strategy();
129+
130+
@override
131+
bool checkClass_procedures(
132+
EquivalenceVisitor visitor, Class node, Class other) {
133+
// Check procedures as a set instead of a list to allow for reordering.
134+
return visitor.checkSets(node.procedures.toSet(), other.procedures.toSet(),
135+
visitor.matchNamedNodes, visitor.checkNodes, 'procedures');
136+
}
137+
138+
bool _isMixinOrCloneReference(EquivalenceVisitor visitor, Reference a,
139+
Reference b, String propertyName) {
140+
if (a != null && b != null) {
141+
ReferenceName thisName = ReferenceName.fromReference(a);
142+
ReferenceName otherName = ReferenceName.fromReference(b);
143+
if (thisName.kind == ReferenceNameKind.Member &&
144+
otherName.kind == ReferenceNameKind.Member &&
145+
thisName.memberName == otherName.memberName) {
146+
String thisClassName = thisName.declarationName;
147+
String otherClassName = otherName.declarationName;
148+
if (thisClassName != null &&
149+
otherClassName != null &&
150+
thisClassName.contains('&${otherClassName}')) {
151+
visitor.assumeReferences(a, b);
152+
}
153+
}
154+
}
155+
return visitor.checkReferences(a, b, propertyName);
156+
}
157+
158+
@override
159+
bool checkProcedure_stubTargetReference(
160+
EquivalenceVisitor visitor, Procedure node, Procedure other) {
161+
return _isMixinOrCloneReference(visitor, node.stubTargetReference,
162+
other.stubTargetReference, 'stubTargetReference');
163+
}
164+
165+
@override
166+
bool checkInstanceGet_interfaceTargetReference(
167+
EquivalenceVisitor visitor, InstanceGet node, InstanceGet other) {
168+
return _isMixinOrCloneReference(visitor, node.interfaceTargetReference,
169+
other.interfaceTargetReference, 'interfaceTargetReference');
170+
}
171+
}

pkg/front_end/test/spell_checking_list_code.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ asgerf
6262
askesc
6363
aspect
6464
aspx
65+
asserting
6566
assigning
6667
assigns
6768
association
@@ -389,12 +390,14 @@ enforce
389390
enforced
390391
enforces
391392
enforcing
393+
enters
392394
engineered
393395
enumerates
394396
env
395397
eof
396398
eq
397399
equation
400+
equivalences
398401
erased
399402
erasure
400403
es
@@ -581,6 +584,9 @@ indexing
581584
indirection
582585
individual
583586
inequality
587+
inequivalence
588+
inequivalences
589+
inequivalent
584590
influence
585591
informative
586592
infos
@@ -605,6 +611,7 @@ int64
605611
int8
606612
integrate
607613
intentionally
614+
interested
608615
interim
609616
interior
610617
interleaved
@@ -787,6 +794,7 @@ nj
787794
nk
788795
nnbd
789796
node's
797+
nominality
790798
nonimplementation
791799
norm
792800
normalization
@@ -1065,6 +1073,7 @@ rpc
10651073
rs
10661074
runnable
10671075
s
1076+
sand
10681077
sanitizing
10691078
saw
10701079
say
@@ -1110,6 +1119,7 @@ sibling
11101119
siblings
11111120
sides
11121121
sigmund
1122+
signaling
11131123
significant
11141124
simplify
11151125
singleton
@@ -1208,6 +1218,7 @@ svg
12081218
sw
12091219
swapped
12101220
sweep
1221+
symbolic
12111222
synchronously
12121223
syncs
12131224
synth
@@ -1417,6 +1428,7 @@ widgets
14171428
wiki
14181429
wikipedia
14191430
wind
1431+
wise
14201432
wiser
14211433
with1
14221434
wn

0 commit comments

Comments
 (0)