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

Side by Side Diff: pkg/compiler/lib/src/stats/builder.dart

Issue 1220043005: dart2js send stats, includes: (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 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
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 /// Computes statistical data about a program. See `stats.dart` for more details
6 /// on the kind of data we collect.
7 library compiler.src.stats.stats_builder;
8
9 import 'dart:convert';
10
11 import '../dart2jslib.dart'
12 show CompilerTask, Compiler, SourceSpan, MessageKind;
13 import '../dart_types.dart';
14 import '../closure.dart';
15 import '../elements/elements.dart';
16 import '../elements/visitor.dart' show ElementVisitor;
17 import '../resolution/operators.dart';
18 import '../resolution/resolution.dart';
19 import '../resolution/semantic_visitor.dart';
20 import '../constants/expressions.dart';
21 import '../scanner/scannerlib.dart' show PartialElement;
22 import '../stats/stats.dart';
23 import '../tree/tree.dart';
24 import '../universe/universe.dart' show Selector, CallStructure;
25
26 import 'analysis_result.dart';
27 import 'naive_analysis_result.dart';
28 import 'trusted_types_analysis_result.dart';
29
30 /// Task that collects all statistical data about a program.
31 class StatsBuilderTask extends CompilerTask {
32 String get name => "Inference Stats";
33
34 GlobalResult resultForTesting;
35
36 StatsBuilderTask(Compiler compiler) : super(compiler);
37
38 void run() {
39 measure(() {
40 var visitor = new StatsBuilder(compiler);
41 for (var lib in compiler.libraryLoader.libraries) {
42 lib.accept(visitor, null);
43 }
44 resultForTesting = visitor.result;
45 var jsonString = new JsonEncoder.withIndent(' ')
46 .convert(visitor.result.toJson());
47 compiler.outputProvider('', 'stats.json')
48 ..add(jsonString)
49 ..close();
50 });
51 }
52 }
53
54 /// Visitor that goes through all elements and builds the metrics information
55 /// from them.
56 class StatsBuilder extends RecursiveElementVisitor {
57 /// The results produced by the builder.
58 final GlobalResult result = new GlobalResult();
59
60 final Compiler compiler;
61
62 LibraryResult currentLibrary;
63 CompilationUnitResult currentFile;
64
65 StatsBuilder(this.compiler);
66
67 visitLibraryElement(LibraryElement e, arg) {
68 currentLibrary = new LibraryResult(e.canonicalUri);
69 result.add(currentLibrary);
70 return super.visitLibraryElement(e, arg);
71 }
72
73 visitClassElement(ClassElement e, arg) {
74 currentLibrary.classes.add(e.name);
75 return super.visitClassElement(e, arg);
76 }
77
78 visitCompilationUnitElement(CompilationUnitElement e, arg) {
79 var uri = e.script.resourceUri;
80 currentLibrary.units.add(currentFile = new CompilationUnitResult(uri));
81 return super.visitCompilationUnitElement(e, arg);
82 }
83
84 _qualifiedName(FunctionElement e) {
85 var cls = e.enclosingClass;
86 return (cls != null) ? '${cls.name}.${e.name}' : e.name;
87 }
88
89 visitFunctionElement(FunctionElement e, arg) {
90 compiler.withCurrentElement(e, () {
91 if (e.library.isPlatformLibrary) return;
92 var name = _qualifiedName(e);
93 if (!e.hasNode) {
94 if (e is PartialElement) {
95 currentFile.functions.add(new FunctionResult(name,
96 const Measurements.unreachableFunction()));
97 } else {
98 assert (e is ConstructorElement && e.isSynthesized);
99 // TODO(sigmund): measure synthethic forwarding sends, measure
100 // initializers
101 currentFile.functions.add(new FunctionResult(name,
102 new Measurements.reachableFunction()));
103 }
104 return;
105 }
106 if (!e.hasResolvedAst) {
107 _debug('no resolved ast ${e.runtimeType}');
108 return;
109 }
110 var resolvedAst = e.resolvedAst;
111 var visitor = new _StatsTraversalVisitor(compiler, resolvedAst.elements);
112 if (resolvedAst.node == null) {
113 _debug('no node ${e.runtimeType}');
114 return;
115 }
116 var def = resolvedAst.elements.getFunctionDefinition(resolvedAst.node);
117 if (def == null) {
118 assert (e is PartialElement);
119 currentFile.functions.add(new FunctionResult(name,
120 const Measurements.unreachableFunction()));
121 return;
122 }
123 resolvedAst.node.accept(visitor);
124 currentFile.functions
125 .add(new FunctionResult(name, visitor.measurements));
126 });
127 }
128
129 // TODO(sigmund): visit initializers too.
130 }
131
132 /// Visitor that categorizes data about an individual send.
133 class _StatsVisitor<T> extends Visitor
134 with SendResolverMixin, SemanticSendResolvedMixin<dynamic, T>
135 implements SemanticSendVisitor<dynamic, T> {
136
137 // TODO(sigmund): consider passing in several AnalysisResults at once, so we
138 // can compute the different metrics together.
139 /// Information we know about the program from static analysis.
140 final AnalysisResult info;
141
142 /// Results from this function.
143 final Measurements measurements = new Measurements.reachableFunction();
144
145 final Compiler compiler;
146 final TreeElements elements;
147
148 SemanticSendVisitor<dynamic, T> get sendVisitor => this;
149
150 _StatsVisitor(this.compiler, this.elements, this.info);
151
152 visitNode(Node node) => throw "unhandled ${node.runtimeType}: $node";
153 apply(Node node, T arg) => throw "missing apply ${node.runtimeType}: $node";
154 internalError(Node node, T arg) => throw "internal error on $node";
155
156 visitSend(Send node) {
157 _checkInvariant(node, 'before');
158 var span = compiler.spanFromNode(node);
159 measurements.record(Metric.send, span.begin, span.end);
160 if (node is SendSet &&
161 ((node.assignmentOperator != null &&
162 node.assignmentOperator.source != '=') ||
163 node.isPrefix ||
164 node.isPostfix)) {
165 measurements.record(Metric.send, span.begin, span.end);
Johnni Winther 2015/07/13 19:21:44 Add a comment that you count both the get and the
Siggi Cherem (dart-lang) 2015/09/29 01:39:33 Done.
166 measurements.record(Metric.send, span.begin, span.end);
167 }
168 super.visitSend(node);
169 _checkInvariant(node, 'after ');
170 }
171
172 visitNewExpression(NewExpression node) {
173 _checkInvariant(node, 'before');
174 var span = compiler.spanFromNode(node);
175 measurements.record(Metric.send, span.begin, span.end);
176 super.visitNewExpression(node);
177 _checkInvariant(node, 'after ');
178 }
179
Johnni Winther 2015/07/13 19:21:43 Add comments for these. For instance what is the d
Siggi Cherem (dart-lang) 2015/09/29 01:39:34 Done - I made the comment a bit short here because
180 handleLocal(Node node) {
181 var span = compiler.spanFromNode(node);
182 measurements.record(Metric.monomorphicSend, span.begin, span.end);
183 measurements.record(Metric.localSend, span.begin, span.end);
184 }
185
186 handleSingleInstance(Node node) {
187 var span = compiler.spanFromNode(node);
188 measurements.record(Metric.monomorphicSend, span.begin, span.end);
189 measurements.record(Metric.instanceSend, span.begin, span.end);
190 }
191
192 handleSingleInterceptor(Node node) {
193 var span = compiler.spanFromNode(node);
194 measurements.record(Metric.monomorphicSend, span.begin, span.end);
195 measurements.record(Metric.interceptorSend, span.begin, span.end);
196 }
197
198 handleMultiInterceptor(Node node) {
199 var span = compiler.spanFromNode(node);
200 measurements.record(Metric.polymorphicSend, span.begin, span.end);
201 measurements.record(Metric.multiInterceptorSend, span.begin, span.end);
202 }
203
204 handleConstructor(Node node) {
205 var span = compiler.spanFromNode(node);
206 measurements.record(Metric.monomorphicSend, span.begin, span.end);
207 measurements.record(Metric.constructorSend, span.begin, span.end);
208 }
209
210 handleDynamic(Node node) {
211 var span = compiler.spanFromNode(node);
212 measurements.record(Metric.polymorphicSend, span.begin, span.end);
213 measurements.record(Metric.dynamicSend, span.begin, span.end);
214 }
215
216 handleVirtual(Node node) {
217 var span = compiler.spanFromNode(node);
218 measurements.record(Metric.polymorphicSend, span.begin, span.end);
219 measurements.record(Metric.virtualSend, span.begin, span.end);
220 }
221
222 handleNSMError(Node node) {
223 var span = compiler.spanFromNode(node);
224 measurements.record(Metric.monomorphicSend, span.begin, span.end);
225 measurements.record(Metric.nsmErrorSend, span.begin, span.end);
226 }
227
228 handleNSMSingle(Node node) {
229 var span = compiler.spanFromNode(node);
230 measurements.record(Metric.monomorphicSend, span.begin, span.end);
231 measurements.record(Metric.singleNsmCallSend, span.begin, span.end);
232 }
233
234 handleNSMSuper(Node node, ClassElement targetType) {
235 var superclass = targetType.superclass;
236 var member = superclass.lookupMember('noSuchMethod');
237 if (!member.enclosingClass.isObject) {
238 handleNSMSingle(node);
239 } else {
240 handleNSMError(node);
241 }
242 }
243
244 handleNSMAny(Node node) {
245 var span = compiler.spanFromNode(node);
246 measurements.record(Metric.polymorphicSend, span.begin, span.end);
247 measurements.record(Metric.multiNsmCallSend, span.begin, span.end);
248 }
249
250 handleSuper(Node node) {
251 var span = compiler.spanFromNode(node);
252 measurements.record(Metric.monomorphicSend, span.begin, span.end);
253 measurements.record(Metric.superSend, span.begin, span.end);
254 }
255 handleTypeVariable(Node node) {
256 var span = compiler.spanFromNode(node);
257 measurements.record(Metric.monomorphicSend, span.begin, span.end);
258 measurements.record(Metric.typeVariableSend, span.begin, span.end);
259 }
260 handleStatic(Node node) {
261 var span = compiler.spanFromNode(node);
262 measurements.record(Metric.monomorphicSend, span.begin, span.end);
263 measurements.record(Metric.staticSend, span.begin, span.end);
264 }
265
266 handleNoSend(Node node) {
267 measurements.popLast(Metric.send);
268 }
269
270 void handleDynamicProperty(Node node, Node receiver, Selector selector) {
271 // staticSend: no (automatically)
272 // superSend: no (automatically)
273 // localSend: no (automatically)
274 // constructorSend: no (automatically)
275 // typeVariableSend: no (automatically)
276
277 // nsmErrorSend: receiver has no `selector` nor nSM.
278 // singleNsmCallSend: receiver has no `selector`, but definitely has `nSM`
279 // instanceSend: receiver has `selector`, no need to use an interceptor
280 // interceptorSend: receiver has `selector`, but we know we need an
281 // interceptor to get it
282
283 // multiNsmCallSend: receiver has no `selector`, not sure if receiver has
284 // nSM, or not sure which nSM is called (does this one
285 // matter, or does nSM is treated like an instance method
286 // call)?
287 // virtualSend: receiver has `selector`, we know we do not need an
288 // interceptor, not sure which specific type implements
289 // the selector.
290 // multiInterceptorSend: multiple possible receiver types, all using an
291 // interceptor to get the `selector`, might be
292 // possbile to pick a special selector logic for this
293 // combination?
294 // dynamicSend: any combination of the above.
295
296 ReceiverInfo receiverInfo = info.infoForReceiver(receiver);
297 SelectorInfo selectorInfo = info.infoForSelector(receiver, selector);
298 boolish hasSelector = selectorInfo.exists;
299 boolish hasNsm = receiverInfo.hasNoSuchMethod;
300
301 if (hasSelector == boolish.no) {
302 if (hasNsm == boolish.no) {
303 handleNSMError(node);
304 } else if (hasNsm == boolish.yes) {
305 if (receiverInfo.possibleNsmTargets == 1) {
306 handleNSMSingle(node);
307 } else {
308 handleNSMAny(node);
309 }
310 } else {
311 handleDynamic(node);
312 }
313 return;
314 }
315
316 boolish usesInterceptor = selectorInfo.usesInterceptor;
317 if (hasSelector == boolish.yes) {
318 if (selectorInfo.isAccurate && selectorInfo.possibleTargets == 1) {
319 assert (usesInterceptor != boolish.maybe);
320 if (usesInterceptor == boolish.yes) {
321 handleSingleInterceptor(node);
322 } else {
323 handleSingleInstance(node);
324 }
325 } else {
326 if (usesInterceptor == boolish.no) {
327 handleVirtual(node);
328 } else if (usesInterceptor == boolish.yes) {
329 handleMultiInterceptor(node);
330 } else {
331 handleDynamic(node);
332 }
333 }
334 return;
335 }
336 handleDynamic(node);
337 }
338
339 void handleThisProperty(Send node, Selector selector) {
340 handleDynamicProperty(node, node.receiver, selector);
341 }
342
343 void handleIndex(Node node) {
344 handleDynamic(node);
345 }
346
347 void handleOperator(Node node) {
348 handleDynamic(node);
349 }
350
351 void handleInvoke(Node node) {
352 handleDynamic(node);
353 }
354
355 void handleEquals(Node node) {
356 handleDynamic(node);
357 }
358
359 // Constructors
360
361 void visitAbstractClassConstructorInvoke(NewExpression node,
362 ConstructorElement element, InterfaceType type, NodeList arguments,
363 CallStructure callStructure, T arg) {
364 handleConstructor(node);
365 }
366
367 void visitBoolFromEnvironmentConstructorInvoke(NewExpression node,
368 BoolFromEnvironmentConstantExpression constant, T arg) {
369 handleConstructor(node);
370 }
371
372 void visitConstConstructorInvoke(
373 NewExpression node, ConstructedConstantExpression constant, T arg) {
374 handleConstructor(node);
375 }
376
377 void visitGenerativeConstructorInvoke(NewExpression node,
378 ConstructorElement constructor, InterfaceType type, NodeList arguments,
379 CallStructure callStructure, T arg) {
380 handleConstructor(node);
381 }
382
383 void visitIntFromEnvironmentConstructorInvoke(NewExpression node,
384 IntFromEnvironmentConstantExpression constant, T arg) {
385 handleConstructor(node);
386 }
387
388 void visitRedirectingFactoryConstructorInvoke(NewExpression node,
389 ConstructorElement constructor, InterfaceType type,
390 ConstructorElement effectiveTarget, InterfaceType effectiveTargetType,
391 NodeList arguments, CallStructure callStructure, T arg) {
392 handleConstructor(node);
393 }
394
395 void visitRedirectingGenerativeConstructorInvoke(NewExpression node,
396 ConstructorElement constructor, InterfaceType type, NodeList arguments,
397 CallStructure callStructure, T arg) {
398 handleConstructor(node);
399 }
400
401 void visitStringFromEnvironmentConstructorInvoke(NewExpression node,
402 StringFromEnvironmentConstantExpression constant, T arg) {
403 handleConstructor(node);
404 }
405
406 // Dynamic sends
407
408
409 // TODO(sigmund): many many things to add:
410 // -- support for operators, indexers, etc.
411 // -- logic about nullables
412 // -- int, JSArray
413 // -- all interceptors
414
415 void visitBinary(
416 Send node, Node left, BinaryOperator operator, Node right, T arg) {
417 handleOperator(node);
418 }
419
420 void visitCompoundIndexSet(SendSet node, Node receiver, Node index,
421 AssignmentOperator operator, Node rhs, T arg) {
422 handleIndex(node); // t1 = receiver[index]
423 handleOperator(node); // t2 = t1 op rhs
424 handleIndex(node); // receiver[index] = t2
425 }
426
427 void visitDynamicPropertyCompound(Send node, Node receiver,
428 AssignmentOperator operator, Node rhs, Selector getterSelector,
429 Selector setterSelector, T arg) {
430 handleDynamicProperty(node, receiver, getterSelector);
431 handleOperator(node);
432 handleDynamicProperty(node, receiver, setterSelector);
433 }
434
435
436 void visitDynamicPropertyGet(
437 Send node, Node receiver, Selector selector, T arg) {
438 handleDynamicProperty(node, receiver, selector);
439 }
440
441 void visitDynamicPropertyInvoke(
442 Send node, Node receiver, NodeList arguments, Selector selector, T arg) {
443 handleDynamicProperty(node, receiver, selector);
444 }
445
446 void visitDynamicPropertyPostfix(Send node, Node receiver,
447 IncDecOperator operator, Selector getterSelector, Selector setterSelector,
448 T arg) {
449 handleDynamicProperty(node, receiver, getterSelector);
450 handleOperator(node);
451 handleDynamicProperty(node, receiver, setterSelector);
452 }
453
454 void visitDynamicPropertyPrefix(Send node, Node receiver,
455 IncDecOperator operator, Selector getterSelector, Selector setterSelector,
456 T arg) {
457 handleDynamicProperty(node, receiver, getterSelector);
458 handleOperator(node);
459 handleDynamicProperty(node, receiver, setterSelector);
460 }
461
462 void visitDynamicPropertySet(
463 SendSet node, Node receiver, Selector selector, Node rhs, T arg) {
464 handleDynamicProperty(node, receiver, selector);
465 }
466
467 void visitEquals(Send node, Node left, Node right, T arg) {
468 handleEquals(node);
469 }
470
471 void visitExpressionInvoke(Send node, Node expression, NodeList arguments,
472 Selector selector, T arg) {
473 handleInvoke(node);
474 }
475
476 void visitIfNotNullDynamicPropertyCompound(Send node, Node receiver,
477 AssignmentOperator operator, Node rhs, Selector getterSelector,
478 Selector setterSelector, T arg) {
479 handleDynamicProperty(node, receiver, getterSelector);
480 handleOperator(node);
481 handleDynamicProperty(node, receiver, setterSelector);
482 }
483
484 void visitIfNotNullDynamicPropertyGet(
485 Send node, Node receiver, Selector selector, T arg) {
486 handleDynamicProperty(node, receiver, selector);
487 }
488
489 void visitIfNotNullDynamicPropertyInvoke(
490 Send node, Node receiver, NodeList arguments, Selector selector, T arg) {
491 handleDynamicProperty(node, receiver, selector);
492 }
493
494 void visitIfNotNullDynamicPropertyPostfix(Send node, Node receiver,
495 IncDecOperator operator, Selector getterSelector, Selector setterSelector,
496 T arg) {
497 handleDynamicProperty(node, receiver, getterSelector);
498 handleOperator(node);
499 handleDynamicProperty(node, receiver, setterSelector);
500 }
501
502 void visitIfNotNullDynamicPropertyPrefix(Send node, Node receiver,
503 IncDecOperator operator, Selector getterSelector, Selector setterSelector,
504 T arg) {
505 handleDynamicProperty(node, receiver, getterSelector);
506 handleOperator(node);
507 handleDynamicProperty(node, receiver, setterSelector);
508 }
509
510 void visitIfNotNullDynamicPropertySet(
511 SendSet node, Node receiver, Selector selector, Node rhs, T arg) {
512 handleDynamicProperty(node, receiver, selector);
513 }
514
515 void visitIndex(Send node, Node receiver, Node index, T arg) {
516 handleIndex(node);
517 }
518
519 void visitIndexPostfix(
520 Send node, Node receiver, Node index, IncDecOperator operator, T arg) {
521 handleIndex(node);
Johnni Winther 2015/07/13 19:21:43 It looks a bit weird that you (don't have to) disc
Siggi Cherem (dart-lang) 2015/09/29 01:39:33 Yeah - this might change as right now handleIndex
522 handleOperator(node);
523 handleIndex(node);
524 }
525
526 void visitIndexPrefix(
527 Send node, Node receiver, Node index, IncDecOperator operator, T arg) {
528 handleIndex(node);
529 handleOperator(node);
530 handleIndex(node);
531 }
532
533 void visitIndexSet(SendSet node, Node receiver, Node index, Node rhs, T arg) {
534 handleIndex(node);
535 }
536
537 void visitLocalVariableCompound(Send node, LocalVariableElement variable,
538 AssignmentOperator operator, Node rhs, T arg) {
539 handleLocal(node);
540 handleOperator(node);
541 handleLocal(node);
542 }
543
544 void visitLocalVariableInvoke(Send node, LocalVariableElement variable,
545 NodeList arguments, CallStructure callStructure, T arg) {
546 handleInvoke(node);
547 }
548
549 void visitLocalVariablePostfix(Send node, LocalVariableElement variable,
550 IncDecOperator operator, T arg) {
551 handleLocal(node);
552 handleOperator(node);
553 handleLocal(node);
554 }
555
556 void visitLocalVariablePrefix(Send node, LocalVariableElement variable,
557 IncDecOperator operator, T arg) {
558 handleLocal(node);
559 handleOperator(node);
560 handleLocal(node);
561 }
562
563 void visitNotEquals(Send node, Node left, Node right, T arg) {
564 handleEquals(node);
565 }
566
567 void visitParameterCompound(Send node, ParameterElement parameter,
568 AssignmentOperator operator, Node rhs, T arg) {
569 handleLocal(node);
570 handleOperator(node);
571 handleLocal(node);
572 }
573
574 void visitParameterInvoke(Send node, ParameterElement parameter,
575 NodeList arguments, CallStructure callStructure, T arg) {
576 handleInvoke(node);
577 }
578
579 void visitParameterPostfix(
580 Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
581 handleLocal(node);
582 handleOperator(node);
583 handleLocal(node);
584 }
585
586 void visitParameterPrefix(
587 Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
588 handleLocal(node);
589 handleOperator(node);
590 handleLocal(node);
591 }
592
593 void visitStaticFieldCompound(Send node, FieldElement field,
594 AssignmentOperator operator, Node rhs, T arg) {
595 handleStatic(node);
596 handleOperator(node);
597 handleStatic(node);
598 }
599
600 void visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
601 CallStructure callStructure, T arg) {
602 handleInvoke(node);
603 }
604
605 void visitStaticFieldPostfix(
606 Send node, FieldElement field, IncDecOperator operator, T arg) {
607 handleStatic(node);
608 handleOperator(node);
609 handleStatic(node);
610 }
611
612 void visitStaticFieldPrefix(
613 Send node, FieldElement field, IncDecOperator operator, T arg) {
614 handleStatic(node);
615 handleOperator(node);
616 handleStatic(node);
617 }
618
619 void visitStaticGetterInvoke(Send node, FunctionElement getter,
620 NodeList arguments, CallStructure callStructure, T arg) {
621 handleInvoke(node);
622 }
623
624 void visitStaticGetterSetterCompound(Send node, FunctionElement getter,
625 FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
626 handleStatic(node);
627 handleOperator(node);
628 handleStatic(node);
629 }
630
631 void visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
632 FunctionElement setter, IncDecOperator operator, T arg) {
633 handleStatic(node);
634 handleOperator(node);
635 handleStatic(node);
636 }
637
638 void visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
639 FunctionElement setter, IncDecOperator operator, T arg) {
640 handleStatic(node);
641 handleOperator(node);
642 handleStatic(node);
643 }
644
645 void visitSuperFieldCompound(Send node, FieldElement field,
646 AssignmentOperator operator, Node rhs, T arg) {
647 handleSuper(node);
648 handleOperator(node);
649 handleSuper(node);
650 }
651
652 void visitSuperFieldFieldCompound(Send node, FieldElement readField,
653 FieldElement writtenField, AssignmentOperator operator, Node rhs, T arg) {
654 handleSuper(node);
655 handleOperator(node);
656 handleSuper(node);
657 }
658
659 void visitSuperFieldFieldPostfix(Send node, FieldElement readField,
660 FieldElement writtenField, IncDecOperator operator, T arg) {
661 handleSuper(node);
662 handleOperator(node);
663 handleSuper(node);
664 }
665
666 void visitSuperFieldFieldPrefix(Send node, FieldElement readField,
667 FieldElement writtenField, IncDecOperator operator, T arg) {
668 handleSuper(node);
669 handleOperator(node);
670 handleSuper(node);
671 }
672
673 void visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments,
674 CallStructure callStructure, T arg) {
675 handleInvoke(node);
676 }
677
678 void visitSuperFieldPostfix(
679 Send node, FieldElement field, IncDecOperator operator, T arg) {
680 handleSuper(node);
681 handleOperator(node);
682 handleSuper(node);
683 }
684
685 void visitSuperFieldPrefix(
686 Send node, FieldElement field, IncDecOperator operator, T arg) {
687 handleSuper(node);
688 handleOperator(node);
689 handleSuper(node);
690 }
691
692 void visitSuperFieldSetterCompound(Send node, FieldElement field,
693 FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
694 handleSuper(node);
695 handleOperator(node);
696 handleSuper(node);
697 }
698
699 void visitSuperFieldSetterPostfix(Send node, FieldElement field,
700 FunctionElement setter, IncDecOperator operator, T arg) {
701 handleSuper(node);
702 handleOperator(node);
703 handleSuper(node);
704 }
705
706 void visitSuperFieldSetterPrefix(Send node, FieldElement field,
707 FunctionElement setter, IncDecOperator operator, T arg) {
708 handleSuper(node);
709 handleOperator(node);
710 handleSuper(node);
711 }
712
713 void visitSuperGetterFieldCompound(Send node, FunctionElement getter,
714 FieldElement field, AssignmentOperator operator, Node rhs, T arg) {
715 handleSuper(node);
716 handleOperator(node);
717 handleSuper(node);
718 }
719
720 void visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
721 FieldElement field, IncDecOperator operator, T arg) {
722 handleSuper(node);
723 handleOperator(node);
724 handleSuper(node);
725 }
726
727 void visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
728 FieldElement field, IncDecOperator operator, T arg) {
729 handleSuper(node);
730 handleOperator(node);
731 handleSuper(node);
732 }
733
734 void visitSuperGetterInvoke(Send node, FunctionElement getter,
735 NodeList arguments, CallStructure callStructure, T arg) {
736 handleInvoke(node);
737 }
738
739 void visitSuperGetterSetterCompound(Send node, FunctionElement getter,
740 FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
741 handleSuper(node);
742 handleOperator(node);
743 handleSuper(node);
744 }
745
746 void visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
747 FunctionElement setter, IncDecOperator operator, T arg) {
748 handleSuper(node);
749 handleOperator(node);
750 handleSuper(node);
751 }
752
753 void visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
754 FunctionElement setter, IncDecOperator operator, T arg) {
755 handleSuper(node);
756 handleOperator(node);
757 handleSuper(node);
758 }
759
760 void visitSuperIndexPostfix(Send node, MethodElement indexFunction,
761 MethodElement indexSetFunction, Node index, IncDecOperator operator,
762 T arg) {
763 handleSuper(node);
764 handleOperator(node);
765 handleSuper(node);
766 }
767
768 void visitSuperIndexPrefix(Send node, MethodElement indexFunction,
769 MethodElement indexSetFunction, Node index, IncDecOperator operator,
770 T arg) {
771 handleSuper(node);
772 handleOperator(node);
773 handleSuper(node);
774 }
775
776 void visitSuperMethodSetterCompound(Send node, FunctionElement method,
777 FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
778 handleSuper(node);
779 handleNSMSuper(node, method.enclosingClass);
780 handleSuper(node);
781 }
782
783 void visitSuperMethodSetterPostfix(Send node, FunctionElement method,
784 FunctionElement setter, IncDecOperator operator, T arg) {
785 handleSuper(node);
786 handleNSMSuper(node, method.enclosingClass);
787 handleSuper(node);
788 }
789
790 void visitSuperMethodSetterPrefix(Send node, FunctionElement method,
791 FunctionElement setter, IncDecOperator operator, T arg) {
792 handleSuper(node);
793 handleNSMSuper(node, method.enclosingClass);
794 handleSuper(node);
795 }
796
797 void visitThisPropertyCompound(Send node, AssignmentOperator operator,
798 Node rhs, Selector getterSelector, Selector setterSelector, T arg) {
799 handleThisProperty(node, getterSelector);
800 handleOperator(node);
801 handleThisProperty(node, setterSelector);
802 }
803
804 void visitThisPropertyInvoke(
805 Send node, NodeList arguments, Selector selector, T arg) {
806 handleThisProperty(node, selector);
807 }
808
809 void visitThisPropertyPostfix(Send node, IncDecOperator operator,
810 Selector getterSelector, Selector setterSelector, T arg) {
811 handleThisProperty(node, getterSelector);
812 handleOperator(node);
813 handleThisProperty(node, setterSelector);
814 }
815
816 void visitThisPropertyPrefix(Send node, IncDecOperator operator,
817 Selector getterSelector, Selector setterSelector, T arg) {
818 handleThisProperty(node, getterSelector);
819 handleOperator(node);
820 handleThisProperty(node, setterSelector);
821 }
822
823 void visitTopLevelFieldCompound(Send node, FieldElement field,
824 AssignmentOperator operator, Node rhs, T arg) {
825 handleStatic(node);
826 handleOperator(node);
827 handleStatic(node);
828 }
829
830 void visitTopLevelFieldInvoke(Send node, FieldElement field,
831 NodeList arguments, CallStructure callStructure, T arg) {
832 handleInvoke(node);
833 }
834
835 void visitTopLevelFieldPostfix(
836 Send node, FieldElement field, IncDecOperator operator, T arg) {
837 handleStatic(node);
838 handleOperator(node);
839 handleStatic(node);
840 }
841
842 void visitTopLevelFieldPrefix(
843 Send node, FieldElement field, IncDecOperator operator, T arg) {
844 handleStatic(node);
845 handleOperator(node);
846 handleStatic(node);
847 }
848
849 void visitTopLevelGetterInvoke(Send node, FunctionElement getter,
850 NodeList arguments, CallStructure callStructure, T arg) {
851 handleInvoke(node);
852 }
853
854 void visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
855 FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
856 handleStatic(node);
857 handleOperator(node);
858 handleStatic(node);
859 }
860
861 void visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
862 FunctionElement setter, IncDecOperator operator, T arg) {
863 handleStatic(node);
864 handleOperator(node);
865 handleStatic(node);
866 }
867
868 void visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
869 FunctionElement setter, IncDecOperator operator, T arg) {
870 handleStatic(node);
871 handleOperator(node);
872 handleStatic(node);
873 }
874
875 void visitUnary(Send node, UnaryOperator operator, Node expression, T arg) {
876 handleDynamic(node);
877 }
878
879 // Local variable sends
880
881 void visitLocalFunctionGet(Send node, LocalFunctionElement function, T arg) {
882 handleLocal(node);
883 }
884
885 void visitLocalFunctionInvoke(Send node, LocalFunctionElement function,
886 NodeList arguments, CallStructure callStructure, T arg) {
887 handleLocal(node);
888 }
889
890 void visitLocalVariableGet(Send node, LocalVariableElement variable, T arg) {
891 handleLocal(node);
892 }
893
894 void visitLocalVariableSet(
895 SendSet node, LocalVariableElement variable, Node rhs, T arg) {
896 handleLocal(node);
897 }
898
899 void visitParameterGet(Send node, ParameterElement parameter, T arg) {
900 handleLocal(node);
901 }
902
903 void visitParameterSet(
904 SendSet node, ParameterElement parameter, Node rhs, T arg) {
905 handleLocal(node);
906 }
907
908 // Super monomorphic sends
909
910 void visitSuperBinary(Send node, FunctionElement function,
911 BinaryOperator operator, Node argument, T arg) {
912 handleSuper(node);
913 }
914
915 void visitSuperEquals(
916 Send node, FunctionElement function, Node argument, T arg) {
917 handleSuper(node);
918 }
919
920 void visitSuperFieldGet(Send node, FieldElement field, T arg) {
921 handleSuper(node);
922 }
923
924 void visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, T arg) {
925 handleSuper(node);
926 }
927
928 void visitSuperGetterGet(Send node, FunctionElement getter, T arg) {
929 handleSuper(node);
930 }
931
932 void visitSuperGetterSet(
933 SendSet node, FunctionElement getter, Node rhs, T arg) {
934 handleSuper(node);
935 }
936
937 void visitSuperIndex(Send node, FunctionElement function, Node index, T arg) {
938 handleSuper(node);
939 }
940
941 void visitSuperIndexSet(
942 SendSet node, FunctionElement function, Node index, Node rhs, T arg) {
943 handleSuper(node);
944 }
945
946 void visitSuperMethodGet(Send node, MethodElement method, T arg) {
947 handleSuper(node);
948 }
949
950 void visitSuperMethodInvoke(Send node, MethodElement method,
951 NodeList arguments, CallStructure callStructure, T arg) {
952 handleSuper(node);
953 }
954
955 void visitSuperNotEquals(
956 Send node, FunctionElement function, Node argument, T arg) {
957 handleSuper(node);
958 }
959
960 void visitSuperSetterSet(
961 SendSet node, FunctionElement setter, Node rhs, T arg) {
962 handleSuper(node);
963 }
964
965 void visitSuperUnary(
966 Send node, UnaryOperator operator, FunctionElement function, T arg) {
967 handleSuper(node);
968 }
969
970 // Statically known "no such method" sends
Johnni Winther 2015/07/13 19:21:43 Indent.
Siggi Cherem (dart-lang) 2015/09/29 01:39:33 Done.
971
972 void visitConstructorIncompatibleInvoke(NewExpression node,
973 ConstructorElement constructor, InterfaceType type, NodeList arguments,
974 CallStructure callStructure, T arg) {
975 handleNSMError(node);
976 }
977
978 void visitFinalLocalVariableCompound(Send node, LocalVariableElement variable,
979 AssignmentOperator operator, Node rhs, T arg) {
980 handleLocal(node);
981 handleOperator(node);
982 handleNSMError(node);
983 }
984
985 void visitFinalLocalVariablePostfix(Send node, LocalVariableElement variable,
986 IncDecOperator operator, T arg) {
987 handleLocal(node);
988 handleOperator(node);
989 handleNSMError(node);
990 }
991
992 void visitFinalLocalVariablePrefix(Send node, LocalVariableElement variable,
993 IncDecOperator operator, T arg) {
994 handleLocal(node);
995 handleOperator(node);
996 handleNSMError(node);
997 }
998
999 void visitFinalLocalVariableSet(
1000 SendSet node, LocalVariableElement variable, Node rhs, T arg) {
1001 handleNSMError(node);
1002 }
1003
1004 void visitFinalParameterCompound(Send node, ParameterElement parameter,
1005 AssignmentOperator operator, Node rhs, T arg) {
1006 handleLocal(node);
1007 handleOperator(node);
1008 handleNSMError(node);
1009 }
1010
1011 void visitFinalParameterPostfix(
1012 Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
1013 handleLocal(node);
1014 handleOperator(node);
1015 handleNSMError(node);
1016 }
1017
1018 void visitFinalParameterPrefix(
1019 Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
1020 handleLocal(node);
1021 handleOperator(node);
1022 handleNSMError(node);
1023 }
1024
1025 void visitFinalParameterSet(
1026 SendSet node, ParameterElement parameter, Node rhs, T arg) {
1027 handleNSMError(node);
1028 }
1029
1030 void visitFinalStaticFieldCompound(Send node, FieldElement field,
1031 AssignmentOperator operator, Node rhs, T arg) {
1032 handleStatic(node);
1033 handleOperator(node);
1034 handleNSMError(node);
1035 }
1036
1037 void visitFinalStaticFieldPostfix(
1038 Send node, FieldElement field, IncDecOperator operator, T arg) {
1039 handleStatic(node);
1040 handleOperator(node);
1041 handleNSMError(node);
1042 }
1043
1044 void visitFinalStaticFieldPrefix(
1045 Send node, FieldElement field, IncDecOperator operator, T arg) {
1046 handleStatic(node);
1047 handleOperator(node);
1048 handleNSMError(node);
1049 }
1050
1051 void visitFinalStaticFieldSet(
1052 SendSet node, FieldElement field, Node rhs, T arg) {
1053 handleNSMError(node);
1054 }
1055
1056 void visitFinalSuperFieldCompound(Send node, FieldElement field,
1057 AssignmentOperator operator, Node rhs, T arg) {
1058 handleSuper(node);
1059 handleOperator(node);
1060 handleNSMSuper(node, field.enclosingClass);
1061 }
1062
1063 void visitFinalSuperFieldPostfix(
1064 Send node, FieldElement field, IncDecOperator operator, T arg) {
1065 handleSuper(node);
1066 handleOperator(node);
1067 handleNSMSuper(node, field.enclosingClass);
1068 }
1069
1070 void visitFinalSuperFieldPrefix(
1071 Send node, FieldElement field, IncDecOperator operator, T arg) {
1072 handleSuper(node);
1073 handleOperator(node);
1074 handleNSMSuper(node, field.enclosingClass);
1075 }
1076
1077 void visitFinalSuperFieldSet(
1078 SendSet node, FieldElement field, Node rhs, T arg) {
1079 handleNSMSuper(node, field.enclosingClass);
1080 }
1081
1082 void visitFinalTopLevelFieldCompound(Send node, FieldElement field,
1083 AssignmentOperator operator, Node rhs, T arg) {
1084 handleStatic(node);
1085 handleOperator(node);
1086 handleNSMError(node);
1087 }
1088
1089 void visitFinalTopLevelFieldPostfix(
1090 Send node, FieldElement field, IncDecOperator operator, T arg) {
1091 handleStatic(node);
1092 handleOperator(node);
1093 handleNSMError(node);
1094 }
1095
1096 void visitFinalTopLevelFieldPrefix(
1097 Send node, FieldElement field, IncDecOperator operator, T arg) {
1098 handleStatic(node);
1099 handleOperator(node);
1100 handleNSMError(node);
1101 }
1102
1103 void visitFinalTopLevelFieldSet(
1104 SendSet node, FieldElement field, Node rhs, T arg) {
1105 handleNSMError(node);
1106 }
1107
1108 void visitLocalFunctionIncompatibleInvoke(Send node,
1109 LocalFunctionElement function, NodeList arguments,
1110 CallStructure callStructure, T arg) {
1111 handleNSMError(node);
1112 }
1113
1114 void visitLocalFunctionCompound(Send node, LocalFunctionElement function,
1115 AssignmentOperator operator, Node rhs, T arg) {
1116 handleLocal(node);
1117 handleNSMError(node);
1118 handleNoSend(node);
1119 }
1120
1121 void visitLocalFunctionPostfix(Send node, LocalFunctionElement function,
1122 IncDecOperator operator, T arg) {
1123 handleLocal(node);
1124 handleNSMError(node);
1125 handleNoSend(node);
1126 }
1127
1128 void visitLocalFunctionPrefix(Send node, LocalFunctionElement function,
1129 IncDecOperator operator, T arg) {
1130 handleLocal(node);
1131 handleNSMError(node);
1132 handleNoSend(node);
1133 }
1134
1135 void visitLocalFunctionSet(
1136 SendSet node, LocalFunctionElement function, Node rhs, T arg) {
1137 handleNSMError(node);
1138 }
1139
1140 void visitStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
1141 NodeList arguments, CallStructure callStructure, T arg) {
1142 handleNSMError(node);
1143 }
1144
1145 void visitStaticFunctionSet(
1146 Send node, MethodElement function, Node rhs, T arg) {
1147 handleNSMError(node);
1148 }
1149
1150 void visitStaticMethodCompound(Send node, MethodElement method,
1151 AssignmentOperator operator, Node rhs, T arg) {
1152 handleStatic(node);
1153 handleNSMError(node); // operator on a method closure yields nSM
1154 handleNoSend(node); // setter is not invoked, don't count it.
1155 }
1156
1157 void visitStaticMethodPostfix(
1158 Send node, MethodElement method, IncDecOperator operator, T arg) {
1159 handleStatic(node);
1160 handleNSMError(node);
1161 handleNoSend(node);
1162 }
1163
1164 void visitStaticMethodPrefix(
1165 Send node, MethodElement method, IncDecOperator operator, T arg) {
1166 handleStatic(node);
1167 handleNSMError(node);
1168 handleNoSend(node);
1169 }
1170
1171 void visitStaticMethodSetterCompound(Send node, MethodElement method,
1172 MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
1173 handleStatic(node);
1174 handleNSMError(node); // operator on a method closure yields nSM
1175 handleNoSend(node); // setter is not invoked, don't count it.
1176 }
1177
1178 void visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
1179 FunctionElement setter, IncDecOperator operator, T arg) {
1180 handleStatic(node);
1181 handleNSMError(node);
1182 handleNoSend(node);
1183 }
1184
1185 void visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
1186 FunctionElement setter, IncDecOperator operator, T arg) {
1187 handleStatic(node);
1188 handleNSMError(node);
1189 handleNoSend(node);
1190 }
1191
1192 void visitStaticSetterGet(Send node, FunctionElement setter, T arg) {
1193 handleNSMError(node);
1194 }
1195
1196 void visitStaticSetterInvoke(Send node, FunctionElement setter,
1197 NodeList arguments, CallStructure callStructure, T arg) {
1198 handleNSMError(node);
1199 }
1200
1201 void visitSuperMethodCompound(Send node, FunctionElement method,
1202 AssignmentOperator operator, Node rhs, T arg) {
1203 handleSuper(node);
1204
1205 // An operator send on a method closure yields nSM
1206 handleNSMSuper(node, method.enclosingClass);
1207
1208 handleNoSend(node); // setter is not invoked, don't count it.
1209 }
1210
1211 void visitSuperMethodIncompatibleInvoke(Send node, MethodElement method,
1212 NodeList arguments, CallStructure callStructure, T arg) {
1213 handleNSMSuper(node, method.enclosingClass);
1214 }
1215
1216 void visitSuperMethodPostfix(
1217 Send node, FunctionElement method, IncDecOperator operator, T arg) {
1218 handleSuper(node);
1219 handleNSMSuper(node, method.enclosingClass);
1220 handleNoSend(node);
1221 }
1222
1223 void visitSuperMethodPrefix(
1224 Send node, FunctionElement method, IncDecOperator operator, T arg) {
1225 handleSuper(node);
1226 handleNSMSuper(node, method.enclosingClass);
1227 handleNoSend(node);
1228 }
1229
1230 void visitSuperMethodSet(Send node, MethodElement method, Node rhs, T arg) {
1231 handleNSMSuper(node, method.enclosingClass);
1232 }
1233
1234 void visitSuperSetterGet(Send node, FunctionElement setter, T arg) {
1235 handleNSMSuper(node, setter.enclosingClass);
1236 }
1237
1238 void visitSuperSetterInvoke(Send node, FunctionElement setter,
1239 NodeList arguments, CallStructure callStructure, T arg) {
1240 handleNSMSuper(node, setter.enclosingClass);
1241 }
1242
1243 void visitTopLevelFunctionIncompatibleInvoke(Send node,
1244 MethodElement function, NodeList arguments, CallStructure callStructure,
1245 T arg) {
1246 handleNSMError(node);
1247 }
1248
1249 void visitTopLevelFunctionSet(
1250 Send node, MethodElement function, Node rhs, T arg) {
1251 handleNSMError(node);
1252 }
1253
1254 void visitTopLevelGetterSet(
1255 SendSet node, FunctionElement getter, Node rhs, T arg) {
1256 handleNSMError(node);
1257 }
1258
1259 void visitTopLevelMethodCompound(Send node, FunctionElement method,
1260 AssignmentOperator operator, Node rhs, T arg) {
1261 handleStatic(node);
1262 handleNSMError(node); // operator on a method closure yields nSM
1263 handleNoSend(node); // setter is not invoked, don't count it.
1264 }
1265
1266 void visitTopLevelMethodPostfix(
1267 Send node, MethodElement method, IncDecOperator operator, T arg) {
1268 handleStatic(node);
1269 handleNSMError(node);
1270 handleNoSend(node);
1271 }
1272
1273 void visitTopLevelMethodPrefix(
1274 Send node, MethodElement method, IncDecOperator operator, T arg) {
1275 handleStatic(node);
1276 handleNSMError(node);
1277 handleNoSend(node);
1278 }
1279
1280 void visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
1281 FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
1282 handleStatic(node);
1283 handleNSMError(node); // operator on a method closure yields nSM
1284 handleNoSend(node); // setter is not invoked, don't count it.
1285 }
1286
1287 void visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
1288 FunctionElement setter, IncDecOperator operator, T arg) {
1289 handleStatic(node);
1290 handleNSMError(node);
1291 handleNoSend(node);
1292 }
1293
1294 void visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
1295 FunctionElement setter, IncDecOperator operator, T arg) {
1296 handleStatic(node);
1297 handleNSMError(node);
1298 handleNoSend(node);
1299 }
1300
1301 void visitTopLevelSetterGet(Send node, FunctionElement setter, T arg) {
1302 handleNSMError(node);
1303 }
1304
1305 void visitTopLevelSetterInvoke(Send node, FunctionElement setter,
1306 NodeList arguments, CallStructure callStructure, T arg) {
1307 handleNSMError(node);
1308 }
1309
1310 void visitTypeVariableTypeLiteralCompound(Send node,
1311 TypeVariableElement element, AssignmentOperator operator, Node rhs,
1312 T arg) {
1313 handleTypeVariable(node);
1314 handleNSMError(node); // operator on a method closure yields nSM
1315 handleNoSend(node); // setter is not invoked, don't count it.
1316 }
1317
1318 void visitTypeVariableTypeLiteralGet(
1319 Send node, TypeVariableElement element, T arg) {
1320 handleTypeVariable(node);
1321 }
1322
1323 void visitTypeVariableTypeLiteralInvoke(Send node,
1324 TypeVariableElement element, NodeList arguments,
1325 CallStructure callStructure, T arg) {
1326 handleNSMError(node);
1327 }
1328
1329 void visitTypeVariableTypeLiteralPostfix(
1330 Send node, TypeVariableElement element, IncDecOperator operator, T arg) {
1331 handleTypeVariable(node);
1332 handleNSMError(node);
1333 handleNoSend(node);
1334 }
1335
1336 void visitTypeVariableTypeLiteralPrefix(
1337 Send node, TypeVariableElement element, IncDecOperator operator, T arg) {
1338 handleTypeVariable(node);
1339 handleNSMError(node);
1340 handleNoSend(node);
1341 }
1342
1343 void visitTypeVariableTypeLiteralSet(
1344 SendSet node, TypeVariableElement element, Node rhs, T arg) {
1345 handleNSMError(node);
1346 }
1347
1348 void visitTypedefTypeLiteralCompound(Send node, ConstantExpression constant,
1349 AssignmentOperator operator, Node rhs, T arg) {
1350 handleTypeVariable(node);
1351 handleNSMError(node);
1352 handleNoSend(node);
1353 }
1354
1355 void visitTypedefTypeLiteralGet(
1356 Send node, ConstantExpression constant, T arg) {
1357 handleTypeVariable(node);
1358 }
1359
1360 void visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
1361 NodeList arguments, CallStructure callStructure, T arg) {
1362 handleNSMError(node);
1363 }
1364
1365 void visitTypedefTypeLiteralPostfix(
1366 Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
1367 handleTypeVariable(node);
1368 handleNSMError(node);
1369 handleNoSend(node);
1370 }
1371
1372 void visitTypedefTypeLiteralPrefix(
1373 Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
1374 handleTypeVariable(node);
1375 handleNSMError(node);
1376 handleNoSend(node);
1377 }
1378
1379 void visitTypedefTypeLiteralSet(
1380 SendSet node, ConstantExpression constant, Node rhs, T arg) {
1381 handleNSMError(node);
1382 }
1383
1384 void visitUnresolvedClassConstructorInvoke(NewExpression node,
1385 Element element, DartType type, NodeList arguments, Selector selector,
1386 T arg) {
1387 handleNSMError(node);
1388 }
1389
1390 void visitUnresolvedCompound(Send node, Element element,
1391 AssignmentOperator operator, Node rhs, T arg) {
1392 handleNSMError(node);
1393 handleNoSend(node);
1394 handleNoSend(node);
1395 }
1396
1397 void visitUnresolvedConstructorInvoke(NewExpression node, Element constructor,
1398 DartType type, NodeList arguments, Selector selector, T arg) {
1399 handleNSMError(node);
1400 }
1401
1402 void visitUnresolvedGet(Send node, Element element, T arg) {
1403 handleNSMError(node);
1404 }
1405
1406 void visitUnresolvedInvoke(Send node, Element element, NodeList arguments,
1407 Selector selector, T arg) {
1408 handleNSMError(node);
1409 }
1410
1411 void visitUnresolvedPostfix(
1412 Send node, Element element, IncDecOperator operator, T arg) {
1413 handleNSMError(node);
1414 handleNoSend(node);
1415 handleNoSend(node);
1416 }
1417
1418 void visitUnresolvedPrefix(
1419 Send node, Element element, IncDecOperator operator, T arg) {
1420 handleNSMError(node);
1421 handleNoSend(node);
1422 handleNoSend(node);
1423 }
1424
1425 void visitUnresolvedRedirectingFactoryConstructorInvoke(NewExpression node,
1426 ConstructorElement constructor, InterfaceType type, NodeList arguments,
1427 CallStructure callStructure, T arg) {
1428 handleNSMError(node);
1429 }
1430
1431 void visitUnresolvedSet(Send node, Element element, Node rhs, T arg) {
1432 handleNSMError(node);
1433 }
1434
1435 void visitUnresolvedStaticGetterCompound(Send node, Element element,
1436 MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
1437 handleNSMError(node);
1438 handleNoSend(node);
1439 handleNoSend(node);
1440 }
1441
1442 void visitUnresolvedStaticGetterPostfix(Send node, Element element,
1443 MethodElement setter, IncDecOperator operator, T arg) {
1444 handleNSMError(node);
1445 handleNoSend(node);
1446 handleNoSend(node);
1447 }
1448
1449 void visitUnresolvedStaticGetterPrefix(Send node, Element element,
1450 MethodElement setter, IncDecOperator operator, T arg) {
1451 handleNSMError(node);
1452 handleNoSend(node);
1453 handleNoSend(node);
1454 }
1455
1456 void visitUnresolvedStaticSetterCompound(Send node, MethodElement getter,
1457 Element element, AssignmentOperator operator, Node rhs, T arg) {
1458 handleNSMError(node);
1459 handleNoSend(node);
1460 handleNoSend(node);
1461 }
1462
1463 void visitUnresolvedStaticSetterPostfix(Send node, MethodElement getter,
1464 Element element, IncDecOperator operator, T arg) {
1465 handleNSMError(node);
1466 handleNoSend(node);
1467 handleNoSend(node);
1468 }
1469
1470 void visitUnresolvedStaticSetterPrefix(Send node, MethodElement getter,
1471 Element element, IncDecOperator operator, T arg) {
1472 handleNSMError(node);
1473 handleNoSend(node);
1474 handleNoSend(node);
1475 }
1476
1477 void visitUnresolvedSuperBinary(Send node, Element element,
1478 BinaryOperator operator, Node argument, T arg) {
1479 handleNSMError(node);
1480 }
1481
1482 void visitUnresolvedSuperCompound(Send node, Element element,
1483 AssignmentOperator operator, Node rhs, T arg) {
1484 handleNSMError(node);
Johnni Winther 2015/07/13 19:21:43 This weird case might actually included both the o
Siggi Cherem (dart-lang) 2015/09/29 01:39:33 Good catch, you are correct. I thought in this sce
1485 handleNoSend(node);
1486 handleNoSend(node);
1487 }
1488
1489 void visitUnresolvedSuperCompoundIndexSet(Send node, Element element,
1490 Node index, AssignmentOperator operator, Node rhs, T arg) {
1491 handleNSMError(node);
1492 handleNoSend(node);
1493 handleNoSend(node);
1494 }
1495
1496 void visitUnresolvedSuperGet(Send node, Element element, T arg) {
1497 handleNSMSuper(node, element.enclosingClass);
1498 }
1499
1500 void visitUnresolvedSuperGetterCompound(Send node, Element element,
1501 MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
1502 handleNSMError(node);
1503 handleNoSend(node);
1504 handleNoSend(node);
1505 }
1506
1507 void visitUnresolvedSuperGetterCompoundIndexSet(Send node, Element element,
1508 MethodElement setter, Node index, AssignmentOperator operator, Node rhs,
1509 T arg) {
1510 handleNSMError(node);
1511 handleNoSend(node);
1512 handleNoSend(node);
1513 }
1514
1515 void visitUnresolvedSuperGetterIndexPostfix(Send node, Element element,
1516 MethodElement setter, Node index, IncDecOperator operator, T arg) {
1517 handleNSMError(node);
1518 handleNoSend(node);
1519 handleNoSend(node);
1520 }
1521
1522 void visitUnresolvedSuperGetterIndexPrefix(Send node, Element element,
1523 MethodElement setter, Node index, IncDecOperator operator, T arg) {
1524 handleNSMError(node);
1525 handleNoSend(node);
1526 handleNoSend(node);
1527 }
1528
1529 void visitUnresolvedSuperGetterPostfix(Send node, Element element,
1530 MethodElement setter, IncDecOperator operator, T arg) {
1531 handleNSMError(node);
1532 handleNoSend(node);
1533 handleNoSend(node);
1534 }
1535
1536 void visitUnresolvedSuperGetterPrefix(Send node, Element element,
1537 MethodElement setter, IncDecOperator operator, T arg) {
1538 handleNSMError(node);
1539 handleNoSend(node);
1540 handleNoSend(node);
1541 }
1542
1543 void visitUnresolvedSuperIndex(
1544 Send node, Element element, Node index, T arg) {
1545 handleNSMError(node);
1546 }
1547
1548 void visitUnresolvedSuperIndexPostfix(
1549 Send node, Element element, Node index, IncDecOperator operator, T arg) {
1550 handleNSMError(node);
1551 handleNoSend(node);
1552 handleNoSend(node);
1553 }
1554
1555 void visitUnresolvedSuperIndexPrefix(
1556 Send node, Element element, Node index, IncDecOperator operator, T arg) {
1557 handleNSMError(node);
1558 handleNoSend(node);
1559 handleNoSend(node);
1560 }
1561
1562 void visitUnresolvedSuperIndexSet(
1563 Send node, Element element, Node index, Node rhs, T arg) {
1564 handleNSMError(node);
1565 }
1566
1567 void visitUnresolvedSuperInvoke(Send node, Element element,
1568 NodeList arguments, Selector selector, T arg) {
1569 handleNSMError(node);
1570 }
1571
1572 void visitUnresolvedSuperPostfix(
1573 Send node, Element element, IncDecOperator operator, T arg) {
1574 handleNSMError(node);
1575 handleNoSend(node);
1576 handleNoSend(node);
1577 }
1578
1579 void visitUnresolvedSuperPrefix(
1580 Send node, Element element, IncDecOperator operator, T arg) {
1581 handleNSMError(node);
1582 handleNoSend(node);
1583 handleNoSend(node);
1584 }
1585
1586 void visitUnresolvedSuperSetterCompound(Send node, MethodElement getter,
1587 Element element, AssignmentOperator operator, Node rhs, T arg) {
Johnni Winther 2015/07/13 19:21:43 Here the getter _does_ exists but not the setter,
Siggi Cherem (dart-lang) 2015/09/29 01:39:33 good point. done
1588 handleNSMError(node);
1589 handleNoSend(node);
1590 handleNoSend(node);
1591 }
1592
1593 void visitUnresolvedSuperSetterCompoundIndexSet(Send node,
1594 MethodElement getter, Element element, Node index,
1595 AssignmentOperator operator, Node rhs, T arg) {
1596 handleNSMError(node);
1597 handleNoSend(node);
1598 handleNoSend(node);
1599 }
1600
1601 void visitUnresolvedSuperSetterIndexPostfix(Send node,
1602 MethodElement indexFunction, Element element, Node index,
1603 IncDecOperator operator, T arg) {
1604 handleNSMError(node);
1605 handleNoSend(node);
1606 handleNoSend(node);
1607 }
1608
1609 void visitUnresolvedSuperSetterIndexPrefix(Send node,
1610 MethodElement indexFunction, Element element, Node index,
1611 IncDecOperator operator, T arg) {
1612 handleNSMError(node);
1613 handleNoSend(node);
1614 handleNoSend(node);
1615 }
1616
1617 void visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
1618 Element element, IncDecOperator operator, T arg) {
1619 handleNSMError(node);
1620 handleNoSend(node);
1621 handleNoSend(node);
1622 }
1623
1624 void visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
1625 Element element, IncDecOperator operator, T arg) {
1626 handleNSMError(node);
1627 handleNoSend(node);
1628 handleNoSend(node);
1629 }
1630
1631 void visitUnresolvedSuperUnary(
1632 Send node, UnaryOperator operator, Element element, T arg) {
1633 handleNSMError(node);
1634 }
1635
1636 void visitUnresolvedTopLevelGetterCompound(Send node, Element element,
1637 MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
1638 handleNSMError(node);
1639 handleNoSend(node);
1640 handleNoSend(node);
1641 }
1642
1643 void visitUnresolvedTopLevelGetterPostfix(Send node, Element element,
1644 MethodElement setter, IncDecOperator operator, T arg) {
1645 handleNSMError(node);
1646 handleNoSend(node);
1647 handleNoSend(node);
1648 }
1649
1650 void visitUnresolvedTopLevelGetterPrefix(Send node, Element element,
1651 MethodElement setter, IncDecOperator operator, T arg) {
1652 handleNSMError(node);
1653 handleNoSend(node);
1654 handleNoSend(node);
1655 }
1656
1657 void visitUnresolvedTopLevelSetterCompound(Send node, MethodElement getter,
1658 Element element, AssignmentOperator operator, Node rhs, T arg) {
1659 handleNSMError(node);
1660 handleNoSend(node);
1661 handleNoSend(node);
1662 }
1663
1664 void visitUnresolvedTopLevelSetterPostfix(Send node, MethodElement getter,
1665 Element element, IncDecOperator operator, T arg) {
1666 handleNSMError(node);
1667 handleNoSend(node);
1668 handleNoSend(node);
1669 }
1670
1671 void visitUnresolvedTopLevelSetterPrefix(Send node, MethodElement getter,
1672 Element element, IncDecOperator operator, T arg) {
1673 handleNSMError(node);
1674 handleNoSend(node);
1675 handleNoSend(node);
1676 }
1677
1678 // Static
1679
1680 void visitConstantGet(Send node, ConstantExpression constant, T arg) {
1681 handleStatic(node);
1682 }
1683
1684 void visitConstantInvoke(Send node, ConstantExpression constant,
1685 NodeList arguments, CallStructure callStreucture, T arg) {
1686 handleStatic(node);
1687 }
1688
1689 void visitFactoryConstructorInvoke(NewExpression node,
1690 ConstructorElement constructor, InterfaceType type, NodeList arguments,
1691 CallStructure callStructure, T arg) {
1692 handleStatic(node);
1693 }
1694
1695 void visitStaticFieldGet(Send node, FieldElement field, T arg) {
1696 handleStatic(node);
1697 }
1698
1699 void visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, T arg) {
1700 handleStatic(node);
1701 }
1702
1703 void visitStaticFunctionGet(Send node, MethodElement function, T arg) {
1704 handleStatic(node);
1705 }
1706
1707 void visitStaticFunctionInvoke(Send node, MethodElement function,
1708 NodeList arguments, CallStructure callStructure, T arg) {
1709 handleStatic(node);
1710 }
1711
1712 void visitStaticGetterGet(Send node, FunctionElement getter, T arg) {
1713 handleStatic(node);
1714 }
1715
1716 void visitStaticGetterSet(
1717 SendSet node, FunctionElement getter, Node rhs, T arg) {
1718 handleStatic(node);
1719 }
1720
1721 void visitStaticSetterSet(
1722 SendSet node, FunctionElement setter, Node rhs, T arg) {
1723 handleStatic(node);
1724 }
1725
1726 void visitTopLevelFieldGet(Send node, FieldElement field, T arg) {
1727 handleStatic(node);
1728 }
1729
1730 void visitTopLevelFieldSet(
1731 SendSet node, FieldElement field, Node rhs, T arg) {
1732 handleStatic(node);
1733 }
1734
1735 void visitTopLevelFunctionGet(Send node, MethodElement function, T arg) {
1736 handleStatic(node);
1737 }
1738
1739 void visitTopLevelFunctionInvoke(Send node, MethodElement function,
1740 NodeList arguments, CallStructure callStructure, T arg) {
1741 handleStatic(node);
1742 }
1743
1744 void visitTopLevelGetterGet(Send node, FunctionElement getter, T arg) {
1745 handleStatic(node);
1746 }
1747
1748 void visitTopLevelSetterSet(
1749 SendSet node, FunctionElement setter, Node rhs, T arg) {
1750 handleStatic(node);
1751 }
1752
1753 // Virtual
1754
1755 void visitSuperCompoundIndexSet(SendSet node, MethodElement getter,
1756 MethodElement setter, Node index, AssignmentOperator operator, Node rhs,
1757 T arg) {
1758 handleSuper(node);
1759 handleOperator(node);
1760 handleSuper(node);
1761 }
1762
1763 void visitThisGet(Identifier node, T arg) {
1764 handleLocal(node); // TODO(sigmund): should we add a metric for "this"?
1765 }
1766
1767 void visitThisInvoke(
1768 Send node, NodeList arguments, CallStructure callStructure, T arg) {
1769 // TODO(sigmund): implement (treat like this.call())
1770 handleDynamic(node);
1771 }
1772
1773 void visitThisPropertyGet(Send node, Selector selector, T arg) {
1774 handleThisProperty(node, selector);
1775 }
1776
1777 void visitThisPropertySet(SendSet node, Selector selector, Node rhs, T arg) {
1778 handleThisProperty(node, selector);
1779 }
1780
1781 // Not count
1782
1783 void errorInvalidAssert(Send node, NodeList arguments, T arg) {
1784 handleNoSend(node);
1785 }
1786
1787 void errorNonConstantConstructorInvoke(NewExpression node, Element element,
1788 DartType type, NodeList arguments, CallStructure callStructure, T arg) {
1789 handleNoSend(node);
1790 }
1791
1792 void errorUndefinedBinaryExpression(
1793 Send node, Node left, Operator operator, Node right, T arg) {
1794 handleNoSend(node);
1795 }
1796
1797 void errorUndefinedUnaryExpression(
1798 Send node, Operator operator, Node expression, T arg) {
1799 handleNoSend(node);
1800 }
1801
1802 void visitAs(Send node, Node expression, DartType type, T arg) {
1803 handleNoSend(node);
1804 }
1805
1806 void visitAssert(Send node, Node expression, T arg) {
1807 handleNoSend(node);
1808 }
1809
1810 void visitClassTypeLiteralCompound(Send node, ConstantExpression constant,
1811 AssignmentOperator operator, Node rhs, T arg) {
1812 handleStatic(node);
1813 handleNSMError(node);
1814 handleNoSend(node);
1815 }
1816
1817 void visitClassTypeLiteralGet(Send node, ConstantExpression constant, T arg) {
1818 handleStatic(node);
1819 }
1820
1821 void visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
1822 NodeList arguments, CallStructure callStructure, T arg) {
1823 handleNSMError(node);
1824 }
1825
1826 void visitClassTypeLiteralPostfix(
1827 Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
1828 handleStatic(node);
1829 handleNSMError(node);
1830 handleNoSend(node);
1831 }
1832
1833 void visitClassTypeLiteralPrefix(
1834 Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
1835 handleStatic(node);
1836 handleNSMError(node);
1837 handleNoSend(node);
1838 }
1839
1840 void visitClassTypeLiteralSet(
1841 SendSet node, ConstantExpression constant, Node rhs, T arg) {
1842 handleNSMError(node);
1843 }
1844
1845 void visitDynamicTypeLiteralCompound(Send node, ConstantExpression constant,
1846 AssignmentOperator operator, Node rhs, T arg) {
1847 handleStatic(node);
1848 handleNSMError(node);
1849 handleNoSend(node);
1850 }
1851
1852 void visitDynamicTypeLiteralGet(
1853 Send node, ConstantExpression constant, T arg) {
1854 handleNSMError(node);
1855 }
1856
1857 void visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
1858 NodeList arguments, CallStructure callStructure, T arg) {
1859 handleNSMError(node);
1860 }
1861
1862 void visitDynamicTypeLiteralPostfix(
1863 Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
1864 handleStatic(node);
1865 handleNSMError(node);
1866 handleNoSend(node);
1867 }
1868
1869 void visitDynamicTypeLiteralPrefix(
1870 Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
1871 handleStatic(node);
1872 handleNSMError(node);
1873 handleNoSend(node);
1874 }
1875
1876 void visitDynamicTypeLiteralSet(
1877 SendSet node, ConstantExpression constant, Node rhs, T arg) {
1878 handleNSMError(node);
1879 }
1880
1881 void visitIfNull(Send node, Node left, Node right, T arg) {
1882 handleNoSend(node);
1883 }
1884
1885 void visitIs(Send node, Node expression, DartType type, T arg) {
1886 handleNoSend(node);
1887 }
1888
1889 void visitIsNot(Send node, Node expression, DartType type, T arg) {
1890 handleNoSend(node);
1891 }
1892
1893 void visitLogicalAnd(Send node, Node left, Node right, T arg) {
1894 handleNoSend(node);
1895 }
1896
1897 void visitLogicalOr(Send node, Node left, Node right, T arg) {
1898 handleNoSend(node);
1899 }
1900
1901 void visitNot(Send node, Node expression, T arg) {
1902 handleNoSend(node);
1903 }
1904
1905 String last;
1906 _checkInvariant(node, String msg) {
1907 msg = '$msg ${recursiveDiagnosticString(measurements, Metric.send)}';
1908 if (!measurements.checkInvariant(Metric.send) ||
1909 !measurements.checkInvariant(Metric.monomorphicSend) ||
1910 !measurements.checkInvariant(Metric.polymorphicSend)) {
1911 compiler.reportError(node,
1912 MessageKind.GENERIC, {'text': 'bad\n-- $msg\nlast:\n-- $last\n'});
1913 last = msg;
1914 } else {
1915 last = msg;
1916 }
1917 }
1918 }
1919
1920 /// Visitor that collects statistics for a single function.
1921 class _StatsTraversalVisitor<T> extends TraversalVisitor<dynamic, T>
1922 implements SemanticSendVisitor<dynamic, T> {
1923 final Compiler compiler;
1924 final _StatsVisitor statsVisitor;
1925 Measurements get measurements => statsVisitor.measurements;
1926 _StatsTraversalVisitor(Compiler compiler, TreeElements elements)
1927 : compiler = compiler,
1928 statsVisitor = new _StatsVisitor(compiler, elements,
1929 // TODO(sigmund): accept a list of analyses, so we can compare them
1930 // together.
1931 new TrustTypesAnalysisResult(elements, compiler.world)),
1932 //new NaiveAnalysisResult()),
1933 super(elements);
1934
1935 void visitSend(Send node) {
1936 try {
1937 node.accept(statsVisitor);
1938 } catch (e, t) {
1939 compiler.reportError(node, MessageKind.GENERIC, {'text': '$e\n$t'});
1940 }
1941 super.visitSend(node);
1942 }
1943
1944 void visitNewExpression(NewExpression node) {
1945 try {
1946 node.accept(statsVisitor);
1947 } catch (e, t) {
1948 compiler.reportError(node, MessageKind.GENERIC, {'text': '$e\n$t'});
1949 }
1950 super.visitNewExpression(node);
1951 }
1952 }
1953
1954 /// Helper to visit elements recursively
1955 // TODO(sigmund): maybe generalize and move to elements/visitor.dart?
1956 abstract class RecursiveElementVisitor<R, A> extends ElementVisitor<R, A> {
1957
1958 @override
1959 R visitWarnOnUseElement(WarnOnUseElement e, A arg) =>
1960 e.wrappedElement.accept(this, arg);
1961
1962 R visitScopeContainerElement(ScopeContainerElement e, A arg) {
1963 e.forEachLocalMember((l) => l.accept(this, arg));
1964 }
1965
1966 @override
1967 R visitCompilationUnitElement(CompilationUnitElement e, A arg) {
1968 e.forEachLocalMember((l) => l.accept(this, arg));
1969 }
1970
1971 @override
1972 R visitLibraryElement(LibraryElement e, A arg) {
1973 e.implementation.compilationUnits.forEach((u) => u.accept(this, arg));
1974 }
1975
1976 @override
1977 R visitVariableElement(VariableElement e, A arg) => null;
1978
1979 @override
1980 R visitParameterElement(ParameterElement e, A arg) => null;
1981
1982 @override
1983 R visitFormalElement(FormalElement e, A arg) => null;
1984
1985 @override
1986 R visitFieldElement(FieldElement e, A arg) => null;
1987
1988 @override
1989 R visitFieldParameterElement(InitializingFormalElement e, A arg) => null;
1990
1991 @override
1992 R visitAbstractFieldElement(AbstractFieldElement e, A arg) => null;
1993
1994 @override
1995 R visitFunctionElement(FunctionElement e, A arg) => null;
1996
1997 @override
1998 R visitConstructorElement(ConstructorElement e, A arg) {
1999 return visitFunctionElement(e, arg);
2000 }
2001
2002 @override
2003 R visitConstructorBodyElement(ConstructorBodyElement e, A arg) {
2004 return visitFunctionElement(e.constructor, arg);
2005 }
2006
2007 @override
2008 R visitClassElement(ClassElement e, A arg) {
2009 return visitScopeContainerElement(e, arg);
2010 }
2011
2012 @override
2013 R visitEnumClassElement(EnumClassElement e, A arg) {
2014 return visitClassElement(e, arg);
2015 }
2016
2017 @override
2018 R visitBoxFieldElement(BoxFieldElement e, A arg) => null;
2019
2020 @override
2021 R visitClosureClassElement(ClosureClassElement e, A arg) {
2022 return visitClassElement(e, arg);
2023 }
2024
2025 @override
2026 R visitClosureFieldElement(ClosureFieldElement e, A arg) {
2027 return visitVariableElement(e, arg);
2028 }
2029 }
2030
2031 // TODO(sigmund): get rid of debug messages.
2032 _debug(String message) {
2033 print('debug: $message');
2034 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698