76 lines · cpp
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-exception6//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 disambiguate25 // 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 llvm::sys::path::filename(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