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

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

Issue 2036203005: Resynthesize CompilationUnitElement.types 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 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 463
464 /** 464 /**
465 * A list containing all of the methods contained in this class. 465 * A list containing all of the methods contained in this class.
466 */ 466 */
467 List<MethodElement> _methods; 467 List<MethodElement> _methods;
468 468
469 /** 469 /**
470 * A flag indicating whether the types associated with the instance members of 470 * A flag indicating whether the types associated with the instance members of
471 * this class have been inferred. 471 * this class have been inferred.
472 */ 472 */
473 bool hasBeenInferred = false; 473 bool _hasBeenInferred = false;
474 474
475 /** 475 /**
476 * Initialize a newly created class element to have the given [name] at the 476 * Initialize a newly created class element to have the given [name] at the
477 * given [offset] in the file that contains the declaration of this element. 477 * given [offset] in the file that contains the declaration of this element.
478 */ 478 */
479 ClassElementImpl(String name, int offset) 479 ClassElementImpl(String name, int offset)
480 : _unlinkedClass = null, 480 : _unlinkedClass = null,
481 super(name, offset); 481 super(name, offset);
482 482
483 /** 483 /**
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 } 649 }
650 return _fields ?? const <FieldElement>[]; 650 return _fields ?? const <FieldElement>[];
651 } 651 }
652 652
653 @override 653 @override
654 void set fields(List<FieldElement> fields) { 654 void set fields(List<FieldElement> fields) {
655 assert(_unlinkedClass == null); 655 assert(_unlinkedClass == null);
656 super.fields = fields; 656 super.fields = fields;
657 } 657 }
658 658
659 bool get hasBeenInferred {
660 if (_unlinkedClass != null) {
661 return context.analysisOptions.strongMode;
662 }
663 return _hasBeenInferred;
664 }
665
666 void set hasBeenInferred(bool hasBeenInferred) {
667 assert(_unlinkedClass == null);
668 _hasBeenInferred = hasBeenInferred;
669 }
670
659 @override 671 @override
660 bool get hasNonFinalField { 672 bool get hasNonFinalField {
661 List<ClassElement> classesToVisit = new List<ClassElement>(); 673 List<ClassElement> classesToVisit = new List<ClassElement>();
662 HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>(); 674 HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
663 classesToVisit.add(this); 675 classesToVisit.add(this);
664 while (!classesToVisit.isEmpty) { 676 while (!classesToVisit.isEmpty) {
665 ClassElement currentElement = classesToVisit.removeAt(0); 677 ClassElement currentElement = classesToVisit.removeAt(0);
666 if (visitedClasses.add(currentElement)) { 678 if (visitedClasses.add(currentElement)) {
667 // check fields 679 // check fields
668 for (FieldElement field in currentElement.fields) { 680 for (FieldElement field in currentElement.fields) {
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 1332
1321 /** 1333 /**
1322 * A list containing all of the function type aliases contained in this 1334 * A list containing all of the function type aliases contained in this
1323 * compilation unit. 1335 * compilation unit.
1324 */ 1336 */
1325 List<FunctionTypeAliasElement> _typeAliases; 1337 List<FunctionTypeAliasElement> _typeAliases;
1326 1338
1327 /** 1339 /**
1328 * A list containing all of the types contained in this compilation unit. 1340 * A list containing all of the types contained in this compilation unit.
1329 */ 1341 */
1330 List<ClassElement> _types = ClassElement.EMPTY_LIST; 1342 List<ClassElement> _types;
1331 1343
1332 /** 1344 /**
1333 * A list containing all of the variables contained in this compilation unit. 1345 * A list containing all of the variables contained in this compilation unit.
1334 */ 1346 */
1335 List<TopLevelVariableElement> _variables; 1347 List<TopLevelVariableElement> _variables;
1336 1348
1337 /** 1349 /**
1338 * A map from offsets to elements of this unit at these offsets. 1350 * A map from offsets to elements of this unit at these offsets.
1339 */ 1351 */
1340 final Map<int, Element> _offsetToElementMap = new HashMap<int, Element>(); 1352 final Map<int, Element> _offsetToElementMap = new HashMap<int, Element>();
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1560 for (FunctionTypeAliasElement typeAlias in typeAliases) { 1572 for (FunctionTypeAliasElement typeAlias in typeAliases) {
1561 (typeAlias as FunctionTypeAliasElementImpl).enclosingElement = this; 1573 (typeAlias as FunctionTypeAliasElementImpl).enclosingElement = this;
1562 } 1574 }
1563 this._typeAliases = typeAliases; 1575 this._typeAliases = typeAliases;
1564 } 1576 }
1565 1577
1566 @override 1578 @override
1567 TypeParameterizedElementMixin get typeParameterContext => null; 1579 TypeParameterizedElementMixin get typeParameterContext => null;
1568 1580
1569 @override 1581 @override
1570 List<ClassElement> get types => _types; 1582 List<ClassElement> get types {
1583 if (_unlinkedUnit != null) {
1584 _types ??= _unlinkedUnit.classes
1585 .map((c) => new ClassElementImpl.forSerialized(c, this))
1586 .toList(growable: false);
1587 }
1588 return _types ?? const <ClassElement>[];
1589 }
1571 1590
1572 /** 1591 /**
1573 * Set the types contained in this compilation unit to the given [types]. 1592 * Set the types contained in this compilation unit to the given [types].
1574 */ 1593 */
1575 void set types(List<ClassElement> types) { 1594 void set types(List<ClassElement> types) {
1595 assert(_unlinkedUnit == null);
1576 for (ClassElement type in types) { 1596 for (ClassElement type in types) {
1577 // Another implementation of ClassElement is _DeferredClassElement, 1597 // Another implementation of ClassElement is _DeferredClassElement,
1578 // which is used to resynthesize classes lazily. We cannot cast it 1598 // which is used to resynthesize classes lazily. We cannot cast it
1579 // to ClassElementImpl, and it already can provide correct values of the 1599 // to ClassElementImpl, and it already can provide correct values of the
1580 // 'enclosingElement' property. 1600 // 'enclosingElement' property.
1581 if (type is ClassElementImpl) { 1601 if (type is ClassElementImpl) {
1582 type.enclosingElement = this; 1602 type.enclosingElement = this;
1583 } 1603 }
1584 } 1604 }
1585 this._types = types; 1605 this._types = types;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
1641 if (variableImpl.identifier == identifier) { 1661 if (variableImpl.identifier == identifier) {
1642 return variableImpl; 1662 return variableImpl;
1643 } 1663 }
1644 } 1664 }
1645 for (FunctionElement function in functions) { 1665 for (FunctionElement function in functions) {
1646 FunctionElementImpl functionImpl = function; 1666 FunctionElementImpl functionImpl = function;
1647 if (functionImpl.identifier == identifier) { 1667 if (functionImpl.identifier == identifier) {
1648 return functionImpl; 1668 return functionImpl;
1649 } 1669 }
1650 } 1670 }
1651 for (FunctionTypeAliasElement typeAlias in _typeAliases) { 1671 for (FunctionTypeAliasElement typeAlias in functionTypeAliases) {
1652 FunctionTypeAliasElementImpl typeAliasImpl = typeAlias; 1672 FunctionTypeAliasElementImpl typeAliasImpl = typeAlias;
1653 if (typeAliasImpl.identifier == identifier) { 1673 if (typeAliasImpl.identifier == identifier) {
1654 return typeAliasImpl; 1674 return typeAliasImpl;
1655 } 1675 }
1656 } 1676 }
1657 for (ClassElement type in _types) { 1677 for (ClassElement type in types) {
1658 ClassElementImpl typeImpl = type; 1678 ClassElementImpl typeImpl = type;
1659 if (typeImpl.name == identifier) { 1679 if (typeImpl.name == identifier) {
1660 return typeImpl; 1680 return typeImpl;
1661 } 1681 }
1662 } 1682 }
1663 for (ClassElement type in _enums) { 1683 for (ClassElement type in _enums) {
1664 EnumElementImpl typeImpl = type; 1684 EnumElementImpl typeImpl = type;
1665 if (typeImpl.identifier == identifier) { 1685 if (typeImpl.identifier == identifier) {
1666 return typeImpl; 1686 return typeImpl;
1667 } 1687 }
(...skipping 14 matching lines...) Expand all
1682 for (ClassElement enumDeclaration in _enums) { 1702 for (ClassElement enumDeclaration in _enums) {
1683 if (enumDeclaration.name == enumName) { 1703 if (enumDeclaration.name == enumName) {
1684 return enumDeclaration; 1704 return enumDeclaration;
1685 } 1705 }
1686 } 1706 }
1687 return null; 1707 return null;
1688 } 1708 }
1689 1709
1690 @override 1710 @override
1691 ClassElement getType(String className) { 1711 ClassElement getType(String className) {
1692 for (ClassElement type in _types) { 1712 for (ClassElement type in types) {
1693 if (type.name == className) { 1713 if (type.name == className) {
1694 return type; 1714 return type;
1695 } 1715 }
1696 } 1716 }
1697 return null; 1717 return null;
1698 } 1718 }
1699 1719
1700 /** 1720 /**
1701 * Replace the given [from] top-level variable with [to] in this compilation u nit. 1721 * Replace the given [from] top-level variable with [to] in this compilation u nit.
1702 */ 1722 */
(...skipping 20 matching lines...) Expand all
1723 annotationMap ??= new HashMap<int, List<ElementAnnotation>>(); 1743 annotationMap ??= new HashMap<int, List<ElementAnnotation>>();
1724 annotationMap[offset] = annotations; 1744 annotationMap[offset] = annotations;
1725 } 1745 }
1726 1746
1727 @override 1747 @override
1728 void visitChildren(ElementVisitor visitor) { 1748 void visitChildren(ElementVisitor visitor) {
1729 super.visitChildren(visitor); 1749 super.visitChildren(visitor);
1730 safelyVisitChildren(accessors, visitor); 1750 safelyVisitChildren(accessors, visitor);
1731 safelyVisitChildren(_enums, visitor); 1751 safelyVisitChildren(_enums, visitor);
1732 safelyVisitChildren(functions, visitor); 1752 safelyVisitChildren(functions, visitor);
1733 safelyVisitChildren(_typeAliases, visitor); 1753 safelyVisitChildren(functionTypeAliases, visitor);
1734 safelyVisitChildren(_types, visitor); 1754 safelyVisitChildren(types, visitor);
1735 safelyVisitChildren(topLevelVariables, visitor); 1755 safelyVisitChildren(topLevelVariables, visitor);
1736 } 1756 }
1737 } 1757 }
1738 1758
1739 /** 1759 /**
1740 * A [FieldElement] for a 'const' or 'final' field that has an initializer. 1760 * A [FieldElement] for a 'const' or 'final' field that has an initializer.
1741 * 1761 *
1742 * TODO(paulberry): we should rename this class to reflect the fact that it's 1762 * TODO(paulberry): we should rename this class to reflect the fact that it's
1743 * used for both const and final fields. However, we shouldn't do so until 1763 * used for both const and final fields. However, we shouldn't do so until
1744 * we've created an API for reading the values of constants; until that API is 1764 * we've created an API for reading the values of constants; until that API is
(...skipping 6471 matching lines...) Expand 10 before | Expand all | Expand 10 after
8216 8236
8217 @override 8237 @override
8218 void visitElement(Element element) { 8238 void visitElement(Element element) {
8219 int offset = element.nameOffset; 8239 int offset = element.nameOffset;
8220 if (offset != -1) { 8240 if (offset != -1) {
8221 map[offset] = element; 8241 map[offset] = element;
8222 } 8242 }
8223 super.visitElement(element); 8243 super.visitElement(element);
8224 } 8244 }
8225 } 8245 }
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