// Copyright (c) 2023, 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;

import com.android.tools.r8.keepanno.annotations.KeepForApi;

/** Information present in a given marker. */
@KeepForApi
public interface MarkerInfo {

  /** Get the tool that has generated the marker. */
  String getTool();

  /** Get the version of the tool that has generated the marker. */
  String getVersion();

  /** True of the generating tool was the R8 compiler. */
  boolean isR8();

  /** True of the generating tool was the D8 compiler. */
  boolean isD8();

  /** True of the generating tool was the L8 compiler. */
  boolean isL8();

  /** Get the min-api specified by the marker, or -1 if not defined. */
  int getMinApi();

  /** True if the "backend" information is present or can be inferred for the tool. */
  boolean hasBackend();

  /** True if the tool is known to be targeting class files as backend output. */
  boolean isBackendClassFiles();

  /** True if the tool is known to be targeting DEX as backend output. */
  boolean isBackendDexFiles();

  /** True if the tool has a known compilation mode (i.e., release or debug). */
  boolean hasCompilationMode();

  /** True if the tool has a known compilation mode and the mode is "debug". */
  boolean isCompilationModeDebug();

  /** True if the tool has a known compilation mode and the mode is "release". */
  boolean isCompilationModeRelease();

  /** True if the tool is R8 using compatibility mode. */
  boolean isR8ModeCompatibility();

  /** True if the tool is R8 using full mode (e.g., not in compatibility mode). */
  boolean isR8ModeFull();

  /**
   * Get the raw encoding of the marker used by the compilers.
   *
   * <p>Warning: The format of this encoding may be subject to change and its concrete encoding
   * should not be assumed. For usages of concrete information in the marker the structured API on
   * {@link MarkerInfo} should be used.
   */
  String getRawEncoding();
}
