]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Plugins/Language/Go/GoLanguage.cpp
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / source / Plugins / Language / Go / GoLanguage.cpp
1 //===-- GoLanguage.cpp ------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // C Includes
11 #include <string.h>
12 // C++ Includes
13 #include <functional>
14 #include <mutex>
15
16 // Other libraries and framework includes
17 #include "llvm/ADT/StringRef.h"
18
19 // Project includes
20 #include "GoLanguage.h"
21 #include "Plugins/Language/Go/GoFormatterFunctions.h"
22 #include "lldb/Core/ConstString.h"
23 #include "lldb/Core/PluginManager.h"
24 #include "lldb/DataFormatters/FormattersHelpers.h"
25 #include "lldb/Symbol/GoASTContext.h"
26
27 using namespace lldb;
28 using namespace lldb_private;
29 using namespace lldb_private::formatters;
30
31 void GoLanguage::Initialize() {
32   PluginManager::RegisterPlugin(GetPluginNameStatic(), "Go Language",
33                                 CreateInstance);
34 }
35
36 void GoLanguage::Terminate() {
37   PluginManager::UnregisterPlugin(CreateInstance);
38 }
39
40 lldb_private::ConstString GoLanguage::GetPluginNameStatic() {
41   static ConstString g_name("Go");
42   return g_name;
43 }
44
45 //------------------------------------------------------------------
46 // PluginInterface protocol
47 //------------------------------------------------------------------
48 lldb_private::ConstString GoLanguage::GetPluginName() {
49   return GetPluginNameStatic();
50 }
51
52 uint32_t GoLanguage::GetPluginVersion() { return 1; }
53
54 //------------------------------------------------------------------
55 // Static Functions
56 //------------------------------------------------------------------
57 Language *GoLanguage::CreateInstance(lldb::LanguageType language) {
58   if (language == eLanguageTypeGo)
59     return new GoLanguage();
60   return nullptr;
61 }
62
63 HardcodedFormatters::HardcodedSummaryFinder
64 GoLanguage::GetHardcodedSummaries() {
65   static std::once_flag g_initialize;
66   static HardcodedFormatters::HardcodedSummaryFinder g_formatters;
67
68   std::call_once(g_initialize, []() -> void {
69     g_formatters.push_back(
70         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
71            FormatManager &) -> TypeSummaryImpl::SharedPointer {
72           static CXXFunctionSummaryFormat::SharedPointer formatter_sp(
73               new CXXFunctionSummaryFormat(
74                   TypeSummaryImpl::Flags().SetDontShowChildren(true),
75                   lldb_private::formatters::GoStringSummaryProvider,
76                   "Go string summary provider"));
77           if (GoASTContext::IsGoString(valobj.GetCompilerType())) {
78             return formatter_sp;
79           }
80           if (GoASTContext::IsGoString(
81                   valobj.GetCompilerType().GetPointeeType())) {
82             return formatter_sp;
83           }
84           return nullptr;
85         });
86     g_formatters.push_back(
87         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
88            FormatManager &) -> TypeSummaryImpl::SharedPointer {
89           static lldb::TypeSummaryImplSP formatter_sp(new StringSummaryFormat(
90               TypeSummaryImpl::Flags().SetHideItemNames(true),
91               "(len ${var.len}, cap ${var.cap})"));
92           if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) {
93             return formatter_sp;
94           }
95           if (GoASTContext::IsGoSlice(
96                   valobj.GetCompilerType().GetPointeeType())) {
97             return formatter_sp;
98           }
99           return nullptr;
100         });
101   });
102   return g_formatters;
103 }
104
105 HardcodedFormatters::HardcodedSyntheticFinder
106 GoLanguage::GetHardcodedSynthetics() {
107   static std::once_flag g_initialize;
108   static HardcodedFormatters::HardcodedSyntheticFinder g_formatters;
109
110   std::call_once(g_initialize, []() -> void {
111     g_formatters.push_back(
112         [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
113            FormatManager &fmt_mgr) -> SyntheticChildren::SharedPointer {
114           static CXXSyntheticChildren::SharedPointer formatter_sp(
115               new CXXSyntheticChildren(
116                   SyntheticChildren::Flags(), "slice synthetic children",
117                   lldb_private::formatters::GoSliceSyntheticFrontEndCreator));
118           if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) {
119             return formatter_sp;
120           }
121           return nullptr;
122         });
123   });
124
125   return g_formatters;
126 }