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