microcad_lang/symbol/
symbol_info.rs1use std::rc::Rc;
5
6use microcad_lang_base::{SrcRef, SrcReferrer};
7
8use crate::{builtin::*, doc::Doc, syntax::*, value::*};
9
10pub trait Info {
12 fn info(&self) -> SymbolInfo;
14}
15
16pub struct ParameterInfo {
18 pub id: String,
20 pub ty: Option<String>,
22 pub def: Option<String>,
24}
25
26impl From<&Parameter> for ParameterInfo {
27 fn from(param: &Parameter) -> Self {
28 Self {
29 id: param.id().to_string(),
30 ty: param.specified_type.clone().map(|ty| ty.to_string()),
31 def: param.default_value.clone().map(|def| def.to_string()),
32 }
33 }
34}
35
36impl From<(&Identifier, &ParameterValue)> for ParameterInfo {
37 fn from(param: (&Identifier, &ParameterValue)) -> Self {
38 Self {
39 id: param.0.to_string(),
40 ty: param.1.specified_type.clone().map(|ty| ty.to_string()),
41 def: param.1.default_value.clone().map(|def| def.to_string()),
42 }
43 }
44}
45
46pub struct SignatureInfo {
48 pub params: Vec<ParameterInfo>,
50 pub doc: Option<DocBlock>,
52}
53
54#[derive(Default)]
56pub struct SymbolInfo {
57 pub id: String,
59 pub kind: String,
61 pub doc: Option<DocBlock>,
63 pub signatures: Vec<SignatureInfo>,
65 pub src_ref: SrcRef,
67}
68
69impl SymbolInfo {
70 pub(super) fn new_local(id: &Identifier) -> Self {
71 SymbolInfo {
72 id: id.to_string(),
73 kind: "local value".into(),
74 ..Default::default()
75 }
76 }
77}
78
79impl From<&Rc<Assignment>> for SymbolInfo {
80 fn from(def: &Rc<Assignment>) -> Self {
81 SymbolInfo {
82 id: def.id().to_string(),
83 kind: "Assignment".into(),
84 doc: Some(def.doc()),
85 signatures: vec![],
86 src_ref: def.src_ref(),
87 }
88 }
89}
90
91impl From<&Rc<SourceFile>> for SymbolInfo {
92 fn from(def: &Rc<SourceFile>) -> Self {
93 SymbolInfo {
94 id: def.id().to_string(),
95 kind: "SourceFile".into(),
96 doc: Some(def.doc()),
97 signatures: vec![],
98 src_ref: def.src_ref(),
99 }
100 }
101}
102
103impl From<&Rc<ModuleDefinition>> for SymbolInfo {
104 fn from(def: &Rc<ModuleDefinition>) -> Self {
105 SymbolInfo {
106 id: def.id().to_string(),
107 kind: "ModuleDefinition".into(),
108 doc: Some(def.doc()),
109 signatures: vec![],
110 src_ref: def.src_ref(),
111 }
112 }
113}
114
115impl From<&Rc<WorkbenchDefinition>> for SymbolInfo {
116 fn from(def: &Rc<WorkbenchDefinition>) -> Self {
117 SymbolInfo {
118 id: def.id().to_string(),
119 kind: def.kind.to_string(),
120 doc: Some(def.doc()),
121 signatures: def
122 .inits()
123 .map(|init| SignatureInfo {
124 params: init.parameters.iter().map(|p| p.into()).collect(),
125 doc: Some(init.doc()),
126 })
127 .collect(),
128 src_ref: def.src_ref(),
129 }
130 }
131}
132
133impl From<&Rc<FunctionDefinition>> for SymbolInfo {
134 fn from(def: &Rc<FunctionDefinition>) -> Self {
135 SymbolInfo {
136 id: def.id().to_string(),
137 kind: "Function".into(),
138 doc: Some(def.doc()),
139 signatures: vec![SignatureInfo {
140 params: def.signature.parameters.iter().map(|p| p.into()).collect(),
141 doc: Some(def.doc()),
142 }],
143 src_ref: def.src_ref(),
144 }
145 }
146}
147
148impl From<&Builtin> for SymbolInfo {
149 fn from(def: &Builtin) -> Self {
150 use crate::doc::Doc;
151 SymbolInfo {
152 id: def.id().to_string(),
153 kind: "Builtin".into(),
154 doc: Some(def.doc()),
155 signatures: vec![],
156 src_ref: SrcRef(None),
157 }
158 }
159}