summaryrefslogtreecommitdiff
path: root/compiler/ExtractBuiltin.ml
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/ExtractBuiltin.ml')
-rw-r--r--compiler/ExtractBuiltin.ml394
1 files changed, 134 insertions, 260 deletions
diff --git a/compiler/ExtractBuiltin.ml b/compiler/ExtractBuiltin.ml
index db942ff0..d15905a2 100644
--- a/compiler/ExtractBuiltin.ml
+++ b/compiler/ExtractBuiltin.ml
@@ -5,38 +5,8 @@
*)
open Config
-open Types
-
-type simple_name = string list [@@deriving show, ord]
-
-(* TODO: update *)
-let name_to_simple_name (s : name) : simple_name =
- (* We simply ignore the disambiguators - TODO: update *)
- List.map
- (function
- | PeIdent (id, _) -> id
- | PeImpl i ->
- (* TODO *)
- show_impl_elem i)
- s
-
-(** Small helper which cuts a string at the occurrences of "::" *)
-let string_to_simple_name (s : string) : simple_name =
- (* No function to split by using string separator?? *)
- let name = String.split_on_char ':' s in
- List.filter (fun s -> s <> "") name
-
-module SimpleNameOrd = struct
- type t = simple_name
-
- let compare = compare_simple_name
- let to_string = show_simple_name
- let pp_t = pp_simple_name
- let show_t = show_simple_name
-end
-
-module SimpleNameMap = Collections.MakeMap (SimpleNameOrd)
-module SimpleNameSet = Collections.MakeSet (SimpleNameOrd)
+open Charon.NameMatcher (* TODO: include? *)
+include ExtractName (* TODO: only open? *)
(** Small utility to memoize some computations *)
let mk_memoized (f : unit -> 'a) : unit -> 'a =
@@ -51,6 +21,9 @@ let mk_memoized (f : unit -> 'a) : unit -> 'a =
in
g
+let split_on_separator (s : string) : string list =
+ Str.split (Str.regexp "::") s
+
(** Switch between two values depending on the target backend.
We often compute the same value (typically: a name) if the target
@@ -62,36 +35,36 @@ let backend_choice (fstar_coq_hol4 : 'a) (lean : 'a) : 'a =
let builtin_globals : (string * string) list =
[
(* Min *)
- ("core::num::usize::MIN", "core_usize_min");
- ("core::num::u8::MIN", "core_u8_min");
- ("core::num::u16::MIN", "core_u16_min");
- ("core::num::u32::MIN", "core_u32_min");
- ("core::num::u64::MIN", "core_u64_min");
- ("core::num::u128::MIN", "core_u128_min");
- ("core::num::isize::MIN", "core_isize_min");
- ("core::num::i8::MIN", "core_i8_min");
- ("core::num::i16::MIN", "core_i16_min");
- ("core::num::i32::MIN", "core_i32_min");
- ("core::num::i64::MIN", "core_i64_min");
- ("core::num::i128::MIN", "core_i128_min");
+ ("core::num::{usize}::MIN", "core_usize_min");
+ ("core::num::{u8}::MIN", "core_u8_min");
+ ("core::num::{u16}::MIN", "core_u16_min");
+ ("core::num::{u32}::MIN", "core_u32_min");
+ ("core::num::{u64}::MIN", "core_u64_min");
+ ("core::num::{u128}::MIN", "core_u128_min");
+ ("core::num::{isize}::MIN", "core_isize_min");
+ ("core::num::{i8}::MIN", "core_i8_min");
+ ("core::num::{i16}::MIN", "core_i16_min");
+ ("core::num::{i32}::MIN", "core_i32_min");
+ ("core::num::{i64}::MIN", "core_i64_min");
+ ("core::num::{i128}::MIN", "core_i128_min");
(* Max *)
- ("core::num::usize::MAX", "core_usize_max");
- ("core::num::u8::MAX", "core_u8_max");
- ("core::num::u16::MAX", "core_u16_max");
- ("core::num::u32::MAX", "core_u32_max");
- ("core::num::u64::MAX", "core_u64_max");
- ("core::num::u128::MAX", "core_u128_max");
- ("core::num::isize::MAX", "core_isize_max");
- ("core::num::i8::MAX", "core_i8_max");
- ("core::num::i16::MAX", "core_i16_max");
- ("core::num::i32::MAX", "core_i32_max");
- ("core::num::i64::MAX", "core_i64_max");
- ("core::num::i128::MAX", "core_i128_max");
+ ("core::num::{usize}::MAX", "core_usize_max");
+ ("core::num::{u8}::MAX", "core_u8_max");
+ ("core::num::{u16}::MAX", "core_u16_max");
+ ("core::num::{u32}::MAX", "core_u32_max");
+ ("core::num::{u64}::MAX", "core_u64_max");
+ ("core::num::{u128}::MAX", "core_u128_max");
+ ("core::num::{isize}::MAX", "core_isize_max");
+ ("core::num::{i8}::MAX", "core_i8_max");
+ ("core::num::{i16}::MAX", "core_i16_max");
+ ("core::num::{i32}::MAX", "core_i32_max");
+ ("core::num::{i64}::MAX", "core_i64_max");
+ ("core::num::{i128}::MAX", "core_i128_max");
]
-let builtin_globals_map : string SimpleNameMap.t =
- SimpleNameMap.of_list
- (List.map (fun (x, y) -> (string_to_simple_name x, y)) builtin_globals)
+let builtin_globals_map : string NameMatcherMap.t =
+ NameMatcherMap.of_list
+ (List.map (fun (x, y) -> (parse_pattern x, y)) builtin_globals)
type builtin_variant_info = { fields : (string * string) list }
[@@deriving show]
@@ -111,7 +84,7 @@ type builtin_type_body_info =
[@@deriving show]
type builtin_type_info = {
- rust_name : string list;
+ rust_name : pattern;
extract_name : string;
keep_params : bool list option;
(** We might want to filter some of the type parameters.
@@ -143,11 +116,11 @@ let mk_struct_constructor (type_name : string) : string =
a type parameter for the allocator to use, which we want to filter.
*)
let builtin_types () : builtin_type_info list =
- let mk_type (rust_name : string list) ?(keep_params : bool list option = None)
+ let mk_type (rust_name : string) ?(keep_params : bool list option = None)
?(kind : type_variant_kind = KOpaque) () : builtin_type_info =
let extract_name =
let sep = backend_choice "_" "." in
- String.concat sep rust_name
+ String.concat sep (split_on_separator rust_name)
in
let body_info : builtin_type_body_info option =
match kind with
@@ -166,17 +139,17 @@ let builtin_types () : builtin_type_info list =
Some (Struct (constructor, fields))
| KEnum -> raise (Failure "TODO")
in
+ let rust_name = parse_pattern rust_name in
{ rust_name; extract_name; keep_params; body_info }
in
[
(* Alloc *)
- mk_type [ "alloc"; "alloc"; "Global" ] ();
+ mk_type "alloc::alloc::Global" ();
(* Vec *)
- mk_type [ "alloc"; "vec"; "Vec" ] ~keep_params:(Some [ true; false ]) ();
+ mk_type "alloc::vec::Vec" ~keep_params:(Some [ true; false ]) ();
(* Range *)
- mk_type
- [ "core"; "ops"; "range"; "Range" ]
+ mk_type "core::ops::range::Range"
~kind:(KStruct [ ("start", "start"); ("end", "end_") ])
();
(* Option
@@ -185,7 +158,7 @@ let builtin_types () : builtin_type_info list =
the target backend.
*)
{
- rust_name = [ "core"; "option"; "Option" ];
+ rust_name = parse_pattern "core::option::Option";
extract_name =
(match !backend with
| Lean -> "Option"
@@ -218,7 +191,7 @@ let builtin_types () : builtin_type_info list =
]
let mk_builtin_types_map () =
- SimpleNameMap.of_list
+ NameMatcherMap.of_list
(List.map (fun info -> (info.rust_name, info)) (builtin_types ()))
let builtin_types_map = mk_memoized mk_builtin_types_map
@@ -235,15 +208,22 @@ type builtin_fun_info = {
parameters. For instance, in the case of the `Vec` functions, there is
a type parameter for the allocator to use, which we want to filter.
*)
-let builtin_funs () :
- (string list * bool list option * builtin_fun_info list) list =
+let builtin_funs () : (pattern * bool list option * builtin_fun_info list) list
+ =
let rg0 = Some Types.RegionGroupId.zero in
(* Small utility *)
- let mk_fun (name : string list) (extract_name : string list option)
+ let mk_fun (rust_name : string) (extract_name : string option)
(filter : bool list option) (with_back : bool) (back_no_suffix : bool) :
- string list * bool list option * builtin_fun_info list =
+ pattern * bool list option * builtin_fun_info list =
+ let rust_name =
+ try parse_pattern rust_name
+ with Failure _ ->
+ raise (Failure ("Could not parse pattern: " ^ rust_name))
+ in
let extract_name =
- match extract_name with None -> name | Some name -> name
+ match extract_name with
+ | None -> pattern_to_fun_extract_name rust_name
+ | Some name -> split_on_separator name
in
let basename =
match !backend with
@@ -257,103 +237,55 @@ let builtin_funs () :
if with_back then [ { rg = rg0; extract_name = basename ^ back_suffix } ]
else []
in
- (name, filter, fwd @ back)
+ (rust_name, filter, fwd @ back)
in
[
- mk_fun [ "core"; "mem"; "replace" ] None None true false;
- mk_fun [ "alloc"; "vec"; "Vec"; "new" ] None None false false;
- mk_fun
- [ "alloc"; "vec"; "Vec"; "push" ]
- None
+ mk_fun "core::mem::replace" None None true false;
+ mk_fun "alloc::vec::{alloc::vec::Vec<@T>}::new" None None false false;
+ mk_fun "alloc::vec::{alloc::vec::Vec<@T>}::push" None
(Some [ true; false ])
true true;
- mk_fun
- [ "alloc"; "vec"; "Vec"; "insert" ]
- None
+ mk_fun "alloc::vec::{alloc::vec::Vec<@T>}::insert" None
(Some [ true; false ])
true true;
- mk_fun
- [ "alloc"; "vec"; "Vec"; "len" ]
- None
+ mk_fun "alloc::vec::{alloc::vec::Vec<@T>}::len" None
(Some [ true; false ])
true false;
- mk_fun
- [ "alloc"; "vec"; "Vec"; "index" ]
- None
+ mk_fun "alloc::vec::{alloc::vec::Vec<@T>}::index" None
(Some [ true; true; false ])
true false;
- mk_fun
- [ "alloc"; "vec"; "Vec"; "index_mut" ]
- None
+ mk_fun "alloc::vec::{alloc::vec::Vec<@T>}::index_mut" None
(Some [ true; true; false ])
true false;
- mk_fun
- [ "alloc"; "boxed"; "Box"; "deref" ]
- None
+ mk_fun "alloc::boxed::{Box<@T>}::deref" None
(Some [ true; false ])
true false;
- mk_fun
- [ "alloc"; "boxed"; "Box"; "deref_mut" ]
- None
+ mk_fun "alloc::boxed::{Box<@T>}::deref_mut" None
(Some [ true; false ])
true false;
- (* TODO: fix the same like "[T]" below *)
- mk_fun
- [ "core"; "slice"; "index"; "[T]"; "index" ]
- (Some [ "core"; "slice"; "index"; "Slice"; "index" ])
- None true false;
- mk_fun
- [ "core"; "slice"; "index"; "[T]"; "index_mut" ]
- (Some [ "core"; "slice"; "index"; "Slice"; "index_mut" ])
- None true false;
- mk_fun
- [ "core"; "array"; "[T; N]"; "index" ]
- (Some [ "core"; "array"; "Array"; "index" ])
- None true false;
- mk_fun
- [ "core"; "array"; "[T; N]"; "index_mut" ]
- (Some [ "core"; "array"; "Array"; "index_mut" ])
- None true false;
- mk_fun [ "core"; "slice"; "index"; "Range"; "get" ] None None true false;
- mk_fun [ "core"; "slice"; "index"; "Range"; "get_mut" ] None None true false;
- mk_fun [ "core"; "slice"; "index"; "Range"; "index" ] None None true false;
- mk_fun
- [ "core"; "slice"; "index"; "Range"; "index_mut" ]
- None None true false;
- mk_fun
- [ "core"; "slice"; "index"; "Range"; "get_unchecked" ]
- None None false false;
- mk_fun
- [ "core"; "slice"; "index"; "Range"; "get_unchecked_mut" ]
- None None false false;
- mk_fun
- [ "core"; "slice"; "index"; "usize"; "get" ]
- (Some [ "core"; "slice"; "index"; "Usize"; "get" ])
- None true false;
- mk_fun
- [ "core"; "slice"; "index"; "usize"; "get_mut" ]
- (Some [ "core"; "slice"; "index"; "Usize"; "get_mut" ])
- None true false;
- mk_fun
- [ "core"; "slice"; "index"; "usize"; "get_unchecked" ]
- (Some [ "core"; "slice"; "index"; "Usize"; "get_unchecked" ])
- None false false;
- mk_fun
- [ "core"; "slice"; "index"; "usize"; "get_unchecked_mut" ]
- (Some [ "core"; "slice"; "index"; "Usize"; "get_unchecked_mut" ])
- None false false;
- mk_fun
- [ "core"; "slice"; "index"; "usize"; "index" ]
- (Some [ "core"; "slice"; "index"; "Usize"; "index" ])
- None true false;
- mk_fun
- [ "core"; "slice"; "index"; "usize"; "index_mut" ]
- (Some [ "core"; "slice"; "index"; "Usize"; "index_mut" ])
- None true false;
+ mk_fun "core::slice::index::{[@T]}::index" None None true false;
+ mk_fun "core::slice::index::{[@T]}::index_mut" None None true false;
+ mk_fun "core::array::{[@T; @C]}::index" None None true false;
+ mk_fun "core::array::{[@T; @C]}::index_mut" None None true false;
+ mk_fun "core::slice::index::{Range<@T>}::get" None None true false;
+ mk_fun "core::slice::index::{Range<@T>}::get_mut" None None true false;
+ mk_fun "core::slice::index::{Range<@T>}::index" None None true false;
+ mk_fun "core::slice::index::{Range<@T>}::index_mut" None None true false;
+ mk_fun "core::slice::index::{Range<@T>}::get_unchecked" None None false
+ false;
+ mk_fun "core::slice::index::{Range<@T>}::get_unchecked_mut" None None false
+ false;
+ mk_fun "core::slice::index::{usize}::get" None None true false;
+ mk_fun "core::slice::index::{usize}::get_mut" None None true false;
+ mk_fun "core::slice::index::{usize}::get_unchecked" None None false false;
+ mk_fun "core::slice::index::{usize}::get_unchecked_mut" None None false
+ false;
+ mk_fun "core::slice::index::{usize}::index" None None true false;
+ mk_fun "core::slice::index::{usize}::index_mut" None None true false;
]
let mk_builtin_funs_map () =
- SimpleNameMap.of_list
+ NameMatcherMap.of_list
(List.map
(fun (name, filter, info) -> (name, (filter, info)))
(builtin_funs ()))
@@ -385,17 +317,22 @@ let builtin_fun_effects =
let int_funs =
List.map
(fun int_name ->
- List.map (fun op -> "core::num::" ^ int_name ^ "::" ^ op) int_ops)
+ List.map
+ (fun op ->
+ "core::num::" ^ "{"
+ ^ StringUtils.capitalize_first_letter int_name
+ ^ "}::" ^ op)
+ int_ops)
int_names
in
let int_funs = List.concat int_funs in
let no_fail_no_state_funs =
[
(* TODO: redundancy with the funs information below *)
- "alloc::vec::Vec::new";
- "alloc::vec::Vec::len";
- "alloc::boxed::Box::deref";
- "alloc::boxed::Box::deref_mut";
+ "alloc::vec::{alloc::vec::Vec<@T>}::new";
+ "alloc::vec::{alloc::vec::Vec<@T>}::len";
+ "alloc::boxed::{Box<@T>}::deref";
+ "alloc::boxed::{Box<@T>}::deref_mut";
"core::mem::replace";
"core::mem::take";
]
@@ -409,10 +346,10 @@ let builtin_fun_effects =
let no_state_funs =
[
(* TODO: redundancy with the funs information below *)
- "alloc::vec::Vec::push";
- "alloc::vec::Vec::index";
- "alloc::vec::Vec::index_mut";
- "alloc::vec::Vec::index_mut_back";
+ "alloc::vec::{alloc::vec::Vec<@T>}::push";
+ "alloc::vec::{alloc::vec::Vec<@T>}::index";
+ "alloc::vec::{alloc::vec::Vec<@T>}::index_mut";
+ "alloc::vec::{alloc::vec::Vec<@T>}::index_mut_back";
]
in
let no_state_funs =
@@ -421,11 +358,11 @@ let builtin_fun_effects =
no_fail_no_state_funs @ no_state_funs
let builtin_fun_effects_map =
- SimpleNameMap.of_list
- (List.map (fun (n, x) -> (string_to_simple_name n, x)) builtin_fun_effects)
+ NameMatcherMap.of_list
+ (List.map (fun (n, x) -> (parse_pattern n, x)) builtin_fun_effects)
type builtin_trait_decl_info = {
- rust_name : string;
+ rust_name : pattern;
extract_name : string;
constructor : string;
parent_clauses : string list;
@@ -441,13 +378,15 @@ type builtin_trait_decl_info = {
let builtin_trait_decls_info () =
let rg0 = Some Types.RegionGroupId.zero in
- let mk_trait (rust_name : string list) ?(extract_name : string option = None)
+ let mk_trait (rust_name : string) ?(extract_name : string option = None)
?(parent_clauses : string list = []) ?(types : string list = [])
?(methods : (string * bool) list = []) () : builtin_trait_decl_info =
+ let rust_name = parse_pattern rust_name in
let extract_name =
match extract_name with
| Some n -> n
| None -> (
+ let rust_name = pattern_to_fun_extract_name rust_name in
match !backend with
| Coq | FStar | HOL4 -> String.concat "_" rust_name
| Lean -> String.concat "." rust_name)
@@ -487,7 +426,6 @@ let builtin_trait_decls_info () =
in
List.map mk_method methods
in
- let rust_name = String.concat "::" rust_name in
{
rust_name;
extract_name;
@@ -500,34 +438,27 @@ let builtin_trait_decls_info () =
in
[
(* Deref *)
- mk_trait
- [ "core"; "ops"; "deref"; "Deref" ]
- ~types:[ "Target" ]
+ mk_trait "core::ops::deref::Deref" ~types:[ "Target" ]
~methods:[ ("deref", true) ]
();
(* DerefMut *)
- mk_trait
- [ "core"; "ops"; "deref"; "DerefMut" ]
+ mk_trait "core::ops::deref::DerefMut"
~parent_clauses:[ backend_choice "deref_inst" "derefInst" ]
~methods:[ ("deref_mut", true) ]
();
(* Index *)
- mk_trait
- [ "core"; "ops"; "index"; "Index" ]
- ~types:[ "Output" ]
+ mk_trait "core::ops::index::Index" ~types:[ "Output" ]
~methods:[ ("index", true) ]
();
(* IndexMut *)
- mk_trait
- [ "core"; "ops"; "index"; "IndexMut" ]
+ mk_trait "core::ops::index::IndexMut"
~parent_clauses:[ backend_choice "index_inst" "indexInst" ]
~methods:[ ("index_mut", true) ]
();
(* Sealed *)
- mk_trait [ "core"; "slice"; "index"; "private_slice_index"; "Sealed" ] ();
+ mk_trait "core::slice::index::private_slice_index::Sealed" ();
(* SliceIndex *)
- mk_trait
- [ "core"; "slice"; "index"; "SliceIndex" ]
+ mk_trait "core::slice::index::SliceIndex"
~parent_clauses:[ backend_choice "sealed_inst" "sealedInst" ]
~types:[ "Output" ]
~methods:
@@ -543,113 +474,56 @@ let builtin_trait_decls_info () =
]
let mk_builtin_trait_decls_map () =
- SimpleNameMap.of_list
+ NameMatcherMap.of_list
(List.map
- (fun info -> (string_to_simple_name info.rust_name, info))
+ (fun info -> (info.rust_name, info))
(builtin_trait_decls_info ()))
let builtin_trait_decls_map = mk_memoized mk_builtin_trait_decls_map
-(* TODO: generalize this.
-
- For now, the key is:
- - name of the impl (ex.: "alloc.boxed.Boxed")
- - name of the implemented trait (ex.: "core.ops.deref.Deref"
-*)
-type simple_name_pair = simple_name * simple_name [@@deriving show, ord]
-
-module SimpleNamePairOrd = struct
- type t = simple_name_pair
-
- let compare = compare_simple_name_pair
- let to_string = show_simple_name_pair
- let pp_t = pp_simple_name_pair
- let show_t = show_simple_name_pair
-end
-
-module SimpleNamePairMap = Collections.MakeMap (SimpleNamePairOrd)
-
-let builtin_trait_impls_info () :
- ((string list * string list) * (bool list option * string)) list =
- let fmt (type_name : string list)
- ?(extract_type_name : string list option = None)
- (trait_name : string list) ?(filter : bool list option = None) () :
- (string list * string list) * (bool list option * string) =
+let builtin_trait_impls_info () : (pattern * (bool list option * string)) list =
+ let fmt (rust_name : string) ?(filter : bool list option = None) () :
+ pattern * (bool list option * string) =
+ let rust_name = parse_pattern rust_name in
let name =
- let trait_name = String.concat "" trait_name ^ "Inst" in
+ let name = pattern_to_trait_impl_extract_name rust_name in
let sep = backend_choice "_" "." in
- let type_name =
- match extract_type_name with
- | Some type_name -> type_name
- | None -> type_name
- in
- String.concat sep type_name ^ sep ^ trait_name
+ String.concat sep name
in
- ((type_name, trait_name), (filter, name))
+ (rust_name, (filter, name))
in
- (* TODO: fix the names like "[T]" below *)
[
(* core::ops::Deref<alloc::boxed::Box<T>> *)
- fmt [ "alloc"; "boxed"; "Box" ] [ "core"; "ops"; "deref"; "Deref" ] ();
- (* core::ops::DerefMut<alloc::boxed::Box<T>> *)
- fmt [ "alloc"; "boxed"; "Box" ] [ "core"; "ops"; "deref"; "DerefMut" ] ();
+ fmt "core::ops::Deref<Box<@T>>" ();
+ (* core::ops::Deref<alloc::boxed::Box<T>> *)
+ fmt "core::ops::Deref<Box<@T>>" ();
(* core::ops::index::Index<[T], I> *)
- fmt
- [ "core"; "slice"; "index"; "[T]" ]
- ~extract_type_name:(Some [ "core"; "slice"; "index"; "Slice" ])
- [ "core"; "ops"; "index"; "Index" ]
- ();
+ fmt "core::ops::index::Index<[@T], @I>" ();
(* core::ops::index::IndexMut<[T], I> *)
- fmt
- [ "core"; "slice"; "index"; "[T]" ]
- ~extract_type_name:(Some [ "core"; "slice"; "index"; "Slice" ])
- [ "core"; "ops"; "index"; "IndexMut" ]
- ();
+ fmt "core::ops::index::IndexMut<[@T], @I>" ();
(* core::slice::index::private_slice_index::Sealed<Range<usize>> *)
- fmt
- [ "core"; "slice"; "index"; "private_slice_index"; "Range" ]
- [ "core"; "slice"; "index"; "private_slice_index"; "Sealed" ]
- ();
+ fmt "core::slice::index::private_slice_index::Sealed<Range<usize>>" ();
(* core::slice::index::SliceIndex<Range<usize>, [T]> *)
- fmt
- [ "core"; "slice"; "index"; "Range" ]
- [ "core"; "slice"; "index"; "SliceIndex" ]
- ();
+ fmt "core::slice::index::SliceIndex<Range<usize>, [@T]>" ();
(* core::ops::index::Index<[T; N], I> *)
- fmt
- [ "core"; "array"; "[T; N]" ]
- ~extract_type_name:(Some [ "core"; "array"; "Array" ])
- [ "core"; "ops"; "index"; "Index" ]
- ();
+ fmt "core::ops::index::Index<[@T; @N], @I>" ();
(* core::ops::index::IndexMut<[T; N], I> *)
- fmt
- [ "core"; "array"; "[T; N]" ]
- ~extract_type_name:(Some [ "core"; "array"; "Array" ])
- [ "core"; "ops"; "index"; "IndexMut" ]
- ();
+ fmt "core::ops::index::IndexMut<[@T; @N], @I>" ();
(* core::slice::index::private_slice_index::Sealed<usize> *)
- fmt
- [ "core"; "slice"; "index"; "private_slice_index"; "usize" ]
- [ "core"; "slice"; "index"; "private_slice_index"; "Sealed" ]
- ();
+ fmt "core::slice::index::private_slice_index::Sealed<usize>" ();
(* core::slice::index::SliceIndex<usize, [T]> *)
- fmt
- [ "core"; "slice"; "index"; "usize" ]
- [ "core"; "slice"; "index"; "SliceIndex" ]
- ();
- (* core::ops::index::Index<Vec<T>, T> *)
- fmt [ "alloc"; "vec"; "Vec" ]
- [ "core"; "ops"; "index"; "Index" ]
+ fmt "core::slice::index::SliceIndex<usize, [@T]>" ();
+ (* core::ops::index::Index<alloc::vec::Vec<T>, T> *)
+ fmt "core::ops::index::Index<alloc::vec::Vec<@T>, @T>"
~filter:(Some [ true; true; false ])
();
- (* core::ops::index::IndexMut<Vec<T>, T> *)
- fmt [ "alloc"; "vec"; "Vec" ]
- [ "core"; "ops"; "index"; "IndexMut" ]
+ (* core::ops::index::IndexMut<alloc::vec::Vec<T>, T> *)
+ fmt "core::ops::index::IndexMut<alloc::vec::Vec<@T>, @T>"
~filter:(Some [ true; true; false ])
();
]
let mk_builtin_trait_impls_map () =
- SimpleNamePairMap.of_list (builtin_trait_impls_info ())
+ NameMatcherMap.of_list (builtin_trait_impls_info ())
let builtin_trait_impls_map = mk_memoized mk_builtin_trait_impls_map