blob: 98af6a58ba9d385e4a419483a02fe66224bdc060 [file] [log] [blame]
// Copyright (c) 2017, 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.
library kernel.transformations.argument_extraction;
import '../ast.dart'
show
Constructor,
FieldInitializer,
Initializer,
Library,
LocalInitializer,
Component,
VariableDeclaration,
VariableGet;
import '../core_types.dart' show CoreTypes;
import '../visitor.dart' show Transformer;
Component transformComponent(CoreTypes coreTypes, Component component) {
new ArgumentExtractionForTesting().visitComponent(component);
return component;
}
void transformLibraries(CoreTypes coreTypes, List<Library> libraries) {
var transformer = new ArgumentExtractionForTesting();
for (var library in libraries) {
transformer.visitLibrary(library);
}
}
class ArgumentExtractionForTesting extends Transformer {
visitConstructor(Constructor node) {
var newInits = <Initializer>[];
int nameCounter = 0;
for (var fieldInit in node.initializers) {
if (fieldInit is FieldInitializer &&
!fieldInit.field.name.name.endsWith("_li")) {
// Move the body of the initializer to a new local initializer, and
// eta-expand the reference to the local initializer in the body of the
// field initializer.
var value = fieldInit.value;
var decl = new VariableDeclaration('#li_$nameCounter');
decl.initializer = value;
var localInit = new LocalInitializer(decl);
localInit.parent = node;
newInits.add(localInit);
fieldInit.value = new VariableGet(decl);
fieldInit.value.parent = fieldInit;
++nameCounter;
newInits.add(fieldInit);
} else {
newInits.add(fieldInit);
}
}
node.initializers = newInits;
return super.visitConstructor(node);
}
}