rune/ast/
expr_field_access.rs

1use crate::ast::prelude::*;
2
3#[test]
4#[cfg(not(miri))]
5fn ast_parse() {
6    rt::<ast::ExprFieldAccess>("foo.bar");
7    rt::<ast::ExprFieldAccess>("foo.bar::<A, B>");
8    rt::<ast::ExprFieldAccess>("foo.0.bar");
9    // Note: tuple accesses must be disambiguated.
10    rt::<ast::ExprFieldAccess>("(foo.0).1");
11}
12
13/// A field access.
14///
15/// * `<expr>.<field>`.
16#[derive(Debug, TryClone, PartialEq, Eq, ToTokens, Spanned)]
17#[non_exhaustive]
18pub struct ExprFieldAccess {
19    /// Attributes associated with expression.
20    #[rune(iter)]
21    pub attributes: Vec<ast::Attribute>,
22    /// The expr where the field is being accessed.
23    pub expr: Box<ast::Expr>,
24    /// The parsed dot separator.
25    pub dot: T![.],
26    /// The field being accessed.
27    pub expr_field: ExprField,
28}
29
30expr_parse!(FieldAccess, ExprFieldAccess, "field access expression");
31
32/// The field being accessed.
33#[derive(Debug, TryClone, PartialEq, Eq, ToTokens, Spanned)]
34#[non_exhaustive]
35pub enum ExprField {
36    /// An identifier.
37    Path(ast::Path),
38    /// A literal number.
39    LitNumber(ast::LitNumber),
40}