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

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

Issue 2813543007: Pass ElementImpl as a context for resynthesizing types. (Closed)
Patch Set: Created 3 years, 8 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) 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/standard_ast_factory.dart'; 10 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET)); 587 TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
588 } 588 }
589 } 589 }
590 590
591 /** 591 /**
592 * Convert the next reference to the [DartType] and return the AST 592 * Convert the next reference to the [DartType] and return the AST
593 * corresponding to this type. 593 * corresponding to this type.
594 */ 594 */
595 TypeAnnotation _newTypeName() { 595 TypeAnnotation _newTypeName() {
596 EntityRef typeRef = uc.references[refPtr++]; 596 EntityRef typeRef = uc.references[refPtr++];
597 DartType type = 597 DartType type = resynthesizer.buildType(context, typeRef);
598 resynthesizer.buildType(typeRef, context?.typeParameterContext);
599 return _buildTypeAst(type); 598 return _buildTypeAst(type);
600 } 599 }
601 600
602 Expression _pop() => stack.removeLast(); 601 Expression _pop() => stack.removeLast();
603 602
604 void _push(Expression expr) { 603 void _push(Expression expr) {
605 stack.add(expr); 604 stack.add(expr);
606 } 605 }
607 606
608 void _pushBinary(TokenType operator) { 607 void _pushBinary(TokenType operator) {
(...skipping 27 matching lines...) Expand all
636 constructorName = null; 635 constructorName = null;
637 } else { 636 } else {
638 List<Expression> arguments = _buildArguments(); 637 List<Expression> arguments = _buildArguments();
639 SimpleIdentifier name = AstTestFactory.identifier3(info.name); 638 SimpleIdentifier name = AstTestFactory.identifier3(info.name);
640 name.staticElement = info.element; 639 name.staticElement = info.element;
641 name.setProperty(ARGUMENT_LIST, AstTestFactory.argumentList(arguments)); 640 name.setProperty(ARGUMENT_LIST, AstTestFactory.argumentList(arguments));
642 _push(name); 641 _push(name);
643 return; 642 return;
644 } 643 }
645 InterfaceType definingType = resynthesizer._createConstructorDefiningType( 644 InterfaceType definingType = resynthesizer._createConstructorDefiningType(
646 context?.typeParameterContext, info, ref.typeArguments); 645 context, info, ref.typeArguments);
647 constructorElement = 646 constructorElement =
648 resynthesizer._getConstructorForInfo(definingType, info); 647 resynthesizer._getConstructorForInfo(definingType, info);
649 typeNode = _buildTypeAst(definingType); 648 typeNode = _buildTypeAst(definingType);
650 } else { 649 } else {
651 if (info.enclosing != null) { 650 if (info.enclosing != null) {
652 if (info.enclosing.enclosing != null) { 651 if (info.enclosing.enclosing != null) {
653 PrefixedIdentifier typeName = AstTestFactory.identifier5( 652 PrefixedIdentifier typeName = AstTestFactory.identifier5(
654 info.enclosing.enclosing.name, info.enclosing.name); 653 info.enclosing.enclosing.name, info.enclosing.name);
655 typeName.prefix.staticElement = info.enclosing.enclosing.element; 654 typeName.prefix.staticElement = info.enclosing.enclosing.element;
656 typeName.identifier.staticElement = info.enclosing.element; 655 typeName.identifier.staticElement = info.enclosing.element;
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after
1432 return _unitResynthesizer.parametersInheritingCovariant.contains(slot); 1431 return _unitResynthesizer.parametersInheritingCovariant.contains(slot);
1433 } 1432 }
1434 1433
1435 @override 1434 @override
1436 bool isInConstCycle(int slot) { 1435 bool isInConstCycle(int slot) {
1437 return _unitResynthesizer.constCycles.contains(slot); 1436 return _unitResynthesizer.constCycles.contains(slot);
1438 } 1437 }
1439 1438
1440 @override 1439 @override
1441 ConstructorElement resolveConstructorRef( 1440 ConstructorElement resolveConstructorRef(
1442 TypeParameterizedElementMixin typeParameterContext, EntityRef entry) { 1441 ElementImpl context, EntityRef entry) {
1443 return _unitResynthesizer._getConstructorForEntry( 1442 return _unitResynthesizer._getConstructorForEntry(context, entry);
1444 typeParameterContext, entry);
1445 } 1443 }
1446 1444
1447 @override 1445 @override
1448 DartType resolveLinkedType( 1446 DartType resolveLinkedType(ElementImpl context, int slot) {
1449 int slot, TypeParameterizedElementMixin typeParameterContext) { 1447 return _unitResynthesizer.buildLinkedType(context, slot);
1450 return _unitResynthesizer.buildLinkedType(slot, typeParameterContext);
1451 } 1448 }
1452 1449
1453 @override 1450 @override
1454 DartType resolveTypeRef( 1451 DartType resolveTypeRef(ElementImpl context, EntityRef type,
1455 EntityRef type, TypeParameterizedElementMixin typeParameterContext,
1456 {bool defaultVoid: false, 1452 {bool defaultVoid: false,
1457 bool instantiateToBoundsAllowed: true, 1453 bool instantiateToBoundsAllowed: true,
1458 bool declaredType: false}) { 1454 bool declaredType: false}) {
1459 return _unitResynthesizer.buildType(type, typeParameterContext, 1455 return _unitResynthesizer.buildType(context, type,
1460 defaultVoid: defaultVoid, 1456 defaultVoid: defaultVoid,
1461 instantiateToBoundsAllowed: instantiateToBoundsAllowed, 1457 instantiateToBoundsAllowed: instantiateToBoundsAllowed,
1462 declaredType: declaredType); 1458 declaredType: declaredType);
1463 } 1459 }
1464 } 1460 }
1465 1461
1466 /** 1462 /**
1467 * An instance of [_UnitResynthesizer] is responsible for resynthesizing the 1463 * An instance of [_UnitResynthesizer] is responsible for resynthesizing the
1468 * elements in a single unit from that unit's summary. 1464 * elements in a single unit from that unit's summary.
1469 */ 1465 */
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1618 PropertyAccessorElementImpl_ImplicitSetter setter = 1614 PropertyAccessorElementImpl_ImplicitSetter setter =
1619 new PropertyAccessorElementImpl_ImplicitSetter(property); 1615 new PropertyAccessorElementImpl_ImplicitSetter(property);
1620 setter.enclosingElement = property.enclosingElement; 1616 setter.enclosingElement = property.enclosingElement;
1621 return setter; 1617 return setter;
1622 } 1618 }
1623 1619
1624 /** 1620 /**
1625 * Build the appropriate [DartType] object corresponding to a slot id in the 1621 * Build the appropriate [DartType] object corresponding to a slot id in the
1626 * [LinkedUnit.types] table. 1622 * [LinkedUnit.types] table.
1627 */ 1623 */
1628 DartType buildLinkedType( 1624 DartType buildLinkedType(ElementImpl context, int slot) {
1629 int slot, TypeParameterizedElementMixin typeParameterContext) {
1630 if (slot == 0) { 1625 if (slot == 0) {
1631 // A slot id of 0 means there is no [DartType] object to build. 1626 // A slot id of 0 means there is no [DartType] object to build.
1632 return null; 1627 return null;
1633 } 1628 }
1634 EntityRef type = linkedTypeMap[slot]; 1629 EntityRef type = linkedTypeMap[slot];
1635 if (type == null) { 1630 if (type == null) {
1636 // A missing entry in [LinkedUnit.types] means there is no [DartType] 1631 // A missing entry in [LinkedUnit.types] means there is no [DartType]
1637 // stored in this slot. 1632 // stored in this slot.
1638 return null; 1633 return null;
1639 } 1634 }
1640 return buildType(type, typeParameterContext); 1635 return buildType(context, type);
1641 } 1636 }
1642 1637
1643 /** 1638 /**
1644 * Build a [DartType] object based on a [EntityRef]. This [DartType] 1639 * Build a [DartType] object based on a [EntityRef]. This [DartType]
1645 * may refer to elements in other libraries than the library being 1640 * may refer to elements in other libraries than the library being
1646 * deserialized, so handles are used to avoid having to deserialize other 1641 * deserialized, so handles are used to avoid having to deserialize other
1647 * libraries in the process. 1642 * libraries in the process.
1648 */ 1643 */
1649 DartType buildType( 1644 DartType buildType(ElementImpl context, EntityRef type,
1650 EntityRef type, TypeParameterizedElementMixin typeParameterContext,
1651 {bool defaultVoid: false, 1645 {bool defaultVoid: false,
1652 bool instantiateToBoundsAllowed: true, 1646 bool instantiateToBoundsAllowed: true,
1653 bool declaredType: false}) { 1647 bool declaredType: false}) {
1654 if (type == null) { 1648 if (type == null) {
1655 if (defaultVoid) { 1649 if (defaultVoid) {
1656 return VoidTypeImpl.instance; 1650 return VoidTypeImpl.instance;
1657 } else { 1651 } else {
1658 return DynamicTypeImpl.instance; 1652 return DynamicTypeImpl.instance;
1659 } 1653 }
1660 } 1654 }
1661 if (type.paramReference != 0) { 1655 if (type.paramReference != 0) {
1662 return typeParameterContext.getTypeParameterType(type.paramReference); 1656 return context.typeParameterContext
1657 .getTypeParameterType(type.paramReference);
1663 } else if (type.entityKind == EntityRefKind.genericFunctionType) { 1658 } else if (type.entityKind == EntityRefKind.genericFunctionType) {
1664 GenericFunctionTypeElement element = 1659 GenericFunctionTypeElement element =
1665 new GenericFunctionTypeElementImpl.forSerialized( 1660 new GenericFunctionTypeElementImpl.forSerialized(context, type);
1666 type, typeParameterContext);
1667 return element.type; 1661 return element.type;
1668 } else if (type.syntheticReturnType != null) { 1662 } else if (type.syntheticReturnType != null) {
1669 FunctionElementImpl element = 1663 FunctionElementImpl element = new FunctionElementImpl_forLUB(
1670 new FunctionElementImpl_forLUB(unit, typeParameterContext, type); 1664 unit, context.typeParameterContext, type);
1671 return element.type; 1665 return element.type;
1672 } else { 1666 } else {
1673 DartType getTypeArgument(int i) { 1667 DartType getTypeArgument(int i) {
1674 if (i < type.typeArguments.length) { 1668 if (i < type.typeArguments.length) {
1675 return buildType(type.typeArguments[i], typeParameterContext, 1669 return buildType(context, type.typeArguments[i],
1676 declaredType: declaredType); 1670 declaredType: declaredType);
1677 } else { 1671 } else {
1678 return DynamicTypeImpl.instance; 1672 return DynamicTypeImpl.instance;
1679 } 1673 }
1680 } 1674 }
1681 1675
1682 _ReferenceInfo referenceInfo = getReferenceInfo(type.reference); 1676 _ReferenceInfo referenceInfo = getReferenceInfo(type.reference);
1683 if (declaredType && !referenceInfo.isDeclarableType) { 1677 if (declaredType && !referenceInfo.isDeclarableType) {
1684 return DynamicTypeImpl.instance; 1678 return DynamicTypeImpl.instance;
1685 } 1679 }
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
1922 1916
1923 Expression _buildConstExpression(ElementImpl context, UnlinkedExpr uc) { 1917 Expression _buildConstExpression(ElementImpl context, UnlinkedExpr uc) {
1924 return new _ConstExprBuilder(this, context, uc).build(); 1918 return new _ConstExprBuilder(this, context, uc).build();
1925 } 1919 }
1926 1920
1927 /** 1921 /**
1928 * Return the defining type for a [ConstructorElement] by applying 1922 * Return the defining type for a [ConstructorElement] by applying
1929 * [typeArgumentRefs] to the given linked [info]. Return [DynamicTypeImpl] 1923 * [typeArgumentRefs] to the given linked [info]. Return [DynamicTypeImpl]
1930 * if the [info] is unresolved. 1924 * if the [info] is unresolved.
1931 */ 1925 */
1932 DartType _createConstructorDefiningType( 1926 DartType _createConstructorDefiningType(ElementImpl context,
1933 TypeParameterizedElementMixin typeParameterContext, 1927 _ReferenceInfo info, List<EntityRef> typeArgumentRefs) {
1934 _ReferenceInfo info,
1935 List<EntityRef> typeArgumentRefs) {
1936 bool isClass = info.element is ClassElement; 1928 bool isClass = info.element is ClassElement;
1937 _ReferenceInfo classInfo = isClass ? info : info.enclosing; 1929 _ReferenceInfo classInfo = isClass ? info : info.enclosing;
1938 if (classInfo == null) { 1930 if (classInfo == null) {
1939 return DynamicTypeImpl.instance; 1931 return DynamicTypeImpl.instance;
1940 } 1932 }
1941 List<DartType> typeArguments = typeArgumentRefs 1933 List<DartType> typeArguments =
1942 .map((t) => buildType(t, typeParameterContext)) 1934 typeArgumentRefs.map((t) => buildType(context, t)).toList();
1943 .toList();
1944 return classInfo.buildType(true, typeArguments.length, (i) { 1935 return classInfo.buildType(true, typeArguments.length, (i) {
1945 if (i < typeArguments.length) { 1936 if (i < typeArguments.length) {
1946 return typeArguments[i]; 1937 return typeArguments[i];
1947 } else { 1938 } else {
1948 return DynamicTypeImpl.instance; 1939 return DynamicTypeImpl.instance;
1949 } 1940 }
1950 }, const <int>[]); 1941 }, const <int>[]);
1951 } 1942 }
1952 1943
1953 /** 1944 /**
1954 * Return the [ConstructorElement] corresponding to the given [entry]. 1945 * Return the [ConstructorElement] corresponding to the given [entry].
1955 */ 1946 */
1956 ConstructorElement _getConstructorForEntry( 1947 ConstructorElement _getConstructorForEntry(
1957 TypeParameterizedElementMixin typeParameterContext, EntityRef entry) { 1948 ElementImpl context, EntityRef entry) {
1958 _ReferenceInfo info = getReferenceInfo(entry.reference); 1949 _ReferenceInfo info = getReferenceInfo(entry.reference);
1959 DartType type = _createConstructorDefiningType( 1950 DartType type =
1960 typeParameterContext, info, entry.typeArguments); 1951 _createConstructorDefiningType(context, info, entry.typeArguments);
1961 if (type is InterfaceType) { 1952 if (type is InterfaceType) {
1962 return _getConstructorForInfo(type, info); 1953 return _getConstructorForInfo(type, info);
1963 } 1954 }
1964 return null; 1955 return null;
1965 } 1956 }
1966 1957
1967 /** 1958 /**
1968 * Return the [ConstructorElement] corresponding to the given linked [info], 1959 * Return the [ConstructorElement] corresponding to the given linked [info],
1969 * using the [classType] which has already been computed (e.g. by 1960 * using the [classType] which has already been computed (e.g. by
1970 * [_createConstructorDefiningType]). Both cases when [info] is a 1961 * [_createConstructorDefiningType]). Both cases when [info] is a
(...skipping 22 matching lines...) Expand all
1993 static String _getElementIdentifier(String name, ReferenceKind kind) { 1984 static String _getElementIdentifier(String name, ReferenceKind kind) {
1994 if (kind == ReferenceKind.topLevelPropertyAccessor || 1985 if (kind == ReferenceKind.topLevelPropertyAccessor ||
1995 kind == ReferenceKind.propertyAccessor) { 1986 kind == ReferenceKind.propertyAccessor) {
1996 if (!name.endsWith('=')) { 1987 if (!name.endsWith('=')) {
1997 return name + '?'; 1988 return name + '?';
1998 } 1989 }
1999 } 1990 }
2000 return name; 1991 return name;
2001 } 1992 }
2002 } 1993 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/summary/link.dart ('k') | pkg/analyzer/test/src/summary/resynthesize_common.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698