25 std::vector<std::string> parts_;
26 std::optional<std::string> module_alias_;
27 bool unresolved_ =
false;
31 static QualifiedName local(std::string name) {
33 qn.parts_ = {std::move(name)};
46 QualifiedName() : parts_{
""} {}
48 static QualifiedName qualified(std::string module, std::string name) {
50 qn.parts_ = {std::move(module), std::move(name)};
54 static QualifiedName unresolved_qualified(std::string alias,
57 qn.parts_ = {std::move(alias), std::move(name)};
58 qn.unresolved_ =
true;
62 static QualifiedName from_parts(std::vector<std::string> parts,
63 bool unresolved =
false,
64 std::optional<std::string> module_alias = std::nullopt) {
66 qn.parts_ = std::move(parts);
67 qn.unresolved_ = unresolved;
68 qn.module_alias_ = std::move(module_alias);
73 const std::string &get_name()
const {
return parts_.back(); }
74 std::string get_module()
const {
75 return parts_.size() > 1 ? parts_.front() :
"";
77 std::string get_qualifier()
const {
78 if (parts_.size() <= 1)
80 std::string result = parts_[0];
81 for (
size_t i = 1; i + 1 < parts_.size(); i++)
82 result +=
"::" + parts_[i];
85 const std::vector<std::string> &parts()
const {
return parts_; }
86 size_t depth()
const {
return parts_.size(); }
89 bool is_qualified()
const {
return parts_.size() > 1; }
90 bool is_unresolved()
const {
return unresolved_; }
93 std::string mangled()
const {
94 std::string result = parts_[0];
95 for (
size_t i = 1; i < parts_.size(); i++)
96 result +=
"::" + parts_[i];
101 QualifiedName with_alias()
const {
104 copy.parts_[0] = *module_alias_;
111 QualifiedName with_module(
const std::string &mod)
const {
112 if (is_qualified() || mod.empty())
114 return qualified(mod, parts_.back());