Skip to main content

swift_demangler/
outlined.rs

1//! Outlined operation symbol representation.
2//!
3//! Outlined operations are compiler-generated helpers for common operations
4//! that have been "outlined" (pulled out into separate functions) for code
5//! size optimization or bridging purposes.
6
7use crate::helpers::NodeExt;
8use crate::raw::{Node, NodeKind};
9
10/// A Swift outlined operation symbol.
11#[derive(Clone, Copy)]
12pub struct Outlined<'ctx> {
13    raw: Node<'ctx>,
14}
15
16impl<'ctx> Outlined<'ctx> {
17    /// Create an Outlined from a raw node.
18    pub fn new(raw: Node<'ctx>) -> Self {
19        Self { raw }
20    }
21
22    /// Get the underlying raw node.
23    pub fn raw(&self) -> Node<'ctx> {
24        self.raw
25    }
26
27    /// Get the kind of outlined operation.
28    pub fn kind(&self) -> OutlinedKind {
29        match self.raw.kind() {
30            NodeKind::OutlinedBridgedMethod => OutlinedKind::BridgedMethod,
31            NodeKind::OutlinedVariable => OutlinedKind::Variable,
32            NodeKind::OutlinedCopy => OutlinedKind::Copy,
33            NodeKind::OutlinedConsume => OutlinedKind::Consume,
34            NodeKind::OutlinedRetain => OutlinedKind::Retain,
35            NodeKind::OutlinedRelease => OutlinedKind::Release,
36            NodeKind::OutlinedInitializeWithTake => OutlinedKind::InitializeWithTake,
37            NodeKind::OutlinedInitializeWithCopy => OutlinedKind::InitializeWithCopy,
38            NodeKind::OutlinedAssignWithTake => OutlinedKind::AssignWithTake,
39            NodeKind::OutlinedAssignWithCopy => OutlinedKind::AssignWithCopy,
40            NodeKind::OutlinedDestroy => OutlinedKind::Destroy,
41            NodeKind::OutlinedInitializeWithCopyNoValueWitness => {
42                OutlinedKind::InitializeWithCopyNoValueWitness
43            }
44            NodeKind::OutlinedInitializeWithTakeNoValueWitness => {
45                OutlinedKind::InitializeWithTakeNoValueWitness
46            }
47            NodeKind::OutlinedAssignWithCopyNoValueWitness => {
48                OutlinedKind::AssignWithCopyNoValueWitness
49            }
50            NodeKind::OutlinedAssignWithTakeNoValueWitness => {
51                OutlinedKind::AssignWithTakeNoValueWitness
52            }
53            NodeKind::OutlinedDestroyNoValueWitness => OutlinedKind::DestroyNoValueWitness,
54            NodeKind::OutlinedReadOnlyObject => OutlinedKind::ReadOnlyObject,
55            _ => OutlinedKind::Other,
56        }
57    }
58
59    /// Get the index of this outlined operation (for variables, copies, etc.).
60    pub fn index(&self) -> Option<u64> {
61        // The index is stored directly on the node, not as a child
62        self.raw.index()
63    }
64
65    /// Get the module containing this outlined operation.
66    pub fn module(&self) -> Option<&'ctx str> {
67        self.raw.find_module_in_descendants()
68    }
69}
70
71impl std::fmt::Debug for Outlined<'_> {
72    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
73        f.debug_struct("Outlined")
74            .field("kind", &self.kind())
75            .field("index", &self.index())
76            .field("module", &self.module())
77            .finish()
78    }
79}
80
81impl std::fmt::Display for Outlined<'_> {
82    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
83        write!(f, "{}", self.raw)
84    }
85}
86
87/// The kind of outlined operation.
88#[derive(Debug, Clone, Copy, PartialEq, Eq)]
89pub enum OutlinedKind {
90    /// Outlined Objective-C bridged method.
91    BridgedMethod,
92    /// Outlined variable (stack allocation).
93    Variable,
94    /// Outlined copy operation.
95    Copy,
96    /// Outlined consume operation.
97    Consume,
98    /// Outlined retain operation.
99    Retain,
100    /// Outlined release operation.
101    Release,
102    /// Outlined initialize with take.
103    InitializeWithTake,
104    /// Outlined initialize with copy.
105    InitializeWithCopy,
106    /// Outlined assign with take.
107    AssignWithTake,
108    /// Outlined assign with copy.
109    AssignWithCopy,
110    /// Outlined destroy operation.
111    Destroy,
112    /// Outlined initialize with copy (no value witness).
113    InitializeWithCopyNoValueWitness,
114    /// Outlined initialize with take (no value witness).
115    InitializeWithTakeNoValueWitness,
116    /// Outlined assign with copy (no value witness).
117    AssignWithCopyNoValueWitness,
118    /// Outlined assign with take (no value witness).
119    AssignWithTakeNoValueWitness,
120    /// Outlined destroy (no value witness).
121    DestroyNoValueWitness,
122    /// Outlined read-only object.
123    ReadOnlyObject,
124    /// Other outlined operation.
125    Other,
126}
127
128impl OutlinedKind {
129    /// Get a human-readable name for this outlined kind.
130    pub fn name(&self) -> &'static str {
131        match self {
132            OutlinedKind::BridgedMethod => "outlined bridged method",
133            OutlinedKind::Variable => "outlined variable",
134            OutlinedKind::Copy => "outlined copy",
135            OutlinedKind::Consume => "outlined consume",
136            OutlinedKind::Retain => "outlined retain",
137            OutlinedKind::Release => "outlined release",
138            OutlinedKind::InitializeWithTake => "outlined initializeWithTake",
139            OutlinedKind::InitializeWithCopy => "outlined initializeWithCopy",
140            OutlinedKind::AssignWithTake => "outlined assignWithTake",
141            OutlinedKind::AssignWithCopy => "outlined assignWithCopy",
142            OutlinedKind::Destroy => "outlined destroy",
143            OutlinedKind::InitializeWithCopyNoValueWitness => {
144                "outlined initializeWithCopy (no value witness)"
145            }
146            OutlinedKind::InitializeWithTakeNoValueWitness => {
147                "outlined initializeWithTake (no value witness)"
148            }
149            OutlinedKind::AssignWithCopyNoValueWitness => {
150                "outlined assignWithCopy (no value witness)"
151            }
152            OutlinedKind::AssignWithTakeNoValueWitness => {
153                "outlined assignWithTake (no value witness)"
154            }
155            OutlinedKind::DestroyNoValueWitness => "outlined destroy (no value witness)",
156            OutlinedKind::ReadOnlyObject => "outlined read-only object",
157            OutlinedKind::Other => "outlined operation",
158        }
159    }
160}