firedbg_rust_parser/def/
function.rs

1use firedbg_protocol::source::LineColumn;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
5pub struct FunctionDef {
6    pub ty: FunctionType,
7    pub loc: BreakableSpan,
8}
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11pub struct BreakableSpan {
12    pub start: LineColumn,
13    pub end: LineColumn,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
17pub enum FunctionType {
18    FreeFn {
19        fn_name: String,
20        is_async: bool,
21        return_type: bool,
22    },
23    ImplFn {
24        self_type: String,
25        fn_name: String,
26        is_async: bool,
27        is_static: bool,
28        return_type: bool,
29    },
30    ImplTraitFn {
31        trait_name: String,
32        self_type: String,
33        fn_name: String,
34        is_async: bool,
35        is_static: bool,
36        return_type: bool,
37    },
38    TraitDefaultFn {
39        trait_name: String,
40        fn_name: String,
41        is_async: bool,
42        is_static: bool,
43        return_type: bool,
44    },
45    NestedFn {
46        fn_name: String,
47        parent_func: String,
48        is_async: bool,
49        return_type: bool,
50    },
51}
52
53impl FunctionType {
54    pub fn into_nested_func(self, parent_breakpoint: &FunctionDef) -> FunctionType {
55        let parent_func = parent_breakpoint.ty.fn_name().to_string();
56        match self {
57            FunctionType::FreeFn {
58                fn_name,
59                is_async,
60                return_type,
61            } => FunctionType::NestedFn {
62                fn_name,
63                parent_func,
64                is_async,
65                return_type,
66            },
67            FunctionType::ImplFn {
68                fn_name,
69                is_async,
70                return_type,
71                ..
72            } => FunctionType::NestedFn {
73                fn_name,
74                parent_func,
75                is_async,
76                return_type,
77            },
78            FunctionType::ImplTraitFn {
79                fn_name,
80                is_async,
81                return_type,
82                ..
83            } => FunctionType::NestedFn {
84                fn_name,
85                parent_func,
86                is_async,
87                return_type,
88            },
89            FunctionType::TraitDefaultFn {
90                fn_name,
91                is_async,
92                return_type,
93                ..
94            } => FunctionType::NestedFn {
95                fn_name,
96                parent_func,
97                is_async,
98                return_type,
99            },
100            FunctionType::NestedFn {
101                fn_name,
102                is_async,
103                return_type,
104                ..
105            } => FunctionType::NestedFn {
106                fn_name,
107                parent_func,
108                is_async,
109                return_type,
110            },
111        }
112    }
113
114    pub fn fn_name(&self) -> &str {
115        match self {
116            FunctionType::FreeFn { fn_name, .. } => &fn_name,
117            FunctionType::ImplFn { fn_name, .. } => &fn_name,
118            FunctionType::ImplTraitFn { fn_name, .. } => &fn_name,
119            FunctionType::TraitDefaultFn { fn_name, .. } => &fn_name,
120            FunctionType::NestedFn { fn_name, .. } => &fn_name,
121        }
122    }
123}