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

Unified Diff: pkg/dev_compiler/lib/src/compiler/reify_coercions.dart

Issue 2362563004: re-land fix #27110 with proper DDC side of changes (Closed)
Patch Set: add tests Created 4 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/dev_compiler/lib/src/compiler/code_generator.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/dev_compiler/lib/src/compiler/reify_coercions.dart
diff --git a/pkg/dev_compiler/lib/src/compiler/reify_coercions.dart b/pkg/dev_compiler/lib/src/compiler/reify_coercions.dart
index dd87fde4404b53cac8be34f9b97e0a1b13b51eb6..9d0492b1a07ee79a5ed2b3b55431682c0ef2b426 100644
--- a/pkg/dev_compiler/lib/src/compiler/reify_coercions.dart
+++ b/pkg/dev_compiler/lib/src/compiler/reify_coercions.dart
@@ -31,6 +31,23 @@ class CoercionReifier extends analyzer.GeneralizingAstVisitor<Object> {
return units.map(cr.visitCompilationUnit).toList(growable: false);
}
+
+ /// Returns true if the `as` [node] was created by this class.
+ // TODO(sra): Find a better way to recognize reified coercion, since we
+ // can't set the isSynthetic attribute.
+ static bool isImplicitCast(AsExpression node) => node.asOperator.offset == 0;
+
+ /// Creates an implicit cast for expression [e] to [toType].
+ static Expression castExpression(Expression e, DartType toType) {
+ // We use an empty name in the AST, because the JS code generator only cares
+ // about the target type. It does not look at the AST name.
+ var typeName = new TypeName(AstBuilder.identifierFromString(''), null);
+ typeName.type = toType;
+ var cast = AstBuilder.asExpression(e, typeName);
+ cast.staticType = toType;
+ return cast;
+ }
+
@override
CompilationUnit visitCompilationUnit(CompilationUnit node) {
if (ast_properties.hasImplicitCasts(node)) {
@@ -47,7 +64,7 @@ class CoercionReifier extends analyzer.GeneralizingAstVisitor<Object> {
var castType = ast_properties.getImplicitCast(node);
if (castType != null) {
- _replaceNode(node.parent, node, _castExpression(node, castType));
+ _replaceNode(node.parent, node, castExpression(node, castType));
}
}
@@ -79,7 +96,7 @@ class CoercionReifier extends analyzer.GeneralizingAstVisitor<Object> {
// Build the cast. We will place this cast in the body, so need to clone
// the variable's AST node and clear out its static type (otherwise we
// will optimize away the cast).
- var cast = _castExpression(
+ var cast = castExpression(
_clone(variable)..staticType = DynamicTypeImpl.instance, castType);
var body = node.body;
@@ -102,16 +119,6 @@ class CoercionReifier extends analyzer.GeneralizingAstVisitor<Object> {
}
}
- Expression _castExpression(Expression e, DartType toType) {
- // We use an empty name in the AST, because the JS code generator only cares
- // about the target type. It does not look at the AST name.
- var typeName = new TypeName(AstBuilder.identifierFromString(''), null);
- typeName.type = toType;
- var cast = AstBuilder.asExpression(e, typeName);
- cast.staticType = toType;
- return cast;
- }
-
/*=T*/ _clone/*<T extends AstNode>*/(/*=T*/ node) {
var copy = node.accept(cloner) as dynamic/*=T*/;
ResolutionCopier.copyResolutionData(node, copy);
« no previous file with comments | « pkg/dev_compiler/lib/src/compiler/code_generator.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698