//===-- BuildKey.cpp ------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 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/BuildKey.h"

#include "llbuild/Basic/LLVM.h"
#include "llbuild/BuildSystem/BuildDescription.h"

#include "llvm/Support/raw_ostream.h"

using namespace llbuild;
using namespace llbuild::buildsystem;

StringRef BuildKey::stringForKind(BuildKey::Kind kind) {
  switch (kind) {
#define CASE(kind) case Kind::kind: return #kind
    CASE(Command);
    CASE(CustomTask);
    CASE(DirectoryContents);
    CASE(DirectoryTreeSignature);
    CASE(Node);
    CASE(Target);
    CASE(Unknown);
#undef CASE
  }
  return "<unknown>";
}

void BuildKey::dump(raw_ostream& os) const {
  os << "BuildKey(" << stringForKind(getKind());
  switch (getKind()) {
  case Kind::Command: {
    os << ", name='" << getCommandName() << "'";
    break;
  }
  case Kind::CustomTask: {
    os << ", name='" << getCustomTaskName() << "'";
    os << ", dataSize='" << getCustomTaskData().size() << "'";
    break;
  }
  case Kind::DirectoryContents: {
    os << ", path='" << getDirectoryContentsPath() << "'";
    break;
  }
  case Kind::DirectoryTreeSignature: {
    os << ", path='" << getDirectoryTreeSignaturePath() << "'";
    break;
  }
  case Kind::Node: {
    os << ", name='" << getNodeName() << "'";
    break;
  }
  case Kind::Target: {
    os << ", name='" << getTargetName() << "'";
    break;
  }
  case Kind::Unknown: {
    break;
  }
  }
  os << ")";
}
