mxmlextrema_as3parser/tree/
object_initializer.rs1use 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}