Library
Module
Module type
Parameter
Class
Class type
Builds a context that allows for mapping each name to a precise uid, taking lexical scopes into account
Name resolution context
type typ = Scopelang.Ast.typ
type scope_context = {
var_idmap : Scopelang.Ast.ScopeVar.t Desugared.Ast.IdentMap.t;
(*Scope variables
*)label_idmap : Desugared.Ast.RuleName.t Desugared.Ast.IdentMap.t;
default_rulemap : unique_rulename Desugared.Ast.ScopeDefMap.t;
(*What is the default rule to refer to for unnamed exceptions, if any
*)sub_scopes_idmap : Scopelang.Ast.SubScopeName.t Desugared.Ast.IdentMap.t;
(*Sub-scopes variables
*)sub_scopes : Scopelang.Ast.ScopeName.t Scopelang.Ast.SubScopeMap.t;
(*To what scope sub-scopes refer to?
*)
}
Inside a scope, we distinguish between the variables and the subscopes.
type struct_context = typ Utils.Pos.marked Scopelang.Ast.StructFieldMap.t
Types of the fields of a struct
type enum_context = typ Utils.Pos.marked Scopelang.Ast.EnumConstructorMap.t
Types of the payloads of the cases of an enum
type context = {
local_var_idmap : Scopelang.Ast.Var.t Desugared.Ast.IdentMap.t;
(*Inside a definition, local variables can be introduced by functions arguments or pattern matching
*)scope_idmap : Scopelang.Ast.ScopeName.t Desugared.Ast.IdentMap.t;
(*The names of the scopes
*)struct_idmap : Scopelang.Ast.StructName.t Desugared.Ast.IdentMap.t;
(*The names of the structs
*)field_idmap : Scopelang.Ast.StructFieldName.t Scopelang.Ast.StructMap.t Desugared.Ast.IdentMap.t;
(*The names of the struct fields. Names of fields can be shared between different structs
*)enum_idmap : Scopelang.Ast.EnumName.t Desugared.Ast.IdentMap.t;
(*The names of the enums
*)constructor_idmap : Scopelang.Ast.EnumConstructor.t Scopelang.Ast.EnumMap.t Desugared.Ast.IdentMap.t;
(*The names of the enum constructors. Constructor names can be shared between different enums
*)scopes : scope_context Scopelang.Ast.ScopeMap.t;
(*For each scope, its context
*)structs : struct_context Scopelang.Ast.StructMap.t;
(*For each struct, its context
*)enums : enum_context Scopelang.Ast.EnumMap.t;
(*For each enum, its context
*)var_typs : (typ Utils.Pos.marked * bool) Scopelang.Ast.ScopeVarMap.t;
(*The types of each scope variable declared
*)
}
Main context used throughout Surface.Desugaring
Helpers
val raise_unsupported_feature : string -> Utils.Pos.t -> 'a
Temporary function raising an error message saying that a feature is not supported yet
val raise_unknown_identifier : string -> ident Utils.Pos.marked -> 'a
Function to call whenever an identifier used somewhere has not been declared in the program previously
val get_var_typ : context -> Scopelang.Ast.ScopeVar.t -> typ Utils.Pos.marked
Gets the type associated to an uid
val is_var_cond : context -> Scopelang.Ast.ScopeVar.t -> bool
val get_var_uid :
Scopelang.Ast.ScopeName.t ->
context ->
ident Utils.Pos.marked ->
Scopelang.Ast.ScopeVar.t
Get the variable uid inside the scope given in argument
val get_subscope_uid :
Scopelang.Ast.ScopeName.t ->
context ->
ident Utils.Pos.marked ->
Scopelang.Ast.SubScopeName.t
Get the subscope uid inside the scope given in argument
val is_subscope_uid : Scopelang.Ast.ScopeName.t -> context -> ident -> bool
is_subscope_uid scope_uid ctxt y
returns true if y
belongs to the subscopes of scope_uid
.
val belongs_to :
context ->
Scopelang.Ast.ScopeVar.t ->
Scopelang.Ast.ScopeName.t ->
bool
Checks if the var_uid belongs to the scope scope_uid
val get_def_typ : context -> Desugared.Ast.ScopeDef.t -> typ Utils.Pos.marked
Retrieves the type of a scope definition from the context
val is_def_cond : context -> Desugared.Ast.ScopeDef.t -> bool
val is_type_cond : Ast.typ Utils.Pos.marked -> bool
val add_def_local_var :
context ->
ident Utils.Pos.marked ->
context * Scopelang.Ast.Var.t
Adds a binding to the context
val get_def_key :
Ast.qident ->
Scopelang.Ast.ScopeName.t ->
context ->
Utils.Pos.t ->
Desugared.Ast.ScopeDef.t
API
val form_context : Ast.program -> context
Derive the context from metadata, in one pass over the declarations