 /*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.jack.transformations;

import com.android.jack.ir.ast.JAbstractMethodBody;
import com.android.jack.ir.ast.JLocal;
import com.android.jack.ir.ast.JMethod;
import com.android.jack.ir.ast.JMethodBody;
import com.android.jack.ir.ast.JModifier;
import com.android.jack.ir.ast.JType;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.transformations.request.AddJLocalInMethodBody;
import com.android.jack.transformations.request.TransformationRequest;
import com.android.jack.util.NamingTools;
import com.android.sched.schedulable.Transform;

import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;

/**
 * An helper class to synthesize temporary local variables in {@link JMethod}s.
 */
@Transform(add = {JLocal.class})
public class LocalVarCreator {

  @Nonnull
  private final JMethodBody currentMethodBody;
  @Nonnull
  private final String tmpLocalVarPrefix;
  @Nonnegative
  private int tmpLocalVarSuffix = 0;

  /**
   * @param method The method the variable will be declared into.
   * @param prefix A name prefix for the created variable. It helps to determine which client
   *               of @{code LocalVarCreator} created it when debugging.
   */
  public LocalVarCreator(@Nonnull JMethod method, @Nonnull String prefix) {
    JAbstractMethodBody body = method.getBody();
    assert body != null;
    assert body instanceof JMethodBody;
    currentMethodBody = (JMethodBody) body;
    tmpLocalVarPrefix = prefix;
  }

  /**
   * This function creates a temporary local variable of type {@code type}, and appends the
   * insertion of its declaration statement in {@code transformationRequest}.
   */
  @Nonnull
  public JLocal createTempLocal(@Nonnull JType type, @Nonnull SourceInfo sourceInfo,
      @Nonnull TransformationRequest transformationRequest) {

    String name = NamingTools.getNonSourceConflictingName(tmpLocalVarPrefix + tmpLocalVarSuffix++);
    JLocal local = new JLocal(sourceInfo, name, type, JModifier.SYNTHETIC, currentMethodBody);

    transformationRequest.append(new AddJLocalInMethodBody(local, currentMethodBody));

    return local;
  }
}