1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use crate::ns::*;
use serde::{Serialize, Deserialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VariableDefinition {
    pub location: Location,
    pub asdoc: Option<Rc<AsDoc>>,
    pub attributes: Vec<Attribute>,
    pub kind: (VariableDefinitionKind, Location),
    pub bindings: Vec<Rc<VariableBinding>>,
}

#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum VariableDefinitionKind {
    Var,
    Const,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SimpleVariableDefinition {
    pub location: Location,
    pub kind: (VariableDefinitionKind, Location),
    pub bindings: Vec<Rc<VariableBinding>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VariableBinding {
    pub destructuring: TypedDestructuring,
    pub initializer: Option<Rc<Expression>>,
}

impl VariableBinding {
    pub fn location(&self) -> Location {
        self.initializer.as_ref().map_or(self.destructuring.location.clone(), |init| self.destructuring.location.combine_with(init.location()))
    }
}