/*
 * Copyright 2000-2016 JetBrains s.r.o.
 *
 * 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 org.jetbrains.java.decompiler.modules.decompiler.stats;

import org.jetbrains.java.decompiler.main.rels.ClassWrapper;
import org.jetbrains.java.decompiler.main.rels.MethodWrapper;
import org.jetbrains.java.decompiler.modules.decompiler.exps.Exprent;
import org.jetbrains.java.decompiler.modules.decompiler.exps.InvocationExprent;
import org.jetbrains.java.decompiler.modules.decompiler.exps.VarExprent;
import org.jetbrains.java.decompiler.modules.decompiler.vars.VarVersionPair;

public class Statements {
  public static Statement findFirstData(Statement stat) {
    if (stat.getExprents() != null) {
      return stat;
    } else if (stat.isLabeled()) { // FIXME: Why??
      return null;
    }

    switch (stat.type) {
    case Statement.TYPE_SEQUENCE:
    case Statement.TYPE_IF:
    case Statement.TYPE_ROOT:
    case Statement.TYPE_SWITCH:
    case Statement.TYPE_SYNCRONIZED:
      return findFirstData(stat.getFirst());
    default:
      return null;
    }
  }

  public static boolean isInvocationInitConstructor(InvocationExprent inv, MethodWrapper method, ClassWrapper wrapper, boolean withThis) {
    if (inv.getFunctype() == InvocationExprent.TYP_INIT && inv.getInstance().type == Exprent.EXPRENT_VAR) {
      VarExprent instVar = (VarExprent) inv.getInstance();
      VarVersionPair varPair = new VarVersionPair(instVar);
      String classname = method.varproc.getThisVars().get(varPair);
      if (classname != null) { // any this instance. TODO: Restrict to current class?
        if (withThis || !wrapper.getClassStruct().qualifiedName.equals(inv.getClassname())) {
          return true;
        }
      }
    }

    return false;
  }
}