let declare_variable env name =
let find_or_declare varmaps nextind uid =
try let (_, uid) = StringMap.find name varmaps in (varmaps, 0, uid)
with Not_found -> (StringMap.add name (nextind, uid) varmaps, 1, uid)
in
match env.locals with
| [] ->
let ( map, num_added, uid) = find_or_declare env.globals.variable_map env.num_globals env.unique_id
in
({ globals ={ variable_map = map; parent = env.globals.parent };
num_globals = env.num_globals + num_added;
locals = env.locals;
num_locals = env.num_locals;
sdepth = env.sdepth;
max_depth = env.max_depth;
errors = env.errors;
warnings = env.warnings;
unique_id = env.unique_id + num_added;
names = if num_added = 0 then env.names else name:: env.names;
varprops = env.varprops;
imported = env.imported;
templates = env.templates;
constants = env.constants;
}, uid)
| _ ->
let (map, num_added, uid) = find_or_declare (List.hd env.locals).variable_map (List.hd env.num_locals) env.unique_id
in
({ globals = env.globals;
num_globals = env.num_globals;
locals ={ variable_map = map; parent = (List.hd env.locals).parent }:: List.tl env.locals;
num_locals = ((List.hd env.num_locals) + num_added):: List.tl env.num_locals;
sdepth = env.sdepth;
max_depth = env.max_depth;
errors = env.errors;
warnings = env.warnings;
unique_id = env.unique_id + num_added;
names = if num_added = 0 then env.names else name:: env.names;
varprops = env.varprops;
imported = env.imported;
templates = env.templates;
constants = env.constants;
}, uid)