42#ifndef COMPILER_MODULE_SEMANTIC_ENVIRONMENT_H
43#define COMPILER_MODULE_SEMANTIC_ENVIRONMENT_H
70namespace Compiler_Module_Semantic_Environment_Detail {
73 for (
size_t i = 0; i < names.
size(); ++i)
74 if (names.
access(i) == name)
90 for (
size_t i = 0; i < table.
modules.size(); ++i)
92 const auto &source = table.
modules.access(i);
94 module.module_name = source.module_name;
95 module.module_index = source.module_index;
96 module.order_index = source.order_index;
98 for (
size_t j = 0; j < source.names.size(); ++j)
100 const auto &item = source.names.access(j);
102 module.types.append(item);
104 module.values.append(item);
107 for (
size_t j = 0; j < source.ambiguous_names.size(); ++j)
109 const auto &item = source.ambiguous_names.access(j);
118 env.modules.append(std::move(module));
128 for (
size_t i = 0; i <
env.modules.size(); ++i)
129 if (
env.modules.access(i).module_name == module_name)
130 return &
env.modules.access(i);
137 const std::string_view module_name,
138 const std::string_view symbol_name)
noexcept
140 const auto *
module = compiler_find_module_semantic_environment(env, module_name);
141 if (module ==
nullptr)
144 for (
size_t i = 0; i <
module->values.size(); ++i)
145 if (module->values.access(i).name == symbol_name)
146 return &
module->values.access(i);
153 const std::string_view module_name,
154 const std::string_view symbol_name)
noexcept
156 const auto *
module = compiler_find_module_semantic_environment(env, module_name);
157 if (module ==
nullptr)
160 for (
size_t i = 0; i <
module->types.size(); ++i)
161 if (module->types.access(i).name == symbol_name)
162 return &
module->types.access(i);
170 std::ostringstream
out;
171 out <<
"ModuleSemanticEnvironment\n";
172 for (
size_t i = 0; i <
env.modules.size(); ++i)
174 const auto &
module = env.modules.access(i);
175 out <<
" Module(" <<
module.module_name << ") order=" << module.order_index << '\n';
176 for (
size_t j = 0; j <
module.values.size(); ++j)
178 const auto &item =
module.values.access(j);
180 <<
")) -> " << item.provider_module_name <<
' '
181 << (item.imported ?
"imported" :
"local") <<
'\n';
183 for (
size_t j = 0; j <
module.types.size(); ++j)
185 const auto &item =
module.types.access(j);
186 out <<
" Type(" << item.name <<
") -> " << item.provider_module_name <<
' '
187 << (item.imported ?
"imported" :
"local") <<
'\n';
189 for (
size_t j = 0; j <
module.ambiguous_values.size(); ++j)
190 out <<
" AmbiguousValue(" << module.ambiguous_values.access(j) <<
")\n";
191 for (
size_t j = 0; j <
module.ambiguous_types.size(); ++j)
192 out <<
" AmbiguousType(" << module.ambiguous_types.access(j) <<
")\n";
Reusable per-module cache for top-level name resolution.
size_t size_t int32_t * out
size_t size() const noexcept
Return the current dimension of array.
T & access(const size_t i) const noexcept
Fast access without checking allocation and bound_min_clock checking.
T & append()
Allocate a new entry to the end of array.
size_t blossom_maximum_cardinality_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, SA sa=SA())
Alias of compute_maximum_cardinality_general_matching().
void append_unique_name(DynArray< std::string > &names, const std::string &name)
Main namespace for Aleph-w library functions.
Compiler_Module_Semantic_Environment compiler_build_module_semantic_environment(const Compiler_Module_Name_Table &table)
Builds one namespace-separated semantic environment from a name table.
std::string compiler_render_module_semantic_environment(const Compiler_Module_Semantic_Environment &env)
Renders one deterministic text artifact for semantic environments.
const char * compiler_module_export_kind_name(const Compiler_Module_Export_Kind kind) noexcept
Returns the stable debug name for one module-export kind.
const Compiler_Module_Bound_Name * compiler_lookup_module_value(const Compiler_Module_Semantic_Environment &env, const std::string_view module_name, const std::string_view symbol_name) noexcept
Looks up one visible value-namespace binding in a module environment.
const Compiler_Module_Bound_Name * compiler_lookup_module_type(const Compiler_Module_Semantic_Environment &env, const std::string_view module_name, const std::string_view symbol_name) noexcept
Looks up one visible type-namespace binding in a module environment.
const Compiler_Module_Semantic_Module * compiler_find_module_semantic_environment(const Compiler_Module_Semantic_Environment &env, const std::string_view module_name) noexcept
Finds one semantic environment by module name.
One top-level name successfully bound in a module namespace.
Cached top-level name table over all visible modules.
DynArray< Compiler_Module_Name_Table_Entry > modules
Semantic environments for all modules in one compilation unit set.
DynArray< Compiler_Module_Semantic_Module > modules
One namespace-separated semantic environment for a module.
DynArray< Compiler_Module_Bound_Name > values
DynArray< std::string > ambiguous_types
DynArray< Compiler_Module_Bound_Name > types
DynArray< std::string > ambiguous_values