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

Side by Side Diff: pkg/compiler/lib/src/ssa/kernel_impact.dart

Issue 2655263002: Rename KernelWorldBuilder to KernelElementAdapter. (Closed)
Patch Set: Created 3 years, 11 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
« no previous file with comments | « pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 4
5 import 'package:kernel/ast.dart' as ir; 5 import 'package:kernel/ast.dart' as ir;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common/names.dart'; 8 import '../common/names.dart';
9 import '../compiler.dart'; 9 import '../compiler.dart';
10 import '../constants/expressions.dart'; 10 import '../constants/expressions.dart';
11 import '../core_types.dart'; 11 import '../core_types.dart';
12 import '../elements/types.dart'; 12 import '../elements/types.dart';
13 import '../elements/elements.dart' show AstElement, ResolvedAst; 13 import '../elements/elements.dart' show AstElement, ResolvedAst;
14 import '../elements/entities.dart'; 14 import '../elements/entities.dart';
15 import '../js_backend/backend.dart' show JavaScriptBackend; 15 import '../js_backend/backend.dart' show JavaScriptBackend;
16 import '../kernel/element_adapter.dart';
16 import '../kernel/kernel.dart'; 17 import '../kernel/kernel.dart';
17 import '../kernel/kernel_debug.dart'; 18 import '../kernel/kernel_debug.dart';
18 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder; 19 import '../resolution/registry.dart' show ResolutionWorldImpactBuilder;
19 import '../universe/call_structure.dart'; 20 import '../universe/call_structure.dart';
20 import '../universe/feature.dart'; 21 import '../universe/feature.dart';
21 import '../universe/selector.dart'; 22 import '../universe/selector.dart';
22 import '../universe/use.dart'; 23 import '../universe/use.dart';
23 24
24 import 'kernel_ast_adapter.dart'; 25 import 'kernel_ast_adapter.dart';
25 import '../common/resolution.dart'; 26 import '../common/resolution.dart';
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 return builder.buildField(field); 60 return builder.buildField(field);
60 } 61 }
61 } else { 62 } else {
62 throw new UnsupportedError("Unsupported element: $element"); 63 throw new UnsupportedError("Unsupported element: $element");
63 } 64 }
64 }); 65 });
65 } 66 }
66 67
67 class KernelImpactBuilder extends ir.Visitor { 68 class KernelImpactBuilder extends ir.Visitor {
68 final ResolutionWorldImpactBuilder impactBuilder; 69 final ResolutionWorldImpactBuilder impactBuilder;
69 final KernelWorldBuilder astAdapter; 70 final KernelElementAdapter elementAdapter;
70 final CommonElements commonElements; 71 final CommonElements commonElements;
71 72
72 KernelImpactBuilder(String name, this.astAdapter, this.commonElements) 73 KernelImpactBuilder(String name, this.elementAdapter, this.commonElements)
73 : this.impactBuilder = new ResolutionWorldImpactBuilder(name); 74 : this.impactBuilder = new ResolutionWorldImpactBuilder(name);
74 75
75 /// Add a checked-mode type use of [type] if it is not `dynamic`. 76 /// Add a checked-mode type use of [type] if it is not `dynamic`.
76 DartType checkType(ir.DartType irType) { 77 DartType checkType(ir.DartType irType) {
77 DartType type = astAdapter.getDartType(irType); 78 DartType type = elementAdapter.getDartType(irType);
78 if (!type.isDynamic) { 79 if (!type.isDynamic) {
79 impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type)); 80 impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type));
80 } 81 }
81 return type; 82 return type;
82 } 83 }
83 84
84 /// Add checked-mode type use for the parameter type and constant for the 85 /// Add checked-mode type use for the parameter type and constant for the
85 /// default value of [parameter]. 86 /// default value of [parameter].
86 void handleParameter(ir.VariableDeclaration parameter) { 87 void handleParameter(ir.VariableDeclaration parameter) {
87 checkType(parameter.type); 88 checkType(parameter.type);
(...skipping 14 matching lines...) Expand all
102 checkType(field.type); 103 checkType(field.type);
103 if (field.initializer != null) { 104 if (field.initializer != null) {
104 visitNode(field.initializer); 105 visitNode(field.initializer);
105 if (!field.isInstanceMember && 106 if (!field.isInstanceMember &&
106 !field.isConst && 107 !field.isConst &&
107 field.initializer is! ir.NullLiteral) { 108 field.initializer is! ir.NullLiteral) {
108 impactBuilder.registerFeature(Feature.LAZY_FIELD); 109 impactBuilder.registerFeature(Feature.LAZY_FIELD);
109 } 110 }
110 } 111 }
111 if (field.isInstanceMember && 112 if (field.isInstanceMember &&
112 astAdapter.isNativeClass(field.enclosingClass)) { 113 elementAdapter.isNativeClass(field.enclosingClass)) {
113 impactBuilder 114 impactBuilder.registerNativeData(
114 .registerNativeData(astAdapter.getNativeBehaviorForFieldLoad(field)); 115 elementAdapter.getNativeBehaviorForFieldLoad(field));
115 impactBuilder 116 impactBuilder.registerNativeData(
116 .registerNativeData(astAdapter.getNativeBehaviorForFieldStore(field)); 117 elementAdapter.getNativeBehaviorForFieldStore(field));
117 } 118 }
118 return impactBuilder; 119 return impactBuilder;
119 } 120 }
120 121
121 ResolutionImpact buildConstructor(ir.Constructor constructor) { 122 ResolutionImpact buildConstructor(ir.Constructor constructor) {
122 handleSignature(constructor.function, checkReturnType: false); 123 handleSignature(constructor.function, checkReturnType: false);
123 visitNodes(constructor.initializers); 124 visitNodes(constructor.initializers);
124 visitNode(constructor.function.body); 125 visitNode(constructor.function.body);
125 return impactBuilder; 126 return impactBuilder;
126 } 127 }
(...skipping 11 matching lines...) Expand all
138 impactBuilder.registerFeature(Feature.ASYNC); 139 impactBuilder.registerFeature(Feature.ASYNC);
139 break; 140 break;
140 case ir.AsyncMarker.AsyncStar: 141 case ir.AsyncMarker.AsyncStar:
141 impactBuilder.registerFeature(Feature.ASYNC_STAR); 142 impactBuilder.registerFeature(Feature.ASYNC_STAR);
142 break; 143 break;
143 case ir.AsyncMarker.SyncYielding: 144 case ir.AsyncMarker.SyncYielding:
144 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE, 145 throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
145 "Unexpected async marker: ${procedure.function.asyncMarker}"); 146 "Unexpected async marker: ${procedure.function.asyncMarker}");
146 } 147 }
147 if (procedure.isExternal && 148 if (procedure.isExternal &&
148 !astAdapter.isForeignLibrary(procedure.enclosingLibrary)) { 149 !elementAdapter.isForeignLibrary(procedure.enclosingLibrary)) {
149 impactBuilder 150 impactBuilder.registerNativeData(
150 .registerNativeData(astAdapter.getNativeBehaviorForMethod(procedure)); 151 elementAdapter.getNativeBehaviorForMethod(procedure));
151 } 152 }
152 return impactBuilder; 153 return impactBuilder;
153 } 154 }
154 155
155 void visitNode(ir.Node node) => node?.accept(this); 156 void visitNode(ir.Node node) => node?.accept(this);
156 157
157 void visitNodes(Iterable<ir.Node> nodes) { 158 void visitNodes(Iterable<ir.Node> nodes) {
158 nodes.forEach(visitNode); 159 nodes.forEach(visitNode);
159 } 160 }
160 161
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 } 246 }
246 247
247 @override 248 @override
248 void visitConstructorInvocation(ir.ConstructorInvocation node) { 249 void visitConstructorInvocation(ir.ConstructorInvocation node) {
249 handleNew(node, node.target, isConst: node.isConst); 250 handleNew(node, node.target, isConst: node.isConst);
250 } 251 }
251 252
252 void handleNew(ir.InvocationExpression node, ir.Member target, 253 void handleNew(ir.InvocationExpression node, ir.Member target,
253 {bool isConst: false}) { 254 {bool isConst: false}) {
254 _visitArguments(node.arguments); 255 _visitArguments(node.arguments);
255 FunctionEntity constructor = astAdapter.getConstructor(target); 256 FunctionEntity constructor = elementAdapter.getConstructor(target);
256 InterfaceType type = astAdapter.createInterfaceType( 257 InterfaceType type = elementAdapter.createInterfaceType(
257 target.enclosingClass, node.arguments.types); 258 target.enclosingClass, node.arguments.types);
258 CallStructure callStructure = astAdapter.getCallStructure(node.arguments); 259 CallStructure callStructure =
260 elementAdapter.getCallStructure(node.arguments);
259 impactBuilder.registerStaticUse(isConst 261 impactBuilder.registerStaticUse(isConst
260 ? new StaticUse.constConstructorInvoke(constructor, callStructure, type) 262 ? new StaticUse.constConstructorInvoke(constructor, callStructure, type)
261 : new StaticUse.typedConstructorInvoke( 263 : new StaticUse.typedConstructorInvoke(
262 constructor, callStructure, type)); 264 constructor, callStructure, type));
263 if (type.typeArguments.any((DartType type) => !type.isDynamic)) { 265 if (type.typeArguments.any((DartType type) => !type.isDynamic)) {
264 impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK); 266 impactBuilder.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK);
265 } 267 }
266 } 268 }
267 269
268 @override 270 @override
269 void visitSuperInitializer(ir.SuperInitializer node) { 271 void visitSuperInitializer(ir.SuperInitializer node) {
270 FunctionEntity target = astAdapter.getConstructor(node.target); 272 FunctionEntity target = elementAdapter.getConstructor(node.target);
271 _visitArguments(node.arguments); 273 _visitArguments(node.arguments);
272 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( 274 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
273 target, astAdapter.getCallStructure(node.arguments))); 275 target, elementAdapter.getCallStructure(node.arguments)));
274 } 276 }
275 277
276 @override 278 @override
277 void visitStaticInvocation(ir.StaticInvocation node) { 279 void visitStaticInvocation(ir.StaticInvocation node) {
278 FunctionEntity target = astAdapter.getMethod(node.target); 280 FunctionEntity target = elementAdapter.getMethod(node.target);
279 if (node.target.kind == ir.ProcedureKind.Factory) { 281 if (node.target.kind == ir.ProcedureKind.Factory) {
280 // TODO(johnniwinther): We should not mark the type as instantiated but 282 // TODO(johnniwinther): We should not mark the type as instantiated but
281 // rather follow the type arguments directly. 283 // rather follow the type arguments directly.
282 // 284 //
283 // Consider this: 285 // Consider this:
284 // 286 //
285 // abstract class A<T> { 287 // abstract class A<T> {
286 // factory A.regular() => new B<T>(); 288 // factory A.regular() => new B<T>();
287 // factory A.redirect() = B<T>; 289 // factory A.redirect() = B<T>;
288 // } 290 // }
289 // 291 //
290 // class B<T> implements A<T> {} 292 // class B<T> implements A<T> {}
291 // 293 //
292 // main() { 294 // main() {
293 // print(new A<int>.regular() is B<int>); 295 // print(new A<int>.regular() is B<int>);
294 // print(new A<String>.redirect() is B<String>); 296 // print(new A<String>.redirect() is B<String>);
295 // } 297 // }
296 // 298 //
297 // To track that B is actually instantiated as B<int> and B<String> we 299 // To track that B is actually instantiated as B<int> and B<String> we
298 // need to follow the type arguments passed to A.regular and A.redirect 300 // need to follow the type arguments passed to A.regular and A.redirect
299 // to B. Currently, we only do this soundly if we register A<int> and 301 // to B. Currently, we only do this soundly if we register A<int> and
300 // A<String> as instantiated. We should instead register that A.T is 302 // A<String> as instantiated. We should instead register that A.T is
301 // instantiated as int and String. 303 // instantiated as int and String.
302 handleNew(node, node.target, isConst: node.isConst); 304 handleNew(node, node.target, isConst: node.isConst);
303 } else { 305 } else {
304 _visitArguments(node.arguments); 306 _visitArguments(node.arguments);
305 impactBuilder.registerStaticUse(new StaticUse.staticInvoke( 307 impactBuilder.registerStaticUse(new StaticUse.staticInvoke(
306 target, astAdapter.getCallStructure(node.arguments))); 308 target, elementAdapter.getCallStructure(node.arguments)));
307 } 309 }
308 switch (astAdapter.getForeignKind(node)) { 310 switch (elementAdapter.getForeignKind(node)) {
309 case ForeignKind.JS: 311 case ForeignKind.JS:
310 impactBuilder 312 impactBuilder.registerNativeData(
311 .registerNativeData(astAdapter.getNativeBehaviorForJsCall(node)); 313 elementAdapter.getNativeBehaviorForJsCall(node));
312 break; 314 break;
313 case ForeignKind.JS_BUILTIN: 315 case ForeignKind.JS_BUILTIN:
314 impactBuilder.registerNativeData( 316 impactBuilder.registerNativeData(
315 astAdapter.getNativeBehaviorForJsBuiltinCall(node)); 317 elementAdapter.getNativeBehaviorForJsBuiltinCall(node));
316 break; 318 break;
317 case ForeignKind.JS_EMBEDDED_GLOBAL: 319 case ForeignKind.JS_EMBEDDED_GLOBAL:
318 impactBuilder.registerNativeData( 320 impactBuilder.registerNativeData(
319 astAdapter.getNativeBehaviorForJsEmbeddedGlobalCall(node)); 321 elementAdapter.getNativeBehaviorForJsEmbeddedGlobalCall(node));
320 break; 322 break;
321 case ForeignKind.JS_INTERCEPTOR_CONSTANT: 323 case ForeignKind.JS_INTERCEPTOR_CONSTANT:
322 InterfaceType type = 324 InterfaceType type =
323 astAdapter.getInterfaceTypeForJsInterceptorCall(node); 325 elementAdapter.getInterfaceTypeForJsInterceptorCall(node);
324 if (type != null) { 326 if (type != null) {
325 impactBuilder.registerTypeUse(new TypeUse.instantiation(type)); 327 impactBuilder.registerTypeUse(new TypeUse.instantiation(type));
326 } 328 }
327 break; 329 break;
328 case ForeignKind.NONE: 330 case ForeignKind.NONE:
329 break; 331 break;
330 } 332 }
331 } 333 }
332 334
333 @override 335 @override
334 void visitStaticGet(ir.StaticGet node) { 336 void visitStaticGet(ir.StaticGet node) {
335 ir.Member target = node.target; 337 ir.Member target = node.target;
336 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { 338 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
337 FunctionEntity method = astAdapter.getMethod(target); 339 FunctionEntity method = elementAdapter.getMethod(target);
338 impactBuilder.registerStaticUse(new StaticUse.staticTearOff(method)); 340 impactBuilder.registerStaticUse(new StaticUse.staticTearOff(method));
339 } else { 341 } else {
340 MemberEntity member = astAdapter.getMember(target); 342 MemberEntity member = elementAdapter.getMember(target);
341 impactBuilder.registerStaticUse(new StaticUse.staticGet(member)); 343 impactBuilder.registerStaticUse(new StaticUse.staticGet(member));
342 } 344 }
343 } 345 }
344 346
345 @override 347 @override
346 void visitStaticSet(ir.StaticSet node) { 348 void visitStaticSet(ir.StaticSet node) {
347 visitNode(node.value); 349 visitNode(node.value);
348 MemberEntity member = astAdapter.getMember(node.target); 350 MemberEntity member = elementAdapter.getMember(node.target);
349 impactBuilder.registerStaticUse(new StaticUse.staticSet(member)); 351 impactBuilder.registerStaticUse(new StaticUse.staticSet(member));
350 } 352 }
351 353
352 void handleSuperInvocation(ir.Node target, ir.Node arguments) { 354 void handleSuperInvocation(ir.Node target, ir.Node arguments) {
353 FunctionEntity method = astAdapter.getMethod(target); 355 FunctionEntity method = elementAdapter.getMethod(target);
354 _visitArguments(arguments); 356 _visitArguments(arguments);
355 impactBuilder.registerStaticUse(new StaticUse.superInvoke( 357 impactBuilder.registerStaticUse(new StaticUse.superInvoke(
356 method, astAdapter.getCallStructure(arguments))); 358 method, elementAdapter.getCallStructure(arguments)));
357 } 359 }
358 360
359 @override 361 @override
360 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) { 362 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
361 handleSuperInvocation(node.target, node.arguments); 363 handleSuperInvocation(node.target, node.arguments);
362 } 364 }
363 365
364 @override 366 @override
365 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) { 367 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) {
366 // TODO(johnniwinther): Should we support this or always use the 368 // TODO(johnniwinther): Should we support this or always use the
367 // [MixinFullResolution] transformer? 369 // [MixinFullResolution] transformer?
368 handleSuperInvocation(node.interfaceTarget, node.arguments); 370 handleSuperInvocation(node.interfaceTarget, node.arguments);
369 } 371 }
370 372
371 void handleSuperGet(ir.Member target) { 373 void handleSuperGet(ir.Member target) {
372 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { 374 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) {
373 FunctionEntity method = astAdapter.getMethod(target); 375 FunctionEntity method = elementAdapter.getMethod(target);
374 impactBuilder.registerStaticUse(new StaticUse.superTearOff(method)); 376 impactBuilder.registerStaticUse(new StaticUse.superTearOff(method));
375 } else { 377 } else {
376 MemberEntity member = astAdapter.getMember(target); 378 MemberEntity member = elementAdapter.getMember(target);
377 impactBuilder.registerStaticUse(new StaticUse.superGet(member)); 379 impactBuilder.registerStaticUse(new StaticUse.superGet(member));
378 } 380 }
379 } 381 }
380 382
381 @override 383 @override
382 void visitDirectPropertyGet(ir.DirectPropertyGet node) { 384 void visitDirectPropertyGet(ir.DirectPropertyGet node) {
383 handleSuperGet(node.target); 385 handleSuperGet(node.target);
384 } 386 }
385 387
386 @override 388 @override
387 void visitSuperPropertyGet(ir.SuperPropertyGet node) { 389 void visitSuperPropertyGet(ir.SuperPropertyGet node) {
388 handleSuperGet(node.interfaceTarget); 390 handleSuperGet(node.interfaceTarget);
389 } 391 }
390 392
391 void handleSuperSet(ir.Node target, ir.Node value) { 393 void handleSuperSet(ir.Node target, ir.Node value) {
392 visitNode(value); 394 visitNode(value);
393 if (target is ir.Field) { 395 if (target is ir.Field) {
394 FieldEntity field = astAdapter.getField(target); 396 FieldEntity field = elementAdapter.getField(target);
395 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(field)); 397 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(field));
396 } else { 398 } else {
397 FunctionEntity method = astAdapter.getMethod(target); 399 FunctionEntity method = elementAdapter.getMethod(target);
398 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(method)); 400 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(method));
399 } 401 }
400 } 402 }
401 403
402 @override 404 @override
403 void visitDirectPropertySet(ir.DirectPropertySet node) { 405 void visitDirectPropertySet(ir.DirectPropertySet node) {
404 handleSuperSet(node.target, node.value); 406 handleSuperSet(node.target, node.value);
405 } 407 }
406 408
407 @override 409 @override
408 void visitSuperPropertySet(ir.SuperPropertySet node) { 410 void visitSuperPropertySet(ir.SuperPropertySet node) {
409 handleSuperSet(node.interfaceTarget, node.value); 411 handleSuperSet(node.interfaceTarget, node.value);
410 } 412 }
411 413
412 @override 414 @override
413 void visitMethodInvocation(ir.MethodInvocation invocation) { 415 void visitMethodInvocation(ir.MethodInvocation invocation) {
414 var receiver = invocation.receiver; 416 var receiver = invocation.receiver;
415 if (receiver is ir.VariableGet && 417 if (receiver is ir.VariableGet &&
416 receiver.variable.isFinal && 418 receiver.variable.isFinal &&
417 receiver.variable.parent is ir.FunctionDeclaration) { 419 receiver.variable.parent is ir.FunctionDeclaration) {
418 // Invocation of a local function. No need for dynamic use. 420 // Invocation of a local function. No need for dynamic use.
419 } else { 421 } else {
420 visitNode(invocation.receiver); 422 visitNode(invocation.receiver);
421 impactBuilder.registerDynamicUse( 423 impactBuilder.registerDynamicUse(
422 new DynamicUse(astAdapter.getSelector(invocation), null)); 424 new DynamicUse(elementAdapter.getSelector(invocation), null));
423 } 425 }
424 _visitArguments(invocation.arguments); 426 _visitArguments(invocation.arguments);
425 } 427 }
426 428
427 @override 429 @override
428 void visitPropertyGet(ir.PropertyGet node) { 430 void visitPropertyGet(ir.PropertyGet node) {
429 visitNode(node.receiver); 431 visitNode(node.receiver);
430 impactBuilder.registerDynamicUse(new DynamicUse( 432 impactBuilder.registerDynamicUse(new DynamicUse(
431 new Selector.getter(astAdapter.getName(node.name)), null)); 433 new Selector.getter(elementAdapter.getName(node.name)), null));
432 } 434 }
433 435
434 @override 436 @override
435 void visitPropertySet(ir.PropertySet node) { 437 void visitPropertySet(ir.PropertySet node) {
436 visitNode(node.receiver); 438 visitNode(node.receiver);
437 visitNode(node.value); 439 visitNode(node.value);
438 impactBuilder.registerDynamicUse(new DynamicUse( 440 impactBuilder.registerDynamicUse(new DynamicUse(
439 new Selector.setter(astAdapter.getName(node.name)), null)); 441 new Selector.setter(elementAdapter.getName(node.name)), null));
440 } 442 }
441 443
442 @override 444 @override
443 void visitAssertStatement(ir.AssertStatement node) { 445 void visitAssertStatement(ir.AssertStatement node) {
444 impactBuilder.registerFeature( 446 impactBuilder.registerFeature(
445 node.message != null ? Feature.ASSERT_WITH_MESSAGE : Feature.ASSERT); 447 node.message != null ? Feature.ASSERT_WITH_MESSAGE : Feature.ASSERT);
446 visitNode(node.condition); 448 visitNode(node.condition);
447 visitNode(node.message); 449 visitNode(node.message);
448 } 450 }
449 451
450 @override 452 @override
451 void visitStringConcatenation(ir.StringConcatenation node) { 453 void visitStringConcatenation(ir.StringConcatenation node) {
452 impactBuilder.registerFeature(Feature.STRING_INTERPOLATION); 454 impactBuilder.registerFeature(Feature.STRING_INTERPOLATION);
453 impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION); 455 impactBuilder.registerFeature(Feature.STRING_JUXTAPOSITION);
454 visitNodes(node.expressions); 456 visitNodes(node.expressions);
455 } 457 }
456 458
457 @override 459 @override
458 void visitFunctionDeclaration(ir.FunctionDeclaration node) { 460 void visitFunctionDeclaration(ir.FunctionDeclaration node) {
459 impactBuilder.registerStaticUse( 461 impactBuilder.registerStaticUse(
460 new StaticUse.closure(astAdapter.getLocalFunction(node))); 462 new StaticUse.closure(elementAdapter.getLocalFunction(node)));
461 handleSignature(node.function); 463 handleSignature(node.function);
462 visitNode(node.function.body); 464 visitNode(node.function.body);
463 } 465 }
464 466
465 @override 467 @override
466 void visitFunctionExpression(ir.FunctionExpression node) { 468 void visitFunctionExpression(ir.FunctionExpression node) {
467 impactBuilder.registerStaticUse( 469 impactBuilder.registerStaticUse(
468 new StaticUse.closure(astAdapter.getLocalFunction(node))); 470 new StaticUse.closure(elementAdapter.getLocalFunction(node)));
469 handleSignature(node.function); 471 handleSignature(node.function);
470 visitNode(node.function.body); 472 visitNode(node.function.body);
471 } 473 }
472 474
473 @override 475 @override
474 void visitVariableDeclaration(ir.VariableDeclaration node) { 476 void visitVariableDeclaration(ir.VariableDeclaration node) {
475 checkType(node.type); 477 checkType(node.type);
476 if (node.initializer != null) { 478 if (node.initializer != null) {
477 visitNode(node.initializer); 479 visitNode(node.initializer);
478 } else { 480 } else {
479 impactBuilder.registerFeature(Feature.LOCAL_WITHOUT_INITIALIZER); 481 impactBuilder.registerFeature(Feature.LOCAL_WITHOUT_INITIALIZER);
480 } 482 }
481 } 483 }
482 484
483 @override 485 @override
484 void visitIsExpression(ir.IsExpression node) { 486 void visitIsExpression(ir.IsExpression node) {
485 impactBuilder.registerTypeUse( 487 impactBuilder.registerTypeUse(
486 new TypeUse.isCheck(astAdapter.getDartType(node.type))); 488 new TypeUse.isCheck(elementAdapter.getDartType(node.type)));
487 visitNode(node.operand); 489 visitNode(node.operand);
488 } 490 }
489 491
490 @override 492 @override
491 void visitAsExpression(ir.AsExpression node) { 493 void visitAsExpression(ir.AsExpression node) {
492 impactBuilder 494 impactBuilder.registerTypeUse(
493 .registerTypeUse(new TypeUse.asCast(astAdapter.getDartType(node.type))); 495 new TypeUse.asCast(elementAdapter.getDartType(node.type)));
494 visitNode(node.operand); 496 visitNode(node.operand);
495 } 497 }
496 498
497 @override 499 @override
498 void visitThrow(ir.Throw node) { 500 void visitThrow(ir.Throw node) {
499 impactBuilder.registerFeature(Feature.THROW_EXPRESSION); 501 impactBuilder.registerFeature(Feature.THROW_EXPRESSION);
500 visitNode(node.expression); 502 visitNode(node.expression);
501 } 503 }
502 504
503 @override 505 @override
(...skipping 19 matching lines...) Expand all
523 } 525 }
524 526
525 @override 527 @override
526 void visitCatch(ir.Catch node) { 528 void visitCatch(ir.Catch node) {
527 impactBuilder.registerFeature(Feature.CATCH_STATEMENT); 529 impactBuilder.registerFeature(Feature.CATCH_STATEMENT);
528 if (node.stackTrace != null) { 530 if (node.stackTrace != null) {
529 impactBuilder.registerFeature(Feature.STACK_TRACE_IN_CATCH); 531 impactBuilder.registerFeature(Feature.STACK_TRACE_IN_CATCH);
530 } 532 }
531 if (node.guard is! ir.DynamicType) { 533 if (node.guard is! ir.DynamicType) {
532 impactBuilder.registerTypeUse( 534 impactBuilder.registerTypeUse(
533 new TypeUse.catchType(astAdapter.getDartType(node.guard))); 535 new TypeUse.catchType(elementAdapter.getDartType(node.guard)));
534 } 536 }
535 visitNode(node.body); 537 visitNode(node.body);
536 } 538 }
537 539
538 @override 540 @override
539 void visitTryFinally(ir.TryFinally node) { 541 void visitTryFinally(ir.TryFinally node) {
540 visitNode(node.body); 542 visitNode(node.body);
541 visitNode(node.finalizer); 543 visitNode(node.finalizer);
542 } 544 }
543 545
544 @override 546 @override
545 void visitTypeLiteral(ir.TypeLiteral node) { 547 void visitTypeLiteral(ir.TypeLiteral node) {
546 impactBuilder.registerTypeUse( 548 impactBuilder.registerTypeUse(
547 new TypeUse.typeLiteral(astAdapter.getDartType(node.type))); 549 new TypeUse.typeLiteral(elementAdapter.getDartType(node.type)));
548 } 550 }
549 551
550 @override 552 @override
551 void visitFieldInitializer(ir.FieldInitializer node) { 553 void visitFieldInitializer(ir.FieldInitializer node) {
552 impactBuilder.registerStaticUse( 554 impactBuilder.registerStaticUse(
553 new StaticUse.fieldInit(astAdapter.getField(node.field))); 555 new StaticUse.fieldInit(elementAdapter.getField(node.field)));
554 visitNode(node.value); 556 visitNode(node.value);
555 } 557 }
556 558
557 @override 559 @override
558 void visitRedirectingInitializer(ir.RedirectingInitializer node) { 560 void visitRedirectingInitializer(ir.RedirectingInitializer node) {
559 _visitArguments(node.arguments); 561 _visitArguments(node.arguments);
560 FunctionEntity target = astAdapter.getConstructor(node.target); 562 FunctionEntity target = elementAdapter.getConstructor(node.target);
561 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( 563 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke(
562 target, astAdapter.getCallStructure(node.arguments))); 564 target, elementAdapter.getCallStructure(node.arguments)));
563 } 565 }
564 566
565 // TODO(johnniwinther): Make this throw and visit child nodes explicitly 567 // TODO(johnniwinther): Make this throw and visit child nodes explicitly
566 // instead to ensure that we don't visit unwanted parts of the ir. 568 // instead to ensure that we don't visit unwanted parts of the ir.
567 @override 569 @override
568 void defaultNode(ir.Node node) => node.visitChildren(this); 570 void defaultNode(ir.Node node) => node.visitChildren(this);
569 } 571 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698