| Index: pkg/compiler/lib/src/stats/builder.dart
|
| diff --git a/pkg/compiler/lib/src/stats/builder.dart b/pkg/compiler/lib/src/stats/builder.dart
|
| deleted file mode 100644
|
| index 1e683bd22ff1a743d19905636e6875d136a1d88c..0000000000000000000000000000000000000000
|
| --- a/pkg/compiler/lib/src/stats/builder.dart
|
| +++ /dev/null
|
| @@ -1,2381 +0,0 @@
|
| -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -/// Computes statistical data about a program. See `stats.dart` for more details
|
| -/// on the kind of data we collect.
|
| -library compiler.src.stats.stats_builder;
|
| -
|
| -import 'dart:convert';
|
| -import 'package:dart2js_info/src/measurements.dart';
|
| -import 'package:dart2js_info/src/util.dart' show recursiveDiagnosticString;
|
| -
|
| -import '../diagnostics/messages.dart' show MessageKind;
|
| -import '../compiler.dart' show Compiler;
|
| -import '../common/tasks.dart' show CompilerTask;
|
| -import '../dart_types.dart';
|
| -import '../closure.dart';
|
| -import '../elements/elements.dart';
|
| -import '../elements/visitor.dart' show ElementVisitor;
|
| -import '../resolution/operators.dart';
|
| -import '../resolution/semantic_visitor.dart';
|
| -import '../resolution/send_resolver.dart';
|
| -import '../resolution/tree_elements.dart';
|
| -import '../constants/expressions.dart';
|
| -import '../parser/partial_elements.dart' show PartialElement;
|
| -import '../tree/tree.dart';
|
| -import '../universe/selector.dart' show Selector;
|
| -import '../universe/call_structure.dart' show CallStructure;
|
| -
|
| -import 'analysis_result.dart';
|
| -import 'naive_analysis_result.dart';
|
| -import 'trusted_types_analysis_result.dart';
|
| -
|
| -/// Collects a set of [Measurements] about send expressions in the function [f].
|
| -// TODO(sigmund): collect information on initializers too.
|
| -Measurements collectSendMeasurements(FunctionElement f, Compiler compiler) {
|
| - return compiler.withCurrentElement(f, () {
|
| - // TODO(sigmund): enable for platform too.
|
| - if (f.library.isPlatformLibrary) return;
|
| - var name = _qualifiedName(f);
|
| - if (!f.hasNode) {
|
| - if (f is PartialElement) return const Measurements.unreachableFunction();
|
| - assert (f is ConstructorElement && f.isSynthesized);
|
| - // TODO(sigmund): measure synthethic forwarding sends, measure
|
| - // initializers
|
| - return new Measurements.reachableFunction();
|
| - }
|
| - if (!f.hasResolvedAst) {
|
| - _debug('no resolved ast ${f.runtimeType}');
|
| - return null;
|
| - }
|
| - var resolvedAst = f.resolvedAst;
|
| - if (resolvedAst.node == null) {
|
| - _debug('no node ${f.runtimeType}');
|
| - return null;
|
| - }
|
| - var def = resolvedAst.elements.getFunctionDefinition(resolvedAst.node);
|
| - if (def == null) {
|
| - assert (f is PartialElement);
|
| - return const Measurements.unreachableFunction();
|
| - }
|
| -
|
| - var visitor = new _StatsTraversalVisitor(
|
| - compiler, resolvedAst.elements,
|
| - compiler.spanFromNode(resolvedAst.node).uri);
|
| - resolvedAst.node.accept(visitor);
|
| - return visitor.measurements;
|
| - });
|
| -}
|
| -
|
| -_qualifiedName(FunctionElement f) {
|
| - var cls = f.enclosingClass;
|
| - return (cls != null) ? '${cls.name}.${f.name}' : f.name;
|
| -}
|
| -
|
| -/// Visitor that categorizes data about an individual send.
|
| -class _StatsVisitor<T> extends Visitor
|
| - with SendResolverMixin, SemanticSendResolvedMixin<dynamic, T>
|
| - implements SemanticSendVisitor<dynamic, T> {
|
| -
|
| - // TODO(sigmund): consider passing in several AnalysisResults at once, so we
|
| - // can compute the different metrics together.
|
| - /// Information we know about the program from static analysis.
|
| - final AnalysisResult info;
|
| -
|
| - /// Results from this function.
|
| - final Measurements measurements;
|
| -
|
| - final Compiler compiler;
|
| - final TreeElements elements;
|
| -
|
| - SemanticSendVisitor<dynamic, T> get sendVisitor => this;
|
| -
|
| - _StatsVisitor(this.compiler, this.elements, this.info, Uri sourceUri)
|
| - : measurements = new Measurements.reachableFunction(sourceUri);
|
| -
|
| - visitNode(Node node) => throw "unhandled ${node.runtimeType}: $node";
|
| - apply(Node node, T arg) => throw "missing apply ${node.runtimeType}: $node";
|
| - internalError(Node node, String arg) => throw "internal error on $node";
|
| -
|
| - visitSend(Send node) {
|
| - _checkInvariant(node, 'before');
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.send, span.begin, span.end);
|
| - if (node is SendSet) {
|
| - if ((node.assignmentOperator != null &&
|
| - node.assignmentOperator.source != '=') ||
|
| - node.isPrefix ||
|
| - node.isPostfix) {
|
| - assert(!node.isIfNullAssignment);
|
| - // We count get and set separately in case one of them is defined by the
|
| - // other could be a nSM error.
|
| - measurements.record(Metric.send, span.begin, span.end);
|
| - measurements.record(Metric.send, span.begin, span.end);
|
| - } else if (node.isIfNullAssignment) {
|
| - measurements.record(Metric.send, span.begin, span.end);
|
| - }
|
| - }
|
| - super.visitSend(node);
|
| - _checkInvariant(node, 'after ');
|
| - }
|
| -
|
| - visitNewExpression(NewExpression node) {
|
| - _checkInvariant(node, 'before');
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.send, span.begin, span.end);
|
| - super.visitNewExpression(node);
|
| - _checkInvariant(node, 'after ');
|
| - }
|
| -
|
| - /// A monomorphic local variable read.
|
| - ///
|
| - /// See [Metric.send] for a full categorization of sends.
|
| - handleLocal(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.localSend, span.begin, span.end);
|
| - }
|
| -
|
| - /// A monomorphic virual call on [node], where we know which function is the
|
| - /// target of the call (for example, because only one type in a class
|
| - /// hierarchy implements a function with a given name).
|
| - ///
|
| - /// See [Metric.send] for a full categorization of sends.
|
| - handleSingleInstance(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.instanceSend, span.begin, span.end);
|
| - }
|
| -
|
| - /// A monomorphic call that goes through an interceptor. This is equivalent in
|
| - /// terms of what the compiler knows as we do with [handleSignleInstance], and
|
| - /// because we know the target of the call, we also know that it doesn't live
|
| - /// in the object instance, but on an interceptor on the side.
|
| - ///
|
| - /// See [Metric.send] for a full categorization of sends.
|
| - handleSingleInterceptor(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.interceptorSend, span.begin, span.end);
|
| - }
|
| -
|
| - /// A polymorphic call that goes through an interceptor.
|
| - ///
|
| - /// See [Metric.send] for a full categorization of sends.
|
| - handleMultiInterceptor(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.polymorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.multiInterceptorSend, span.begin, span.end);
|
| - }
|
| -
|
| - handleConstructor(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.constructorSend, span.begin, span.end);
|
| - }
|
| -
|
| - handleDynamic(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.polymorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.dynamicSend, span.begin, span.end);
|
| - }
|
| -
|
| - handleVirtual(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.polymorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.virtualSend, span.begin, span.end);
|
| - }
|
| -
|
| - handleNSMError(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.nsmErrorSend, span.begin, span.end);
|
| - }
|
| -
|
| - handleNSMSingle(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.singleNsmCallSend, span.begin, span.end);
|
| - }
|
| -
|
| - handleNSMSuper(Node node, ClassElement type) {
|
| - var superclass = type.superclass;
|
| - var member = superclass.lookupMember('noSuchMethod');
|
| - if (!member.enclosingClass.isObject) {
|
| - handleNSMSingle(node);
|
| - } else {
|
| - handleNSMError(node);
|
| - }
|
| - }
|
| -
|
| - handleNSMAny(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.polymorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.multiNsmCallSend, span.begin, span.end);
|
| - }
|
| -
|
| - handleSuper(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.superSend, span.begin, span.end);
|
| - }
|
| - handleTypeVariable(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.typeVariableSend, span.begin, span.end);
|
| - }
|
| - handleStatic(Node node) {
|
| - var span = compiler.spanFromNode(node);
|
| - measurements.record(Metric.monomorphicSend, span.begin, span.end);
|
| - measurements.record(Metric.staticSend, span.begin, span.end);
|
| - }
|
| -
|
| - handleNoSend(Node node) {
|
| - measurements.popLast(Metric.send);
|
| - }
|
| -
|
| - void handleDynamicProperty(Node node, Node receiver, Selector selector) {
|
| - // staticSend: no (automatically)
|
| - // superSend: no (automatically)
|
| - // localSend: no (automatically)
|
| - // constructorSend: no (automatically)
|
| - // typeVariableSend: no (automatically)
|
| -
|
| - // nsmErrorSend: receiver has no `selector` nor nSM.
|
| - // singleNsmCallSend: receiver has no `selector`, but definitely has `nSM`
|
| - // instanceSend: receiver has `selector`, no need to use an interceptor
|
| - // interceptorSend: receiver has `selector`, but we know we need an
|
| - // interceptor to get it
|
| -
|
| - // multiNsmCallSend: receiver has no `selector`, not sure if receiver has
|
| - // nSM, or not sure which nSM is called (does this one
|
| - // matter, or does nSM is treated like an instance method
|
| - // call)?
|
| - // virtualSend: receiver has `selector`, we know we do not need an
|
| - // interceptor, not sure which specific type implements
|
| - // the selector.
|
| - // multiInterceptorSend: multiple possible receiver types, all using an
|
| - // interceptor to get the `selector`, might be
|
| - // possbile to pick a special selector logic for this
|
| - // combination?
|
| - // dynamicSend: any combination of the above.
|
| -
|
| - ReceiverInfo receiverInfo = info.infoForReceiver(receiver);
|
| - SelectorInfo selectorInfo = info.infoForSelector(receiver, selector);
|
| - Boolish hasSelector = selectorInfo.exists;
|
| - Boolish hasNsm = receiverInfo.hasNoSuchMethod;
|
| -
|
| - if (hasSelector == Boolish.no) {
|
| - if (hasNsm == Boolish.no) {
|
| - handleNSMError(node);
|
| - } else if (hasNsm == Boolish.yes) {
|
| - if (receiverInfo.possibleNsmTargets == 1) {
|
| - handleNSMSingle(node);
|
| - } else {
|
| - handleNSMAny(node);
|
| - }
|
| - } else {
|
| - handleDynamic(node);
|
| - }
|
| - return;
|
| - }
|
| -
|
| - Boolish usesInterceptor = selectorInfo.usesInterceptor;
|
| - if (hasSelector == Boolish.yes) {
|
| - if (selectorInfo.isAccurate && selectorInfo.possibleTargets == 1) {
|
| - assert (usesInterceptor != Boolish.maybe);
|
| - if (usesInterceptor == Boolish.yes) {
|
| - handleSingleInterceptor(node);
|
| - } else {
|
| - handleSingleInstance(node);
|
| - }
|
| - } else {
|
| - if (usesInterceptor == Boolish.no) {
|
| - handleVirtual(node);
|
| - } else if (usesInterceptor == Boolish.yes) {
|
| - handleMultiInterceptor(node);
|
| - } else {
|
| - handleDynamic(node);
|
| - }
|
| - }
|
| - return;
|
| - }
|
| - handleDynamic(node);
|
| - }
|
| -
|
| - void handleThisProperty(Send node, Selector selector) {
|
| - handleDynamicProperty(node, node.receiver, selector);
|
| - }
|
| -
|
| - void handleIndex(Node node) {
|
| - handleDynamic(node);
|
| - }
|
| -
|
| - void handleOperator(Node node) {
|
| - handleDynamic(node);
|
| - }
|
| -
|
| - void handleInvoke(Node node) {
|
| - handleDynamic(node);
|
| - }
|
| -
|
| - void handleEquals(Node node) {
|
| - handleDynamic(node);
|
| - }
|
| -
|
| - // Constructors
|
| -
|
| - void visitAbstractClassConstructorInvoke(NewExpression node,
|
| - ConstructorElement element, InterfaceType type, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleConstructor(node);
|
| - }
|
| -
|
| - void visitBoolFromEnvironmentConstructorInvoke(NewExpression node,
|
| - BoolFromEnvironmentConstantExpression constant, T arg) {
|
| - handleConstructor(node);
|
| - }
|
| -
|
| - void visitConstConstructorInvoke(
|
| - NewExpression node, ConstructedConstantExpression constant, T arg) {
|
| - handleConstructor(node);
|
| - }
|
| -
|
| - void visitGenerativeConstructorInvoke(NewExpression node,
|
| - ConstructorElement constructor, InterfaceType type, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleConstructor(node);
|
| - }
|
| -
|
| - void visitIntFromEnvironmentConstructorInvoke(NewExpression node,
|
| - IntFromEnvironmentConstantExpression constant, T arg) {
|
| - handleConstructor(node);
|
| - }
|
| -
|
| - void visitRedirectingFactoryConstructorInvoke(NewExpression node,
|
| - ConstructorElement constructor, InterfaceType type,
|
| - ConstructorElement effectiveTarget, InterfaceType effectiveTargetType,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleConstructor(node);
|
| - }
|
| -
|
| - void visitRedirectingGenerativeConstructorInvoke(NewExpression node,
|
| - ConstructorElement constructor, InterfaceType type, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleConstructor(node);
|
| - }
|
| -
|
| - void visitStringFromEnvironmentConstructorInvoke(NewExpression node,
|
| - StringFromEnvironmentConstantExpression constant, T arg) {
|
| - handleConstructor(node);
|
| - }
|
| -
|
| - // Dynamic sends
|
| -
|
| -
|
| - // TODO(sigmund): many many things to add:
|
| - // -- support for operators, indexers, etc.
|
| - // -- logic about nullables
|
| - // -- int, JSArray
|
| - // -- all interceptors
|
| -
|
| - void visitBinary(
|
| - Send node, Node left, BinaryOperator operator, Node right, T arg) {
|
| - handleOperator(node);
|
| - }
|
| -
|
| - void visitCompoundIndexSet(SendSet node, Node receiver, Node index,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleIndex(node); // t1 = receiver[index]
|
| - handleOperator(node); // t2 = t1 op rhs
|
| - handleIndex(node); // receiver[index] = t2
|
| - }
|
| -
|
| - void visitDynamicPropertyCompound(Send node, Node receiver,
|
| - Name name, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| -
|
| - void visitDynamicPropertyGet(
|
| - Send node, Node receiver, Name name, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - }
|
| -
|
| - void visitDynamicPropertyInvoke(
|
| - Send node, Node receiver, NodeList arguments, Selector selector, T arg) {
|
| - handleDynamicProperty(node, receiver, selector);
|
| - }
|
| -
|
| - void visitDynamicPropertyPostfix(Send node, Node receiver,
|
| - Name name, IncDecOperator operator, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitDynamicPropertyPrefix(Send node, Node receiver, Name name,
|
| - IncDecOperator operator, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitDynamicPropertySet(
|
| - SendSet node, Node receiver, Name name, Node rhs, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitDynamicPropertySetIfNull(
|
| - Send node, Node receiver, Name name, Node rhs, T arg) {
|
| - // read to check for null?
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitEquals(Send node, Node left, Node right, T arg) {
|
| - handleEquals(node);
|
| - }
|
| -
|
| - void visitExpressionInvoke(Send node, Node expression, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitIfNotNullDynamicPropertyCompound(Send node, Node receiver,
|
| - Name name, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitIfNotNullDynamicPropertyGet(
|
| - Send node, Node receiver, Name name, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - }
|
| -
|
| - void visitIfNotNullDynamicPropertyInvoke(
|
| - Send node, Node receiver, NodeList arguments, Selector selector, T arg) {
|
| - handleDynamicProperty(node, receiver, selector);
|
| - }
|
| -
|
| - void visitIfNotNullDynamicPropertyPostfix(Send node, Node receiver, Name name,
|
| - IncDecOperator operator, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitIfNotNullDynamicPropertyPrefix(Send node, Node receiver, Name name,
|
| - IncDecOperator operator, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitIfNotNullDynamicPropertySet(
|
| - SendSet node, Node receiver, Name name, Node rhs, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitIfNotNullDynamicPropertySetIfNull(
|
| - Send node, Node receiver, Name name, Node rhs, T arg) {
|
| - handleDynamicProperty(node, receiver, new Selector.getter(name));
|
| - handleDynamicProperty(node, receiver, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitIndex(Send node, Node receiver, Node index, T arg) {
|
| - handleIndex(node);
|
| - }
|
| -
|
| - void visitIndexPostfix(
|
| - Send node, Node receiver, Node index, IncDecOperator operator, T arg) {
|
| - handleIndex(node);
|
| - handleOperator(node);
|
| - handleIndex(node);
|
| - }
|
| -
|
| - void visitIndexPrefix(
|
| - Send node, Node receiver, Node index, IncDecOperator operator, T arg) {
|
| - handleIndex(node);
|
| - handleOperator(node);
|
| - handleIndex(node);
|
| - }
|
| -
|
| - void visitIndexSet(SendSet node, Node receiver, Node index, Node rhs, T arg) {
|
| - handleIndex(node);
|
| - }
|
| -
|
| - void visitLocalVariableCompound(Send node, LocalVariableElement variable,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitLocalVariableInvoke(Send node, LocalVariableElement variable,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitLocalVariablePostfix(Send node, LocalVariableElement variable,
|
| - IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitLocalVariablePrefix(Send node, LocalVariableElement variable,
|
| - IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitNotEquals(Send node, Node left, Node right, T arg) {
|
| - handleEquals(node);
|
| - }
|
| -
|
| - void visitParameterCompound(Send node, ParameterElement parameter,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitParameterInvoke(Send node, ParameterElement parameter,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitParameterPostfix(
|
| - Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitParameterPrefix(
|
| - Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitStaticFieldCompound(Send node, FieldElement field,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitStaticFieldPostfix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticFieldPrefix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticGetterInvoke(Send node, FunctionElement getter,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitStaticGetterSetterCompound(Send node, FunctionElement getter,
|
| - FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitSuperFieldCompound(Send node, FieldElement field,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldFieldCompound(Send node, FieldElement readField,
|
| - FieldElement writtenField, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldFieldPostfix(Send node, FieldElement readField,
|
| - FieldElement writtenField, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldFieldPrefix(Send node, FieldElement readField,
|
| - FieldElement writtenField, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldFieldSetIfNull(
|
| - Send node, FieldElement readField, FieldElement writtenField, Node rhs,
|
| - T arg) {
|
| - handleSuper(node);
|
| - handleNSMSuper(node, readField.enclosingClass);
|
| - }
|
| -
|
| - void visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitSuperFieldPostfix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldPrefix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldSetterCompound(Send node, FieldElement field,
|
| - FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldSetterPostfix(Send node, FieldElement field,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldSetterPrefix(Send node, FieldElement field,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldSetterSetIfNull(Send node, FieldElement field,
|
| - FunctionElement setter, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterFieldCompound(Send node, FunctionElement getter,
|
| - FieldElement field, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
|
| - FieldElement field, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
|
| - FieldElement field, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterFieldSetIfNull(Send node, FunctionElement getter,
|
| - FieldElement field, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterInvoke(Send node, FunctionElement getter,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitSuperGetterSetterCompound(Send node, FunctionElement getter,
|
| - FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterSetterSetIfNull(Send node, FunctionElement getter,
|
| - FunctionElement setter, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperIndexPostfix(Send node, MethodElement indexFunction,
|
| - MethodElement indexSetFunction, Node index, IncDecOperator operator,
|
| - T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperIndexPrefix(Send node, MethodElement indexFunction,
|
| - MethodElement indexSetFunction, Node index, IncDecOperator operator,
|
| - T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperMethodSetterCompound(Send node, FunctionElement method,
|
| - FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleNSMSuper(node, method.enclosingClass);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperMethodSetterPostfix(Send node, FunctionElement method,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleNSMSuper(node, method.enclosingClass);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperMethodSetterPrefix(Send node, FunctionElement method,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleNSMSuper(node, method.enclosingClass);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperMethodSetterSetIfNull(Send node, FunctionElement method,
|
| - FunctionElement setter, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitThisPropertyCompound(Send node, Name name,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleThisProperty(node, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleThisProperty(node, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitThisPropertyInvoke(
|
| - Send node, NodeList arguments, Selector selector, T arg) {
|
| - handleThisProperty(node, selector);
|
| - }
|
| -
|
| - void visitThisPropertyPostfix(Send node, Name name, IncDecOperator operator,
|
| - T arg) {
|
| - handleThisProperty(node, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleThisProperty(node, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitThisPropertyPrefix(Send node, Name name, IncDecOperator operator,
|
| - T arg) {
|
| - handleThisProperty(node, new Selector.getter(name));
|
| - handleOperator(node);
|
| - handleThisProperty(node, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitTopLevelFieldCompound(Send node, FieldElement field,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelFieldInvoke(Send node, FieldElement field,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitTopLevelFieldPostfix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelFieldPrefix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelGetterInvoke(Send node, FunctionElement getter,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleInvoke(node);
|
| - }
|
| -
|
| - void visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
|
| - FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitUnary(Send node, UnaryOperator operator, Node expression, T arg) {
|
| - handleDynamic(node);
|
| - }
|
| -
|
| - // Local variable sends
|
| -
|
| - void visitLocalFunctionGet(Send node, LocalFunctionElement function, T arg) {
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitLocalFunctionInvoke(Send node, LocalFunctionElement function,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitLocalVariableGet(Send node, LocalVariableElement variable, T arg) {
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitLocalVariableSet(
|
| - SendSet node, LocalVariableElement variable, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitLocalVariableSetIfNull(
|
| - SendSet node, LocalVariableElement variable, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitParameterGet(Send node, ParameterElement parameter, T arg) {
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitParameterSet(
|
| - SendSet node, ParameterElement parameter, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - }
|
| -
|
| - void visitParameterSetIfNull(
|
| - Send node, ParameterElement parameter, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleLocal(node);
|
| - }
|
| -
|
| - // Super monomorphic sends
|
| -
|
| - void visitSuperBinary(Send node, FunctionElement function,
|
| - BinaryOperator operator, Node argument, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperEquals(
|
| - Send node, FunctionElement function, Node argument, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldGet(Send node, FieldElement field, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperFieldSetIfNull(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterGet(Send node, FunctionElement getter, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperGetterSet(
|
| - SendSet node, FunctionElement getter, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperIndex(Send node, FunctionElement function, Node index, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperIndexSet(
|
| - SendSet node, FunctionElement function, Node index, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperMethodGet(Send node, MethodElement method, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperMethodInvoke(Send node, MethodElement method,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperNotEquals(
|
| - Send node, FunctionElement function, Node argument, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperSetterSet(
|
| - SendSet node, FunctionElement setter, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitSuperUnary(
|
| - Send node, UnaryOperator operator, FunctionElement function, T arg) {
|
| - handleSuper(node);
|
| - }
|
| -
|
| - // Statically known "no such method" sends
|
| -
|
| - void visitConstructorIncompatibleInvoke(NewExpression node,
|
| - ConstructorElement constructor, InterfaceType type, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalLocalVariableCompound(Send node, LocalVariableElement variable,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalLocalVariablePostfix(Send node, LocalVariableElement variable,
|
| - IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalLocalVariablePrefix(Send node, LocalVariableElement variable,
|
| - IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalLocalVariableSet(
|
| - SendSet node, LocalVariableElement variable, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalLocalVariableSetIfNull(
|
| - SendSet node, LocalVariableElement variable, Node rhs, T arg) {
|
| - handleLocal(node); // read for null
|
| - handleNSMError(node); // set fails
|
| - }
|
| -
|
| - void visitFinalParameterCompound(Send node, ParameterElement parameter,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalParameterPostfix(
|
| - Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalParameterPrefix(
|
| - Send node, ParameterElement parameter, IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalParameterSet(
|
| - SendSet node, ParameterElement parameter, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalParameterSetIfNull(
|
| - SendSet node, ParameterElement parameter, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalStaticFieldCompound(Send node, FieldElement field,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalStaticFieldPostfix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalStaticFieldPrefix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalStaticFieldSet(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalStaticFieldSetIfNull(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalSuperFieldSetIfNull(Send node, FieldElement field,
|
| - Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleNSMSuper(node, field.enclosingClass);
|
| - }
|
| -
|
| - void visitFinalSuperFieldCompound(Send node, FieldElement field,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, field.enclosingClass);
|
| - }
|
| -
|
| - void visitFinalSuperFieldPostfix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, field.enclosingClass);
|
| - }
|
| -
|
| - void visitFinalSuperFieldPrefix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, field.enclosingClass);
|
| - }
|
| -
|
| - void visitFinalSuperFieldSet(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleNSMSuper(node, field.enclosingClass);
|
| - }
|
| -
|
| - void visitFinalTopLevelFieldCompound(Send node, FieldElement field,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalTopLevelFieldPostfix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalTopLevelFieldPrefix(
|
| - Send node, FieldElement field, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleOperator(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalTopLevelFieldSet(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitFinalTopLevelFieldSetIfNull(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTopLevelGetterSetterSetIfNull(Send node, FunctionElement getter,
|
| - FunctionElement setter, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelMethodSetterSetIfNull(Send node, FunctionElement method,
|
| - FunctionElement setter, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelMethodSetIfNull(Send node, FunctionElement method,
|
| - Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitLocalFunctionIncompatibleInvoke(Send node,
|
| - LocalFunctionElement function, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitLocalFunctionCompound(Send node, LocalFunctionElement function,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitLocalFunctionPostfix(Send node, LocalFunctionElement function,
|
| - IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitLocalFunctionPrefix(Send node, LocalFunctionElement function,
|
| - IncDecOperator operator, T arg) {
|
| - handleLocal(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitLocalFunctionSet(
|
| - SendSet node, LocalFunctionElement function, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitLocalFunctionSetIfNull(
|
| - SendSet node, LocalFunctionElement function, Node rhs, T arg) {
|
| - handleLocal(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitStaticFunctionSet(
|
| - Send node, MethodElement function, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitStaticMethodCompound(Send node, MethodElement method,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node); // operator on a method closure yields nSM
|
| - handleNoSend(node); // setter is not invoked, don't count it.
|
| - }
|
| -
|
| - void visitStaticMethodPostfix(
|
| - Send node, MethodElement method, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitStaticMethodPrefix(
|
| - Send node, MethodElement method, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitStaticMethodSetterCompound(Send node, MethodElement method,
|
| - MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node); // operator on a method closure yields nSM
|
| - handleNoSend(node); // setter is not invoked, don't count it.
|
| - }
|
| -
|
| - void visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitStaticSetterGet(Send node, FunctionElement setter, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitStaticSetterInvoke(Send node, FunctionElement setter,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitSuperMethodCompound(Send node, FunctionElement method,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| -
|
| - // An operator send on a method closure yields nSM
|
| - handleNSMSuper(node, method.enclosingClass);
|
| -
|
| - handleNoSend(node); // setter is not invoked, don't count it.
|
| - }
|
| -
|
| - void visitSuperMethodIncompatibleInvoke(Send node, MethodElement method,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNSMSuper(node, method.enclosingClass);
|
| - }
|
| -
|
| - void visitSuperMethodPostfix(
|
| - Send node, FunctionElement method, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleNSMSuper(node, method.enclosingClass);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitSuperMethodPrefix(
|
| - Send node, FunctionElement method, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleNSMSuper(node, method.enclosingClass);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitSuperMethodSet(Send node, MethodElement method, Node rhs, T arg) {
|
| - handleNSMSuper(node, method.enclosingClass);
|
| - }
|
| -
|
| - void visitSuperMethodSetIfNull(
|
| - Send node, MethodElement method, Node rhs, T arg) {
|
| - handleNSMSuper(node, method.enclosingClass);
|
| - }
|
| -
|
| - void visitSuperSetterGet(Send node, FunctionElement setter, T arg) {
|
| - handleNSMSuper(node, setter.enclosingClass);
|
| - }
|
| -
|
| - void visitSuperSetterInvoke(Send node, FunctionElement setter,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNSMSuper(node, setter.enclosingClass);
|
| - }
|
| -
|
| - void visitTopLevelFunctionIncompatibleInvoke(Send node,
|
| - MethodElement function, NodeList arguments, CallStructure callStructure,
|
| - T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTopLevelFunctionSet(
|
| - Send node, MethodElement function, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTopLevelGetterSet(
|
| - SendSet node, FunctionElement getter, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTopLevelMethodCompound(Send node, FunctionElement method,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node); // operator on a method closure yields nSM
|
| - handleNoSend(node); // setter is not invoked, don't count it.
|
| - }
|
| -
|
| - void visitTopLevelMethodPostfix(
|
| - Send node, MethodElement method, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTopLevelMethodPrefix(
|
| - Send node, MethodElement method, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
|
| - FunctionElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node); // operator on a method closure yields nSM
|
| - handleNoSend(node); // setter is not invoked, don't count it.
|
| - }
|
| -
|
| - void visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
|
| - FunctionElement setter, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTopLevelSetterGet(Send node, FunctionElement setter, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTopLevelSetterInvoke(Send node, FunctionElement setter,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTypeVariableTypeLiteralCompound(Send node,
|
| - TypeVariableElement element, AssignmentOperator operator, Node rhs,
|
| - T arg) {
|
| - handleTypeVariable(node);
|
| - handleNSMError(node); // operator on a method closure yields nSM
|
| - handleNoSend(node); // setter is not invoked, don't count it.
|
| - }
|
| -
|
| - void visitTypeVariableTypeLiteralGet(
|
| - Send node, TypeVariableElement element, T arg) {
|
| - handleTypeVariable(node);
|
| - }
|
| -
|
| - void visitTypeVariableTypeLiteralInvoke(Send node,
|
| - TypeVariableElement element, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTypeVariableTypeLiteralPostfix(
|
| - Send node, TypeVariableElement element, IncDecOperator operator, T arg) {
|
| - handleTypeVariable(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTypeVariableTypeLiteralPrefix(
|
| - Send node, TypeVariableElement element, IncDecOperator operator, T arg) {
|
| - handleTypeVariable(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTypeVariableTypeLiteralSet(
|
| - SendSet node, TypeVariableElement element, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTypeVariableTypeLiteralSetIfNull(
|
| - SendSet node, TypeVariableElement element, Node rhs, T arg) {
|
| - handleTypeVariable(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTypedefTypeLiteralCompound(Send node, ConstantExpression constant,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleTypeVariable(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTypedefTypeLiteralGet(
|
| - Send node, ConstantExpression constant, T arg) {
|
| - handleTypeVariable(node);
|
| - }
|
| -
|
| - void visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTypedefTypeLiteralPostfix(
|
| - Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
|
| - handleTypeVariable(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTypedefTypeLiteralPrefix(
|
| - Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
|
| - handleTypeVariable(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitTypedefTypeLiteralSet(
|
| - SendSet node, ConstantExpression constant, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTypedefTypeLiteralSetIfNull(
|
| - SendSet node, ConstantExpression constant, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitUnresolvedClassConstructorInvoke(NewExpression node,
|
| - Element element, DartType type, NodeList arguments, Selector selector,
|
| - T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitUnresolvedCompound(Send node, Element element,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedConstructorInvoke(NewExpression node, Element constructor,
|
| - DartType type, NodeList arguments, Selector selector, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitUnresolvedGet(Send node, Element element, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitUnresolvedInvoke(Send node, Element element, NodeList arguments,
|
| - Selector selector, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitUnresolvedPostfix(
|
| - Send node, Element element, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedPrefix(
|
| - Send node, Element element, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedRedirectingFactoryConstructorInvoke(NewExpression node,
|
| - ConstructorElement constructor, InterfaceType type, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitUnresolvedSet(Send node, Element element, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitUnresolvedSetIfNull(Send node, Element element, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedStaticGetterCompound(Send node, Element element,
|
| - MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedStaticGetterPostfix(Send node, Element element,
|
| - MethodElement setter, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedStaticGetterPrefix(Send node, Element element,
|
| - MethodElement setter, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedStaticGetterSetIfNull(Send node, Element element,
|
| - MethodElement setter, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedStaticSetterCompound(Send node, MethodElement getter,
|
| - Element element, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedStaticSetterPostfix(Send node, MethodElement getter,
|
| - Element element, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedStaticSetterPrefix(Send node, MethodElement getter,
|
| - Element element, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedStaticSetterSetIfNull(Send node, MethodElement getter,
|
| - Element element, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperBinary(Send node, Element element,
|
| - BinaryOperator operator, Node argument, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperCompound(Send node, Element element,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - // TODO(sigmund): we should only count the next 2 if we know that the
|
| - // superclass has a nSM method.
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperCompoundIndexSet(Send node, Element element,
|
| - Node index, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleNoSend(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperGet(Send node, Element element, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperSetIfNull(
|
| - Send node, Element element, Node rhs, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperGetterCompound(Send node, Element element,
|
| - MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperGetterCompoundIndexSet(Send node, Element element,
|
| - MethodElement setter, Node index, AssignmentOperator operator, Node rhs,
|
| - T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperGetterIndexPostfix(Send node, Element element,
|
| - MethodElement setter, Node index, IncDecOperator operator, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperGetterIndexPrefix(Send node, Element element,
|
| - MethodElement setter, Node index, IncDecOperator operator, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperGetterPostfix(Send node, Element element,
|
| - MethodElement setter, IncDecOperator operator, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperGetterPrefix(Send node, Element element,
|
| - MethodElement setter, IncDecOperator operator, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperGetterSetIfNull(Send node, Element element,
|
| - MethodElement setter, Node rhs, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitUnresolvedSuperIndex(
|
| - Send node, Element element, Node index, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperIndexPostfix(
|
| - Send node, Element element, Node index, IncDecOperator operator, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperIndexPrefix(
|
| - Send node, Element element, Node index, IncDecOperator operator, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperIndexSet(
|
| - Send node, Element element, Node index, Node rhs, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperInvoke(Send node, Element element,
|
| - NodeList arguments, Selector selector, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperPostfix(
|
| - Send node, Element element, IncDecOperator operator, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperPrefix(
|
| - Send node, Element element, IncDecOperator operator, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperSetterCompound(Send node, MethodElement getter,
|
| - Element element, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperSetterCompoundIndexSet(Send node,
|
| - MethodElement getter, Element element, Node index,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperSetterIndexPostfix(Send node,
|
| - MethodElement indexFunction, Element element, Node index,
|
| - IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperSetterIndexPrefix(Send node,
|
| - MethodElement indexFunction, Element element, Node index,
|
| - IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
|
| - Element element, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
|
| - Element element, IncDecOperator operator, T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperSetterSetIfNull(Send node, MethodElement getter,
|
| - Element element, Node rhs, T arg) {
|
| - handleSuper(node);
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedSuperUnary(
|
| - Send node, UnaryOperator operator, Element element, T arg) {
|
| - handleNSMSuper(node, element.enclosingClass);
|
| - }
|
| -
|
| - void visitUnresolvedTopLevelGetterCompound(Send node, Element element,
|
| - MethodElement setter, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedTopLevelGetterPostfix(Send node, Element element,
|
| - MethodElement setter, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedTopLevelGetterPrefix(Send node, Element element,
|
| - MethodElement setter, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedTopLevelGetterSetIfNull(Send node, Element element,
|
| - MethodElement setter, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedTopLevelSetterCompound(Send node, MethodElement getter,
|
| - Element element, AssignmentOperator operator, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedTopLevelSetterPostfix(Send node, MethodElement getter,
|
| - Element element, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedTopLevelSetterPrefix(Send node, MethodElement getter,
|
| - Element element, IncDecOperator operator, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitUnresolvedTopLevelSetterSetIfNull(Send node, MethodElement getter,
|
| - Element element, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - // Static
|
| -
|
| - void visitConstantGet(Send node, ConstantExpression constant, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitConstantInvoke(Send node, ConstantExpression constant,
|
| - NodeList arguments, CallStructure callStreucture, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitFactoryConstructorInvoke(NewExpression node,
|
| - ConstructorElement constructor, InterfaceType type, NodeList arguments,
|
| - CallStructure callStructure, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticFieldGet(Send node, FieldElement field, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticFieldSetIfNull(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticFunctionGet(Send node, MethodElement function, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticFunctionInvoke(Send node, MethodElement function,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticGetterGet(Send node, FunctionElement getter, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticGetterSet(
|
| - SendSet node, FunctionElement getter, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticSetterSet(
|
| - SendSet node, FunctionElement setter, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticGetterSetterSetIfNull(
|
| - Send node,
|
| - FunctionElement getter,
|
| - FunctionElement setter,
|
| - Node rhs,
|
| - T arg) {
|
| - handleStatic(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticMethodSetterSetIfNull(
|
| - Send node,
|
| - MethodElement method,
|
| - MethodElement setter,
|
| - Node rhs,
|
| - T arg) {
|
| - handleStatic(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitStaticMethodSetIfNull(
|
| - Send node,
|
| - FunctionElement method,
|
| - Node rhs,
|
| - T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitTopLevelFieldGet(Send node, FieldElement field, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelFieldSet(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelFieldSetIfNull(
|
| - SendSet node, FieldElement field, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelFunctionGet(Send node, MethodElement function, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelFunctionInvoke(Send node, MethodElement function,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelGetterGet(Send node, FunctionElement getter, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitTopLevelSetterSet(
|
| - SendSet node, FunctionElement setter, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - // Virtual
|
| -
|
| - void visitSuperCompoundIndexSet(SendSet node, MethodElement getter,
|
| - MethodElement setter, Node index, AssignmentOperator operator, Node rhs,
|
| - T arg) {
|
| - handleSuper(node);
|
| - handleOperator(node);
|
| - handleSuper(node);
|
| - }
|
| -
|
| - void visitThisGet(Identifier node, T arg) {
|
| - handleLocal(node); // TODO(sigmund): should we add a metric for "this"?
|
| - }
|
| -
|
| - void visitThisInvoke(
|
| - Send node, NodeList arguments, CallStructure callStructure, T arg) {
|
| - // TODO(sigmund): implement (treat like this.call())
|
| - handleDynamic(node);
|
| - }
|
| -
|
| - void visitThisPropertyGet(Send node, Name name, T arg) {
|
| - handleThisProperty(node, new Selector.getter(name));
|
| - }
|
| -
|
| - void visitThisPropertySet(SendSet node, Name name, Node rhs, T arg) {
|
| - handleThisProperty(node, new Selector.setter(name));
|
| - }
|
| -
|
| - void visitThisPropertySetIfNull(Send node, Name name, Node rhs, T arg) {
|
| - handleThisProperty(node, new Selector.getter(name));
|
| - handleThisProperty(node, new Selector.setter(name));
|
| - }
|
| -
|
| - // Not count
|
| -
|
| - void errorNonConstantConstructorInvoke(NewExpression node, Element element,
|
| - DartType type, NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorUndefinedBinaryExpression(
|
| - Send node, Node left, Operator operator, Node right, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorUndefinedUnaryExpression(
|
| - Send node, Operator operator, Node expression, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidGet(
|
| - Send node,
|
| - ErroneousElement error,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidInvoke(
|
| - Send node,
|
| - ErroneousElement error,
|
| - NodeList arguments,
|
| - Selector selector,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidSet(
|
| - Send node,
|
| - ErroneousElement error,
|
| - Node rhs,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidSetIfNull(
|
| - Send node, ErroneousElement error, Node rhs, T arg) {
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| -
|
| - void errorInvalidPrefix(
|
| - Send node,
|
| - ErroneousElement error,
|
| - IncDecOperator operator,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidPostfix(
|
| - Send node,
|
| - ErroneousElement error,
|
| - IncDecOperator operator,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidCompound(
|
| - Send node,
|
| - ErroneousElement error,
|
| - AssignmentOperator operator,
|
| - Node rhs,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidUnary(
|
| - Send node,
|
| - UnaryOperator operator,
|
| - ErroneousElement error,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidEquals(
|
| - Send node,
|
| - ErroneousElement error,
|
| - Node right,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidNotEquals(
|
| - Send node,
|
| - ErroneousElement error,
|
| - Node right,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidBinary(
|
| - Send node,
|
| - ErroneousElement error,
|
| - BinaryOperator operator,
|
| - Node right,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidIndex(
|
| - Send node,
|
| - ErroneousElement error,
|
| - Node index,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidIndexSet(
|
| - Send node,
|
| - ErroneousElement error,
|
| - Node index,
|
| - Node rhs,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidCompoundIndexSet(
|
| - Send node,
|
| - ErroneousElement error,
|
| - Node index,
|
| - AssignmentOperator operator,
|
| - Node rhs,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidIndexPrefix(
|
| - Send node,
|
| - ErroneousElement error,
|
| - Node index,
|
| - IncDecOperator operator,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void errorInvalidIndexPostfix(
|
| - Send node,
|
| - ErroneousElement error,
|
| - Node index,
|
| - IncDecOperator operator,
|
| - T arg) {
|
| - handleNoSend(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void previsitDeferredAccess(
|
| - Send node,
|
| - PrefixElement prefix,
|
| - T arg) {
|
| - }
|
| -
|
| -
|
| - void visitAs(Send node, Node expression, DartType type, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitClassTypeLiteralCompound(Send node, ConstantExpression constant,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitClassTypeLiteralGet(Send node, ConstantExpression constant, T arg) {
|
| - handleStatic(node);
|
| - }
|
| -
|
| - void visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitClassTypeLiteralPostfix(
|
| - Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitClassTypeLiteralPrefix(
|
| - Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitClassTypeLiteralSet(
|
| - SendSet node, ConstantExpression constant, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitClassTypeLiteralSetIfNull(
|
| - SendSet node, ConstantExpression constant, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitDynamicTypeLiteralCompound(Send node, ConstantExpression constant,
|
| - AssignmentOperator operator, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitDynamicTypeLiteralGet(
|
| - Send node, ConstantExpression constant, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
|
| - NodeList arguments, CallStructure callStructure, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitDynamicTypeLiteralPostfix(
|
| - Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitDynamicTypeLiteralPrefix(
|
| - Send node, ConstantExpression constant, IncDecOperator operator, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitDynamicTypeLiteralSet(
|
| - SendSet node, ConstantExpression constant, Node rhs, T arg) {
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitDynamicTypeLiteralSetIfNull(
|
| - SendSet node, ConstantExpression constant, Node rhs, T arg) {
|
| - handleStatic(node);
|
| - handleNSMError(node);
|
| - }
|
| -
|
| - void visitIfNull(Send node, Node left, Node right, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitIs(Send node, Node expression, DartType type, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitIsNot(Send node, Node expression, DartType type, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitLogicalAnd(Send node, Node left, Node right, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitLogicalOr(Send node, Node left, Node right, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - void visitNot(Send node, Node expression, T arg) {
|
| - handleNoSend(node);
|
| - }
|
| -
|
| - String last;
|
| - _checkInvariant(node, String msg) {
|
| - msg = '$msg ${recursiveDiagnosticString(measurements, Metric.send)}';
|
| - if (!measurements.checkInvariant(Metric.send) ||
|
| - !measurements.checkInvariant(Metric.monomorphicSend) ||
|
| - !measurements.checkInvariant(Metric.polymorphicSend)) {
|
| - compiler.reportErrorMessage(node,
|
| - MessageKind.GENERIC, {'text': 'bad\n-- $msg\nlast:\n-- $last\n'});
|
| - last = msg;
|
| - } else {
|
| - last = msg;
|
| - }
|
| - }
|
| -}
|
| -
|
| -/// Visitor that collects statistics for a single function.
|
| -class _StatsTraversalVisitor<T> extends TraversalVisitor<dynamic, T>
|
| - implements SemanticSendVisitor<dynamic, T> {
|
| - final Compiler compiler;
|
| - final _StatsVisitor statsVisitor;
|
| - Measurements get measurements => statsVisitor.measurements;
|
| - _StatsTraversalVisitor(
|
| - Compiler compiler, TreeElements elements, Uri sourceUri)
|
| - : compiler = compiler,
|
| - statsVisitor = new _StatsVisitor(compiler, elements,
|
| - // TODO(sigmund): accept a list of analyses, so we can compare them
|
| - // together.
|
| - true
|
| - ? new TrustTypesAnalysisResult(elements, compiler.world)
|
| - : new NaiveAnalysisResult(),
|
| - sourceUri),
|
| - super(elements);
|
| -
|
| - void visitSend(Send node) {
|
| - try {
|
| - node.accept(statsVisitor);
|
| - } catch (e, t) {
|
| - compiler.reportErrorMessage(
|
| - node, MessageKind.GENERIC, {'text': '$e\n$t'});
|
| - }
|
| - super.visitSend(node);
|
| - }
|
| -
|
| - void visitNewExpression(NewExpression node) {
|
| - try {
|
| - node.accept(statsVisitor);
|
| - } catch (e, t) {
|
| - compiler.reportErrorMessage(
|
| - node, MessageKind.GENERIC, {'text': '$e\n$t'});
|
| - }
|
| - super.visitNewExpression(node);
|
| - }
|
| -}
|
| -
|
| -/// Helper to visit elements recursively
|
| -// TODO(sigmund): maybe generalize and move to elements/visitor.dart?
|
| -abstract class RecursiveElementVisitor<R, A> extends ElementVisitor<R, A> {
|
| -
|
| - @override
|
| - R visitWarnOnUseElement(WarnOnUseElement e, A arg) =>
|
| - e.wrappedElement.accept(this, arg);
|
| -
|
| - R visitScopeContainerElement(ScopeContainerElement e, A arg) {
|
| - e.forEachLocalMember((l) => l.accept(this, arg));
|
| - return null;
|
| - }
|
| -
|
| - @override
|
| - R visitCompilationUnitElement(CompilationUnitElement e, A arg) {
|
| - e.forEachLocalMember((l) => l.accept(this, arg));
|
| - return null;
|
| - }
|
| -
|
| - @override
|
| - R visitLibraryElement(LibraryElement e, A arg) {
|
| - e.implementation.compilationUnits.forEach((u) => u.accept(this, arg));
|
| - return null;
|
| - }
|
| -
|
| - @override
|
| - R visitVariableElement(VariableElement e, A arg) => null;
|
| -
|
| - @override
|
| - R visitParameterElement(ParameterElement e, A arg) => null;
|
| -
|
| - @override
|
| - R visitFormalElement(FormalElement e, A arg) => null;
|
| -
|
| - @override
|
| - R visitFieldElement(FieldElement e, A arg) => null;
|
| -
|
| - @override
|
| - R visitFieldParameterElement(InitializingFormalElement e, A arg) => null;
|
| -
|
| - @override
|
| - R visitAbstractFieldElement(AbstractFieldElement e, A arg) => null;
|
| -
|
| - @override
|
| - R visitFunctionElement(FunctionElement e, A arg) => null;
|
| -
|
| - @override
|
| - R visitConstructorElement(ConstructorElement e, A arg) {
|
| - return visitFunctionElement(e, arg);
|
| - }
|
| -
|
| - @override
|
| - R visitConstructorBodyElement(ConstructorBodyElement e, A arg) {
|
| - return visitFunctionElement(e.constructor, arg);
|
| - }
|
| -
|
| - @override
|
| - R visitClassElement(ClassElement e, A arg) {
|
| - return visitScopeContainerElement(e, arg);
|
| - }
|
| -
|
| - @override
|
| - R visitEnumClassElement(EnumClassElement e, A arg) {
|
| - return visitClassElement(e, arg);
|
| - }
|
| -
|
| - @override
|
| - R visitBoxFieldElement(BoxFieldElement e, A arg) => null;
|
| -
|
| - @override
|
| - R visitClosureClassElement(ClosureClassElement e, A arg) {
|
| - return visitClassElement(e, arg);
|
| - }
|
| -
|
| - @override
|
| - R visitClosureFieldElement(ClosureFieldElement e, A arg) {
|
| - return visitVariableElement(e, arg);
|
| - }
|
| -}
|
| -
|
| -// TODO(sigmund): get rid of debug messages.
|
| -_debug(String message) {
|
| - print('[33mdebug:[0m $message');
|
| -}
|
|
|