summaryrefslogtreecommitdiff
path: root/src/syntax/ast.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-04-19 16:37:16 +0200
committerLaurenz <laurmaedje@gmail.com>2022-04-19 16:37:16 +0200
commit7a2cc3e7d29d16c5cf9b5a93a688e14da93c8662 (patch)
tree8ca787c56b84b83f5d34ee7b4701c0e8f4778753 /src/syntax/ast.rs
parent255d4c620f39133b40a9132843781f2a620a6008 (diff)
Field access
Diffstat (limited to 'src/syntax/ast.rs')
-rw-r--r--src/syntax/ast.rs21
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
}