diff options
Diffstat (limited to '')
-rw-r--r-- | src/TypesAnalysis.ml | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/src/TypesAnalysis.ml b/src/TypesAnalysis.ml index fb9d2708..80748f8b 100644 --- a/src/TypesAnalysis.ml +++ b/src/TypesAnalysis.ml @@ -34,9 +34,7 @@ type partial_type_info = type_param_info list option g_type_info Allows us to factorize code: [analyze_full_ty] is used both to analyze type definitions and types. *) -let initialize_type_def_info (def : type_def) : type_def_info = - let param_info = { under_borrow = false; under_nested_borrows = false } in - let param_infos = List.map (fun _ -> param_info) def.type_params in +let initialize_g_type_info (param_infos : 'p) : 'p g_type_info = { contains_static = false; contains_borrow = false; @@ -44,6 +42,11 @@ let initialize_type_def_info (def : type_def) : type_def_info = param_infos; } +let initialize_type_def_info (def : type_def) : type_def_info = + let param_info = { under_borrow = false; under_nested_borrows = false } in + let param_infos = List.map (fun _ -> param_info) def.type_params in + initialize_g_type_info param_infos + let type_def_info_to_partial_type_info (info : type_def_info) : partial_type_info = { @@ -62,6 +65,14 @@ let partial_type_info_to_type_def_info (info : partial_type_info) : param_infos = Option.get info.param_infos; } +let partial_type_info_to_ty_info (info : partial_type_info) : ty_info = + { + contains_static = info.contains_static; + contains_borrow = info.contains_borrow; + contains_nested_borrows = info.contains_nested_borrows; + param_infos = (); + } + type type_infos = type_def_info TypeDefId.Map.t let expl_info_init = { under_borrow = false; under_nested_borrows = false } @@ -234,9 +245,25 @@ let analyze_type_declaration_group (type_defs : type_def TypeDefId.Map.t) in analyze infos -(** Compute the type information for every type definition in a list of declarations *) +(** Compute the type information for every *type definition* in a list of + declarations. This type definition information is later used to easily + compute the information of arbitrary types. + + Rk.: pay attention to the difference between type definitions and types! + *) let analyze_type_declarations (type_defs : type_def TypeDefId.Map.t) (decls : type_declaration_group list) : type_infos = List.fold_left (fun infos decl -> analyze_type_declaration_group type_defs infos decl) TypeDefId.Map.empty decls + +(** Analyze a type to check whether it contains borrows, etc., provided + we have already analyzed the type definitions in the context. + *) +let analyze_ty (infos : type_infos) (ty : 'r gr_ty) : ty_info = + (* We don't use `updated` but need to give it as parameter *) + let updated = ref false in + let ty_info = initialize_g_type_info None in + let ty_info = analyze_full_ty updated infos ty_info ty in + (* Convert the ty_info *) + partial_type_info_to_ty_info ty_info |