// Copyright (c) 2016, 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.shaking;

import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexClass;

public enum ProguardClassType {
  ANNOTATION_INTERFACE {
    @Override
    public boolean matches(DexClass clazz) {
      return clazz.accessFlags.isInterface() && clazz.accessFlags.isAnnotation();
    }
  },
  CLASS {
    @Override
    public boolean matches(DexClass clazz) {
      return true;
    }
  },
  ENUM {
    @Override
    public boolean matches(DexClass clazz) {
      return clazz.accessFlags.isEnum();
    }
  },
  INTERFACE {
    @Override
    public boolean matches(DexClass clazz) {
      return clazz.accessFlags.isInterface();
    }
  },
  UNSPECIFIED {
    @Override
    public boolean matches(DexClass clazz) {
      return true;
    }
  };

  @Override
  public String toString() {
    switch (this) {
      case ANNOTATION_INTERFACE: return "@interface";
      case CLASS: return "class";
      case ENUM: return "enum";
      case INTERFACE: return "interface";
      case UNSPECIFIED:
        return "";
      default:
        throw new Unreachable("Invalid proguard class type '" + this + "'");
    }
  }

  public abstract boolean matches(DexClass clazz);
}
