Skip to main content

microcad_lang/symbol/
symbol_info.rs

1// Copyright © 2025-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4use std::rc::Rc;
5
6use microcad_lang_base::{SrcRef, SrcReferrer};
7
8use crate::{builtin::*, doc::Doc, syntax::*, value::*};
9
10/// Retrieve symbol information.
11pub trait Info {
12    /// Get symbol information.
13    fn info(&self) -> SymbolInfo;
14}
15
16/// Single parameter information in human readable form.
17pub struct ParameterInfo {
18    /// Parameter ID.
19    pub id: String,
20    /// Type if given.
21    pub ty: Option<String>,
22    /// Default value if given.
23    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
46/// Call signature information in human readable form.
47pub struct SignatureInfo {
48    /// Parameters of the call.
49    pub params: Vec<ParameterInfo>,
50    /// Documentation.
51    pub doc: Option<DocBlock>,
52}
53
54/// Symbol information in human readable form.
55#[derive(Default)]
56pub struct SymbolInfo {
57    /// ID of the symbol.
58    pub id: String,
59    /// Human readable symbol kind.
60    pub kind: String,
61    /// Optional documentation block.
62    pub doc: Option<DocBlock>,
63    /// Parameters and alternative parameters if any.
64    pub signatures: Vec<SignatureInfo>,
65    /// Source code reference.
66    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}