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

Side by Side Diff: pkg/analyzer/lib/src/dart/element/element.dart

Issue 2030403002: Resynthesize constructors lazily. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 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
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/summary/resynthesize.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 analyzer.src.dart.element.element; 5 library analyzer.src.dart.element.element;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import 'dart:math' show min; 8 import 'dart:math' show min;
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 @override 520 @override
521 int get codeOffset { 521 int get codeOffset {
522 if (_unlinkedClass != null) { 522 if (_unlinkedClass != null) {
523 return _unlinkedClass.codeRange?.offset; 523 return _unlinkedClass.codeRange?.offset;
524 } 524 }
525 return super.codeOffset; 525 return super.codeOffset;
526 } 526 }
527 527
528 @override 528 @override
529 List<ConstructorElement> get constructors { 529 List<ConstructorElement> get constructors {
530 if (!isMixinApplication) { 530 if (isMixinApplication) {
531 assert(_constructors != null); 531 return _computeMixinAppConstructors();
532 return _constructors ?? ConstructorElement.EMPTY_LIST;
533 } 532 }
534 return _computeMixinAppConstructors(); 533 if (_unlinkedClass != null && _constructors == null) {
534 _constructors = _unlinkedClass.executables
535 .where((e) => e.kind == UnlinkedExecutableKind.constructor)
536 .map((e) => new ConstructorElementImpl.forSerialized(e, this))
537 .toList(growable: false);
538 // Ensure at least implicit default constructor.
539 if (_constructors.isEmpty) {
540 ConstructorElementImpl constructor = new ConstructorElementImpl('', -1);
541 constructor.enclosingElement = this;
542 constructor.synthetic = true;
543 constructor.type = new FunctionTypeImpl.elementWithNameAndArgs(
544 constructor, null, type.typeArguments, false);
545 _constructors = <ConstructorElement>[constructor];
546 }
547 }
548 assert(_constructors != null);
549 return _constructors ?? const <ConstructorElement>[];
Brian Wilkerson 2016/06/03 16:06:34 This doesn't make sense. If _constructors is not n
scheglov 2016/06/03 16:10:38 I agree, but this change just keeps the previous s
Brian Wilkerson 2016/06/03 16:18:15 Ok, I see. Are we doing the same everywhere that w
Paul Berry 2016/06/03 16:21:50 Yes, that was my intention when I wrote this code,
535 } 550 }
536 551
537 /** 552 /**
538 * Set the constructors contained in this class to the given [constructors]. 553 * Set the constructors contained in this class to the given [constructors].
539 * 554 *
540 * Should only be used for class elements that are not mixin applications. 555 * Should only be used for class elements that are not mixin applications.
541 */ 556 */
542 void set constructors(List<ConstructorElement> constructors) { 557 void set constructors(List<ConstructorElement> constructors) {
558 assert(_unlinkedClass == null);
543 assert(!isMixinApplication); 559 assert(!isMixinApplication);
544 for (ConstructorElement constructor in constructors) { 560 for (ConstructorElement constructor in constructors) {
545 (constructor as ConstructorElementImpl).enclosingElement = this; 561 (constructor as ConstructorElementImpl).enclosingElement = this;
546 } 562 }
547 this._constructors = constructors; 563 this._constructors = constructors;
548 } 564 }
549 565
550 @override 566 @override
551 SourceRange get docRange { 567 SourceRange get docRange {
552 if (_unlinkedClass != null) { 568 if (_unlinkedClass != null) {
(...skipping 1118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1671 ExecutableElementImpl enclosingExecutable) 1687 ExecutableElementImpl enclosingExecutable)
1672 : super.forSerialized(unlinkedVariable, enclosingExecutable); 1688 : super.forSerialized(unlinkedVariable, enclosingExecutable);
1673 } 1689 }
1674 1690
1675 /** 1691 /**
1676 * A concrete implementation of a [ConstructorElement]. 1692 * A concrete implementation of a [ConstructorElement].
1677 */ 1693 */
1678 class ConstructorElementImpl extends ExecutableElementImpl 1694 class ConstructorElementImpl extends ExecutableElementImpl
1679 implements ConstructorElement { 1695 implements ConstructorElement {
1680 /** 1696 /**
1681 * Set of slots corresponding to const constructors that are part of cycles.
1682 */
1683 final Set<int> _constCycles;
1684
1685 /**
1686 * The constructor to which this constructor is redirecting. 1697 * The constructor to which this constructor is redirecting.
1687 */ 1698 */
1688 ConstructorElement _redirectedConstructor; 1699 ConstructorElement _redirectedConstructor;
1689 1700
1690 /** 1701 /**
1691 * The initializers for this constructor (used for evaluating constant 1702 * The initializers for this constructor (used for evaluating constant
1692 * instance creation expressions). 1703 * instance creation expressions).
1693 */ 1704 */
1694 List<ConstructorInitializer> _constantInitializers; 1705 List<ConstructorInitializer> _constantInitializers;
1695 1706
(...skipping 11 matching lines...) Expand all
1707 /** 1718 /**
1708 * True if this constructor has been found by constant evaluation to be free 1719 * True if this constructor has been found by constant evaluation to be free
1709 * of redirect cycles, and is thus safe to evaluate. 1720 * of redirect cycles, and is thus safe to evaluate.
1710 */ 1721 */
1711 bool _isCycleFree = false; 1722 bool _isCycleFree = false;
1712 1723
1713 /** 1724 /**
1714 * Initialize a newly created constructor element to have the given [name] and 1725 * Initialize a newly created constructor element to have the given [name] and
1715 * [offset]. 1726 * [offset].
1716 */ 1727 */
1717 ConstructorElementImpl(String name, int offset) 1728 ConstructorElementImpl(String name, int offset) : super(name, offset);
1718 : _constCycles = null,
1719 super(name, offset);
1720 1729
1721 /** 1730 /**
1722 * Initialize a newly created constructor element to have the given [name]. 1731 * Initialize a newly created constructor element to have the given [name].
1723 */ 1732 */
1724 ConstructorElementImpl.forNode(Identifier name) 1733 ConstructorElementImpl.forNode(Identifier name) : super.forNode(name);
1725 : _constCycles = null,
1726 super.forNode(name);
1727 1734
1728 /** 1735 /**
1729 * Initialize using the given serialized information. 1736 * Initialize using the given serialized information.
1730 */ 1737 */
1731 ConstructorElementImpl.forSerialized(UnlinkedExecutable serializedExecutable, 1738 ConstructorElementImpl.forSerialized(
1732 this._constCycles, ClassElementImpl enclosingClass) 1739 UnlinkedExecutable serializedExecutable, ClassElementImpl enclosingClass)
1733 : super.forSerialized(serializedExecutable, enclosingClass); 1740 : super.forSerialized(serializedExecutable, enclosingClass);
1734 1741
1735 /** 1742 /**
1736 * Set whether this constructor represents a 'const' constructor. 1743 * Set whether this constructor represents a 'const' constructor.
1737 */ 1744 */
1738 void set const2(bool isConst) { 1745 void set const2(bool isConst) {
1739 assert(serializedExecutable == null); 1746 assert(serializedExecutable == null);
1740 setModifier(Modifier.CONST, isConst); 1747 setModifier(Modifier.CONST, isConst);
1741 } 1748 }
1742 1749
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1775 bool get isConst { 1782 bool get isConst {
1776 if (serializedExecutable != null) { 1783 if (serializedExecutable != null) {
1777 return serializedExecutable.isConst; 1784 return serializedExecutable.isConst;
1778 } 1785 }
1779 return hasModifier(Modifier.CONST); 1786 return hasModifier(Modifier.CONST);
1780 } 1787 }
1781 1788
1782 bool get isCycleFree { 1789 bool get isCycleFree {
1783 if (serializedExecutable != null) { 1790 if (serializedExecutable != null) {
1784 return serializedExecutable.isConst && 1791 return serializedExecutable.isConst &&
1785 !_constCycles.contains(serializedExecutable.constCycleSlot); 1792 !enclosingUnit.resynthesizerContext
1793 .isInConstCycle(serializedExecutable.constCycleSlot);
1786 } 1794 }
1787 return _isCycleFree; 1795 return _isCycleFree;
1788 } 1796 }
1789 1797
1790 void set isCycleFree(bool isCycleFree) { 1798 void set isCycleFree(bool isCycleFree) {
1791 assert(serializedExecutable == null); 1799 assert(serializedExecutable == null);
1792 _isCycleFree = isCycleFree; 1800 _isCycleFree = isCycleFree;
1793 } 1801 }
1794 1802
1795 @override 1803 @override
(...skipping 5591 matching lines...) Expand 10 before | Expand all | Expand 10 after
7387 * Build explicit top-level property accessors. 7395 * Build explicit top-level property accessors.
7388 */ 7396 */
7389 UnitExplicitTopLevelAccessors buildTopLevelAccessors(); 7397 UnitExplicitTopLevelAccessors buildTopLevelAccessors();
7390 7398
7391 /** 7399 /**
7392 * Build explicit top-level variables. 7400 * Build explicit top-level variables.
7393 */ 7401 */
7394 UnitExplicitTopLevelVariables buildTopLevelVariables(); 7402 UnitExplicitTopLevelVariables buildTopLevelVariables();
7395 7403
7396 /** 7404 /**
7405 * Return `true` if the given const constructor [slot] is a part of cycle.
7406 */
7407 bool isInConstCycle(int slot);
7408
7409 /**
7397 * Resolve an [EntityRef] into a constructor. If the reference is 7410 * Resolve an [EntityRef] into a constructor. If the reference is
7398 * unresolved, return `null`. 7411 * unresolved, return `null`.
7399 */ 7412 */
7400 ConstructorElement resolveConstructorRef( 7413 ConstructorElement resolveConstructorRef(
7401 TypeParameterizedElementMixin typeParameterContext, EntityRef entry); 7414 TypeParameterizedElementMixin typeParameterContext, EntityRef entry);
7402 7415
7403 /** 7416 /**
7404 * Build the appropriate [DartType] object corresponding to a slot id in the 7417 * Build the appropriate [DartType] object corresponding to a slot id in the
7405 * [LinkedUnit.types] table. 7418 * [LinkedUnit.types] table.
7406 */ 7419 */
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after
8047 8060
8048 @override 8061 @override
8049 void visitElement(Element element) { 8062 void visitElement(Element element) {
8050 int offset = element.nameOffset; 8063 int offset = element.nameOffset;
8051 if (offset != -1) { 8064 if (offset != -1) {
8052 map[offset] = element; 8065 map[offset] = element;
8053 } 8066 }
8054 super.visitElement(element); 8067 super.visitElement(element);
8055 } 8068 }
8056 } 8069 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/summary/resynthesize.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698