xee_interpreter/function/
inline_function.rs

1use xee_schema_type::Xs;
2use xee_xpath_type::ast::SequenceType;
3
4use crate::sequence;
5use crate::span::SourceSpan;
6use crate::xml;
7
8use super::signature::Signature;
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
11pub struct CastType {
12    pub xs: Xs,
13    pub empty_sequence_allowed: bool,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq)]
17pub struct Name(pub(crate) String);
18
19impl Name {
20    pub fn new(name: String) -> Self {
21        Name(name)
22    }
23}
24
25#[derive(Debug, Clone)]
26pub struct InlineFunction {
27    pub name: String,
28    pub signature: Signature,
29    // things referenced by instructions (by index)
30    pub constants: Vec<sequence::Sequence>,
31    pub steps: Vec<xml::Step>,
32    pub cast_types: Vec<CastType>,
33    pub sequence_types: Vec<SequenceType>,
34    pub closure_names: Vec<Name>,
35    // the compiled code, and the spans of each instruction
36    pub chunk: Vec<u8>,
37    pub spans: Vec<SourceSpan>,
38}
39
40impl InlineFunction {
41    pub(crate) fn signature(&self) -> &Signature {
42        &self.signature
43    }
44
45    pub(crate) fn arity(&self) -> usize {
46        self.signature.parameter_types().len()
47    }
48
49    pub fn display_representation(&self) -> String {
50        let signature = self.signature.display_representation();
51        format!("function{}", signature)
52    }
53}