OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 library dart2js.serialization_test; | 5 library dart2js.serialization_test; |
6 | 6 |
7 import 'dart:io'; | 7 import 'dart:io'; |
8 import '../memory_compiler.dart'; | 8 import '../memory_compiler.dart'; |
9 import 'package:async_helper/async_helper.dart'; | 9 import 'package:async_helper/async_helper.dart'; |
10 import 'package:compiler/src/commandline_options.dart'; | 10 import 'package:compiler/src/commandline_options.dart'; |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
128 LibraryElement library1, LibraryElement library2) { | 128 LibraryElement library1, LibraryElement library2) { |
129 checkElementProperties(object1, object2, property, library1, library2); | 129 checkElementProperties(object1, object2, property, library1, library2); |
130 } | 130 } |
131 | 131 |
132 /// Check the equivalence of [element1] and [element2] and their properties. | 132 /// Check the equivalence of [element1] and [element2] and their properties. |
133 /// | 133 /// |
134 /// Uses [object1], [object2] and [property] to provide context for failures. | 134 /// Uses [object1], [object2] and [property] to provide context for failures. |
135 checkElementProperties( | 135 checkElementProperties( |
136 Object object1, object2, String property, | 136 Object object1, object2, String property, |
137 Element element1, Element element2) { | 137 Element element1, Element element2) { |
| 138 currentCheck = |
| 139 new Check(currentCheck, object1, object2, property, element1, element2); |
138 const ElementPropertyEquivalence().visit(element1, element2); | 140 const ElementPropertyEquivalence().visit(element1, element2); |
| 141 currentCheck = currentCheck.parent; |
139 } | 142 } |
140 | 143 |
141 /// Checks the equivalence of [constructor1] and [constructor2]. | 144 /// Checks the equivalence of [constructor1] and [constructor2]. |
142 void constantConstructorEquivalence(ConstantConstructor constructor1, | 145 void constantConstructorEquivalence(ConstantConstructor constructor1, |
143 ConstantConstructor constructor2) { | 146 ConstantConstructor constructor2) { |
144 const ConstantConstructorEquivalence().visit(constructor1, constructor2); | 147 const ConstantConstructorEquivalence().visit(constructor1, constructor2); |
145 } | 148 } |
146 | 149 |
147 /// Visitor that checks the equivalence of [ConstantConstructor]s. | 150 /// Visitor that checks the equivalence of [ConstantConstructor]s. |
148 class ConstantConstructorEquivalence | 151 class ConstantConstructorEquivalence |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 check(element1, element2, 'kind', element1.kind, element2.kind); | 251 check(element1, element2, 'kind', element1.kind, element2.kind); |
249 element1.accept(this, element2); | 252 element1.accept(this, element2); |
250 check(element1, element2, 'isSynthesized', | 253 check(element1, element2, 'isSynthesized', |
251 element1.isSynthesized, element2.isSynthesized); | 254 element1.isSynthesized, element2.isSynthesized); |
252 check(element1, element2, 'isLocal', | 255 check(element1, element2, 'isLocal', |
253 element1.isLocal, element2.isLocal); | 256 element1.isLocal, element2.isLocal); |
254 check(element1, element2, 'isFinal', | 257 check(element1, element2, 'isFinal', |
255 element1.isFinal, element2.isFinal); | 258 element1.isFinal, element2.isFinal); |
256 check(element1, element2, 'isConst', | 259 check(element1, element2, 'isConst', |
257 element1.isConst, element2.isConst); | 260 element1.isConst, element2.isConst); |
| 261 check(element1, element2, 'isAbstract', |
| 262 element1.isAbstract, element2.isAbstract); |
| 263 check(element1, element2, 'isStatic', |
| 264 element1.isStatic, element2.isStatic); |
| 265 check(element1, element2, 'isTopLevel', |
| 266 element1.isTopLevel, element2.isTopLevel); |
| 267 check(element1, element2, 'isClassMember', |
| 268 element1.isClassMember, element2.isClassMember); |
| 269 check(element1, element2, 'isInstanceMember', |
| 270 element1.isInstanceMember, element2.isInstanceMember); |
258 } | 271 } |
259 | 272 |
260 @override | 273 @override |
261 void visitElement(Element e, Element arg) { | 274 void visitElement(Element e, Element arg) { |
262 throw new UnsupportedError("Unsupported element $e"); | 275 throw new UnsupportedError("Unsupported element $e"); |
263 } | 276 } |
264 | 277 |
265 @override | 278 @override |
266 void visitLibraryElement(LibraryElement element1, LibraryElement element2) { | 279 void visitLibraryElement(LibraryElement element1, LibraryElement element2) { |
267 checkElementIdentities(null, null, null, element1, element2); | 280 checkElementIdentities(null, null, null, element1, element2); |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 String message = | 366 String message = |
354 'Missing member for $member1 in\n ${members2.join('\n ')}'; | 367 'Missing member for $member1 in\n ${members2.join('\n ')}'; |
355 if (member1.isAbstractField) { | 368 if (member1.isAbstractField) { |
356 // TODO(johnniwinther): Ensure abstract fields are handled correctly. | 369 // TODO(johnniwinther): Ensure abstract fields are handled correctly. |
357 //print(message); | 370 //print(message); |
358 continue; | 371 continue; |
359 } else { | 372 } else { |
360 throw message; | 373 throw message; |
361 } | 374 } |
362 } | 375 } |
| 376 currentCheck = new Check(currentCheck, element1, element1, |
| 377 'member:$name', member1, member2); |
363 visit(member1, member2); | 378 visit(member1, member2); |
| 379 currentCheck = currentCheck.parent; |
364 } | 380 } |
365 } | 381 } |
366 | 382 |
367 @override | 383 @override |
368 void visitClassElement(ClassElement element1, ClassElement element2) { | 384 void visitClassElement(ClassElement element1, ClassElement element2) { |
369 checkElementIdentities(null, null, null, element1, element2); | 385 checkElementIdentities(null, null, null, element1, element2); |
370 check(element1, element2, 'name', | 386 check(element1, element2, 'name', |
371 element1.name, element2.name); | 387 element1.name, element2.name); |
372 check(element1, element2, 'sourcePosition', | 388 if (!element1.isUnnamedMixinApplication) { |
| 389 check(element1, element2, 'sourcePosition', |
373 element1.sourcePosition, element2.sourcePosition); | 390 element1.sourcePosition, element2.sourcePosition); |
| 391 } else { |
| 392 check(element1, element2, 'sourcePosition.uri', |
| 393 element1.sourcePosition.uri, element2.sourcePosition.uri); |
| 394 } |
374 checkElementIdentities( | 395 checkElementIdentities( |
375 element1, element2, 'library', | 396 element1, element2, 'library', |
376 element1.library, element2.library); | 397 element1.library, element2.library); |
377 checkElementIdentities( | 398 checkElementIdentities( |
378 element1, element2, 'compilationUnit', | 399 element1, element2, 'compilationUnit', |
379 element1.compilationUnit, element2.compilationUnit); | 400 element1.compilationUnit, element2.compilationUnit); |
| 401 checkTypeLists( |
| 402 element1, element2, 'typeVariables', |
| 403 element1.typeVariables, element2.typeVariables); |
| 404 checkTypes( |
| 405 element1, element2, 'thisType', |
| 406 element1.thisType, element2.thisType); |
| 407 checkTypes( |
| 408 element1, element2, 'rawType', |
| 409 element1.rawType, element2.rawType); |
380 check(element1, element2, 'isObject', | 410 check(element1, element2, 'isObject', |
381 element1.isObject, element2.isObject); | 411 element1.isObject, element2.isObject); |
382 checkTypeLists(element1, element2, 'typeVariables', | 412 checkTypeLists(element1, element2, 'typeVariables', |
383 element1.typeVariables, element2.typeVariables); | 413 element1.typeVariables, element2.typeVariables); |
384 check(element1, element2, 'isAbstract', | 414 check(element1, element2, 'isAbstract', |
385 element1.isAbstract, element2.isAbstract); | 415 element1.isAbstract, element2.isAbstract); |
386 check(element1, element2, 'isUnnamedMixinApplication', | 416 check(element1, element2, 'isUnnamedMixinApplication', |
387 element1.isUnnamedMixinApplication, element2.isUnnamedMixinApplication); | 417 element1.isUnnamedMixinApplication, element2.isUnnamedMixinApplication); |
388 check(element1, element2, 'isEnumClass', | 418 check(element1, element2, 'isEnumClass', |
389 element1.isEnumClass, element2.isEnumClass); | 419 element1.isEnumClass, element2.isEnumClass); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 List<ConstructorElement> getConstructors(ClassElement cls) { | 459 List<ConstructorElement> getConstructors(ClassElement cls) { |
430 return cls.implementation.constructors.map((c) => c.declaration).toList(); | 460 return cls.implementation.constructors.map((c) => c.declaration).toList(); |
431 } | 461 } |
432 | 462 |
433 checkElementLists( | 463 checkElementLists( |
434 element1, element2, 'constructors', | 464 element1, element2, 'constructors', |
435 getConstructors(element1), | 465 getConstructors(element1), |
436 getConstructors(element2)); | 466 getConstructors(element2)); |
437 | 467 |
438 visitMembers(element1, element2); | 468 visitMembers(element1, element2); |
| 469 |
| 470 ClassElement superclass1 = element1.superclass; |
| 471 ClassElement superclass2 = element2.superclass; |
| 472 while (superclass1 != null && superclass1.isMixinApplication) { |
| 473 checkElementProperties(element1, element2, 'supermixin', |
| 474 superclass1, superclass2); |
| 475 superclass1 = superclass1.superclass; |
| 476 superclass2 = superclass2.superclass; |
| 477 } |
439 } | 478 } |
440 | 479 |
441 @override | 480 @override |
442 void visitFieldElement(FieldElement element1, FieldElement element2) { | 481 void visitFieldElement(FieldElement element1, FieldElement element2) { |
443 checkElementIdentities(null, null, null, element1, element2); | 482 checkElementIdentities(null, null, null, element1, element2); |
444 check(element1, element2, 'name', | 483 check(element1, element2, 'name', |
445 element1.name, element2.name); | 484 element1.name, element2.name); |
446 check(element1, element2, 'sourcePosition', | 485 check(element1, element2, 'sourcePosition', |
447 element1.sourcePosition, element2.sourcePosition); | 486 element1.sourcePosition, element2.sourcePosition); |
448 checkTypes( | 487 checkTypes( |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 @override | 582 @override |
544 void visitConstructorElement(ConstructorElement element1, | 583 void visitConstructorElement(ConstructorElement element1, |
545 ConstructorElement element2) { | 584 ConstructorElement element2) { |
546 checkElementIdentities(null, null, null, element1, element2); | 585 checkElementIdentities(null, null, null, element1, element2); |
547 checkElementIdentities( | 586 checkElementIdentities( |
548 element1, element2, 'enclosingClass', | 587 element1, element2, 'enclosingClass', |
549 element1.enclosingClass, element2.enclosingClass); | 588 element1.enclosingClass, element2.enclosingClass); |
550 check( | 589 check( |
551 element1, element2, 'name', | 590 element1, element2, 'name', |
552 element1.name, element2.name); | 591 element1.name, element2.name); |
553 check(element1, element2, 'sourcePosition', | 592 if (!element1.isSynthesized) { |
| 593 check(element1, element2, 'sourcePosition', |
554 element1.sourcePosition, element2.sourcePosition); | 594 element1.sourcePosition, element2.sourcePosition); |
| 595 } else { |
| 596 check(element1, element2, 'sourcePosition.uri', |
| 597 element1.sourcePosition.uri, element2.sourcePosition.uri); |
| 598 } |
555 checkListEquivalence( | 599 checkListEquivalence( |
556 element1, element2, 'parameters', | 600 element1, element2, 'parameters', |
557 element1.parameters, element2.parameters, | 601 element1.parameters, element2.parameters, |
558 checkElementProperties); | 602 checkElementProperties); |
559 checkTypes( | 603 checkTypes( |
560 element1, element2, 'type', | 604 element1, element2, 'type', |
561 element1.type, element2.type); | 605 element1.type, element2.type); |
562 check(element1, element2, 'isExternal', | 606 check(element1, element2, 'isExternal', |
563 element1.isExternal, element2.isExternal); | 607 element1.isExternal, element2.isExternal); |
564 if (element1.isConst && !element1.isExternal) { | 608 if (element1.isConst && !element1.isExternal) { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 void visitPrefixElement(PrefixElement element1, PrefixElement element2) { | 745 void visitPrefixElement(PrefixElement element1, PrefixElement element2) { |
702 check( | 746 check( |
703 element1, element2, 'isDeferred', | 747 element1, element2, 'isDeferred', |
704 element1.isDeferred, element2.isDeferred); | 748 element1.isDeferred, element2.isDeferred); |
705 checkElementIdentities( | 749 checkElementIdentities( |
706 element1, element2, 'importedLibrary', | 750 element1, element2, 'importedLibrary', |
707 element1.deferredImport, element2.deferredImport); | 751 element1.deferredImport, element2.deferredImport); |
708 // TODO(johnniwinther): Check members. | 752 // TODO(johnniwinther): Check members. |
709 } | 753 } |
710 } | 754 } |
OLD | NEW |