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