1//===-- RPCServerHeaderEmitter.cpp ----------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "RPCServerHeaderEmitter.h"
10#include "RPCCommon.h"
11
12#include "clang/AST/AST.h"
13#include "clang/AST/Mangle.h"
14#include "clang/Frontend/CompilerInstance.h"
15
16#include "llvm/ADT/StringRef.h"
17#include "llvm/Support/ToolOutputFile.h"
18#include "llvm/Support/raw_ostream.h"
19
20using namespace clang;
21using namespace lldb_rpc_gen;
22
23void RPCServerHeaderEmitter::EmitMethod(const Method &method) {
24 // We'll be using the mangled name in order to disambiguate
25 // overloaded methods.
26 const std::string &MangledName = method.MangledName;
27
28 EmitLine("class " + MangledName +
29 " : public rpc_common::RPCFunctionInstance {");
30 EmitLine("public:");
31 IndentLevel++;
32 EmitConstructor(MangledName);
33 EmitDestructor(MangledName);
34 EmitHandleRPCCall();
35 IndentLevel--;
36 EmitLine("};");
37}
38
39void RPCServerHeaderEmitter::EmitHandleRPCCall() {
40 EmitLine("bool HandleRPCCall(rpc_common::Connection &connection, "
41 "rpc_common::RPCStream &send, rpc_common::RPCStream &response) "
42 "override;");
43}
44
45void RPCServerHeaderEmitter::EmitConstructor(const std::string &MangledName) {
46 EmitLine(MangledName + "() : RPCFunctionInstance(\"" + MangledName +
47 "\") {}");
48}
49
50void RPCServerHeaderEmitter::EmitDestructor(const std::string &MangledName) {
51 EmitLine("~" + MangledName + "() override {}");
52}
53
54std::string RPCServerHeaderEmitter::GetHeaderGuard() {
55 const std::string UpperFilenameNoExt =
56 llvm::sys::path::stem(
57 path: llvm::sys::path::filename(path: OutputFile->getFilename()))
58 .upper();
59 return "GENERATED_LLDB_RPC_SERVER_" + UpperFilenameNoExt + "_H";
60}
61
62void RPCServerHeaderEmitter::Begin() {
63 const std::string HeaderGuard = GetHeaderGuard();
64 EmitLine("#ifndef " + HeaderGuard);
65 EmitLine("#define " + HeaderGuard);
66 EmitLine("");
67 EmitLine("#include <lldb-rpc/common/RPCFunction.h>");
68 EmitLine("");
69 EmitLine("namespace rpc_server {");
70}
71
72void RPCServerHeaderEmitter::End() {
73 EmitLine("} // namespace rpc_server");
74 EmitLine("#endif // " + GetHeaderGuard());
75}
76

source code of lldb/tools/lldb-rpc/lldb-rpc-gen/server/RPCServerHeaderEmitter.cpp