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 | 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'; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 throw "FOUND NULL FIELD: $element"; | 57 throw "FOUND NULL FIELD: $element"; |
58 } | 58 } |
59 } else { | 59 } else { |
60 throw new UnsupportedError("Unsupported element: $element"); | 60 throw new UnsupportedError("Unsupported element: $element"); |
61 } | 61 } |
62 return member; | 62 return member; |
63 } | 63 } |
64 | 64 |
65 ResolutionImpact buildKernelImpact( | 65 ResolutionImpact buildKernelImpact( |
66 ir.Member member, KernelToElementMap elementAdapter) { | 66 ir.Member member, KernelToElementMap elementAdapter) { |
67 KernelImpactBuilder builder = | 67 KernelImpactBuilder builder = new KernelImpactBuilder(elementAdapter, member); |
68 new KernelImpactBuilder('${member.name}', elementAdapter); | |
69 if (member is ir.Procedure) { | 68 if (member is ir.Procedure) { |
70 return builder.buildProcedure(member); | 69 return builder.buildProcedure(member); |
71 } else if (member is ir.Constructor) { | 70 } else if (member is ir.Constructor) { |
72 return builder.buildConstructor(member); | 71 return builder.buildConstructor(member); |
73 } else if (member is ir.Field) { | 72 } else if (member is ir.Field) { |
74 return builder.buildField(member); | 73 return builder.buildField(member); |
75 } | 74 } |
76 throw new UnsupportedError("Unsupported member: $member"); | 75 throw new UnsupportedError("Unsupported member: $member"); |
77 } | 76 } |
78 | 77 |
79 class KernelImpactBuilder extends ir.Visitor { | 78 class KernelImpactBuilder extends ir.Visitor { |
80 final ResolutionWorldImpactBuilder impactBuilder; | 79 final ResolutionWorldImpactBuilder impactBuilder; |
81 final KernelToElementMap elementAdapter; | 80 final KernelToElementMap elementAdapter; |
| 81 final ir.Member currentMember; |
82 | 82 |
83 KernelImpactBuilder(String name, this.elementAdapter) | 83 KernelImpactBuilder(this.elementAdapter, this.currentMember) |
84 : this.impactBuilder = new ResolutionWorldImpactBuilder(name); | 84 : this.impactBuilder = |
| 85 new ResolutionWorldImpactBuilder('${currentMember.name}'); |
85 | 86 |
86 CommonElements get commonElements => elementAdapter.commonElements; | 87 CommonElements get commonElements => elementAdapter.commonElements; |
87 | 88 |
88 /// Add a checked-mode type use of [type] if it is not `dynamic`. | 89 /// Add a checked-mode type use of [type] if it is not `dynamic`. |
89 DartType checkType(ir.DartType irType) { | 90 DartType checkType(ir.DartType irType) { |
90 DartType type = elementAdapter.getDartType(irType); | 91 DartType type = elementAdapter.getDartType(irType); |
91 if (!type.isDynamic) { | 92 if (!type.isDynamic) { |
92 impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type)); | 93 impactBuilder.registerTypeUse(new TypeUse.checkedModeCheck(type)); |
93 } | 94 } |
94 return type; | 95 return type; |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 } | 383 } |
383 } | 384 } |
384 | 385 |
385 @override | 386 @override |
386 void visitStaticSet(ir.StaticSet node) { | 387 void visitStaticSet(ir.StaticSet node) { |
387 visitNode(node.value); | 388 visitNode(node.value); |
388 MemberEntity member = elementAdapter.getMember(node.target); | 389 MemberEntity member = elementAdapter.getMember(node.target); |
389 impactBuilder.registerStaticUse(new StaticUse.staticSet(member)); | 390 impactBuilder.registerStaticUse(new StaticUse.staticSet(member)); |
390 } | 391 } |
391 | 392 |
392 void handleSuperInvocation(ir.Node target, ir.Node arguments) { | 393 void handleSuperInvocation(ir.Name name, ir.Node target, ir.Node arguments) { |
393 FunctionEntity method = elementAdapter.getMethod(target); | 394 FunctionEntity method = elementAdapter |
| 395 .getSuperMember(currentMember, name, target, setter: false); |
394 _visitArguments(arguments); | 396 _visitArguments(arguments); |
395 impactBuilder.registerStaticUse(new StaticUse.superInvoke( | 397 impactBuilder.registerStaticUse(new StaticUse.superInvoke( |
396 method, elementAdapter.getCallStructure(arguments))); | 398 method, elementAdapter.getCallStructure(arguments))); |
397 } | 399 } |
398 | 400 |
399 @override | 401 @override |
400 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) { | 402 void visitDirectMethodInvocation(ir.DirectMethodInvocation node) { |
401 handleSuperInvocation(node.target, node.arguments); | 403 handleSuperInvocation(node.name, node.target, node.arguments); |
402 } | 404 } |
403 | 405 |
404 @override | 406 @override |
405 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) { | 407 void visitSuperMethodInvocation(ir.SuperMethodInvocation node) { |
406 // TODO(johnniwinther): Should we support this or always use the | 408 // TODO(johnniwinther): Should we support this or always use the |
407 // [MixinFullResolution] transformer? | 409 // [MixinFullResolution] transformer? |
408 handleSuperInvocation(node.interfaceTarget, node.arguments); | 410 handleSuperInvocation(node.name, node.interfaceTarget, node.arguments); |
409 } | 411 } |
410 | 412 |
411 void handleSuperGet(ir.Member target) { | 413 void handleSuperGet(ir.Name name, ir.Member target) { |
412 if (target is ir.Procedure && target.kind == ir.ProcedureKind.Method) { | 414 MemberEntity member = elementAdapter |
413 FunctionEntity method = elementAdapter.getMethod(target); | 415 .getSuperMember(currentMember, name, target, setter: false); |
414 impactBuilder.registerStaticUse(new StaticUse.superTearOff(method)); | 416 if (member.isFunction) { |
| 417 impactBuilder.registerStaticUse(new StaticUse.superTearOff(member)); |
415 } else { | 418 } else { |
416 MemberEntity member = elementAdapter.getMember(target); | |
417 impactBuilder.registerStaticUse(new StaticUse.superGet(member)); | 419 impactBuilder.registerStaticUse(new StaticUse.superGet(member)); |
418 } | 420 } |
419 } | 421 } |
420 | 422 |
421 @override | 423 @override |
422 void visitDirectPropertyGet(ir.DirectPropertyGet node) { | 424 void visitDirectPropertyGet(ir.DirectPropertyGet node) { |
423 handleSuperGet(node.target); | 425 handleSuperGet(null, node.target); |
424 } | 426 } |
425 | 427 |
426 @override | 428 @override |
427 void visitSuperPropertyGet(ir.SuperPropertyGet node) { | 429 void visitSuperPropertyGet(ir.SuperPropertyGet node) { |
428 handleSuperGet(node.interfaceTarget); | 430 handleSuperGet(node.name, node.interfaceTarget); |
429 } | 431 } |
430 | 432 |
431 void handleSuperSet(ir.Node target, ir.Node value) { | 433 void handleSuperSet(ir.Name name, ir.Node target, ir.Node value) { |
432 visitNode(value); | 434 visitNode(value); |
433 if (target is ir.Field) { | 435 MemberEntity member = elementAdapter |
434 FieldEntity field = elementAdapter.getField(target); | 436 .getSuperMember(currentMember, name, target, setter: true); |
435 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(field)); | 437 if (member.isField) { |
| 438 impactBuilder.registerStaticUse(new StaticUse.superFieldSet(member)); |
436 } else { | 439 } else { |
437 FunctionEntity method = elementAdapter.getMethod(target); | 440 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(member)); |
438 impactBuilder.registerStaticUse(new StaticUse.superSetterSet(method)); | |
439 } | 441 } |
440 } | 442 } |
441 | 443 |
442 @override | 444 @override |
443 void visitDirectPropertySet(ir.DirectPropertySet node) { | 445 void visitDirectPropertySet(ir.DirectPropertySet node) { |
444 handleSuperSet(node.target, node.value); | 446 handleSuperSet(null, node.target, node.value); |
445 } | 447 } |
446 | 448 |
447 @override | 449 @override |
448 void visitSuperPropertySet(ir.SuperPropertySet node) { | 450 void visitSuperPropertySet(ir.SuperPropertySet node) { |
449 handleSuperSet(node.interfaceTarget, node.value); | 451 handleSuperSet(node.name, node.interfaceTarget, node.value); |
450 } | 452 } |
451 | 453 |
452 @override | 454 @override |
453 void visitMethodInvocation(ir.MethodInvocation invocation) { | 455 void visitMethodInvocation(ir.MethodInvocation invocation) { |
454 var receiver = invocation.receiver; | 456 var receiver = invocation.receiver; |
455 if (receiver is ir.VariableGet && | 457 if (receiver is ir.VariableGet && |
456 receiver.variable.isFinal && | 458 receiver.variable.isFinal && |
457 receiver.variable.parent is ir.FunctionDeclaration) { | 459 receiver.variable.parent is ir.FunctionDeclaration) { |
458 // Invocation of a local function. No need for dynamic use. | 460 // Invocation of a local function. No need for dynamic use. |
459 } else { | 461 } else { |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
602 ConstructorEntity target = elementAdapter.getConstructor(node.target); | 604 ConstructorEntity target = elementAdapter.getConstructor(node.target); |
603 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( | 605 impactBuilder.registerStaticUse(new StaticUse.superConstructorInvoke( |
604 target, elementAdapter.getCallStructure(node.arguments))); | 606 target, elementAdapter.getCallStructure(node.arguments))); |
605 } | 607 } |
606 | 608 |
607 // TODO(johnniwinther): Make this throw and visit child nodes explicitly | 609 // TODO(johnniwinther): Make this throw and visit child nodes explicitly |
608 // instead to ensure that we don't visit unwanted parts of the ir. | 610 // instead to ensure that we don't visit unwanted parts of the ir. |
609 @override | 611 @override |
610 void defaultNode(ir.Node node) => node.visitChildren(this); | 612 void defaultNode(ir.Node node) => node.visitChildren(this); |
611 } | 613 } |
OLD | NEW |