Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: tests/compiler/dart2js/kernel/closed_world2_test.dart

Issue 2845093003: Handle mixed in members (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 // Partial test that the closed world computed from [WorldImpact]s derived from 5 // Partial test that the closed world computed from [WorldImpact]s derived from
6 // kernel is equivalent to the original computed from resolution. 6 // kernel is equivalent to the original computed from resolution.
7 library dart2js.kernel.closed_world2_test; 7 library dart2js.kernel.closed_world2_test;
8 8
9 import 'dart:async'; 9 import 'dart:async';
10 10
11 import 'package:async_helper/async_helper.dart'; 11 import 'package:async_helper/async_helper.dart';
12 import 'package:compiler/src/commandline_options.dart'; 12 import 'package:compiler/src/commandline_options.dart';
13 import 'package:compiler/src/common.dart'; 13 import 'package:compiler/src/common.dart';
14 import 'package:compiler/src/common_elements.dart'; 14 import 'package:compiler/src/common_elements.dart';
15 import 'package:compiler/src/common/backend_api.dart'; 15 import 'package:compiler/src/common/backend_api.dart';
16 import 'package:compiler/src/common/tasks.dart'; 16 import 'package:compiler/src/common/tasks.dart';
17 import 'package:compiler/src/compiler.dart'; 17 import 'package:compiler/src/compiler.dart';
18 import 'package:compiler/src/deferred_load.dart'; 18 import 'package:compiler/src/deferred_load.dart';
19 import 'package:compiler/src/elements/entities.dart';
19 import 'package:compiler/src/elements/resolution_types.dart'; 20 import 'package:compiler/src/elements/resolution_types.dart';
20 import 'package:compiler/src/elements/types.dart'; 21 import 'package:compiler/src/elements/types.dart';
21 import 'package:compiler/src/enqueue.dart'; 22 import 'package:compiler/src/enqueue.dart';
22 import 'package:compiler/src/js_backend/backend.dart' 23 import 'package:compiler/src/js_backend/backend.dart'
23 hide RuntimeTypesNeedBuilderImpl; 24 hide RuntimeTypesNeedBuilderImpl;
24 import 'package:compiler/src/js_backend/backend_impact.dart'; 25 import 'package:compiler/src/js_backend/backend_impact.dart';
25 import 'package:compiler/src/js_backend/backend_usage.dart'; 26 import 'package:compiler/src/js_backend/backend_usage.dart';
26 import 'package:compiler/src/js_backend/custom_elements_analysis.dart'; 27 import 'package:compiler/src/js_backend/custom_elements_analysis.dart';
27 import 'package:compiler/src/js_backend/native_data.dart'; 28 import 'package:compiler/src/js_backend/native_data.dart';
28 import 'package:compiler/src/js_backend/impact_transformer.dart'; 29 import 'package:compiler/src/js_backend/impact_transformer.dart';
(...skipping 25 matching lines...) Expand all
54 55
55 const SOURCE = const { 56 const SOURCE = const {
56 'main.dart': ''' 57 'main.dart': '''
57 import 'dart:html'; 58 import 'dart:html';
58 import 'package:expect/expect.dart'; 59 import 'package:expect/expect.dart';
59 60
60 class ClassWithSetter { 61 class ClassWithSetter {
61 void set setter(_) {} 62 void set setter(_) {}
62 } 63 }
63 64
65 class Mixin {
66 method1() {}
67 method2() {}
68 method3() {}
69 }
70 class Class1 = Object with Mixin;
71 class Class2 extends Object with Mixin {
72 method3() {}
73 }
74
75
64 @NoInline() 76 @NoInline()
65 main() { 77 main() {
66 print('Hello World'); 78 print('Hello World');
67 ''.contains; // Trigger member closurization. 79 ''.contains; // Trigger member closurization.
68 new Element.div(); 80 new Element.div();
69 new ClassWithSetter().setter = null; 81 new ClassWithSetter().setter = null;
82 new Class1().method1();
83 new Class2().method2();
84 new Class2().method3();
70 } 85 }
71 ''' 86 '''
72 }; 87 };
73 88
74 main(List<String> args) { 89 main(List<String> args) {
75 asyncTest(() async { 90 asyncTest(() async {
76 await mainInternal(args); 91 await mainInternal(args);
77 }); 92 });
78 } 93 }
79 94
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 BackendUsage backendUsage1 = compiler1.backend.backendUsage; 130 BackendUsage backendUsage1 = compiler1.backend.backendUsage;
116 ClosedWorld closedWorld1 = compiler1.resolutionWorldBuilder.closeWorld(); 131 ClosedWorld closedWorld1 = compiler1.resolutionWorldBuilder.closeWorld();
117 132
118 print('---- analyze-all -------------------------------------------------'); 133 print('---- analyze-all -------------------------------------------------');
119 Compiler compiler = compilerFor( 134 Compiler compiler = compilerFor(
120 entryPoint: entryPoint, 135 entryPoint: entryPoint,
121 memorySourceFiles: memorySourceFiles, 136 memorySourceFiles: memorySourceFiles,
122 options: [Flags.analyzeAll, Flags.useKernel, Flags.enableAssertMessage]); 137 options: [Flags.analyzeAll, Flags.useKernel, Flags.enableAssertMessage]);
123 await compiler.run(entryPoint); 138 await compiler.run(entryPoint);
124 compiler.resolutionWorldBuilder.closeWorld(); 139 compiler.resolutionWorldBuilder.closeWorld();
140 ElementEnvironment environment1 = compiler.elementEnvironment;
125 141
126 print('---- closed world from kernel ------------------------------------'); 142 print('---- closed world from kernel ------------------------------------');
127 Compiler compiler2 = compilerFor( 143 Compiler compiler2 = compilerFor(
128 entryPoint: entryPoint, 144 entryPoint: entryPoint,
129 memorySourceFiles: memorySourceFiles, 145 memorySourceFiles: memorySourceFiles,
130 options: [ 146 options: [
131 Flags.analyzeOnly, 147 Flags.analyzeOnly,
132 Flags.enableAssertMessage, 148 Flags.enableAssertMessage,
133 Flags.loadFromDill 149 Flags.loadFromDill
134 ]); 150 ]);
135 ElementResolutionWorldBuilder.useInstantiationMap = true; 151 ElementResolutionWorldBuilder.useInstantiationMap = true;
136 compiler2.resolution.retainCachesForTesting = true; 152 compiler2.resolution.retainCachesForTesting = true;
137 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy; 153 KernelFrontEndStrategy frontEndStrategy = compiler2.frontEndStrategy;
138 KernelToElementMap elementMap = frontEndStrategy.elementMap; 154 KernelToElementMap elementMap = frontEndStrategy.elementMap;
139 compiler2.libraryLoader = new MemoryDillLibraryLoaderTask( 155 compiler2.libraryLoader = new MemoryDillLibraryLoaderTask(
140 elementMap, 156 elementMap,
141 compiler2.reporter, 157 compiler2.reporter,
142 compiler2.measurer, 158 compiler2.measurer,
143 compiler.backend.kernelTask.program); 159 compiler.backend.kernelTask.program);
144 await compiler2.run(entryPoint); 160 await compiler2.run(entryPoint);
145 Expect.isFalse(compiler2.compilationFailed); 161 Expect.isFalse(compiler2.compilationFailed);
162
163 KernelEquivalence equivalence = new KernelEquivalence(elementMap);
164
165 ElementEnvironment environment2 = compiler2.elementEnvironment;
166 checkElementEnvironment(environment1, environment2, equivalence);
167
146 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution; 168 ResolutionEnqueuer enqueuer2 = compiler2.enqueuer.resolution;
147 BackendUsage backendUsage2 = compiler2.backend.backendUsage; 169 BackendUsage backendUsage2 = compiler2.backend.backendUsage;
148 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld(); 170 ClosedWorld closedWorld2 = compiler2.resolutionWorldBuilder.closeWorld();
149 KernelEquivalence equivalence = new KernelEquivalence(elementMap);
150 checkBackendUsage(backendUsage1, backendUsage2, equivalence); 171 checkBackendUsage(backendUsage1, backendUsage2, equivalence);
151 172
152 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2, 173 checkResolutionEnqueuers(backendUsage1, backendUsage2, enqueuer1, enqueuer2,
153 elementEquivalence: equivalence.entityEquivalence, 174 elementEquivalence: equivalence.entityEquivalence,
154 typeEquivalence: (ResolutionDartType a, DartType b) { 175 typeEquivalence: (ResolutionDartType a, DartType b) {
155 return equivalence.typeEquivalence(unalias(a), b); 176 return equivalence.typeEquivalence(unalias(a), b);
156 }, elementFilter: elementFilter, verbose: arguments.verbose); 177 }, elementFilter: elementFilter, verbose: arguments.verbose);
157 178
158 checkClosedWorlds(closedWorld1, closedWorld2, equivalence.entityEquivalence, 179 checkClosedWorlds(closedWorld1, closedWorld2, equivalence.entityEquivalence,
159 verbose: arguments.verbose); 180 verbose: arguments.verbose);
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed, 308 check(usage1, usage2, 'isRuntimeTypeUsed', usage1.isRuntimeTypeUsed,
288 usage2.isRuntimeTypeUsed); 309 usage2.isRuntimeTypeUsed);
289 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse, 310 check(usage1, usage2, 'isIsolateInUse', usage1.isIsolateInUse,
290 usage2.isIsolateInUse); 311 usage2.isIsolateInUse);
291 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed, 312 check(usage1, usage2, 'isFunctionApplyUsed', usage1.isFunctionApplyUsed,
292 usage2.isFunctionApplyUsed); 313 usage2.isFunctionApplyUsed);
293 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed, 314 check(usage1, usage2, 'isNoSuchMethodUsed', usage1.isNoSuchMethodUsed,
294 usage2.isNoSuchMethodUsed); 315 usage2.isNoSuchMethodUsed);
295 } 316 }
296 317
318 checkElementEnvironment(ElementEnvironment env1, ElementEnvironment env2,
319 KernelEquivalence equivalence) {
320 checkSetEquivalence(env1, env2, 'libraries', env1.libraries, env2.libraries,
321 equivalence.entityEquivalence,
322 onSameElement: (LibraryEntity lib1, LibraryEntity lib2) {
323 List<ClassEntity> classes2 = <ClassEntity>[];
324 env1.forEachClass(lib1, (ClassEntity cls1) {
325 String className = cls1.name;
326 ClassEntity cls2 = env2.lookupClass(lib2, className);
327 Expect.isNotNull(cls2, 'Missing class $className in $lib2');
328 check(lib1, lib2, 'class:${className}', cls1, cls2,
329 equivalence.entityEquivalence);
330
331 check(cls1, cls2, 'superclass', env1.getSuperClass(cls1),
332 env2.getSuperClass(cls2), equivalence.entityEquivalence);
333
334 Map<MemberEntity, ClassEntity> members1 = <MemberEntity, ClassEntity>{};
335 Map<MemberEntity, ClassEntity> members2 = <MemberEntity, ClassEntity>{};
336 env1.forEachClassMember(cls1,
337 (ClassEntity declarer1, MemberEntity member1) {
338 members1[member1] = declarer1;
339 });
340 env1.forEachClassMember(cls1,
341 (ClassEntity declarer2, MemberEntity member2) {
342 members2[member2] = declarer2;
343 });
344 checkMapEquivalence(cls1, cls2, 'members', members1, members2,
345 equivalence.entityEquivalence, equivalence.entityEquivalence);
346
347 classes2.add(cls2);
348 });
349 env2.forEachClass(lib2, (ClassEntity cls2) {
350 Expect.isTrue(classes2.contains(cls2), "Extra class $cls2 in $lib2");
351 });
352 });
353
354 // TODO(johnniwinther): Test the remaining properties of [ElementEnvironment].
355 }
356
297 class MemoryDillLibraryLoaderTask extends DillLibraryLoaderTask { 357 class MemoryDillLibraryLoaderTask extends DillLibraryLoaderTask {
298 final ir.Program program; 358 final ir.Program program;
299 359
300 MemoryDillLibraryLoaderTask(KernelToElementMap elementMap, 360 MemoryDillLibraryLoaderTask(KernelToElementMap elementMap,
301 DiagnosticReporter reporter, Measurer measurer, this.program) 361 DiagnosticReporter reporter, Measurer measurer, this.program)
302 : super(elementMap, null, null, reporter, measurer); 362 : super(elementMap, null, null, reporter, measurer);
303 363
304 Future<LoadedLibraries> loadLibrary(Uri resolvedUri, 364 Future<LoadedLibraries> loadLibrary(Uri resolvedUri,
305 {bool skipFileWithPartOfTag: false}) async { 365 {bool skipFileWithPartOfTag: false}) async {
306 return createLoadedLibraries(program); 366 return createLoadedLibraries(program);
307 } 367 }
308 } 368 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/kernel/element_map.dart ('k') | tests/compiler/dart2js/serialization/model_test_helper.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698