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