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;