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 import 'package:analyzer/analyzer.dart' as analyzer; | 5 import 'package:analyzer/analyzer.dart' as analyzer; |
6 import 'package:analyzer/dart/ast/ast.dart'; | 6 import 'package:analyzer/dart/ast/ast.dart'; |
7 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; | 7 import 'package:analyzer/dart/ast/standard_ast_factory.dart'; |
8 import 'package:analyzer/dart/element/type.dart' show DartType; | 8 import 'package:analyzer/dart/element/type.dart' show DartType; |
9 import 'package:analyzer/src/dart/ast/ast.dart' show FunctionBodyImpl; | 9 import 'package:analyzer/src/dart/ast/ast.dart' show FunctionBodyImpl; |
10 import 'package:analyzer/src/dart/ast/utilities.dart' show NodeReplacer; | 10 import 'package:analyzer/src/dart/ast/utilities.dart' show NodeReplacer; |
(...skipping 14 matching lines...) Expand all Loading... |
25 | 25 |
26 CoercionReifier._(); | 26 CoercionReifier._(); |
27 | 27 |
28 /// Transforms the given compilation units, and returns a new AST with | 28 /// Transforms the given compilation units, and returns a new AST with |
29 /// explicit coercion nodes in appropriate places. | 29 /// explicit coercion nodes in appropriate places. |
30 static List<CompilationUnit> reify(List<CompilationUnit> units) { | 30 static List<CompilationUnit> reify(List<CompilationUnit> units) { |
31 var cr = new CoercionReifier._(); | 31 var cr = new CoercionReifier._(); |
32 return units.map(cr.visitCompilationUnit).toList(growable: false); | 32 return units.map(cr.visitCompilationUnit).toList(growable: false); |
33 } | 33 } |
34 | 34 |
35 /// Returns true if the `as` [node] was created by this class. | 35 /// True if the `as` [node] is a required runtime check for soundness. |
36 // TODO(sra): Find a better way to recognize reified coercion, since we | 36 // TODO(sra): Find a better way to recognize reified coercion, since we |
37 // can't set the isSynthetic attribute. | 37 // can't set the isSynthetic attribute. |
38 static bool isImplicitCast(AsExpression node) => node.asOperator.offset == 0; | 38 static bool isRequiredForSoundness(AsExpression node) => |
| 39 node.asOperator.offset == 0; |
39 | 40 |
40 /// Creates an implicit cast for expression [e] to [toType]. | 41 /// Creates an implicit cast for expression [e] to [toType]. |
41 static Expression castExpression(Expression e, DartType toType) { | 42 static Expression castExpression(Expression e, DartType toType) { |
42 // We use an empty name in the AST, because the JS code generator only cares | 43 // We use an empty name in the AST, because the JS code generator only cares |
43 // about the target type. It does not look at the AST name. | 44 // about the target type. It does not look at the AST name. |
44 var typeName = | 45 var typeName = |
45 astFactory.typeName(AstBuilder.identifierFromString(''), null); | 46 astFactory.typeName(AstBuilder.identifierFromString(''), null); |
46 typeName.type = toType; | 47 typeName.type = toType; |
47 var cast = AstBuilder.asExpression(e, typeName); | 48 var cast = AstBuilder.asExpression(e, typeName); |
48 cast.staticType = toType; | 49 cast.staticType = toType; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 ResolutionCopier.copyResolutionData(node, copy); | 126 ResolutionCopier.copyResolutionData(node, copy); |
126 return copy; | 127 return copy; |
127 } | 128 } |
128 } | 129 } |
129 | 130 |
130 class _TreeCloner extends analyzer.AstCloner { | 131 class _TreeCloner extends analyzer.AstCloner { |
131 void _cloneProperties(AstNode clone, AstNode node) { | 132 void _cloneProperties(AstNode clone, AstNode node) { |
132 if (clone is Expression) { | 133 if (clone is Expression) { |
133 ast_properties.setImplicitCast( | 134 ast_properties.setImplicitCast( |
134 clone, ast_properties.getImplicitCast(node)); | 135 clone, ast_properties.getImplicitCast(node)); |
| 136 ast_properties.setImplicitOperationCast( |
| 137 clone, ast_properties.getImplicitOperationCast(node)); |
135 ast_properties.setIsDynamicInvoke( | 138 ast_properties.setIsDynamicInvoke( |
136 clone, ast_properties.isDynamicInvoke(node)); | 139 clone, ast_properties.isDynamicInvoke(node)); |
137 } | 140 } |
| 141 if (clone is ClassDeclaration) { |
| 142 ast_properties.setClassCovariantParameters( |
| 143 clone, ast_properties.getClassCovariantParameters(node)); |
| 144 ast_properties.setSuperclassCovariantParameters( |
| 145 clone, ast_properties.getSuperclassCovariantParameters(node)); |
| 146 } |
138 } | 147 } |
139 | 148 |
140 @override | 149 @override |
141 /*=E*/ cloneNode/*<E extends AstNode>*/(/*=E*/ node) { | 150 /*=E*/ cloneNode/*<E extends AstNode>*/(/*=E*/ node) { |
142 var clone = super.cloneNode(node); | 151 var clone = super.cloneNode(node); |
143 _cloneProperties(clone, node); | 152 _cloneProperties(clone, node); |
144 return clone; | 153 return clone; |
145 } | 154 } |
146 | 155 |
147 @override | 156 @override |
(...skipping 25 matching lines...) Expand all Loading... |
173 | 182 |
174 // TODO(jmesserly): workaround for | 183 // TODO(jmesserly): workaround for |
175 // https://github.com/dart-lang/sdk/issues/26368 | 184 // https://github.com/dart-lang/sdk/issues/26368 |
176 @override | 185 @override |
177 TypeName visitTypeName(TypeName node) { | 186 TypeName visitTypeName(TypeName node) { |
178 var clone = super.visitTypeName(node); | 187 var clone = super.visitTypeName(node); |
179 clone.type = node.type; | 188 clone.type = node.type; |
180 return clone; | 189 return clone; |
181 } | 190 } |
182 } | 191 } |
OLD | NEW |