blob: 079c4dd8dc36eb9ab9362b367aa8b44633fd60bf [file] [log] [blame]
//===--- RequestResponsePrinterBase.h - -------------------------*- C++ -*-===//
//
// 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 https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SOURCEKITD_REQUESTRESPONSEPRINTERBASE_H
#define LLVM_SOURCEKITD_REQUESTRESPONSEPRINTERBASE_H
#include "sourcekitd/sourcekitd.h"
#include "sourcekitd/Logging.h"
#include <vector>
namespace llvm {
class StringRef;
template <typename T> class ArrayRef;
class raw_ostream;
}
namespace SourceKit {
class UIdent;
}
namespace sourcekitd {
template <typename VisitorImplClass, typename VisitedType>
class RequestResponsePrinterBase {
llvm::raw_ostream &OS;
unsigned Indent;
bool PrintAsJSON;
public:
typedef std::vector<std::pair<SourceKit::UIdent, VisitedType>> DictMap;
RequestResponsePrinterBase(llvm::raw_ostream &OS, unsigned Indent = 0,
bool PrintAsJSON = false)
: OS(OS), Indent(Indent), PrintAsJSON(PrintAsJSON) { }
void visitNull() {
OS << "<<NULL>>";
}
void visitDictionary(const DictMap &Map) {
OS << "{\n";
Indent += 2;
for (unsigned i = 0, e = Map.size(); i != e; ++i) {
auto &Pair = Map[i];
OS.indent(Indent);
if (PrintAsJSON) {
visitString(Pair.first.getName());
} else {
OSColor(OS, DictKeyColor) << Pair.first.getName();
}
OS << ": ";
static_cast<VisitorImplClass *>(this)->visit(Pair.second);
if (i < e-1)
OS << ',';
OS << '\n';
}
Indent -= 2;
OS.indent(Indent) << '}';
}
void visitArray(llvm::ArrayRef<VisitedType> Arr) {
OS << "[\n";
Indent += 2;
for (unsigned i = 0, e = Arr.size(); i != e; ++i) {
auto Obj = Arr[i];
OS.indent(Indent);
static_cast<VisitorImplClass *>(this)->visit(Obj);
if (i < e-1)
OS << ',';
OS << '\n';
}
Indent -= 2;
OS.indent(Indent) << ']';
}
void visitInt64(int64_t Val) {
OS << Val;
}
void visitBool(bool Val) {
OS << Val;
}
void visitString(llvm::StringRef Str) {
OS << '\"';
// Avoid raw_ostream's write_escaped, we don't want to escape unicode
// characters because it will be invalid JSON.
writeEscaped(Str, OS);
OS << '\"';
}
void visitUID(llvm::StringRef UID) {
if (PrintAsJSON) {
visitString(UID);
} else {
OSColor(OS, UIDColor) << UID;
}
}
void visitData(const void *Data, size_t Size) {
// FIXME: We should probably print the real data here
OS << "<data>";
}
};
}
#endif