package org.checkerframework.framework.test;

import java.util.Collections;
import java.util.List;
import javax.tools.Diagnostic;
import javax.tools.JavaFileObject;

/** CompilationResult represents the output of the compiler after it is run. */
public class CompilationResult {
  private final boolean compiledWithoutError;
  private final String javacOutput;
  private final Iterable<? extends JavaFileObject> javaFileObjects;
  private final List<Diagnostic<? extends JavaFileObject>> diagnostics;

  CompilationResult(
      boolean compiledWithoutError,
      String javacOutput,
      Iterable<? extends JavaFileObject> javaFileObjects,
      List<Diagnostic<? extends JavaFileObject>> diagnostics) {
    this.compiledWithoutError = compiledWithoutError;
    this.javacOutput = javacOutput;
    this.javaFileObjects = javaFileObjects;
    this.diagnostics = Collections.unmodifiableList(diagnostics);
  }

  /**
   * Returns whether or not compilation succeeded without errors or exceptions.
   *
   * @return whether or not compilation succeeded without errors or exceptions
   */
  public boolean compiledWithoutError() {
    return compiledWithoutError;
  }

  /**
   * Returns all of the output from the compiler.
   *
   * @return all of the output from the compiler
   */
  public String getJavacOutput() {
    return javacOutput;
  }

  /**
   * Returns the list of Java files passed to the compiler.
   *
   * @return the list of Java files passed to the compiler
   */
  public Iterable<? extends JavaFileObject> getJavaFileObjects() {
    return javaFileObjects;
  }

  /**
   * Returns the diagnostics reported by the compiler.
   *
   * @return the diagnostics reported by the compiler
   */
  public List<Diagnostic<? extends JavaFileObject>> getDiagnostics() {
    return diagnostics;
  }
}
