2024-02-15 10:43:46 -08:00
|
|
|
#pragma once
|
|
|
|
|
2024-03-18 09:49:38 -07:00
|
|
|
// Compilation environments
|
|
|
|
|
2024-02-15 10:43:46 -08:00
|
|
|
#include <gc/cord.h>
|
|
|
|
|
|
|
|
#include "types.h"
|
2024-09-13 17:18:08 -07:00
|
|
|
#include "stdlib/tables.h"
|
2024-02-15 10:43:46 -08:00
|
|
|
|
|
|
|
typedef struct {
|
2024-06-06 13:28:53 -07:00
|
|
|
CORD local_typedefs;
|
2024-02-17 13:56:19 -08:00
|
|
|
CORD staticdefs;
|
2025-02-19 13:30:19 -08:00
|
|
|
CORD lambdas;
|
2024-08-17 11:41:31 -07:00
|
|
|
CORD variable_initializers;
|
2024-09-12 20:41:32 -07:00
|
|
|
CORD function_naming;
|
2024-02-17 13:56:19 -08:00
|
|
|
} compilation_unit_t;
|
|
|
|
|
2024-07-04 15:00:01 -07:00
|
|
|
typedef struct deferral_s {
|
|
|
|
struct deferral_s *next;
|
|
|
|
struct env_s *defer_env;
|
|
|
|
ast_t *block;
|
|
|
|
} deferral_t;
|
|
|
|
|
2024-03-15 10:35:30 -07:00
|
|
|
typedef struct loop_ctx_s {
|
|
|
|
struct loop_ctx_s *next;
|
2024-07-13 14:17:58 -07:00
|
|
|
const char *loop_name;
|
|
|
|
ast_list_t *loop_vars;
|
2024-07-04 15:00:01 -07:00
|
|
|
deferral_t *deferred;
|
2024-03-15 10:35:30 -07:00
|
|
|
CORD skip_label, stop_label;
|
|
|
|
} loop_ctx_t;
|
2024-03-09 13:03:38 -08:00
|
|
|
|
2024-06-16 12:12:00 -07:00
|
|
|
typedef struct namespace_s {
|
|
|
|
const char *name;
|
2025-02-19 15:50:50 -08:00
|
|
|
Array_t constructors;
|
2024-06-16 12:12:00 -07:00
|
|
|
struct namespace_s *parent;
|
|
|
|
} namespace_t;
|
|
|
|
|
2024-03-21 10:33:10 -07:00
|
|
|
typedef struct env_s {
|
2024-09-08 18:55:15 -07:00
|
|
|
Table_t *types, *globals, *namespace_bindings, *locals;
|
2024-08-22 11:02:48 -07:00
|
|
|
// Lookup table for env_t* where the key is:
|
|
|
|
// - Resolved path for local imports (so that `use ./foo.tm` is the same as `use ./baz/../foo.tm`)
|
|
|
|
// - Raw 'use' string for module imports
|
2024-09-05 11:57:31 -07:00
|
|
|
Table_t *imports;
|
2024-02-17 13:56:19 -08:00
|
|
|
compilation_unit_t *code;
|
2025-02-09 10:57:54 -08:00
|
|
|
type_t *fn_ret;
|
2024-03-15 10:35:30 -07:00
|
|
|
loop_ctx_t *loop_ctx;
|
2024-07-04 15:00:01 -07:00
|
|
|
deferral_t *deferred;
|
2024-09-24 11:54:22 -07:00
|
|
|
CORD libname; // Currently compiling library name (if any)
|
2024-06-16 12:12:00 -07:00
|
|
|
namespace_t *namespace;
|
2024-09-12 11:27:13 -07:00
|
|
|
Closure_t *comprehension_action;
|
2024-02-15 10:43:46 -08:00
|
|
|
} env_t;
|
|
|
|
|
|
|
|
typedef struct {
|
2024-02-17 13:56:19 -08:00
|
|
|
type_t *type;
|
2025-02-06 11:18:52 -08:00
|
|
|
CORD code;
|
2024-02-15 10:43:46 -08:00
|
|
|
} binding_t;
|
|
|
|
|
2024-09-24 11:54:22 -07:00
|
|
|
env_t *new_compilation_unit(CORD libname);
|
2024-06-16 12:12:00 -07:00
|
|
|
env_t *load_module_env(env_t *env, ast_t *ast);
|
2024-09-24 11:54:22 -07:00
|
|
|
CORD namespace_prefix(env_t *env, namespace_t *ns);
|
2025-03-10 09:42:45 -07:00
|
|
|
env_t *get_namespace_by_type(env_t *env, type_t *t);
|
2025-03-10 10:33:31 -07:00
|
|
|
env_t *global_scope(env_t *env);
|
2024-09-08 18:55:15 -07:00
|
|
|
env_t *namespace_scope(env_t *env);
|
2024-02-17 13:56:19 -08:00
|
|
|
env_t *fresh_scope(env_t *env);
|
2024-03-13 23:37:56 -07:00
|
|
|
env_t *for_scope(env_t *env, ast_t *ast);
|
2025-03-10 10:33:31 -07:00
|
|
|
env_t *with_enum_scope(env_t *env, type_t *t);
|
2024-03-04 10:51:47 -08:00
|
|
|
env_t *namespace_env(env_t *env, const char *namespace_name);
|
2024-09-08 14:17:15 -07:00
|
|
|
__attribute__((format(printf, 4, 5)))
|
|
|
|
_Noreturn void compiler_err(file_t *f, const char *start, const char *end, const char *fmt, ...);
|
2024-02-17 13:56:19 -08:00
|
|
|
binding_t *get_binding(env_t *env, const char *name);
|
2025-03-10 09:42:45 -07:00
|
|
|
binding_t *get_constructor(env_t *env, type_t *t, arg_ast_t *args);
|
2025-02-10 10:13:45 -08:00
|
|
|
void set_binding(env_t *env, const char *name, type_t *type, CORD code);
|
2024-03-03 10:04:50 -08:00
|
|
|
binding_t *get_namespace_binding(env_t *env, ast_t *self, const char *name);
|
2024-02-17 13:56:19 -08:00
|
|
|
#define code_err(ast, ...) compiler_err((ast)->file, (ast)->start, (ast)->end, __VA_ARGS__)
|
2024-03-21 22:52:00 -07:00
|
|
|
extern type_t *TEXT_TYPE;
|
2024-11-09 13:27:54 -08:00
|
|
|
extern type_t *MATCH_TYPE;
|
2024-11-03 19:37:48 -08:00
|
|
|
extern type_t *RNG_TYPE;
|
2025-03-15 11:22:11 -07:00
|
|
|
extern type_t *PATH_TYPE;
|
2024-08-11 11:47:34 -07:00
|
|
|
extern type_t *THREAD_TYPE;
|
2024-02-15 10:43:46 -08:00
|
|
|
|
|
|
|
// vim: ts=4 sw=0 et cino=L2,l1,(0,W4,m1,\:0
|