ast_demangle/
lib.rs

1//! # ast-demangle
2//!
3//! Parses mangled names and produces structured results.
4//!
5//! Example:
6//!
7//! ```rust
8//! use ast_demangle::rust_v0::{DisplayStyle, Identifier, Path, Symbol};
9//! use std::borrow::Cow;
10//!
11//! let mangled_name = "_RNvNtCs6GSVXm7oiwY_5regex4utf811decode_utf8.llvm.1119170478327948870";
12//! let (symbol, suffix) = Symbol::parse_from_str(mangled_name).unwrap();
13//!
14//! // The suffix is returned.
15//! assert_eq!(suffix, "");
16//!
17//! // The default style for displaying is the long format.
18//! assert_eq!(format!("{}", symbol), "regex[4df147058689a776]::utf8::decode_utf8");
19//!
20//! // To omit the crate hash, use the alternate display format.
21//! assert_eq!(format!("{:#}", symbol), "regex::utf8::decode_utf8");
22//!
23//! // Use `Symbol::display` and `DisplayStyle` to specify the display style explicitly.
24//!
25//! assert_eq!(format!("{}", symbol.display(DisplayStyle::Short)), "decode_utf8");
26//! assert_eq!(format!("{}", symbol.display(DisplayStyle::Normal)), "regex::utf8::decode_utf8");
27//!
28//! assert_eq!(
29//!     format!("{}", symbol.display(DisplayStyle::Long)),
30//!     "regex[4df147058689a776]::utf8::decode_utf8"
31//! );
32//!
33//! // You can access the structure of the demangled symbol.
34//!
35//! assert_eq!(
36//!     symbol,
37//!     Symbol {
38//!         version: None,
39//!         path: Path::Nested {
40//!             namespace: b'v',
41//!             path: Path::Nested {
42//!                 namespace: b't',
43//!                 path: Path::CrateRoot(Identifier {
44//!                     disambiguator: 0x4df1_4705_8689_a776,
45//!                     name: Cow::Borrowed("regex")
46//!                 })
47//!                 .into(),
48//!                 identifier: Identifier {
49//!                     disambiguator: 0,
50//!                     name: Cow::Borrowed("utf8")
51//!                 }
52//!             }
53//!             .into(),
54//!             identifier: Identifier {
55//!                 disambiguator: 0,
56//!                 name: Cow::Borrowed("decode_utf8")
57//!             }
58//!         }
59//!         .into(),
60//!         instantiating_crate: None,
61//!         vendor_specific_suffix: Some(".llvm.1119170478327948870"),
62//!     }
63//! );
64//! ```
65
66#![warn(
67    explicit_outlives_requirements,
68    macro_use_extern_crate,
69    meta_variable_misuse,
70    missing_abi,
71    // missing_docs,
72    noop_method_call,
73    pointer_structural_match,
74    // single_use_lifetimes, // See <https://github.com/rust-lang/rust/issues/69952>.
75    trivial_casts,
76    trivial_numeric_casts,
77    unsafe_code,
78    unsafe_op_in_unsafe_fn,
79    // unused_crate_dependencies, // False positive.
80    unused_extern_crates,
81    unused_import_braces,
82    unused_lifetimes,
83    unused_qualifications,
84    variant_size_differences,
85    // clippy::cargo_common_metadata,
86    clippy::clone_on_ref_ptr,
87    clippy::cognitive_complexity,
88    clippy::create_dir,
89    clippy::dbg_macro,
90    clippy::debug_assert_with_mut_call,
91    clippy::empty_line_after_outer_attr,
92    clippy::fallible_impl_from,
93    clippy::filetype_is_file,
94    clippy::float_cmp_const,
95    clippy::get_unwrap,
96    clippy::if_then_some_else_none,
97    clippy::imprecise_flops,
98    clippy::let_underscore_must_use,
99    clippy::lossy_float_literal,
100    clippy::multiple_inherent_impl,
101    clippy::mutex_integer,
102    clippy::nonstandard_macro_braces,
103    clippy::panic_in_result_fn,
104    clippy::path_buf_push_overwrite,
105    clippy::pedantic,
106    clippy::print_stderr,
107    clippy::print_stdout,
108    clippy::rc_buffer,
109    clippy::rc_mutex,
110    clippy::rest_pat_in_fully_bound_structs,
111    clippy::string_lit_as_bytes,
112    clippy::string_to_string,
113    clippy::suboptimal_flops,
114    clippy::suspicious_operation_groupings,
115    clippy::todo,
116    clippy::trivial_regex,
117    clippy::unimplemented,
118    clippy::unnecessary_self_imports,
119    clippy::unneeded_field_pattern,
120    clippy::use_debug,
121    clippy::use_self,
122    clippy::useless_let_if_seq,
123    clippy::useless_transmute,
124    clippy::verbose_file_reads,
125    // clippy::wildcard_dependencies,
126)]
127#![allow(clippy::module_name_repetitions, clippy::non_ascii_literal)]
128
129mod mini_parser;
130pub mod rust_v0;