45 lines
1.4 KiB
C++
45 lines
1.4 KiB
C++
#pragma once
|
|
#include <map>
|
|
#include <string>
|
|
#include <set>
|
|
#include "type.hpp"
|
|
|
|
struct type_env;
|
|
using type_env_ptr = std::shared_ptr<type_env>;
|
|
|
|
enum class visibility { global,local };
|
|
|
|
struct type_env {
|
|
struct variable_data {
|
|
type_scheme_ptr type;
|
|
visibility vis;
|
|
|
|
variable_data()
|
|
: variable_data(nullptr, visibility::local) {}
|
|
variable_data(type_scheme_ptr t, visibility v)
|
|
: type(std::move(t)), vis(v) {}
|
|
};
|
|
|
|
type_env_ptr parent;
|
|
std::map<std::string, variable_data> names;
|
|
std::map<std::string, type_ptr> type_names;
|
|
|
|
type_env(type_env_ptr p) : parent(std::move(p)) {}
|
|
type_env() : type_env(nullptr) {}
|
|
|
|
void find_free(const type_mgr& mgr, std::set<std::string>& into) const;
|
|
void find_free_except(const type_mgr& mgr, const std::string& avoid,
|
|
std::set<std::string>& into) const;
|
|
type_scheme_ptr lookup(const std::string& name) const;
|
|
type_ptr lookup_type(const std::string& name) const;
|
|
void bind(const std::string& name, type_ptr t,
|
|
visibility v = visibility::local);
|
|
void bind(const std::string& name, type_scheme_ptr t,
|
|
visibility v = visibility::local);
|
|
void bind_type(const std::string& type_name, type_ptr t);
|
|
void generalize(const std::string& name, type_mgr& mgr);
|
|
};
|
|
|
|
|
|
type_env_ptr type_scope(type_env_ptr parent);
|