| Index: pkg/kernel/lib/transformations/argument_extraction.dart
|
| diff --git a/pkg/kernel/lib/transformations/argument_extraction.dart b/pkg/kernel/lib/transformations/argument_extraction.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..699f87e5eca66d2d16ae3ab9304082f0ad7084e2
|
| --- /dev/null
|
| +++ b/pkg/kernel/lib/transformations/argument_extraction.dart
|
| @@ -0,0 +1,64 @@
|
| +// 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,
|
| + Program,
|
| + VariableDeclaration,
|
| + VariableGet;
|
| +import '../core_types.dart' show CoreTypes;
|
| +import '../visitor.dart' show Transformer;
|
| +
|
| +Program transformProgram(CoreTypes coreTypes, Program program) {
|
| + new ArgumentExtractionForTesting().visitProgram(program);
|
| + return program;
|
| +}
|
| +
|
| +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);
|
| + }
|
| +}
|
|
|