//===-- BuildValue.cpp ----------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#include "llbuild/BuildSystem/BuildValue.h"

#include "llbuild/Basic/LLVM.h"

#include "llvm/Support/raw_ostream.h"

using namespace llbuild;
using namespace llbuild::buildsystem;

StringRef BuildValue::stringForKind(BuildValue::Kind kind) {
  switch (kind) {
#define CASE(kind) case Kind::kind: return #kind
    CASE(Invalid);
    CASE(VirtualInput);
    CASE(ExistingInput);
    CASE(MissingInput);
    CASE(DirectoryContents);
    CASE(DirectoryTreeSignature);
    CASE(MissingOutput);
    CASE(FailedInput);
    CASE(SuccessfulCommand);
    CASE(FailedCommand);
    CASE(PropagatedFailureCommand);
    CASE(CancelledCommand);
    CASE(SkippedCommand);
    CASE(Target);
    CASE(StaleFileRemoval);
#undef CASE
  }
  return "<unknown>";
}
  
void BuildValue::dump(raw_ostream& os) const {
  os << "BuildValue(" << stringForKind(kind);
  if (kindHasCommandSignature()) {
    os << ", signature=" << commandSignature;
  }
  if (kindHasOutputInfo()) {
    os << ", outputInfos=[";
    for (unsigned i = 0; i != getNumOutputs(); ++i) {
      auto& info = getNthOutputInfo(i);
      if (i != 0) os << ", ";
      if (info.isMissing()) {
        os << "FileInfo{/*missing*/}";
      } else {
        os << "FileInfo{"
           << "dev=" << info.device
           << ", inode=" << info.inode
           << ", mode=" << info.mode
           << ", size=" << info.size
           << ", modTime=(" << info.modTime.seconds
           << ":" << info.modTime.nanoseconds << "}";
      }
    }
    os << "]";
  }
  if (kindHasStringList()) {
    std::vector<StringRef> values = getStringListValues();
    os << ", values=[";
    for (unsigned i = 0; i != values.size(); ++i) {
      if (i != 0) os << ", ";
      os << '"';
      os.write_escaped(values[i]);
      os << '"';
    }
    os << "]";
  }
  os << ")";
}
