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

Side by Side Diff: pkg/compiler/lib/src/resolution/resolution_strategy.dart

Issue 2944843002: All strong mode cleaning of dart2js. (Closed)
Patch Set: More issues discovered during testing. Created 3 years, 6 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 library dart2js.resolution_strategy; 5 library dart2js.resolution_strategy;
6 6
7 import 'package:front_end/src/fasta/scanner.dart' show Token; 7 import 'package:front_end/src/fasta/scanner.dart' show Token;
8 8
9 import '../common.dart'; 9 import '../common.dart';
10 import '../common_elements.dart'; 10 import '../common_elements.dart';
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 } 135 }
136 136
137 WorkItemBuilder createResolutionWorkItemBuilder( 137 WorkItemBuilder createResolutionWorkItemBuilder(
138 NativeBasicData nativeBasicData, 138 NativeBasicData nativeBasicData,
139 NativeDataBuilder nativeDataBuilder, 139 NativeDataBuilder nativeDataBuilder,
140 ImpactTransformer impactTransformer) { 140 ImpactTransformer impactTransformer) {
141 return new ResolutionWorkItemBuilder(_compiler.resolution); 141 return new ResolutionWorkItemBuilder(_compiler.resolution);
142 } 142 }
143 143
144 FunctionEntity computeMain( 144 FunctionEntity computeMain(
145 LibraryElement mainApp, WorldImpactBuilder impactBuilder) { 145 covariant LibraryElement mainApp, WorldImpactBuilder impactBuilder) {
146 _elementEnvironment._mainLibrary = mainApp; 146 _elementEnvironment._mainLibrary = mainApp;
147 if (mainApp == null) return null; 147 if (mainApp == null) return null;
148 MethodElement mainFunction; 148 MethodElement mainFunction;
149 Element main = mainApp.findExported(Identifiers.main); 149 Element main = mainApp.findExported(Identifiers.main);
150 ErroneousElement errorElement = null; 150 ErroneousElement errorElement = null;
151 if (main == null) { 151 if (main == null) {
152 if (_compiler.options.analyzeOnly) { 152 if (_compiler.options.analyzeOnly) {
153 if (!_compiler.analyzeAll) { 153 if (!_compiler.analyzeAll) {
154 errorElement = new ErroneousElementX(MessageKind.CONSIDER_ANALYZE_ALL, 154 errorElement = new ErroneousElementX(MessageKind.CONSIDER_ANALYZE_ALL,
155 {'main': Identifiers.main}, Identifiers.main, mainApp); 155 {'main': Identifiers.main}, Identifiers.main, mainApp);
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 @override 387 @override
388 LibraryEntity get mainLibrary => _mainLibrary; 388 LibraryEntity get mainLibrary => _mainLibrary;
389 389
390 @override 390 @override
391 FunctionEntity get mainFunction => _mainFunction; 391 FunctionEntity get mainFunction => _mainFunction;
392 392
393 @override 393 @override
394 Iterable<LibraryEntity> get libraries => _compiler.libraryLoader.libraries; 394 Iterable<LibraryEntity> get libraries => _compiler.libraryLoader.libraries;
395 395
396 @override 396 @override
397 String getLibraryName(LibraryElement library) => library.libraryName; 397 String getLibraryName(covariant LibraryElement library) =>
398 library.libraryName;
398 399
399 @override 400 @override
400 ResolutionInterfaceType getThisType(ClassElement cls) { 401 ResolutionInterfaceType getThisType(covariant ClassElement cls) {
401 cls.ensureResolved(_resolution); 402 cls.ensureResolved(_resolution);
402 return cls.thisType; 403 return cls.thisType;
403 } 404 }
404 405
405 @override 406 @override
406 ResolutionInterfaceType getRawType(ClassElement cls) { 407 ResolutionInterfaceType getRawType(covariant ClassElement cls) {
407 cls.ensureResolved(_resolution); 408 cls.ensureResolved(_resolution);
408 return cls.rawType; 409 return cls.rawType;
409 } 410 }
410 411
411 @override 412 @override
412 bool isGenericClass(ClassEntity cls) { 413 bool isGenericClass(ClassEntity cls) {
413 return getThisType(cls).typeArguments.isNotEmpty; 414 return getThisType(cls).typeArguments.isNotEmpty;
414 } 415 }
415 416
416 @override 417 @override
417 bool isMixinApplication(ClassElement cls) { 418 bool isMixinApplication(covariant ClassElement cls) {
418 return cls.isMixinApplication; 419 return cls.isMixinApplication;
419 } 420 }
420 421
421 @override 422 @override
422 bool isUnnamedMixinApplication(ClassElement cls) { 423 bool isUnnamedMixinApplication(covariant ClassElement cls) {
423 return cls.isUnnamedMixinApplication; 424 return cls.isUnnamedMixinApplication;
424 } 425 }
425 426
426 @override 427 @override
427 ClassEntity getEffectiveMixinClass(ClassElement cls) { 428 ClassEntity getEffectiveMixinClass(covariant ClassElement cls) {
428 if (!cls.isMixinApplication) return null; 429 if (!cls.isMixinApplication) return null;
429 do { 430 do {
430 MixinApplicationElement mixinApplication = cls; 431 MixinApplicationElement mixinApplication = cls;
431 cls = mixinApplication.mixin; 432 cls = mixinApplication.mixin;
432 } while (cls.isMixinApplication); 433 } while (cls.isMixinApplication);
433 return cls; 434 return cls;
434 } 435 }
435 436
436 @override 437 @override
437 ResolutionDartType getTypeVariableBound(TypeVariableElement typeVariable) { 438 ResolutionDartType getTypeVariableBound(
439 covariant TypeVariableElement typeVariable) {
438 return typeVariable.bound; 440 return typeVariable.bound;
439 } 441 }
440 442
441 @override 443 @override
442 ResolutionInterfaceType createInterfaceType( 444 ResolutionInterfaceType createInterfaceType(covariant ClassElement cls,
443 ClassElement cls, List<ResolutionDartType> typeArguments) { 445 covariant List<ResolutionDartType> typeArguments) {
444 cls.ensureResolved(_resolution); 446 cls.ensureResolved(_resolution);
445 return cls.thisType.createInstantiation(typeArguments); 447 return cls.thisType.createInstantiation(typeArguments);
446 } 448 }
447 449
448 @override 450 @override
449 MemberElement lookupClassMember(ClassElement cls, String name, 451 MemberElement lookupClassMember(covariant ClassElement cls, String name,
450 {bool setter: false, bool required: false}) { 452 {bool setter: false, bool required: false}) {
451 cls.ensureResolved(_resolution); 453 cls.ensureResolved(_resolution);
452 Element member = cls.implementation.lookupLocalMember(name); 454 Element member = cls.implementation.lookupLocalMember(name);
453 if (member != null && member.isAbstractField) { 455 if (member != null && member.isAbstractField) {
454 AbstractFieldElement abstractField = member; 456 AbstractFieldElement abstractField = member;
455 if (setter) { 457 if (setter) {
456 member = abstractField.setter; 458 member = abstractField.setter;
457 } else { 459 } else {
458 member = abstractField.getter; 460 member = abstractField.getter;
459 } 461 }
460 if (member == null && required) { 462 if (member == null && required) {
461 throw new SpannableAssertionFailure( 463 throw new SpannableAssertionFailure(
462 cls, 464 cls,
463 "The class '${cls.name}' does not contain required " 465 "The class '${cls.name}' does not contain required "
464 "${setter ? 'setter' : 'getter'}: '$name'."); 466 "${setter ? 'setter' : 'getter'}: '$name'.");
465 } 467 }
466 } 468 }
467 if (member == null && required) { 469 if (member == null && required) {
468 throw new SpannableAssertionFailure( 470 throw new SpannableAssertionFailure(
469 cls, 471 cls,
470 "The class '${cls.name}' does not " 472 "The class '${cls.name}' does not "
471 "contain required member: '$name'."); 473 "contain required member: '$name'.");
472 } 474 }
473 return member?.declaration; 475 return member?.declaration;
474 } 476 }
475 477
476 @override 478 @override
477 ConstructorElement lookupConstructor(ClassElement cls, String name, 479 ConstructorElement lookupConstructor(covariant ClassElement cls, String name,
478 {bool required: false}) { 480 {bool required: false}) {
479 cls.ensureResolved(_resolution); 481 cls.ensureResolved(_resolution);
480 ConstructorElement constructor = cls.implementation.lookupConstructor(name); 482 ConstructorElement constructor = cls.implementation.lookupConstructor(name);
481 // TODO(johnniwinther): Skip redirecting factories. 483 // TODO(johnniwinther): Skip redirecting factories.
482 if (constructor == null && required) { 484 if (constructor == null && required) {
483 throw new SpannableAssertionFailure( 485 throw new SpannableAssertionFailure(
484 cls, 486 cls,
485 "The class '${cls.name}' does not contain " 487 "The class '${cls.name}' does not contain "
486 "required constructor: '$name'."); 488 "required constructor: '$name'.");
487 } 489 }
488 return constructor?.declaration; 490 return constructor?.declaration;
489 } 491 }
490 492
491 @override 493 @override
492 void forEachClassMember( 494 void forEachClassMember(covariant ClassElement cls,
493 ClassElement cls, void f(ClassElement declarer, MemberElement member)) { 495 void f(ClassElement declarer, MemberElement member)) {
494 cls.ensureResolved(_resolution); 496 cls.ensureResolved(_resolution);
495 cls.forEachMember((ClassElement declarer, _member) { 497 cls.forEachMember((ClassElement declarer, _member) {
496 MemberElement member = _member; 498 MemberElement member = _member;
497 if (member.isSynthesized) return; 499 if (member.isSynthesized) return;
498 if (member.isMalformed) return; 500 if (member.isMalformed) return;
499 if (member.isConstructor) return; 501 if (member.isConstructor) return;
500 f(declarer, member); 502 f(declarer, member);
501 }, includeSuperAndInjectedMembers: true); 503 }, includeSuperAndInjectedMembers: true);
502 } 504 }
503 505
504 @override 506 @override
505 void forEachConstructor( 507 void forEachConstructor(
506 ClassElement cls, void f(ConstructorEntity constructor)) { 508 covariant ClassElement cls, void f(ConstructorEntity constructor)) {
507 cls.ensureResolved(_resolution); 509 cls.ensureResolved(_resolution);
508 for (ConstructorElement constructor in cls.implementation.constructors) { 510 for (ConstructorElement constructor in cls.implementation.constructors) {
509 _resolution.ensureResolved(constructor.declaration); 511 _resolution.ensureResolved(constructor.declaration);
510 if (constructor.isRedirectingFactory) continue; 512 if (constructor.isRedirectingFactory) continue;
511 f(constructor); 513 f(constructor);
512 } 514 }
513 } 515 }
514 516
515 @override 517 @override
516 ClassEntity getSuperClass(ClassElement cls, 518 ClassEntity getSuperClass(covariant ClassElement cls,
517 {bool skipUnnamedMixinApplications: false}) { 519 {bool skipUnnamedMixinApplications: false}) {
518 cls.ensureResolved(_resolution); 520 cls.ensureResolved(_resolution);
519 ClassElement superclass = cls.superclass; 521 ClassElement superclass = cls.superclass;
520 if (skipUnnamedMixinApplications) { 522 if (skipUnnamedMixinApplications) {
521 while (superclass != null && superclass.isUnnamedMixinApplication) { 523 while (superclass != null && superclass.isUnnamedMixinApplication) {
522 superclass = superclass.superclass; 524 superclass = superclass.superclass;
523 } 525 }
524 } 526 }
525 return superclass; 527 return superclass;
526 } 528 }
527 529
528 @override 530 @override
529 void forEachSupertype( 531 void forEachSupertype(
530 ClassElement cls, void f(ResolutionInterfaceType supertype)) { 532 covariant ClassElement cls, void f(ResolutionInterfaceType supertype)) {
531 cls.allSupertypes 533 cls.allSupertypes.forEach((InterfaceType supertype) => f(supertype));
532 .forEach((ResolutionInterfaceType supertype) => f(supertype));
533 } 534 }
534 535
535 @override 536 @override
536 void forEachMixin(ClassElement cls, void f(ClassElement mixin)) { 537 void forEachMixin(covariant ClassElement cls, void f(ClassElement mixin)) {
537 for (; cls != null; cls = cls.superclass) { 538 for (; cls != null; cls = cls.superclass) {
538 if (cls.isMixinApplication) { 539 if (cls.isMixinApplication) {
539 MixinApplicationElement mixinApplication = cls; 540 MixinApplicationElement mixinApplication = cls;
540 f(mixinApplication.mixin); 541 f(mixinApplication.mixin);
541 } 542 }
542 } 543 }
543 } 544 }
544 545
545 @override 546 @override
546 MemberElement lookupLibraryMember(LibraryElement library, String name, 547 MemberElement lookupLibraryMember(
548 covariant LibraryElement library, String name,
547 {bool setter: false, bool required: false}) { 549 {bool setter: false, bool required: false}) {
548 Element member = library.implementation.findLocal(name); 550 Element member = library.implementation.findLocal(name);
549 if (member != null && member.isAbstractField) { 551 if (member != null && member.isAbstractField) {
550 AbstractFieldElement abstractField = member; 552 AbstractFieldElement abstractField = member;
551 if (setter) { 553 if (setter) {
552 member = abstractField.setter; 554 member = abstractField.setter;
553 } else { 555 } else {
554 member = abstractField.getter; 556 member = abstractField.getter;
555 } 557 }
556 if (member == null && required) { 558 if (member == null && required) {
557 throw new SpannableAssertionFailure( 559 throw new SpannableAssertionFailure(
558 library, 560 library,
559 "The library '${library.canonicalUri}' does not contain required " 561 "The library '${library.canonicalUri}' does not contain required "
560 "${setter ? 'setter' : 'getter'}: '$name'."); 562 "${setter ? 'setter' : 'getter'}: '$name'.");
561 } 563 }
562 } 564 }
563 if (member == null && required) { 565 if (member == null && required) {
564 throw new SpannableAssertionFailure( 566 throw new SpannableAssertionFailure(
565 member, 567 member,
566 "The library '${library.libraryName}' does not " 568 "The library '${library.libraryName}' does not "
567 "contain required member: '$name'."); 569 "contain required member: '$name'.");
568 } 570 }
569 return member?.declaration; 571 return member?.declaration;
570 } 572 }
571 573
572 @override 574 @override
573 void forEachLibraryMember( 575 void forEachLibraryMember(
574 LibraryElement library, void f(MemberEntity member)) { 576 covariant LibraryElement library, void f(MemberEntity member)) {
575 library.implementation.forEachLocalMember((Element element) { 577 library.implementation.forEachLocalMember((Element element) {
576 if (!element.isClass && !element.isTypedef) { 578 if (!element.isClass && !element.isTypedef) {
577 MemberElement member = element; 579 MemberElement member = element;
578 f(member); 580 f(member);
579 } 581 }
580 }); 582 });
581 } 583 }
582 584
583 @override 585 @override
584 ClassElement lookupClass(LibraryElement library, String name, 586 ClassElement lookupClass(covariant LibraryElement library, String name,
585 {bool required: false}) { 587 {bool required: false}) {
586 ClassElement cls = library.implementation.findLocal(name); 588 ClassElement cls = library.implementation.findLocal(name);
587 if (cls == null && required) { 589 if (cls == null && required) {
588 throw new SpannableAssertionFailure( 590 throw new SpannableAssertionFailure(
589 library, 591 library,
590 "The library '${library.libraryName}' does not " 592 "The library '${library.libraryName}' does not "
591 "contain required class: '$name'."); 593 "contain required class: '$name'.");
592 } 594 }
593 return cls?.declaration; 595 return cls?.declaration;
594 } 596 }
595 597
596 @override 598 @override
597 void forEachClass(LibraryElement library, void f(ClassElement cls)) { 599 void forEachClass(covariant LibraryElement library, void f(ClassEntity cls)) {
598 library.implementation.forEachLocalMember((member) { 600 library.implementation.forEachLocalMember((dynamic member) {
599 if (member.isClass) { 601 if (member.isClass) {
600 f(member); 602 ClassElement cls = member;
603 f(cls);
601 } 604 }
602 }); 605 });
603 } 606 }
604 607
605 @override 608 @override
606 LibraryElement lookupLibrary(Uri uri, {bool required: false}) { 609 LibraryElement lookupLibrary(Uri uri, {bool required: false}) {
607 LibraryElement library = _libraryProvider.lookupLibrary(uri); 610 LibraryElement library = _libraryProvider.lookupLibrary(uri);
608 // If the script of the library is synthesized, the library does not exist 611 // If the script of the library is synthesized, the library does not exist
609 // and we do not try to load the helpers. 612 // and we do not try to load the helpers.
610 // 613 //
611 // This could for example happen if dart:async is disabled, then loading it 614 // This could for example happen if dart:async is disabled, then loading it
612 // should not try to find the given element. 615 // should not try to find the given element.
613 if (library != null && library.isSynthesized) { 616 if (library != null && library.isSynthesized) {
614 return null; 617 return null;
615 } 618 }
616 if (library == null && required) { 619 if (library == null && required) {
617 throw new SpannableAssertionFailure( 620 throw new SpannableAssertionFailure(
618 NO_LOCATION_SPANNABLE, "The library '${uri}' was not found."); 621 NO_LOCATION_SPANNABLE, "The library '${uri}' was not found.");
619 } 622 }
620 return library; 623 return library;
621 } 624 }
622 625
623 @override 626 @override
624 bool isDeferredLoadLibraryGetter(MemberElement member) { 627 bool isDeferredLoadLibraryGetter(covariant MemberElement member) {
625 return member.isDeferredLoaderGetter; 628 return member.isDeferredLoaderGetter;
626 } 629 }
627 630
628 @override 631 @override
629 ResolutionFunctionType getFunctionType(MethodElement method) { 632 ResolutionFunctionType getFunctionType(covariant MethodElement method) {
630 if (method is ConstructorBodyElement) { 633 if (method is ConstructorBodyElement) {
631 return method.constructor.type; 634 return method.constructor.type;
632 } 635 }
633 method.computeType(_resolution); 636 method.computeType(_resolution);
634 return method.type; 637 return method.type;
635 } 638 }
636 639
637 @override 640 @override
638 ResolutionFunctionType getLocalFunctionType(LocalFunctionElement function) { 641 ResolutionFunctionType getLocalFunctionType(
642 covariant LocalFunctionElement function) {
639 return function.type; 643 return function.type;
640 } 644 }
641 645
642 @override 646 @override
643 ResolutionDartType getUnaliasedType(ResolutionDartType type) { 647 ResolutionDartType getUnaliasedType(covariant ResolutionDartType type) {
644 type.computeUnaliased(_resolution); 648 type.computeUnaliased(_resolution);
645 return type.unaliased; 649 return type.unaliased;
646 } 650 }
647 651
648 @override 652 @override
649 Iterable<ConstantValue> getMemberMetadata(MemberElement element) { 653 Iterable<ConstantValue> getMemberMetadata(covariant MemberElement element) {
650 List<ConstantValue> values = <ConstantValue>[]; 654 List<ConstantValue> values = <ConstantValue>[];
651 _compiler.reporter.withCurrentElement(element, () { 655 _compiler.reporter.withCurrentElement(element, () {
652 for (MetadataAnnotation metadata in element.implementation.metadata) { 656 for (MetadataAnnotation metadata in element.implementation.metadata) {
653 metadata.ensureResolved(_compiler.resolution); 657 metadata.ensureResolved(_compiler.resolution);
654 assert(metadata.constant != null, 658 assert(metadata.constant != null,
655 failedAt(metadata, "Unevaluated metadata constant.")); 659 failedAt(metadata, "Unevaluated metadata constant."));
656 ConstantValue value = 660 ConstantValue value =
657 _compiler.constants.getConstantValue(metadata.constant); 661 _compiler.constants.getConstantValue(metadata.constant);
658 values.add(value); 662 values.add(value);
659 } 663 }
(...skipping 10 matching lines...) Expand all
670 /// annotations correspond to the correct element. 674 /// annotations correspond to the correct element.
671 class _ElementAnnotationProcessor implements AnnotationProcessor { 675 class _ElementAnnotationProcessor implements AnnotationProcessor {
672 Compiler _compiler; 676 Compiler _compiler;
673 677
674 _ElementAnnotationProcessor(this._compiler); 678 _ElementAnnotationProcessor(this._compiler);
675 679
676 CommonElements get _commonElements => _compiler.resolution.commonElements; 680 CommonElements get _commonElements => _compiler.resolution.commonElements;
677 681
678 /// Check whether [cls] has a `@Native(...)` annotation, and if so, set its 682 /// Check whether [cls] has a `@Native(...)` annotation, and if so, set its
679 /// native name from the annotation. 683 /// native name from the annotation.
680 void extractNativeAnnotations( 684 void extractNativeAnnotations(covariant LibraryElement library,
681 LibraryElement library, NativeBasicDataBuilder nativeBasicDataBuilder) { 685 NativeBasicDataBuilder nativeBasicDataBuilder) {
682 library.forEachLocalMember((Element element) { 686 library.forEachLocalMember((Element element) {
683 if (element.isClass) { 687 if (element.isClass) {
684 EagerAnnotationHandler.checkAnnotation(_compiler, element, 688 EagerAnnotationHandler.checkAnnotation(_compiler, element,
685 new NativeAnnotationHandler(nativeBasicDataBuilder)); 689 new NativeAnnotationHandler(nativeBasicDataBuilder));
686 } 690 }
687 }); 691 });
688 } 692 }
689 693
690 void extractJsInteropAnnotations( 694 void extractJsInteropAnnotations(covariant LibraryElement library,
691 LibraryElement library, NativeBasicDataBuilder nativeBasicDataBuilder) { 695 NativeBasicDataBuilder nativeBasicDataBuilder) {
692 bool checkJsInteropAnnotation(Element element) { 696 bool checkJsInteropAnnotation(Element element) {
693 return EagerAnnotationHandler.checkAnnotation( 697 return EagerAnnotationHandler.checkAnnotation(
694 _compiler, element, const JsInteropAnnotationHandler()); 698 _compiler, element, const JsInteropAnnotationHandler());
695 } 699 }
696 700
697 if (checkJsInteropAnnotation(library)) { 701 if (checkJsInteropAnnotation(library)) {
698 nativeBasicDataBuilder.markAsJsInteropLibrary(library); 702 nativeBasicDataBuilder.markAsJsInteropLibrary(library);
699 } 703 }
700 library.forEachLocalMember((Element element) { 704 library.forEachLocalMember((Element element) {
701 if (element.isClass) { 705 if (element.isClass) {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 }); 847 });
844 } else { 848 } else {
845 checkFunctionParameters(fn); 849 checkFunctionParameters(fn);
846 } 850 }
847 } 851 }
848 }); 852 });
849 }); 853 });
850 } 854 }
851 855
852 _compiler.libraryLoader.libraries 856 _compiler.libraryLoader.libraries
853 .forEach(processJsInteropAnnotationsInLibrary); 857 .forEach((LibraryEntity l) => processJsInteropAnnotationsInLibrary(l));
854 } 858 }
855 } 859 }
856 860
857 /// Builder that creates work item necessary for the resolution of a 861 /// Builder that creates work item necessary for the resolution of a
858 /// [MemberElement]. 862 /// [MemberElement].
859 class ResolutionWorkItemBuilder extends WorkItemBuilder { 863 class ResolutionWorkItemBuilder extends WorkItemBuilder {
860 final Resolution _resolution; 864 final Resolution _resolution;
861 865
862 ResolutionWorkItemBuilder(this._resolution); 866 ResolutionWorkItemBuilder(this._resolution);
863 867
864 @override 868 @override
865 WorkItem createWorkItem(MemberElement element) { 869 WorkItem createWorkItem(MemberElement element) {
866 assert(element.isDeclaration, failedAt(element)); 870 assert(element.isDeclaration, failedAt(element));
867 if (element.isMalformed) return null; 871 if (element.isMalformed) return null;
868 872
869 assert(element is AnalyzableElement, 873 assert(element is AnalyzableElement,
870 failedAt(element, 'Element $element is not analyzable.')); 874 failedAt(element, 'Element $element is not analyzable.'));
871 return _resolution.createWorkItem(element); 875 return _resolution.createWorkItem(element);
872 } 876 }
873 } 877 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/resolution_common.dart ('k') | pkg/compiler/lib/src/resolution/scope.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698