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

Side by Side Diff: lib/src/codegen/reify_coercions.dart

Issue 1172453002: fixes #209, remove tree mutation from CodeChecker (Closed) Base URL: git@github.com:dart-lang/dev_compiler.git@master
Patch Set: Created 5 years, 6 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 dev_compiler.src.codegen.reify_coercions; 5 library dev_compiler.src.codegen.reify_coercions;
6 6
7 import 'package:analyzer/analyzer.dart' as analyzer; 7 import 'package:analyzer/analyzer.dart' as analyzer;
8 import 'package:analyzer/src/generated/ast.dart'; 8 import 'package:analyzer/src/generated/ast.dart';
9 import 'package:analyzer/src/generated/element.dart'; 9 import 'package:analyzer/src/generated/element.dart';
10 import 'package:logging/logging.dart' as logger; 10 import 'package:logging/logging.dart' as logger;
(...skipping 27 matching lines...) Expand all
38 } 38 }
39 39
40 class _Inference extends DownwardsInference { 40 class _Inference extends DownwardsInference {
41 TypeManager _tm; 41 TypeManager _tm;
42 42
43 _Inference(TypeRules rules, this._tm) : super(rules); 43 _Inference(TypeRules rules, this._tm) : super(rules);
44 44
45 @override 45 @override
46 void annotateCastFromDynamic(Expression e, DartType t) { 46 void annotateCastFromDynamic(Expression e, DartType t) {
47 var cast = Coercion.cast(e.staticType, t); 47 var cast = Coercion.cast(e.staticType, t);
48 var node = new DynamicCast(rules, e, cast); 48 var info = new DynamicCast(rules, e, cast);
49 if (!NodeReplacer.replace(e, node)) { 49 CoercionInfo.set(e, info);
50 _log.severe("Failed to replace node for DownCast");
51 }
52 } 50 }
53 51
54 @override 52 @override
55 void annotateListLiteral(ListLiteral e, List<DartType> targs) { 53 void annotateListLiteral(ListLiteral e, List<DartType> targs) {
56 var tNames = targs.map(_tm.typeNameFromDartType).toList(); 54 var tNames = targs.map(_tm.typeNameFromDartType).toList();
57 e.typeArguments = AstBuilder.typeArgumentList(tNames); 55 e.typeArguments = AstBuilder.typeArgumentList(tNames);
58 var listT = rules.provider.listType.substitute4(targs); 56 var listT = rules.provider.listType.substitute4(targs);
59 e.staticType = listT; 57 e.staticType = listT;
60 } 58 }
61 59
(...skipping 21 matching lines...) Expand all
83 81
84 @override 82 @override
85 void annotateFunctionExpression(FunctionExpression e, DartType returnType) { 83 void annotateFunctionExpression(FunctionExpression e, DartType returnType) {
86 // Implicitly changes e.staticType 84 // Implicitly changes e.staticType
87 (e.element as ExecutableElementImpl).returnType = returnType; 85 (e.element as ExecutableElementImpl).returnType = returnType;
88 } 86 }
89 } 87 }
90 88
91 // This class implements a pass which modifies (in place) the ast replacing 89 // This class implements a pass which modifies (in place) the ast replacing
92 // abstract coercion nodes with their dart implementations. 90 // abstract coercion nodes with their dart implementations.
93 class CoercionReifier extends analyzer.GeneralizingAstVisitor<Object> 91 class CoercionReifier extends analyzer.GeneralizingAstVisitor<Object> {
94 with ConversionVisitor<Object> {
95 final CoercionManager _cm; 92 final CoercionManager _cm;
96 final TypeManager _tm; 93 final TypeManager _tm;
97 final VariableManager _vm; 94 final VariableManager _vm;
98 final LibraryUnit _library; 95 final LibraryUnit _library;
99 final _Inference _inferrer; 96 final _Inference _inferrer;
100 97
101 CoercionReifier._( 98 CoercionReifier._(
102 this._cm, this._tm, this._vm, this._library, this._inferrer); 99 this._cm, this._tm, this._vm, this._library, this._inferrer);
103 100
104 factory CoercionReifier(LibraryUnit library, AbstractCompiler compiler) { 101 factory CoercionReifier(LibraryUnit library, AbstractCompiler compiler) {
(...skipping 10 matching lines...) Expand all
115 // Returns the set of new type identifiers added by the reifier 112 // Returns the set of new type identifiers added by the reifier
116 Map<Identifier, NewTypeIdDesc> reify() { 113 Map<Identifier, NewTypeIdDesc> reify() {
117 _library.partsThenLibrary.forEach(generateUnit); 114 _library.partsThenLibrary.forEach(generateUnit);
118 return _tm.addedTypes; 115 return _tm.addedTypes;
119 } 116 }
120 117
121 void generateUnit(CompilationUnit unit) { 118 void generateUnit(CompilationUnit unit) {
122 visitCompilationUnit(unit); 119 visitCompilationUnit(unit);
123 } 120 }
124 121
122 @override
123 Object visitExpression(Expression node) {
124 var info = CoercionInfo.get(node);
125 if (info is InferredTypeBase) {
126 return _visitInferredTypeBase(info);
127 } else if (info is DownCast) {
128 return _visitDownCast(info);
129 }
130 return super.visitExpression(node);
131 }
132
125 ///////////////// Private ////////////////////////////////// 133 ///////////////// Private //////////////////////////////////
126 134
127 @override 135 Object _visitInferredTypeBase(InferredTypeBase node) {
128 Object visitInferredTypeBase(InferredTypeBase node) {
129 var expr = node.node; 136 var expr = node.node;
130 var b = _inferrer.inferExpression(expr, node.type, <String>[]); 137 var success = _inferrer.inferExpression(expr, node.type, <String>[]);
131 assert(b); 138 assert(success);
132 if (!NodeReplacer.replace(node, expr)) { 139 expr.visitChildren(this);
133 _log.severe("Failed to replace node for InferredType");
134 }
135 expr.accept(this);
136 return null; 140 return null;
137 } 141 }
138 142
139 @override 143 Object _visitDownCast(DownCast node) {
140 Object visitDownCast(DownCast node) { 144 var expr = node.node;
141 Expression castNode = _cm.coerceExpression(node.node, node.cast); 145 var parent = expr.parent;
142 if (!NodeReplacer.replace(node, castNode)) { 146 expr.visitChildren(this);
143 _log.severe("Failed to replace node for DownCast"); 147 Expression newE = _cm.coerceExpression(expr, node.cast);
148 if (!identical(expr, newE)) {
149 var replaced = parent.accept(new NodeReplacer(expr, newE));
150 // It looks like NodeReplacer will always return true.
151 // It does throw IllegalArgumentException though, if child is not found.
152 assert(replaced);
144 } 153 }
145 castNode.accept(this);
146 return null; 154 return null;
147 } 155 }
148 156
149 Object visitCompilationUnit(CompilationUnit unit) { 157 Object visitCompilationUnit(CompilationUnit unit) {
150 _cm.enterCompilationUnit(unit); 158 _cm.enterCompilationUnit(unit);
151 Object ret = super.visitCompilationUnit(unit); 159 Object ret = super.visitCompilationUnit(unit);
152 _cm.exitCompilationUnit(unit); 160 _cm.exitCompilationUnit(unit);
153 return ret; 161 return ret;
154 } 162 }
155 } 163 }
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
490 var t = _mkNewTypeName(dType, id, args); 498 var t = _mkNewTypeName(dType, id, args);
491 return t; 499 return t;
492 } 500 }
493 501
494 TypeName _mkNewTypeName(DartType type, Identifier id, List<TypeName> args) { 502 TypeName _mkNewTypeName(DartType type, Identifier id, List<TypeName> args) {
495 var t = AstBuilder.typeName(id, args); 503 var t = AstBuilder.typeName(id, args);
496 t.type = type; 504 t.type = type;
497 return t; 505 return t;
498 } 506 }
499 } 507 }
OLDNEW
« no previous file with comments | « lib/src/codegen/js_codegen.dart ('k') | lib/src/info.dart » ('j') | lib/src/testing.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698