diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-04-19 16:37:16 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-04-19 16:37:16 +0200 |
| commit | 7a2cc3e7d29d16c5cf9b5a93a688e14da93c8662 (patch) | |
| tree | 8ca787c56b84b83f5d34ee7b4701c0e8f4778753 /src/syntax/ast.rs | |
| parent | 255d4c620f39133b40a9132843781f2a620a6008 (diff) | |
Field access
Diffstat (limited to 'src/syntax/ast.rs')
| -rw-r--r-- | src/syntax/ast.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs index 60856691..8af359bf 100644 --- a/src/syntax/ast.rs +++ b/src/syntax/ast.rs @@ -237,6 +237,8 @@ pub enum Expr { Unary(UnaryExpr), /// A binary operation: `a + b`. Binary(BinaryExpr), + /// A field access: `properties.age`. + FieldAccess(FieldAccess), /// An invocation of a function: `f(x, y)`. FuncCall(FuncCall), /// An invocation of a method: `array.push(v)`. @@ -280,6 +282,7 @@ impl TypedNode for Expr { NodeKind::DictExpr => node.cast().map(Self::Dict), NodeKind::UnaryExpr => node.cast().map(Self::Unary), NodeKind::BinaryExpr => node.cast().map(Self::Binary), + NodeKind::FieldAccess => node.cast().map(Self::FieldAccess), NodeKind::FuncCall => node.cast().map(Self::FuncCall), NodeKind::MethodCall => node.cast().map(Self::MethodCall), NodeKind::ClosureExpr => node.cast().map(Self::Closure), @@ -310,6 +313,7 @@ impl TypedNode for Expr { Self::Group(v) => v.as_red(), Self::Unary(v) => v.as_red(), Self::Binary(v) => v.as_red(), + Self::FieldAccess(v) => v.as_red(), Self::FuncCall(v) => v.as_red(), Self::MethodCall(v) => v.as_red(), Self::Closure(v) => v.as_red(), @@ -790,6 +794,23 @@ pub enum Associativity { } node! { + /// A field access: `properties.age`. + FieldAccess: FieldAccess +} + +impl FieldAccess { + /// The object with the field. + pub fn object(&self) -> Expr { + self.0.cast_first_child().expect("field access is missing object") + } + + /// The name of the field. + pub fn field(&self) -> Ident { + self.0.cast_last_child().expect("field access call is missing name") + } +} + +node! { /// An invocation of a function: `f(x, y)`. FuncCall: FuncCall } |
