1 | //===-- ScriptedInterface.h -------------------------------------*- C++ -*-===// |
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 | #ifndef LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H |
10 | #define LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H |
11 | |
12 | #include "lldb/Core/StructuredDataImpl.h" |
13 | #include "lldb/Target/ExecutionContext.h" |
14 | #include "lldb/Utility/LLDBLog.h" |
15 | #include "lldb/Utility/Log.h" |
16 | #include "lldb/Utility/UnimplementedError.h" |
17 | #include "lldb/lldb-private.h" |
18 | |
19 | #include "llvm/Support/Compiler.h" |
20 | |
21 | #include <string> |
22 | |
23 | namespace lldb_private { |
24 | class ScriptedInterface { |
25 | public: |
26 | ScriptedInterface() = default; |
27 | virtual ~ScriptedInterface() = default; |
28 | |
29 | StructuredData::GenericSP GetScriptObjectInstance() { |
30 | return m_object_instance_sp; |
31 | } |
32 | |
33 | virtual llvm::SmallVector<llvm::StringLiteral> GetAbstractMethods() const = 0; |
34 | |
35 | template <typename Ret> |
36 | static Ret ErrorWithMessage(llvm::StringRef caller_name, |
37 | llvm::StringRef error_msg, Status &error, |
38 | LLDBLog log_caterogy = LLDBLog::Process) { |
39 | LLDB_LOGF(GetLog(log_caterogy), "%s ERROR = %s" , caller_name.data(), |
40 | error_msg.data()); |
41 | std::string full_error_message = |
42 | llvm::Twine(caller_name + llvm::Twine(" ERROR = " ) + |
43 | llvm::Twine(error_msg)) |
44 | .str(); |
45 | if (const char *detailed_error = error.AsCString()) |
46 | full_error_message += |
47 | llvm::Twine(llvm::Twine(" (" ) + llvm::Twine(detailed_error) + |
48 | llvm::Twine(")" )) |
49 | .str(); |
50 | error.SetErrorString(full_error_message); |
51 | return {}; |
52 | } |
53 | |
54 | template <typename T = StructuredData::ObjectSP> |
55 | bool CheckStructuredDataObject(llvm::StringRef caller, T obj, Status &error) { |
56 | if (!obj) |
57 | return ErrorWithMessage<bool>(caller_name: caller, error_msg: "Null Structured Data object" , |
58 | error); |
59 | |
60 | if (!obj->IsValid()) { |
61 | return ErrorWithMessage<bool>(caller_name: caller, error_msg: "Invalid StructuredData object" , |
62 | error); |
63 | } |
64 | |
65 | if (error.Fail()) |
66 | return ErrorWithMessage<bool>(caller_name: caller, error_msg: error.AsCString(), error); |
67 | |
68 | return true; |
69 | } |
70 | |
71 | protected: |
72 | StructuredData::GenericSP m_object_instance_sp; |
73 | }; |
74 | } // namespace lldb_private |
75 | #endif // LLDB_INTERPRETER_INTERFACES_SCRIPTEDINTERFACE_H |
76 | |