| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library kernel.analyzer.ast_from_analyzer; | 4 library kernel.analyzer.ast_from_analyzer; |
| 5 | 5 |
| 6 import 'package:kernel/ast.dart' as ast; | 6 import 'package:kernel/ast.dart' as ast; |
| 7 import 'package:kernel/frontend/accessors.dart'; | 7 import 'package:kernel/frontend/accessors.dart'; |
| 8 import 'package:kernel/frontend/super_initializers.dart'; | 8 import 'package:kernel/frontend/super_initializers.dart'; |
| 9 import 'package:kernel/log.dart'; | 9 import 'package:kernel/log.dart'; |
| 10 import 'package:kernel/type_algebra.dart'; | 10 import 'package:kernel/type_algebra.dart'; |
| (...skipping 1399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1410 return node.leftBracket.offset; | 1410 return node.leftBracket.offset; |
| 1411 } | 1411 } |
| 1412 return node.offset; | 1412 return node.offset; |
| 1413 } | 1413 } |
| 1414 | 1414 |
| 1415 Accessor buildLeftHandValue(Expression node) { | 1415 Accessor buildLeftHandValue(Expression node) { |
| 1416 var result = node.accept(this); | 1416 var result = node.accept(this); |
| 1417 if (result is Accessor) { | 1417 if (result is Accessor) { |
| 1418 return result; | 1418 return result; |
| 1419 } else { | 1419 } else { |
| 1420 return new ReadOnlyAccessor(result); | 1420 return new ReadOnlyAccessor(result, ast.TreeNode.noOffset); |
| 1421 } | 1421 } |
| 1422 } | 1422 } |
| 1423 | 1423 |
| 1424 ast.Expression visitAsExpression(AsExpression node) { | 1424 ast.Expression visitAsExpression(AsExpression node) { |
| 1425 return new ast.AsExpression( | 1425 return new ast.AsExpression( |
| 1426 build(node.expression), scope.buildTypeAnnotation(node.type)); | 1426 build(node.expression), scope.buildTypeAnnotation(node.type)); |
| 1427 } | 1427 } |
| 1428 | 1428 |
| 1429 ast.Expression visitAssignmentExpression(AssignmentExpression node) { | 1429 ast.Expression visitAssignmentExpression(AssignmentExpression node) { |
| 1430 bool voidContext = isInVoidContext(node); | 1430 bool voidContext = isInVoidContext(node); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1720 scope.resolveInterfaceSet(element, auxiliary)); | 1720 scope.resolveInterfaceSet(element, auxiliary)); |
| 1721 | 1721 |
| 1722 case ElementKind.FUNCTION: | 1722 case ElementKind.FUNCTION: |
| 1723 FunctionElement function = element; | 1723 FunctionElement function = element; |
| 1724 if (isTopLevelFunction(function)) { | 1724 if (isTopLevelFunction(function)) { |
| 1725 return scope.staticAccess(node.name, function); | 1725 return scope.staticAccess(node.name, function); |
| 1726 } | 1726 } |
| 1727 if (function == function.library.loadLibraryFunction) { | 1727 if (function == function.library.loadLibraryFunction) { |
| 1728 return scope.unsupportedFeature('Deferred loading'); | 1728 return scope.unsupportedFeature('Deferred loading'); |
| 1729 } | 1729 } |
| 1730 return new VariableAccessor(scope.getVariableReference(function)); | 1730 return new VariableAccessor( |
| 1731 scope.getVariableReference(function), null, ast.TreeNode.noOffset); |
| 1731 | 1732 |
| 1732 case ElementKind.LOCAL_VARIABLE: | 1733 case ElementKind.LOCAL_VARIABLE: |
| 1733 case ElementKind.PARAMETER: | 1734 case ElementKind.PARAMETER: |
| 1734 VariableElement variable = element; | 1735 VariableElement variable = element; |
| 1735 var type = identical(node.staticType, variable.type) | 1736 var type = identical(node.staticType, variable.type) |
| 1736 ? null | 1737 ? null |
| 1737 : scope.buildType(node.staticType); | 1738 : scope.buildType(node.staticType); |
| 1738 return new VariableAccessor(scope.getVariableReference(element), type); | 1739 return new VariableAccessor( |
| 1740 scope.getVariableReference(element), type, ast.TreeNode.noOffset); |
| 1739 | 1741 |
| 1740 case ElementKind.IMPORT: | 1742 case ElementKind.IMPORT: |
| 1741 case ElementKind.LIBRARY: | 1743 case ElementKind.LIBRARY: |
| 1742 case ElementKind.PREFIX: | 1744 case ElementKind.PREFIX: |
| 1743 return scope.emitCompileTimeError( | 1745 return scope.emitCompileTimeError( |
| 1744 CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT, | 1746 CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT, |
| 1745 [node.name]); | 1747 [node.name]); |
| 1746 | 1748 |
| 1747 case ElementKind.COMPILATION_UNIT: | 1749 case ElementKind.COMPILATION_UNIT: |
| 1748 case ElementKind.CONSTRUCTOR: | 1750 case ElementKind.CONSTRUCTOR: |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1762 return IndexAccessor.make( | 1764 return IndexAccessor.make( |
| 1763 makeCascadeReceiver(), | 1765 makeCascadeReceiver(), |
| 1764 build(node.index), | 1766 build(node.index), |
| 1765 scope.resolveInterfaceIndexGet(element, auxiliary), | 1767 scope.resolveInterfaceIndexGet(element, auxiliary), |
| 1766 scope.resolveInterfaceIndexSet(element, auxiliary)); | 1768 scope.resolveInterfaceIndexSet(element, auxiliary)); |
| 1767 } else if (node.target is SuperExpression) { | 1769 } else if (node.target is SuperExpression) { |
| 1768 scope.addTransformerFlag(TransformerFlag.superCalls); | 1770 scope.addTransformerFlag(TransformerFlag.superCalls); |
| 1769 return new SuperIndexAccessor( | 1771 return new SuperIndexAccessor( |
| 1770 build(node.index), | 1772 build(node.index), |
| 1771 scope.resolveConcreteIndexGet(element, auxiliary), | 1773 scope.resolveConcreteIndexGet(element, auxiliary), |
| 1772 scope.resolveConcreteIndexSet(element, auxiliary)); | 1774 scope.resolveConcreteIndexSet(element, auxiliary), |
| 1775 ast.TreeNode.noOffset); |
| 1773 } else { | 1776 } else { |
| 1774 return IndexAccessor.make( | 1777 return IndexAccessor.make( |
| 1775 build(node.target), | 1778 build(node.target), |
| 1776 build(node.index), | 1779 build(node.index), |
| 1777 scope.resolveInterfaceIndexGet(element, auxiliary), | 1780 scope.resolveInterfaceIndexGet(element, auxiliary), |
| 1778 scope.resolveInterfaceIndexSet(element, auxiliary)); | 1781 scope.resolveInterfaceIndexSet(element, auxiliary)); |
| 1779 } | 1782 } |
| 1780 } | 1783 } |
| 1781 | 1784 |
| 1782 /// Follows any number of redirecting factories, returning the effective | 1785 /// Follows any number of redirecting factories, returning the effective |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2082 var setter = scope.resolveInterfaceSet(element, auxiliary); | 2085 var setter = scope.resolveInterfaceSet(element, auxiliary); |
| 2083 Expression target = node.target; | 2086 Expression target = node.target; |
| 2084 if (node.isCascaded) { | 2087 if (node.isCascaded) { |
| 2085 return PropertyAccessor.make(makeCascadeReceiver(), | 2088 return PropertyAccessor.make(makeCascadeReceiver(), |
| 2086 scope.buildName(node.propertyName), getter, setter); | 2089 scope.buildName(node.propertyName), getter, setter); |
| 2087 } else if (node.target is SuperExpression) { | 2090 } else if (node.target is SuperExpression) { |
| 2088 scope.addTransformerFlag(TransformerFlag.superCalls); | 2091 scope.addTransformerFlag(TransformerFlag.superCalls); |
| 2089 return new SuperPropertyAccessor( | 2092 return new SuperPropertyAccessor( |
| 2090 scope.buildName(node.propertyName), | 2093 scope.buildName(node.propertyName), |
| 2091 scope.resolveConcreteGet(element, auxiliary), | 2094 scope.resolveConcreteGet(element, auxiliary), |
| 2092 scope.resolveConcreteSet(element, auxiliary)); | 2095 scope.resolveConcreteSet(element, auxiliary), |
| 2096 ast.TreeNode.noOffset); |
| 2093 } else if (target is Identifier && target.staticElement is ClassElement) { | 2097 } else if (target is Identifier && target.staticElement is ClassElement) { |
| 2094 // Note that this case also covers null-aware static access on a class, | 2098 // Note that this case also covers null-aware static access on a class, |
| 2095 // which is equivalent to a regular static access. | 2099 // which is equivalent to a regular static access. |
| 2096 return scope.staticAccess(node.propertyName.name, element, auxiliary); | 2100 return scope.staticAccess(node.propertyName.name, element, auxiliary); |
| 2097 } else if (node.operator.value() == '?.') { | 2101 } else if (node.operator.value() == '?.') { |
| 2098 return new NullAwarePropertyAccessor( | 2102 return new NullAwarePropertyAccessor( |
| 2099 build(target), | 2103 build(target), |
| 2100 scope.buildName(node.propertyName), | 2104 scope.buildName(node.propertyName), |
| 2101 getter, | 2105 getter, |
| 2102 setter, | 2106 setter, |
| 2103 scope.buildType(node.staticType)); | 2107 scope.buildType(node.staticType), |
| 2108 ast.TreeNode.noOffset); |
| 2104 } else { | 2109 } else { |
| 2105 return PropertyAccessor.make( | 2110 return PropertyAccessor.make( |
| 2106 build(target), scope.buildName(node.propertyName), getter, setter); | 2111 build(target), scope.buildName(node.propertyName), getter, setter); |
| 2107 } | 2112 } |
| 2108 } | 2113 } |
| 2109 | 2114 |
| 2110 ast.Expression visitRethrowExpression(RethrowExpression node) { | 2115 ast.Expression visitRethrowExpression(RethrowExpression node) { |
| 2111 return new ast.Rethrow(); | 2116 return new ast.Rethrow(); |
| 2112 } | 2117 } |
| 2113 | 2118 |
| (...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2997 } | 3002 } |
| 2998 | 3003 |
| 2999 /// A [StaticAccessor] that throws a NoSuchMethodError when a suitable target | 3004 /// A [StaticAccessor] that throws a NoSuchMethodError when a suitable target |
| 3000 /// could not be resolved. | 3005 /// could not be resolved. |
| 3001 class _StaticAccessor extends StaticAccessor { | 3006 class _StaticAccessor extends StaticAccessor { |
| 3002 final ExpressionScope scope; | 3007 final ExpressionScope scope; |
| 3003 final String name; | 3008 final String name; |
| 3004 | 3009 |
| 3005 _StaticAccessor( | 3010 _StaticAccessor( |
| 3006 this.scope, this.name, ast.Member readTarget, ast.Member writeTarget) | 3011 this.scope, this.name, ast.Member readTarget, ast.Member writeTarget) |
| 3007 : super(readTarget, writeTarget); | 3012 : super(readTarget, writeTarget, ast.TreeNode.noOffset); |
| 3008 | 3013 |
| 3009 @override | 3014 @override |
| 3010 makeInvalidRead() { | 3015 makeInvalidRead() { |
| 3011 return scope.buildThrowNoSuchMethodError( | 3016 return scope.buildThrowNoSuchMethodError( |
| 3012 new ast.NullLiteral(), name, new ast.Arguments([])); | 3017 new ast.NullLiteral(), name, new ast.Arguments([])); |
| 3013 } | 3018 } |
| 3014 | 3019 |
| 3015 @override | 3020 @override |
| 3016 makeInvalidWrite(ast.Expression value) { | 3021 makeInvalidWrite(ast.Expression value) { |
| 3017 return scope.buildThrowNoSuchMethodError( | 3022 return scope.buildThrowNoSuchMethodError( |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3073 if (list[i - 1].compareTo(item) == 0) { | 3078 if (list[i - 1].compareTo(item) == 0) { |
| 3074 ++deleted; | 3079 ++deleted; |
| 3075 } else if (deleted > 0) { | 3080 } else if (deleted > 0) { |
| 3076 list[i - deleted] = item; | 3081 list[i - deleted] = item; |
| 3077 } | 3082 } |
| 3078 } | 3083 } |
| 3079 if (deleted > 0) { | 3084 if (deleted > 0) { |
| 3080 list.length -= deleted; | 3085 list.length -= deleted; |
| 3081 } | 3086 } |
| 3082 } | 3087 } |
| OLD | NEW |