sammine-lang
Loading...
Searching...
No Matches
MonomorphizedName.h
1#pragma once
2#include "util/QualifiedName.h"
3#include <string>
4
5namespace sammine_util {
6
16 QualifiedName base; // original name (preserves module)
17 std::string type_args; // "<i32>" or "<Option<i32>>" (includes brackets)
18 std::string method_name; // "add" for typeclasses, "" for generics
19
21 static MonomorphizedName generic(QualifiedName base, std::string type_args) {
22 return {std::move(base), std::move(type_args), ""};
23 }
24
26 static MonomorphizedName typeclass(std::string class_name,
27 std::string concrete_type_str,
28 std::string method_name) {
29 return {QualifiedName::local(std::move(class_name)),
30 "<" + std::move(concrete_type_str) + ">",
31 std::move(method_name)};
32 }
33
35 std::string instance_key() const { return base.mangled() + type_args; }
36
40 std::string mangled() const {
41 if (method_name.empty())
42 return base.mangled() + type_args;
43 return base.mangled() + type_args + "::" + method_name;
44 }
45
50 if (method_name.empty()) {
51 // Generic: replace the last part of base with name + type_args
52 auto parts = base.parts();
53 parts.back() = base.get_name() + type_args;
54 return QualifiedName::from_parts(std::move(parts));
55 }
56 // Typeclass: single-part local name so mangleName() can prepend module
57 return QualifiedName::local(base.mangled() + type_args + "::" +
58 method_name);
59 }
60};
61
62} // namespace sammine_util
Definition MonomorphizedName.h:15
QualifiedName to_qualified_name() const
Definition MonomorphizedName.h:49
std::string instance_key() const
Typeclass instance lookup key: "Add<i32>".
Definition MonomorphizedName.h:35
std::string mangled() const
Definition MonomorphizedName.h:40
static MonomorphizedName typeclass(std::string class_name, std::string concrete_type_str, std::string method_name)
Typeclass instance method: Add<i32>::add.
Definition MonomorphizedName.h:26
Definition QualifiedName.h:23