| Index: pkg/kernel/lib/transformations/closure/converter.dart
|
| diff --git a/pkg/kernel/lib/transformations/closure/converter.dart b/pkg/kernel/lib/transformations/closure/converter.dart
|
| index abb0a11f9cded3e92d5be2aab4e769e08cebd7f0..c879627c28b40771a50030dd3bf047f21fb886c0 100644
|
| --- a/pkg/kernel/lib/transformations/closure/converter.dart
|
| +++ b/pkg/kernel/lib/transformations/closure/converter.dart
|
| @@ -40,7 +40,6 @@ import '../../ast.dart'
|
| PropertyGet,
|
| ReturnStatement,
|
| Statement,
|
| - StaticGet,
|
| StaticInvocation,
|
| ThisExpression,
|
| Transformer,
|
| @@ -80,10 +79,6 @@ class ClosureConverter extends Transformer {
|
| final Set<InvalidExpression> contextClonePlaceHolders =
|
| new Set<InvalidExpression>();
|
|
|
| - /// Maps the names of all instance methods that may be torn off (aka
|
| - /// implicitly closurized) to `${name.name}#get`.
|
| - final Map<Name, Name> tearOffGetterNames;
|
| -
|
| final CloneVisitor cloner = new CloneWithoutBody();
|
|
|
| /// New members to add to [currentLibrary] after it has been
|
| @@ -136,8 +131,7 @@ class ClosureConverter extends Transformer {
|
| : this.capturedVariables = info.variables,
|
| this.capturedTypeVariables = info.typeVariables,
|
| this.thisAccess = info.thisAccess,
|
| - this.localNames = info.localNames,
|
| - this.tearOffGetterNames = info.tearOffGetterNames;
|
| + this.localNames = info.localNames;
|
|
|
| bool get isOuterMostContext {
|
| return currentFunction == null || currentMemberFunction == currentFunction;
|
| @@ -370,43 +364,11 @@ class ClosureConverter extends Transformer {
|
| closedTopLevelFunction, accessContext, closureType);
|
| }
|
|
|
| - TreeNode visitField(Field node) {
|
| - currentMember = node;
|
| - context = new NoContext(this);
|
| - if (node.isInstanceMember) {
|
| - Name tearOffName = tearOffGetterNames[node.name];
|
| - if (tearOffName != null) {
|
| - // TODO(ahe): If we rewrite setters, we can rename the field to avoid
|
| - // an indirection in most cases.
|
| - addFieldForwarder(tearOffName, node);
|
| - }
|
| - }
|
| - node = super.visitField(node);
|
| - context = null;
|
| - currentMember = null;
|
| - return node;
|
| - }
|
| -
|
| TreeNode visitProcedure(Procedure node) {
|
| assert(isEmptyContext);
|
|
|
| currentMember = node;
|
|
|
| - if (node.isInstanceMember) {
|
| - Name tearOffName = tearOffGetterNames[node.name];
|
| - if (tearOffName != null) {
|
| - if (node.isGetter) {
|
| - // We rename the getter to avoid an indirection in most cases.
|
| - Name oldName = node.name;
|
| - node.name = tearOffName;
|
| - node.canonicalName?.unbind();
|
| - addGetterForwarder(oldName, node);
|
| - } else if (node.kind == ProcedureKind.Method) {
|
| - addTearOffMethod(tearOffName, node);
|
| - }
|
| - }
|
| - }
|
| -
|
| FunctionNode function = node.function;
|
| if (function.body != null) {
|
| setupContextForFunctionBody(function);
|
| @@ -611,30 +573,6 @@ class ClosureConverter extends Transformer {
|
| : context.lookup(thisAccess[currentMemberFunction]);
|
| }
|
|
|
| - TreeNode visitStaticGet(StaticGet node) {
|
| - Member target = node.target;
|
| - if (target is Procedure && target.kind == ProcedureKind.Method) {
|
| - VariableDeclaration contextVariable = new VariableDeclaration(
|
| - "#contextParameter",
|
| - type: const VectorType());
|
| - Expression expression = getTearOffExpression(
|
| - null, node.target, contextVariable, new NullLiteral());
|
| - expression.transformChildren(this);
|
| - return expression;
|
| - }
|
| - return super.visitStaticGet(node);
|
| - }
|
| -
|
| - TreeNode visitPropertyGet(PropertyGet node) {
|
| - Name tearOffName = tearOffGetterNames[node.name];
|
| - if (tearOffName != null) {
|
| - MethodInvocation replacement = new MethodInvocation(
|
| - node.receiver, tearOffName, new Arguments(<Expression>[]));
|
| - return super.visitMethodInvocation(replacement);
|
| - }
|
| - return super.visitPropertyGet(node);
|
| - }
|
| -
|
| TreeNode visitCatch(Catch node) {
|
| VariableDeclaration exception = node.exception;
|
| VariableDeclaration stackTrace = node.stackTrace;
|
| @@ -663,61 +601,6 @@ class ClosureConverter extends Transformer {
|
| return statement is Block ? statement : new Block(<Statement>[statement]);
|
| }
|
|
|
| - /// Creates a closure that will invoke method [procedure] of [receiver] and
|
| - /// return an expression that instantiates that closure.
|
| - Expression getTearOffExpression(
|
| - VariableDeclaration receiver,
|
| - Procedure procedure,
|
| - VariableDeclaration contextVariable,
|
| - Expression accessContext) {
|
| - Map<TypeParameter, DartType> substitution = procedure.isInstanceMember
|
| - // Note: we do not attempt to avoid copying type variables that aren't
|
| - // used in the signature of [procedure]. It might be more economical to
|
| - // only copy type variables that are used. However, we assume that
|
| - // passing type arguments that match the enclosing class' type
|
| - // variables will be handled most efficiently.
|
| - ? copyTypeVariables(procedure.enclosingClass.typeParameters)
|
| - : const <TypeParameter, DartType>{};
|
| -
|
| - // TODO(29181): remove variable `dynamicSubstitution` and replace its usages
|
| - // with `substitution`.
|
| -
|
| - Map<TypeParameter, DartType> dynamicSubstitution =
|
| - <TypeParameter, DartType>{};
|
| - for (TypeParameter parameter in substitution.keys) {
|
| - dynamicSubstitution[parameter] = const DynamicType();
|
| - }
|
| - for (TypeParameter parameter in substitution.keys) {
|
| - if (!isObject(parameter.bound)) {
|
| - dynamicSubstitution[parameter] =
|
| - substitute(parameter.bound, dynamicSubstitution);
|
| - }
|
| - }
|
| -
|
| - // Find the closure class for the function. If there isn't one, create it.
|
| - String closedTopLevelFunctionName =
|
| - createNameForClosedTopLevelFunction(procedure.function);
|
| - Procedure closedTopLevelFunction = null;
|
| - for (TreeNode node in newLibraryMembers) {
|
| - if (node is Procedure && node.name.name == closedTopLevelFunctionName) {
|
| - closedTopLevelFunction = node;
|
| - }
|
| - }
|
| - if (closedTopLevelFunction == null) {
|
| - closedTopLevelFunction = new Procedure(
|
| - new Name(closedTopLevelFunctionName),
|
| - ProcedureKind.Method,
|
| - forwardFunction(
|
| - procedure, receiver, contextVariable, dynamicSubstitution),
|
| - isStatic: true,
|
| - fileUri: currentFileUri);
|
| - newLibraryMembers.add(closedTopLevelFunction);
|
| - }
|
| -
|
| - return new ClosureCreation(
|
| - closedTopLevelFunction, accessContext, procedure.function.functionType);
|
| - }
|
| -
|
| /// Creates a function that has the same signature as `procedure.function`
|
| /// and which forwards all arguments to `procedure`.
|
| FunctionNode forwardFunction(
|
| @@ -816,55 +699,4 @@ class ClosureConverter extends Transformer {
|
| newClassMembers
|
| .add(copyWithBody(getter, forwardToThisProperty(getter))..name = name);
|
| }
|
| -
|
| - void addTearOffMethod(Name name, Procedure procedure) {
|
| - // [addTearOffMethod] generates a method along with a context that captures
|
| - // `this`. The work with contexts is typically done using the data gathered
|
| - // by a [ClosureInfo] instance. In absence of this information, we need to
|
| - // create some variables, like `#self` and `#context`, and manipulate
|
| - // contexts directly in some cases.
|
| - //
|
| - // Also, the tear-off method is generated during a visit to the AST node
|
| - // of the procedure being torn off, so we need to save and restore some
|
| - // auxiliary variables like `currentMember` and `currentMemberFunction`
|
| - // and use [saveContext], so that those variables have proper values when
|
| - // the procedure itself is being transformed.
|
| - Member oldCurrentMember = currentMember;
|
| - FunctionNode oldCurrentMemberFunction = currentMemberFunction;
|
| - try {
|
| - saveContext(() {
|
| - Block body = new Block(<Statement>[]);
|
| - FunctionNode tearOffMethodFunction = new FunctionNode(body);
|
| - setupContextForFunctionBody(tearOffMethodFunction);
|
| -
|
| - // We need a variable that refers to `this` to put it into the context.
|
| - VariableDeclaration self = new VariableDeclaration("#self",
|
| - type: procedure.enclosingClass.rawType);
|
| - context.extend(self, new ThisExpression());
|
| -
|
| - // The `#context` variable is used to access the context in the closed
|
| - // top-level function that represents the closure and is generated in
|
| - // [getTearOffExpression].
|
| - VariableDeclaration contextVariable = new VariableDeclaration(
|
| - "#contextParameter",
|
| - type: const VectorType());
|
| - Context parent = context;
|
| - context = context.toNestedContext(
|
| - new VariableAccessor(contextVariable, null, TreeNode.noOffset));
|
| -
|
| - body.addStatement(new ReturnStatement(getTearOffExpression(
|
| - self, procedure, contextVariable, parent.expression)));
|
| -
|
| - Procedure tearOffMethod = new Procedure(
|
| - name, ProcedureKind.Method, tearOffMethodFunction,
|
| - fileUri: currentFileUri);
|
| - newClassMembers.add(tearOffMethod);
|
| -
|
| - resetContext();
|
| - });
|
| - } finally {
|
| - currentMember = oldCurrentMember;
|
| - currentMemberFunction = oldCurrentMemberFunction;
|
| - }
|
| - }
|
| }
|
|
|