mxmlextrema_as3parser/tree/
object_initializer.rs

1use crate::ns::*;
2use serde::{Serialize, Deserialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct ObjectInitializer {
6    pub location: Location,
7    pub fields: Vec<Rc<InitializerField>>,
8}
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
11pub enum InitializerField {
12    Field {
13        name: (FieldName, Location),
14        value: Option<Rc<Expression>>,
15    },
16    Rest((Rc<Expression>, Location)),
17}
18
19impl InitializerField {
20    pub fn location(&self) -> Location {
21        match self {
22            Self::Field { ref name, ref value, .. } => {
23                value.clone().map_or(name.1.clone(), |v| name.1.combine_with(v.location()))
24            },
25            Self::Rest((_, ref l)) => l.clone(),
26        }
27    }
28
29    pub fn shorthand(&self) -> Option<&QualifiedIdentifier> {
30        if let Self::Field { name, value, .. } = self {
31            if let FieldName::Identifier(qid) = &name.0 {
32                if value.is_none() {
33                    Some(qid)
34                } else {
35                    None
36                }
37            } else {
38                None
39            }
40        } else {
41            None
42        }
43    }
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
47pub enum FieldName {
48    Identifier(QualifiedIdentifier),
49    Brackets(Rc<Expression>),
50    StringLiteral(Rc<Expression>),
51    NumericLiteral(Rc<Expression>),
52}
53
54impl FieldName {
55    pub(crate) fn id(&self) -> Option<&QualifiedIdentifier> {
56        let Self::Identifier(id) = &self else {
57            return None;
58        };
59        Some(id)
60    }
61
62    pub fn id_equals(&self, name: &str) -> bool {
63        self.id().map(|name1| name == name1.to_identifier_name_or_asterisk().map(|id| id.0.clone()).unwrap_or("".into())).unwrap_or(false)
64    }
65}