1
2
3
4
5
6 #include <sngcpp/symbols/Symbol.hpp>
7 #include <sngcpp/symbols/ContainerSymbol.hpp>
8 #include <sngcpp/symbols/ClassTypeSymbol.hpp>
9 #include <soulng/util/Sha1.hpp>
10 #include <soulng/util/Unicode.hpp>
11
12 namespace sngcpp { namespace symbols {
13
14 using namespace soulng::unicode;
15 using namespace soulng::util;
16
17 std::u32string ToString(SymbolAccess access)
18 {
19 switch (access)
20 {
21 case SymbolAccess::public_: return U"public";
22 case SymbolAccess::protected_: return U"protected";
23 case SymbolAccess::private_: return U"private";
24 }
25 return std::u32string();
26 }
27
28 Symbol::Symbol(const Span& span_, const std::u32string& name_) : span(span_), name(name_), parent(nullptr), access(SymbolAccess::private_)
29 {
30 }
31
32 Symbol::~Symbol()
33 {
34 }
35
36 std::u32string Symbol::FullName()
37 {
38 std::u32string fullName;
39 if (Parent())
40 {
41 fullName = Parent()->FullName();
42 }
43 if (fullName.empty())
44 {
45 return Name();
46 }
47 else
48 {
49 fullName.append(U"::").append(Name());
50 return fullName;
51 }
52 }
53
54 void Symbol::SetAccess(Specifier accessSpecifier)
55 {
56 if ((accessSpecifier & Specifier::public_) != Specifier::none)
57 {
58 access = SymbolAccess::public_;
59 }
60 else if ((accessSpecifier & Specifier::protected_) != Specifier::none)
61 {
62 access = SymbolAccess::protected_;
63 }
64 else if ((accessSpecifier & Specifier::private_) != Specifier::none)
65 {
66 access = SymbolAccess::private_;
67 }
68 }
69
70 std::u32string Symbol::IdStr()
71 {
72 return FullName();
73 }
74
75 std::u32string Symbol::Id()
76 {
77 std::u32string id = KindStr();
78 id.append(1, '_').append(SimpleName()).append(1, '_').append(ToUtf32(GetSha1MessageDigest(ToUtf8(IdStr()))));
79 return id;
80 }
81
82 void Symbol::SetProjectName(const std::u32string& projectName_)
83 {
84 projectName = projectName_;
85 }
86
87 std::std::unique_ptr<sngxml::dom::Element>Symbol::ToDomElement()
88 {
89 std::unique_ptr<sngxml::dom::Element> element = CreateElement();
90 element->SetAttribute(U"name", Name());
91 element->SetAttribute(U"id", Id());
92 element->SetAttribute(U"access", ToString(access));
93 if (!IsNamespaceSymbol() && parent && parent->IsNamespaceSymbol())
94 {
95 element->SetAttribute(U"project", projectName);
96 }
97 std::unique_ptr<sngxml::dom::Element> namespaces = Namespaces();
98 if (namespaces)
99 {
100 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(namespaces.release()));
101 }
102 std::unique_ptr<sngxml::dom::Element> classes = Classes();
103 if (classes)
104 {
105 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(classes.release()));
106 }
107 std::unique_ptr<sngxml::dom::Element> constructors = Constructors();
108 if (constructors)
109 {
110 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(constructors.release()));
111 }
112 std::unique_ptr<sngxml::dom::Element> functions = Functions();
113 if (functions)
114 {
115 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(functions.release()));
116 }
117 std::unique_ptr<sngxml::dom::Element> enumTypes = EnumTypes();
118 if (enumTypes)
119 {
120 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(enumTypes.release()));
121 }
122 std::unique_ptr<sngxml::dom::Element> enumerators = Enumerators();
123 if (enumerators)
124 {
125 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(enumerators.release()));
126 }
127 std::unique_ptr<sngxml::dom::Element> typedefs = Typedefs();
128 if (typedefs)
129 {
130 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(typedefs.release()));
131 }
132 std::unique_ptr<sngxml::dom::Element> variables = Variables();
133 if (variables)
134 {
135 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(variables.release()));
136 }
137 std::unique_ptr<sngxml::dom::Element> grammars = Grammars();
138 if (grammars)
139 {
140 element->AppendChild(std::unique_ptr<sngxml::dom::Node>(grammars.release()));
141 }
142 return element;
143 }
144
145 std::std::unique_ptr<sngxml::dom::Element>Symbol::Namespaces()
146 {
147 return std::unique_ptr<sngxml::dom::Element>();
148 }
149
150 std::std::unique_ptr<sngxml::dom::Element>Symbol::Classes()
151 {
152 return std::unique_ptr<sngxml::dom::Element>();
153 }
154
155 std::std::unique_ptr<sngxml::dom::Element>Symbol::Constructors()
156 {
157 return std::unique_ptr<sngxml::dom::Element>();
158 }
159
160 std::std::unique_ptr<sngxml::dom::Element>Symbol::Functions()
161 {
162 return std::unique_ptr<sngxml::dom::Element>();
163 }
164
165 std::std::unique_ptr<sngxml::dom::Element>Symbol::EnumTypes()
166 {
167 return std::unique_ptr<sngxml::dom::Element>();
168 }
169
170 std::std::unique_ptr<sngxml::dom::Element>Symbol::Enumerators()
171 {
172 return std::unique_ptr<sngxml::dom::Element>();
173 }
174
175 std::std::unique_ptr<sngxml::dom::Element>Symbol::Typedefs()
176 {
177 return std::unique_ptr<sngxml::dom::Element>();
178 }
179
180 std::std::unique_ptr<sngxml::dom::Element>Symbol::Variables()
181 {
182 return std::unique_ptr<sngxml::dom::Element>();
183 }
184
185 std::std::unique_ptr<sngxml::dom::Element>Symbol::Grammars()
186 {
187 return std::unique_ptr<sngxml::dom::Element>();
188 }
189
190 ClassTypeSymbol* Symbol::Class()
191 {
192 if (IsClassTypeSymbol())
193 {
194 return static_cast<ClassTypeSymbol*>(this);
195 }
196 else if (parent)
197 {
198 return parent->Class();
199 }
200 else
201 {
202 return nullptr;
203 }
204 }
205
206 } }