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

Side by Side Diff: pkg/compiler/lib/src/info/send_info.dart

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

Powered by Google App Engine
This is Rietveld 408576698