sammine-lang
Loading...
Searching...
No Matches
QualifiedName.h
1#pragma once
2#include <optional>
3#include <string>
4#include <utility>
5#include <vector>
6
7// Forward declarations for QualifiedName friends
8namespace sammine_lang {
9class Parser;
10namespace AST {
12class TypeAliasDefAST;
13class CallExprAST;
15struct CasePattern;
16} // namespace AST
17} // namespace sammine_lang
18
19namespace sammine_util {
20
22
23struct QualifiedName {
24private:
25 std::vector<std::string> parts_; // ["math", "Color", "Red"]
26 std::optional<std::string> module_alias_; // original alias before resolution
27 bool unresolved_ = false;
28
29 // local() is restricted to parsing/AST construction only.
30 // After scope generation, use MonomorphizedName instead.
31 static QualifiedName local(std::string name) {
32 QualifiedName qn;
33 qn.parts_ = {std::move(name)};
34 return qn;
35 }
36
37 friend class sammine_lang::Parser;
44
45public:
46 QualifiedName() : parts_{""} {}
47
48 static QualifiedName qualified(std::string module, std::string name) {
49 QualifiedName qn;
50 qn.parts_ = {std::move(module), std::move(name)};
51 return qn;
52 }
53
54 static QualifiedName unresolved_qualified(std::string alias,
55 std::string name) {
56 QualifiedName qn;
57 qn.parts_ = {std::move(alias), std::move(name)};
58 qn.unresolved_ = true;
59 return qn;
60 }
61
62 static QualifiedName from_parts(std::vector<std::string> parts,
63 bool unresolved = false,
64 std::optional<std::string> module_alias = std::nullopt) {
65 QualifiedName qn;
66 qn.parts_ = std::move(parts);
67 qn.unresolved_ = unresolved;
68 qn.module_alias_ = std::move(module_alias);
69 return qn;
70 }
71
72 // Accessors
73 const std::string &get_name() const { return parts_.back(); }
74 std::string get_module() const {
75 return parts_.size() > 1 ? parts_.front() : "";
76 }
77 std::string get_qualifier() const {
78 if (parts_.size() <= 1)
79 return "";
80 std::string result = parts_[0];
81 for (size_t i = 1; i + 1 < parts_.size(); i++)
82 result += "::" + parts_[i];
83 return result;
84 }
85 const std::vector<std::string> &parts() const { return parts_; }
86 size_t depth() const { return parts_.size(); }
87
88 // Query methods
89 bool is_qualified() const { return parts_.size() > 1; }
90 bool is_unresolved() const { return unresolved_; }
91
92 // String representation — single method
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];
97 return result;
98 }
99
100 // Return a copy with the original alias swapped back in
101 QualifiedName with_alias() const {
102 if (module_alias_) {
103 auto copy = *this;
104 copy.parts_[0] = *module_alias_;
105 return copy;
106 }
107 return *this;
108 }
109
110 // Return a copy with module prepended (if not already qualified)
111 QualifiedName with_module(const std::string &mod) const {
112 if (is_qualified() || mod.empty())
113 return *this;
114 return qualified(mod, parts_.back());
115 }
116};
117
118} // namespace sammine_util
Definition Ast.h:548
Definition Parser.h:46
Definition Ast.h:784
Definition MonomorphizedName.h:15