1 // =================================
  2 // Copyright (c) 2020 Seppo Laakko
  3 // Distributed under the MIT license
  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 } } // namespace sngcpp::symbols