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}