blob: ed010ffa4b2e0b4cc085583941f10cf63af3e4e4 [file] [log] [blame]
Ryan Brown2dd84882015-11-05 00:24:36 +00001//===-- 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 "lldb/Core/ConstString.h"
22#include "lldb/Core/PluginManager.h"
23#include "lldb/DataFormatters/FormattersHelpers.h"
24#include "lldb/Symbol/GoASTContext.h"
25#include "Plugins/Language/Go/GoFormatterFunctions.h"
26
27using namespace lldb;
28using namespace lldb_private;
29using namespace lldb_private::formatters;
30
31void
32GoLanguage::Initialize()
33{
34 PluginManager::RegisterPlugin(GetPluginNameStatic(), "Go Language", CreateInstance);
35}
36
37void
38GoLanguage::Terminate()
39{
40 PluginManager::UnregisterPlugin(CreateInstance);
41}
42
43lldb_private::ConstString
44GoLanguage::GetPluginNameStatic()
45{
46 static ConstString g_name("Go");
47 return g_name;
48}
49
50//------------------------------------------------------------------
51// PluginInterface protocol
52//------------------------------------------------------------------
53lldb_private::ConstString
54GoLanguage::GetPluginName()
55{
56 return GetPluginNameStatic();
57}
58
59uint32_t
60GoLanguage::GetPluginVersion()
61{
62 return 1;
63}
64
65//------------------------------------------------------------------
66// Static Functions
67//------------------------------------------------------------------
68Language *
69GoLanguage::CreateInstance(lldb::LanguageType language)
70{
71 if (language == eLanguageTypeGo)
72 return new GoLanguage();
73 return nullptr;
74}
75
76HardcodedFormatters::HardcodedSummaryFinder
77GoLanguage::GetHardcodedSummaries()
78{
79 static std::once_flag g_initialize;
80 static HardcodedFormatters::HardcodedSummaryFinder g_formatters;
81
82 std::call_once(g_initialize, []() -> void
83 {
84 g_formatters.push_back(
85 [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
86 FormatManager &) -> TypeSummaryImpl::SharedPointer
87 {
88 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(
89 TypeSummaryImpl::Flags().SetDontShowChildren(true),
90 lldb_private::formatters::GoStringSummaryProvider, "Go string summary provider"));
91 if (GoASTContext::IsGoString(valobj.GetCompilerType()))
92 {
93 return formatter_sp;
94 }
95 if (GoASTContext::IsGoString(valobj.GetCompilerType().GetPointeeType()))
96 {
97 return formatter_sp;
98 }
99 return nullptr;
100 });
101 g_formatters.push_back(
102 [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
103 FormatManager &) -> TypeSummaryImpl::SharedPointer
104 {
105 static lldb::TypeSummaryImplSP formatter_sp(
106 new StringSummaryFormat(TypeSummaryImpl::Flags().SetHideItemNames(true),
107 "(len ${var.len}, cap ${var.cap})"));
108 if (GoASTContext::IsGoSlice(valobj.GetCompilerType()))
109 {
110 return formatter_sp;
111 }
112 if (GoASTContext::IsGoSlice(valobj.GetCompilerType().GetPointeeType()))
113 {
114 return formatter_sp;
115 }
116 return nullptr;
117 });
118 });
119 return g_formatters;
120}
121
122HardcodedFormatters::HardcodedSyntheticFinder
123GoLanguage::GetHardcodedSynthetics()
124{
125 static std::once_flag g_initialize;
126 static HardcodedFormatters::HardcodedSyntheticFinder g_formatters;
127
128 std::call_once(g_initialize, []() -> void
129 {
130 g_formatters.push_back(
131 [](lldb_private::ValueObject &valobj, lldb::DynamicValueType,
132 FormatManager &fmt_mgr) -> SyntheticChildren::SharedPointer
133 {
134 static CXXSyntheticChildren::SharedPointer formatter_sp(
135 new CXXSyntheticChildren(SyntheticChildren::Flags(), "slice synthetic children",
136 lldb_private::formatters::GoSliceSyntheticFrontEndCreator));
137 if (GoASTContext::IsGoSlice(valobj.GetCompilerType()))
138 {
139 return formatter_sp;
140 }
141 return nullptr;
142 });
143 });
144
145 return g_formatters;
146}