// 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);
  }
}
