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

Side by Side Diff: pkg/analyzer/lib/src/summary/resynthesize.dart

Issue 2043783002: Resynthesize enums 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 | « pkg/analyzer/lib/src/dart/element/element.dart ('k') | no next file » | 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) 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 summary_resynthesizer; 5 library summary_resynthesizer;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
(...skipping 988 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 for (int i = 1; i < linkedLibrary.units.length; i++) { 999 for (int i = 1; i < linkedLibrary.units.length; i++) {
1000 _UnitResynthesizer partResynthesizer = buildPart( 1000 _UnitResynthesizer partResynthesizer = buildPart(
1001 definingUnitResynthesizer, 1001 definingUnitResynthesizer,
1002 unlinkedDefiningUnit.publicNamespace.parts[i - 1], 1002 unlinkedDefiningUnit.publicNamespace.parts[i - 1],
1003 unlinkedDefiningUnit.parts[i - 1], 1003 unlinkedDefiningUnit.parts[i - 1],
1004 i); 1004 i);
1005 partResynthesizers.add(partResynthesizer); 1005 partResynthesizers.add(partResynthesizer);
1006 } 1006 }
1007 library.parts = partResynthesizers.map((r) => r.unit).toList(); 1007 library.parts = partResynthesizers.map((r) => r.unit).toList();
1008 // Populate units. 1008 // Populate units.
1009 populateUnit(definingUnitResynthesizer); 1009 rememberUriToUnit(definingUnitResynthesizer);
1010 for (_UnitResynthesizer partResynthesizer in partResynthesizers) { 1010 for (_UnitResynthesizer partResynthesizer in partResynthesizers) {
1011 populateUnit(partResynthesizer); 1011 rememberUriToUnit(partResynthesizer);
1012 } 1012 }
1013 // Create the synthetic element for `loadLibrary`. 1013 // Create the synthetic element for `loadLibrary`.
1014 // Until the client received dart:core and dart:async, we cannot do this, 1014 // Until the client received dart:core and dart:async, we cannot do this,
1015 // because the TypeProvider is not fully initialized. So, it is up to the 1015 // because the TypeProvider is not fully initialized. So, it is up to the
1016 // Dart SDK client to initialize TypeProvider and finish the dart:core and 1016 // Dart SDK client to initialize TypeProvider and finish the dart:core and
1017 // dart:async libraries creation. 1017 // dart:async libraries creation.
1018 if (library.name != 'dart.core' && library.name != 'dart.async') { 1018 if (library.name != 'dart.core' && library.name != 'dart.async') {
1019 library.createLoadLibraryFunction(summaryResynthesizer.typeProvider); 1019 library.createLoadLibraryFunction(summaryResynthesizer.typeProvider);
1020 } 1020 }
1021 // Done. 1021 // Done.
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1082 Source partSource = 1082 Source partSource =
1083 summaryResynthesizer.sourceFactory.resolveUri(librarySource, uri); 1083 summaryResynthesizer.sourceFactory.resolveUri(librarySource, uri);
1084 partUri = partSource.uri.toString(); 1084 partUri = partSource.uri.toString();
1085 } else { 1085 } else {
1086 partUri = referencedLibraryUri; 1086 partUri = referencedLibraryUri;
1087 } 1087 }
1088 return <String>[referencedLibraryUri, partUri, name]; 1088 return <String>[referencedLibraryUri, partUri, name];
1089 } 1089 }
1090 1090
1091 /** 1091 /**
1092 * Populate a [CompilationUnitElement] by deserializing all the elements 1092 * Remember the absolute URI to the corresponding unit mapping.
1093 * contained in it.
1094 */ 1093 */
1095 void populateUnit(_UnitResynthesizer unitResynthesized) { 1094 void rememberUriToUnit(_UnitResynthesizer unitResynthesized) {
1096 unitResynthesized.populateUnit(); 1095 CompilationUnitElementImpl unit = unitResynthesized.unit;
1097 String absoluteUri = unitResynthesized.unit.source.uri.toString(); 1096 String absoluteUri = unit.source.uri.toString();
1098 resynthesizedUnits[absoluteUri] = unitResynthesized.unit; 1097 resynthesizedUnits[absoluteUri] = unit;
1099 } 1098 }
1100 } 1099 }
1101 1100
1102 /** 1101 /**
1103 * Implementation of [LibraryResynthesizerContext] for [_LibraryResynthesizer]. 1102 * Implementation of [LibraryResynthesizerContext] for [_LibraryResynthesizer].
1104 */ 1103 */
1105 class _LibraryResynthesizerContext implements LibraryResynthesizerContext { 1104 class _LibraryResynthesizerContext implements LibraryResynthesizerContext {
1106 final _LibraryResynthesizer resynthesizer; 1105 final _LibraryResynthesizer resynthesizer;
1107 1106
1108 _LibraryResynthesizerContext(this.resynthesizer); 1107 _LibraryResynthesizerContext(this.resynthesizer);
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 */ 1415 */
1417 final LinkedUnit linkedUnit; 1416 final LinkedUnit linkedUnit;
1418 1417
1419 /** 1418 /**
1420 * The [CompilationUnitElementImpl] for the compilation unit currently being 1419 * The [CompilationUnitElementImpl] for the compilation unit currently being
1421 * resynthesized. 1420 * resynthesized.
1422 */ 1421 */
1423 CompilationUnitElementImpl unit; 1422 CompilationUnitElementImpl unit;
1424 1423
1425 /** 1424 /**
1426 * [ElementHolder] into which resynthesized elements should be placed. This
1427 * object is recreated afresh for each unit in the library, and is used to
1428 * populate the [CompilationUnitElement].
1429 */
1430 final ElementHolder unitHolder = new ElementHolder();
1431
1432 /**
1433 * Map from slot id to the corresponding [EntityRef] object for linked types 1425 * Map from slot id to the corresponding [EntityRef] object for linked types
1434 * (i.e. propagated and inferred types). 1426 * (i.e. propagated and inferred types).
1435 */ 1427 */
1436 final Map<int, EntityRef> linkedTypeMap = <int, EntityRef>{}; 1428 final Map<int, EntityRef> linkedTypeMap = <int, EntityRef>{};
1437 1429
1438 /** 1430 /**
1439 * Set of slot ids corresponding to const constructors that are part of 1431 * Set of slot ids corresponding to const constructors that are part of
1440 * cycles. 1432 * cycles.
1441 */ 1433 */
1442 Set<int> constCycles; 1434 Set<int> constCycles;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 elementAnnotation.annotationAst = AstFactory.annotation2( 1493 elementAnnotation.annotationAst = AstFactory.annotation2(
1502 typeName, constructorName, constExpr.argumentList); 1494 typeName, constructorName, constExpr.argumentList);
1503 } else { 1495 } else {
1504 throw new StateError( 1496 throw new StateError(
1505 'Unexpected annotation type: ${constExpr.runtimeType}'); 1497 'Unexpected annotation type: ${constExpr.runtimeType}');
1506 } 1498 }
1507 return elementAnnotation; 1499 return elementAnnotation;
1508 } 1500 }
1509 1501
1510 /** 1502 /**
1511 * Build the documentation for the given [element]. Does nothing if
1512 * [serializedDocumentationComment] is `null`.
1513 */
1514 void buildDocumentation(ElementImpl element,
1515 UnlinkedDocumentationComment serializedDocumentationComment) {
1516 if (serializedDocumentationComment != null) {
1517 element.documentationComment = serializedDocumentationComment.text;
1518 element.setDocRange(serializedDocumentationComment.offset,
1519 serializedDocumentationComment.length);
1520 }
1521 }
1522
1523 /**
1524 * Resynthesize the [ClassElement] corresponding to an enum, along with the
1525 * associated fields and implicit accessors.
1526 */
1527 void buildEnum(UnlinkedEnum serializedEnum) {
1528 assert(!libraryResynthesizer.isCoreLibrary);
1529 EnumElementImpl classElement =
1530 new EnumElementImpl.forSerialized(serializedEnum, unit);
1531 unitHolder.addEnum(classElement);
1532 }
1533
1534 /**
1535 * Build the implicit getter and setter associated with [element], and place
1536 * them in [holder].
1537 */
1538 void buildImplicitAccessors(
1539 PropertyInducingElementImpl element, ElementHolder holder) {
1540 PropertyAccessorElementImpl getter = buildImplicitGetter(element);
1541 holder?.addAccessor(getter);
1542 if (!(element.isConst || element.isFinal)) {
1543 PropertyAccessorElementImpl setter = buildImplicitSetter(element);
1544 holder?.addAccessor(setter);
1545 }
1546 }
1547
1548 /**
1549 * Build an implicit getter for the given [property] and bind it to the 1503 * Build an implicit getter for the given [property] and bind it to the
1550 * [property] and to its enclosing element. 1504 * [property] and to its enclosing element.
1551 */ 1505 */
1552 PropertyAccessorElementImpl buildImplicitGetter( 1506 PropertyAccessorElementImpl buildImplicitGetter(
1553 PropertyInducingElementImpl property) { 1507 PropertyInducingElementImpl property) {
1554 PropertyAccessorElementImpl_ImplicitGetter getter = 1508 PropertyAccessorElementImpl_ImplicitGetter getter =
1555 new PropertyAccessorElementImpl_ImplicitGetter(property); 1509 new PropertyAccessorElementImpl_ImplicitGetter(property);
1556 getter.enclosingElement = property.enclosingElement; 1510 getter.enclosingElement = property.enclosingElement;
1557 return getter; 1511 return getter;
1558 } 1512 }
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 break; 1760 break;
1807 } 1761 }
1808 } 1762 }
1809 result = new _ReferenceInfo(libraryResynthesizer, enclosingInfo, name, 1763 result = new _ReferenceInfo(libraryResynthesizer, enclosingInfo, name,
1810 element, type, numTypeParameters); 1764 element, type, numTypeParameters);
1811 referenceInfos[index] = result; 1765 referenceInfos[index] = result;
1812 } 1766 }
1813 return result; 1767 return result;
1814 } 1768 }
1815 1769
1816 /**
1817 * Populate a [CompilationUnitElement] by deserializing all the elements
1818 * contained in it.
1819 */
1820 void populateUnit() {
1821 unlinkedUnit.enums.forEach(buildEnum);
1822 unit.enums = unitHolder.enums;
1823 }
1824
1825 Expression _buildConstExpression(ElementImpl context, UnlinkedConst uc) { 1770 Expression _buildConstExpression(ElementImpl context, UnlinkedConst uc) {
1826 return new _ConstExprBuilder(this, context, uc).build(); 1771 return new _ConstExprBuilder(this, context, uc).build();
1827 } 1772 }
1828 1773
1829 /** 1774 /**
1830 * Return the defining type for a [ConstructorElement] by applying 1775 * Return the defining type for a [ConstructorElement] by applying
1831 * [typeArgumentRefs] to the given linked [info]. 1776 * [typeArgumentRefs] to the given linked [info].
1832 */ 1777 */
1833 DartType _createConstructorDefiningType( 1778 DartType _createConstructorDefiningType(
1834 TypeParameterizedElementMixin typeParameterContext, 1779 TypeParameterizedElementMixin typeParameterContext,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1891 static String _getElementIdentifier(String name, ReferenceKind kind) { 1836 static String _getElementIdentifier(String name, ReferenceKind kind) {
1892 if (kind == ReferenceKind.topLevelPropertyAccessor || 1837 if (kind == ReferenceKind.topLevelPropertyAccessor ||
1893 kind == ReferenceKind.propertyAccessor) { 1838 kind == ReferenceKind.propertyAccessor) {
1894 if (!name.endsWith('=')) { 1839 if (!name.endsWith('=')) {
1895 return name + '?'; 1840 return name + '?';
1896 } 1841 }
1897 } 1842 }
1898 return name; 1843 return name;
1899 } 1844 }
1900 } 1845 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/dart/element/element.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698