// Copyright (c) 2017, the R8 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.
package com.android.tools.r8.optimize;

import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.UseRegistry;

public class InvokeSingleTargetExtractor extends UseRegistry {
  private InvokeKind kind = InvokeKind.NONE;
  private DexMethod target;

  public InvokeSingleTargetExtractor(DexItemFactory factory) {
    super(factory);
  }

  private boolean setTarget(DexMethod target, InvokeKind kind) {
    if (this.kind != InvokeKind.NONE) {
      this.kind = InvokeKind.ILLEGAL;
      this.target = null;
    } else {
      assert this.target == null;
      this.target = target;
      this.kind = kind;
    }
    return false;
  }

  private boolean invalid() {
    kind = InvokeKind.ILLEGAL;
    return false;
  }

  public DexMethod getTarget() {
    return target;
  }

  public InvokeKind getKind() {
    return kind;
  }

  @Override
  public boolean registerInitClass(DexType clazz) {
    return invalid();
  }

  @Override
  public boolean registerInvokeVirtual(DexMethod method) {
    return setTarget(method, InvokeKind.VIRTUAL);
  }

  @Override
  public boolean registerInvokeDirect(DexMethod method) {
    return invalid();
  }

  @Override
  public boolean registerInvokeStatic(DexMethod method) {
    return setTarget(method, InvokeKind.STATIC);
  }

  @Override
  public boolean registerInvokeInterface(DexMethod method) {
    return invalid();
  }

  @Override
  public boolean registerInvokeSuper(DexMethod method) {
    return setTarget(method, InvokeKind.SUPER);
  }

  @Override
  public boolean registerInstanceFieldWrite(DexField field) {
    return invalid();
  }

  @Override
  public boolean registerInstanceFieldRead(DexField field) {
    return invalid();
  }

  @Override
  public boolean registerNewInstance(DexType type) {
    return invalid();
  }

  @Override
  public boolean registerStaticFieldRead(DexField field) {
    return invalid();
  }

  @Override
  public boolean registerStaticFieldWrite(DexField field) {
    return invalid();
  }

  @Override
  public boolean registerTypeReference(DexType type) {
    return invalid();
  }

  public enum InvokeKind {
    VIRTUAL,
    STATIC,
    SUPER,
    ILLEGAL,
    NONE
  }
}
