//! > Test attributes without an item.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
#[aaa]
3

//! > top_level_kind

//! > ignored_kinds
Attribute

//! > expected_diagnostics
error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:1:7
#[aaa]
      ^

error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:2:1
3
^

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList)
    │   └── child #0: Missing []
    └── eof (kind: TerminalEndOfFile)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute) <ignored>
        │   └── child #1 (kind: TokenSkipped): '3'
        ├── token (kind: TokenEndOfFile).
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test attributes without a trait item.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
trait Abc {
    #[aaa]
    3
}

//! > top_level_kind
TraitBody

//! > ignored_kinds
Attribute
TerminalLBrace

//! > expected_diagnostics
error[E1024]: Missing tokens. Expected a trait item after attributes.
 --> dummy_file.cairo:2:11
    #[aaa]
          ^

error[E1000]: Skipped tokens. Expected: Const/Function/Impl/Type or an attribute.
 --> dummy_file.cairo:3:5
    3
    ^

//! > expected_tree
└── Top level kind: TraitBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: TraitItemList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute) <ignored>
        │   ├── child #1 (kind: TokenWhitespace).
        │   ├── child #2 (kind: TokenSkipped): '3'
        │   └── child #3 (kind: TokenNewline).
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test attributes without an impl item.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
impl Abc of Def {
    #[aaa]
    3
}

//! > top_level_kind
ImplBody

//! > ignored_kinds
Attribute
TerminalLBrace

//! > expected_diagnostics
error[E1025]: Missing tokens. Expected an impl item after attributes.
 --> dummy_file.cairo:2:11
    #[aaa]
          ^

error[E1000]: Skipped tokens. Expected: Const/Function/Impl/Type or an attribute.
 --> dummy_file.cairo:3:5
    3
    ^

//! > expected_tree
└── Top level kind: ImplBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: ImplItemList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute) <ignored>
        │   ├── child #1 (kind: TokenWhitespace).
        │   ├── child #2 (kind: TokenSkipped): '3'
        │   └── child #3 (kind: TokenNewline).
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test repeated attributes without an item.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
#[aaa]
#[bbb]
2

//! > top_level_kind

//! > ignored_kinds
TerminalLBrack
TerminalRBrack
TerminalHash

//! > expected_diagnostics
error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:2:7
#[bbb]
      ^

error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:3:1
2
^

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList)
    │   └── child #0: Missing []
    └── eof (kind: TerminalEndOfFile)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       ├── child #0 (kind: Attribute)
        │   │       │   ├── hash (kind: TerminalHash) <ignored>
        │   │       │   ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │       │   ├── attr (kind: ExprPath)
        │   │       │   │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │   │       │   │   └── segments (kind: ExprPathInner)
        │   │       │   │       └── item #0 (kind: PathSegmentSimple)
        │   │       │   │           └── ident (kind: TerminalIdentifier)
        │   │       │   │               ├── leading_trivia (kind: Trivia) []
        │   │       │   │               ├── token (kind: TokenIdentifier): 'aaa'
        │   │       │   │               └── trailing_trivia (kind: Trivia) []
        │   │       │   ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │       │   └── rbrack (kind: TerminalRBrack) <ignored>
        │   │       └── child #1 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash) <ignored>
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath)
        │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │   │           │   └── segments (kind: ExprPathInner)
        │   │           │       └── item #0 (kind: PathSegmentSimple)
        │   │           │           └── ident (kind: TerminalIdentifier)
        │   │           │               ├── leading_trivia (kind: Trivia) []
        │   │           │               ├── token (kind: TokenIdentifier): 'bbb'
        │   │           │               └── trailing_trivia (kind: Trivia) []
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   └── child #1 (kind: TokenSkipped): '2'
        ├── token (kind: TokenEndOfFile).
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test attributes with skipped braced element in between.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
#[aaa]
[bbb]
#[ccc]
fn foo() {}

//! > top_level_kind
FunctionWithBody

//! > ignored_kinds
FunctionDeclaration
ExprBlock
TerminalLBrack
TerminalRBrack

//! > expected_diagnostics
error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:1:7
#[aaa]
      ^

error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:2:1
[bbb]
^

error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:2:5
[bbb]
    ^

//! > expected_tree
└── Top level kind: FunctionWithBody
    ├── attributes (kind: AttributeList)
    │   └── child #0 (kind: Attribute)
    │       ├── hash (kind: TerminalHash)
    │       │   ├── leading_trivia (kind: Trivia)
    │       │   │   ├── child #0 (kind: TriviumSkippedNode)
    │       │   │   │   └── node (kind: ExprPath)
    │       │   │   │       ├── dollar (kind: OptionTerminalDollarEmpty) []
    │       │   │   │       └── segments (kind: ExprPathInner)
    │       │   │   │           └── item #0 (kind: PathSegmentSimple)
    │       │   │   │               └── ident (kind: TerminalIdentifier)
    │       │   │   │                   ├── leading_trivia (kind: Trivia)
    │       │   │   │                   │   ├── child #0 (kind: TriviumSkippedNode)
    │       │   │   │                   │   │   └── node (kind: AttributeList)
    │       │   │   │                   │   │       └── child #0 (kind: Attribute)
    │       │   │   │                   │   │           ├── hash (kind: TerminalHash)
    │       │   │   │                   │   │           │   ├── leading_trivia (kind: Trivia) []
    │       │   │   │                   │   │           │   ├── token (kind: TokenHash): '#'
    │       │   │   │                   │   │           │   └── trailing_trivia (kind: Trivia) []
    │       │   │   │                   │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
    │       │   │   │                   │   │           ├── attr (kind: ExprPath)
    │       │   │   │                   │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
    │       │   │   │                   │   │           │   └── segments (kind: ExprPathInner)
    │       │   │   │                   │   │           │       └── item #0 (kind: PathSegmentSimple)
    │       │   │   │                   │   │           │           └── ident (kind: TerminalIdentifier)
    │       │   │   │                   │   │           │               ├── leading_trivia (kind: Trivia) []
    │       │   │   │                   │   │           │               ├── token (kind: TokenIdentifier): 'aaa'
    │       │   │   │                   │   │           │               └── trailing_trivia (kind: Trivia) []
    │       │   │   │                   │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
    │       │   │   │                   │   │           └── rbrack (kind: TerminalRBrack) <ignored>
    │       │   │   │                   │   └── child #1 (kind: TokenSkipped): '['
    │       │   │   │                   ├── token (kind: TokenIdentifier): 'bbb'
    │       │   │   │                   └── trailing_trivia (kind: Trivia) []
    │       │   │   ├── child #1 (kind: TokenSkipped): ']'
    │       │   │   └── child #2 (kind: TokenNewline).
    │       │   ├── token (kind: TokenHash): '#'
    │       │   └── trailing_trivia (kind: Trivia) []
    │       ├── lbrack (kind: TerminalLBrack) <ignored>
    │       ├── attr (kind: ExprPath)
    │       │   ├── dollar (kind: OptionTerminalDollarEmpty) []
    │       │   └── segments (kind: ExprPathInner)
    │       │       └── item #0 (kind: PathSegmentSimple)
    │       │           └── ident (kind: TerminalIdentifier)
    │       │               ├── leading_trivia (kind: Trivia) []
    │       │               ├── token (kind: TokenIdentifier): 'ccc'
    │       │               └── trailing_trivia (kind: Trivia) []
    │       ├── arguments (kind: OptionArgListParenthesizedEmpty) []
    │       └── rbrack (kind: TerminalRBrack) <ignored>
    ├── visibility (kind: VisibilityDefault) []
    ├── declaration (kind: FunctionDeclaration) <ignored>
    └── body (kind: ExprBlock) <ignored>

//! > ==========================================================================

//! > Test skipped node inside a module.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
mod mod1 {
    #[aaa]
    fn foo() {}
    #[bbb]
}

//! > top_level_kind
ModuleBody

//! > ignored_kinds
FunctionDeclaration
ExprBlock
TerminalLBrack
TerminalRBrack
TerminalLBrace
TerminalHash

//! > expected_diagnostics
error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:4:11
    #[bbb]
          ^

//! > expected_tree
└── Top level kind: ModuleBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: ModuleItemList)
    │   ├── child #0 (kind: FunctionWithBody)
    │   │   ├── attributes (kind: AttributeList)
    │   │   │   └── child #0 (kind: Attribute)
    │   │   │       ├── hash (kind: TerminalHash) <ignored>
    │   │   │       ├── lbrack (kind: TerminalLBrack) <ignored>
    │   │   │       ├── attr (kind: ExprPath)
    │   │   │       │   ├── dollar (kind: OptionTerminalDollarEmpty) []
    │   │   │       │   └── segments (kind: ExprPathInner)
    │   │   │       │       └── item #0 (kind: PathSegmentSimple)
    │   │   │       │           └── ident (kind: TerminalIdentifier)
    │   │   │       │               ├── leading_trivia (kind: Trivia) []
    │   │   │       │               ├── token (kind: TokenIdentifier): 'aaa'
    │   │   │       │               └── trailing_trivia (kind: Trivia) []
    │   │   │       ├── arguments (kind: OptionArgListParenthesizedEmpty) []
    │   │   │       └── rbrack (kind: TerminalRBrack) <ignored>
    │   │   ├── visibility (kind: VisibilityDefault) []
    │   │   ├── declaration (kind: FunctionDeclaration) <ignored>
    │   │   └── body (kind: ExprBlock) <ignored>
    │   └── child #1: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash) <ignored>
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath)
        │               │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   └── segments (kind: ExprPathInner)
        │               │       └── item #0 (kind: PathSegmentSimple)
        │               │           └── ident (kind: TerminalIdentifier)
        │               │               ├── leading_trivia (kind: Trivia) []
        │               │               ├── token (kind: TokenIdentifier): 'bbb'
        │               │               └── trailing_trivia (kind: Trivia) []
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test skipped attributes with a comment before.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
mod mod1 {
    // A comment
    #[aaa]
}

//! > top_level_kind
ModuleBody

//! > ignored_kinds
TerminalLBrack
TerminalRBrack
ExprPath
TerminalLBrace

//! > expected_diagnostics
error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:3:11
    #[aaa]
          ^

//! > expected_tree
└── Top level kind: ModuleBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: ModuleItemList)
    │   ├── child #0 (kind: ItemHeaderDoc)
    │   │   └── empty (kind: TerminalEmpty)
    │   │       ├── leading_trivia (kind: Trivia)
    │   │       │   ├── child #0 (kind: TokenWhitespace).
    │   │       │   ├── child #1 (kind: TokenSingleLineComment): '// A comment'
    │   │       │   ├── child #2 (kind: TokenNewline).
    │   │       │   └── child #3 (kind: TokenWhitespace).
    │   │       ├── token (kind: TokenEmpty): ''
    │   │       └── trailing_trivia (kind: Trivia) []
    │   └── child #1: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash)
        │               │   ├── leading_trivia (kind: Trivia) []
        │               │   ├── token (kind: TokenHash): '#'
        │               │   └── trailing_trivia (kind: Trivia) []
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath) <ignored>
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test skipped attributes with a comment after.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
mod mod1 {
    #[aaa]
    // A comment
}

//! > top_level_kind
ModuleBody

//! > ignored_kinds
TerminalLBrack
TerminalRBrack
ExprPath
TerminalHash
TerminalLBrace

//! > expected_diagnostics
error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:2:11
    #[aaa]
          ^

//! > expected_tree
└── Top level kind: ModuleBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: ModuleItemList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash) <ignored>
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath) <ignored>
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   ├── child #1 (kind: TokenWhitespace).
        │   ├── child #2 (kind: TokenSingleLineComment): '// A comment'
        │   └── child #3 (kind: TokenNewline).
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test skipped attributes between comments.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
mod mod1 {
    // A comment
    #[aaa]
    // A second comment
}

//! > top_level_kind
ModuleBody

//! > ignored_kinds
TerminalLBrack
TerminalRBrack
ExprPath
TerminalLBrace

//! > expected_diagnostics
error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:3:11
    #[aaa]
          ^

//! > expected_tree
└── Top level kind: ModuleBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: ModuleItemList)
    │   ├── child #0 (kind: ItemHeaderDoc)
    │   │   └── empty (kind: TerminalEmpty)
    │   │       ├── leading_trivia (kind: Trivia)
    │   │       │   ├── child #0 (kind: TokenWhitespace).
    │   │       │   ├── child #1 (kind: TokenSingleLineComment): '// A comment'
    │   │       │   ├── child #2 (kind: TokenNewline).
    │   │       │   └── child #3 (kind: TokenWhitespace).
    │   │       ├── token (kind: TokenEmpty): ''
    │   │       └── trailing_trivia (kind: Trivia) []
    │   └── child #1: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash)
        │   │           │   ├── leading_trivia (kind: Trivia) []
        │   │           │   ├── token (kind: TokenHash): '#'
        │   │           │   └── trailing_trivia (kind: Trivia) []
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath) <ignored>
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   ├── child #1 (kind: TokenWhitespace).
        │   ├── child #2 (kind: TokenSingleLineComment): '// A second comment'
        │   └── child #3 (kind: TokenNewline).
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test skipped attributes after a skipped token.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
mod mod1 {
    $
    #[aaa]
}

//! > top_level_kind
ModuleBody

//! > ignored_kinds
TerminalLBrack
TerminalRBrack
ExprPath
TerminalLBrace

//! > expected_diagnostics
error[E1003]: Missing tokens. Expected a path segment.
 --> dummy_file.cairo:2:6
    $
     ^

error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:3:1
    #[aaa]
^

error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:3:11
    #[aaa]
          ^

//! > expected_tree
└── Top level kind: ModuleBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: ModuleItemList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash)
        │               │   ├── leading_trivia (kind: Trivia)
        │               │   │   ├── child #0 (kind: TriviumSkippedNode)
        │               │   │   │   └── node (kind: ExprPath) <ignored>
        │               │   │   └── child #1 (kind: TokenWhitespace).
        │               │   ├── token (kind: TokenHash): '#'
        │               │   └── trailing_trivia (kind: Trivia) []
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath) <ignored>
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test skipped attributes before a skipped token.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
mod mod1 {
    #[aaa]
    $
}

//! > top_level_kind
ModuleBody

//! > ignored_kinds
TerminalLBrack
TerminalRBrack
ExprPath
TerminalHash
TerminalLBrace

//! > expected_diagnostics
error[E1003]: Missing tokens. Expected a path segment.
 --> dummy_file.cairo:3:6
    $
     ^

error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:2:11-4:0
      #[aaa]
 ___________^
|     $
| }
|^

//! > expected_tree
└── Top level kind: ModuleBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: ModuleItemList) []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash) <ignored>
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath) <ignored>
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   └── child #1 (kind: TriviumSkippedNode)
        │       └── node (kind: ExprPath) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test skipped attributes with skipped token in between.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
mod mod1 {
    #[aaa]
    $
    #[bbb]
}

//! > top_level_kind
ModuleBody

//! > ignored_kinds
TerminalLBrack
TerminalRBrack
TerminalLBrace

//! > expected_diagnostics
error[E1003]: Missing tokens. Expected a path segment.
 --> dummy_file.cairo:3:6
    $
     ^

error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:2:11-4:0
      #[aaa]
 ___________^
|     $
|     #[bbb]
|^

error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:4:11
    #[bbb]
          ^

//! > expected_tree
└── Top level kind: ModuleBody
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── items (kind: ModuleItemList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash)
        │               │   ├── leading_trivia (kind: Trivia)
        │               │   │   ├── child #0 (kind: TriviumSkippedNode)
        │               │   │   │   └── node (kind: AttributeList)
        │               │   │   │       └── child #0 (kind: Attribute)
        │               │   │   │           ├── hash (kind: TerminalHash)
        │               │   │   │           │   ├── leading_trivia (kind: Trivia)
        │               │   │   │           │   │   └── child #0 (kind: TokenWhitespace).
        │               │   │   │           │   ├── token (kind: TokenHash): '#'
        │               │   │   │           │   └── trailing_trivia (kind: Trivia) []
        │               │   │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │               │   │   │           ├── attr (kind: ExprPath)
        │               │   │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   │   │           │   └── segments (kind: ExprPathInner)
        │               │   │   │           │       └── item #0 (kind: PathSegmentSimple)
        │               │   │   │           │           └── ident (kind: TerminalIdentifier)
        │               │   │   │           │               ├── leading_trivia (kind: Trivia) []
        │               │   │   │           │               ├── token (kind: TokenIdentifier): 'aaa'
        │               │   │   │           │               └── trailing_trivia (kind: Trivia) []
        │               │   │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               │   │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │               │   │   ├── child #1 (kind: TriviumSkippedNode)
        │               │   │   │   └── node (kind: ExprPath)
        │               │   │   │       ├── dollar (kind: TerminalDollar)
        │               │   │   │       │   ├── leading_trivia (kind: Trivia)
        │               │   │   │       │   │   └── child #0 (kind: TokenWhitespace).
        │               │   │   │       │   ├── token (kind: TokenDollar): '$'
        │               │   │   │       │   └── trailing_trivia (kind: Trivia)
        │               │   │   │       │       └── child #0 (kind: TokenNewline).
        │               │   │   │       └── segments (kind: ExprPathInner)
        │               │   │   │           └── item #0: Missing
        │               │   │   │               └── ident (kind: TerminalIdentifier)
        │               │   │   │                   ├── leading_trivia (kind: Trivia) []
        │               │   │   │                   ├── token: Missing
        │               │   │   │                   └── trailing_trivia (kind: Trivia) []
        │               │   │   └── child #2 (kind: TokenWhitespace).
        │               │   ├── token (kind: TokenHash): '#'
        │               │   └── trailing_trivia (kind: Trivia) []
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath)
        │               │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   └── segments (kind: ExprPathInner)
        │               │       └── item #0 (kind: PathSegmentSimple)
        │               │           └── ident (kind: TerminalIdentifier)
        │               │               ├── leading_trivia (kind: Trivia) []
        │               │               ├── token (kind: TokenIdentifier): 'bbb'
        │               │               └── trailing_trivia (kind: Trivia) []
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test attributes without a statement.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    #[aaa]
}

//! > top_level_kind
ExprBlock

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalHash
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:2:11
    #[aaa]
          ^

//! > expected_tree
└── Top level kind: ExprBlock
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── statements (kind: StatementList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash) <ignored>
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath)
        │               │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   └── segments (kind: ExprPathInner)
        │               │       └── item #0 (kind: PathSegmentSimple)
        │               │           └── ident (kind: TerminalIdentifier)
        │               │               ├── leading_trivia (kind: Trivia) []
        │               │               ├── token (kind: TokenIdentifier): 'aaa'
        │               │               └── trailing_trivia (kind: Trivia) []
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test attributes without a statement after a statement.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    #[aaa]
    let x = 1;
    #[bbb]
}

//! > top_level_kind
ExprBlock

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalHash
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:4:11
    #[bbb]
          ^

//! > expected_tree
└── Top level kind: ExprBlock
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── statements (kind: StatementList)
    │   ├── child #0 (kind: StatementLet)
    │   │   ├── attributes (kind: AttributeList)
    │   │   │   └── child #0 (kind: Attribute)
    │   │   │       ├── hash (kind: TerminalHash) <ignored>
    │   │   │       ├── lbrack (kind: TerminalLBrack) <ignored>
    │   │   │       ├── attr (kind: ExprPath)
    │   │   │       │   ├── dollar (kind: OptionTerminalDollarEmpty) []
    │   │   │       │   └── segments (kind: ExprPathInner)
    │   │   │       │       └── item #0 (kind: PathSegmentSimple)
    │   │   │       │           └── ident (kind: TerminalIdentifier)
    │   │   │       │               ├── leading_trivia (kind: Trivia) []
    │   │   │       │               ├── token (kind: TokenIdentifier): 'aaa'
    │   │   │       │               └── trailing_trivia (kind: Trivia) []
    │   │   │       ├── arguments (kind: OptionArgListParenthesizedEmpty) []
    │   │   │       └── rbrack (kind: TerminalRBrack) <ignored>
    │   │   ├── let_kw (kind: TerminalLet) <ignored>
    │   │   ├── pattern (kind: ExprPath)
    │   │   │   ├── dollar (kind: OptionTerminalDollarEmpty) []
    │   │   │   └── segments (kind: ExprPathInner)
    │   │   │       └── item #0 (kind: PathSegmentSimple)
    │   │   │           └── ident (kind: TerminalIdentifier)
    │   │   │               ├── leading_trivia (kind: Trivia) []
    │   │   │               ├── token (kind: TokenIdentifier): 'x'
    │   │   │               └── trailing_trivia (kind: Trivia)
    │   │   │                   └── child #0 (kind: TokenWhitespace).
    │   │   ├── type_clause (kind: OptionTypeClauseEmpty) []
    │   │   ├── eq (kind: TerminalEq) <ignored>
    │   │   ├── rhs (kind: TerminalLiteralNumber) <ignored>
    │   │   ├── let_else_clause (kind: OptionLetElseClauseEmpty) []
    │   │   └── semicolon (kind: TerminalSemicolon) <ignored>
    │   └── child #1: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash) <ignored>
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath)
        │               │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   └── segments (kind: ExprPathInner)
        │               │       └── item #0 (kind: PathSegmentSimple)
        │               │           └── ident (kind: TerminalIdentifier)
        │               │               ├── leading_trivia (kind: Trivia) []
        │               │               ├── token (kind: TokenIdentifier): 'bbb'
        │               │               └── trailing_trivia (kind: Trivia) []
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test two attributes without a statement.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    #[aaa]
    #[bbb]
}

//! > top_level_kind
ExprBlock

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalHash
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:3:11
    #[bbb]
          ^

//! > expected_tree
└── Top level kind: ExprBlock
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── statements (kind: StatementList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           ├── child #0 (kind: Attribute)
        │           │   ├── hash (kind: TerminalHash) <ignored>
        │           │   ├── lbrack (kind: TerminalLBrack) <ignored>
        │           │   ├── attr (kind: ExprPath)
        │           │   │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │           │   │   └── segments (kind: ExprPathInner)
        │           │   │       └── item #0 (kind: PathSegmentSimple)
        │           │   │           └── ident (kind: TerminalIdentifier)
        │           │   │               ├── leading_trivia (kind: Trivia) []
        │           │   │               ├── token (kind: TokenIdentifier): 'aaa'
        │           │   │               └── trailing_trivia (kind: Trivia) []
        │           │   ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │           │   └── rbrack (kind: TerminalRBrack) <ignored>
        │           └── child #1 (kind: Attribute)
        │               ├── hash (kind: TerminalHash) <ignored>
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath)
        │               │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   └── segments (kind: ExprPathInner)
        │               │       └── item #0 (kind: PathSegmentSimple)
        │               │           └── ident (kind: TerminalIdentifier)
        │               │               ├── leading_trivia (kind: Trivia) []
        │               │               ├── token (kind: TokenIdentifier): 'bbb'
        │               │               └── trailing_trivia (kind: Trivia) []
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test an attribute with a skipped token after.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    #[aaa]
    /
}

//! > top_level_kind
ExprBlock

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalHash
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:2:11
    #[aaa]
          ^

error[E1000]: Skipped tokens. Expected: statement.
 --> dummy_file.cairo:3:5
    /
    ^

//! > expected_tree
└── Top level kind: ExprBlock
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── statements (kind: StatementList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash) <ignored>
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath)
        │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │   │           │   └── segments (kind: ExprPathInner)
        │   │           │       └── item #0 (kind: PathSegmentSimple)
        │   │           │           └── ident (kind: TerminalIdentifier)
        │   │           │               ├── leading_trivia (kind: Trivia) []
        │   │           │               ├── token (kind: TokenIdentifier): 'aaa'
        │   │           │               └── trailing_trivia (kind: Trivia) []
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   ├── child #1 (kind: TokenWhitespace).
        │   ├── child #2 (kind: TokenSkipped): '/'
        │   └── child #3 (kind: TokenNewline).
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test an attribute with a skipped token before.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    /
    #[aaa]
}

//! > top_level_kind
ExprBlock

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1000]: Skipped tokens. Expected: statement.
 --> dummy_file.cairo:2:5
    /
    ^

error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:3:11
    #[aaa]
          ^

//! > expected_tree
└── Top level kind: ExprBlock
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── statements (kind: StatementList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash)
        │               │   ├── leading_trivia (kind: Trivia)
        │               │   │   ├── child #0 (kind: TokenWhitespace).
        │               │   │   ├── child #1 (kind: TokenSkipped): '/'
        │               │   │   ├── child #2 (kind: TokenNewline).
        │               │   │   └── child #3 (kind: TokenWhitespace).
        │               │   ├── token (kind: TokenHash): '#'
        │               │   └── trailing_trivia (kind: Trivia) []
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath)
        │               │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   └── segments (kind: ExprPathInner)
        │               │       └── item #0 (kind: PathSegmentSimple)
        │               │           └── ident (kind: TerminalIdentifier)
        │               │               ├── leading_trivia (kind: Trivia) []
        │               │               ├── token (kind: TokenIdentifier): 'aaa'
        │               │               └── trailing_trivia (kind: Trivia) []
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test an attribute with a skipped token in between.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    #[aaa]
    /
    #[bbb]
}

//! > top_level_kind
ExprBlock

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:2:11
    #[aaa]
          ^

error[E1000]: Skipped tokens. Expected: statement.
 --> dummy_file.cairo:3:5
    /
    ^

error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:4:11
    #[bbb]
          ^

//! > expected_tree
└── Top level kind: ExprBlock
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── statements (kind: StatementList)
    │   ├── child #0: Missing []
    │   └── child #1: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash)
        │               │   ├── leading_trivia (kind: Trivia)
        │               │   │   ├── child #0 (kind: TriviumSkippedNode)
        │               │   │   │   └── node (kind: AttributeList)
        │               │   │   │       └── child #0 (kind: Attribute)
        │               │   │   │           ├── hash (kind: TerminalHash)
        │               │   │   │           │   ├── leading_trivia (kind: Trivia)
        │               │   │   │           │   │   └── child #0 (kind: TokenWhitespace).
        │               │   │   │           │   ├── token (kind: TokenHash): '#'
        │               │   │   │           │   └── trailing_trivia (kind: Trivia) []
        │               │   │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │               │   │   │           ├── attr (kind: ExprPath)
        │               │   │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   │   │           │   └── segments (kind: ExprPathInner)
        │               │   │   │           │       └── item #0 (kind: PathSegmentSimple)
        │               │   │   │           │           └── ident (kind: TerminalIdentifier)
        │               │   │   │           │               ├── leading_trivia (kind: Trivia) []
        │               │   │   │           │               ├── token (kind: TokenIdentifier): 'aaa'
        │               │   │   │           │               └── trailing_trivia (kind: Trivia) []
        │               │   │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               │   │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │               │   │   ├── child #1 (kind: TokenWhitespace).
        │               │   │   ├── child #2 (kind: TokenSkipped): '/'
        │               │   │   ├── child #3 (kind: TokenNewline).
        │               │   │   └── child #4 (kind: TokenWhitespace).
        │               │   ├── token (kind: TokenHash): '#'
        │               │   └── trailing_trivia (kind: Trivia) []
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath)
        │               │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   └── segments (kind: ExprPathInner)
        │               │       └── item #0 (kind: PathSegmentSimple)
        │               │           └── ident (kind: TerminalIdentifier)
        │               │               ├── leading_trivia (kind: Trivia) []
        │               │               ├── token (kind: TokenIdentifier): 'bbb'
        │               │               └── trailing_trivia (kind: Trivia) []
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test an attribute with a comment before.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    // A comment
    #[bbb]
}

//! > top_level_kind
ExprBlock

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:3:11
    #[bbb]
          ^

//! > expected_tree
└── Top level kind: ExprBlock
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── statements (kind: StatementList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: AttributeList)
        │           └── child #0 (kind: Attribute)
        │               ├── hash (kind: TerminalHash)
        │               │   ├── leading_trivia (kind: Trivia)
        │               │   │   ├── child #0 (kind: TokenWhitespace).
        │               │   │   ├── child #1 (kind: TokenSingleLineComment): '// A comment'
        │               │   │   ├── child #2 (kind: TokenNewline).
        │               │   │   └── child #3 (kind: TokenWhitespace).
        │               │   ├── token (kind: TokenHash): '#'
        │               │   └── trailing_trivia (kind: Trivia) []
        │               ├── lbrack (kind: TerminalLBrack) <ignored>
        │               ├── attr (kind: ExprPath)
        │               │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │               │   └── segments (kind: ExprPathInner)
        │               │       └── item #0 (kind: PathSegmentSimple)
        │               │           └── ident (kind: TerminalIdentifier)
        │               │               ├── leading_trivia (kind: Trivia) []
        │               │               ├── token (kind: TokenIdentifier): 'bbb'
        │               │               └── trailing_trivia (kind: Trivia) []
        │               ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │               └── rbrack (kind: TerminalRBrack) <ignored>
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test an attribute with a comment after.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: true)

//! > cairo_code
fn foo() {
    #[bbb]
    // A comment
}

//! > top_level_kind
ExprBlock

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1026]: Missing tokens. Expected a statement after attributes.
 --> dummy_file.cairo:2:11
    #[bbb]
          ^

//! > expected_tree
└── Top level kind: ExprBlock
    ├── lbrace (kind: TerminalLBrace) <ignored>
    ├── statements (kind: StatementList)
    │   └── child #0: Missing []
    └── rbrace (kind: TerminalRBrace)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash)
        │   │           │   ├── leading_trivia (kind: Trivia)
        │   │           │   │   └── child #0 (kind: TokenWhitespace).
        │   │           │   ├── token (kind: TokenHash): '#'
        │   │           │   └── trailing_trivia (kind: Trivia) []
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath)
        │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │   │           │   └── segments (kind: ExprPathInner)
        │   │           │       └── item #0 (kind: PathSegmentSimple)
        │   │           │           └── ident (kind: TerminalIdentifier)
        │   │           │               ├── leading_trivia (kind: Trivia) []
        │   │           │               ├── token (kind: TokenIdentifier): 'bbb'
        │   │           │               └── trailing_trivia (kind: Trivia) []
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   ├── child #1 (kind: TokenWhitespace).
        │   ├── child #2 (kind: TokenSingleLineComment): '// A comment'
        │   └── child #3 (kind: TokenNewline).
        ├── token (kind: TokenRBrace): '}'
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test an attribute with an identifier after.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: *)

//! > cairo_code
// TODO(Gil): handle multiline diagnostics.
#[bbb]
a_macro

//! > top_level_kind

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:2:7-3:7
  #[bbb]
 _______^
| a_macro
|_______^

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList)
    │   └── child #0 (kind: ItemHeaderDoc)
    │       └── empty (kind: TerminalEmpty)
    │           ├── leading_trivia (kind: Trivia)
    │           │   ├── child #0 (kind: TokenSingleLineComment): '// TODO(Gil): handle multiline diagnostics.'
    │           │   └── child #1 (kind: TokenNewline).
    │           ├── token (kind: TokenEmpty): ''
    │           └── trailing_trivia (kind: Trivia) []
    └── eof (kind: TerminalEndOfFile)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash)
        │   │           │   ├── leading_trivia (kind: Trivia) []
        │   │           │   ├── token (kind: TokenHash): '#'
        │   │           │   └── trailing_trivia (kind: Trivia) []
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath)
        │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │   │           │   └── segments (kind: ExprPathInner)
        │   │           │       └── item #0 (kind: PathSegmentSimple)
        │   │           │           └── ident (kind: TerminalIdentifier)
        │   │           │               ├── leading_trivia (kind: Trivia) []
        │   │           │               ├── token (kind: TokenIdentifier): 'bbb'
        │   │           │               └── trailing_trivia (kind: Trivia) []
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   └── child #1 (kind: TriviumSkippedNode)
        │       └── node (kind: ExprPath)
        │           ├── dollar (kind: OptionTerminalDollarEmpty) []
        │           └── segments (kind: ExprPathInner)
        │               └── item #0 (kind: PathSegmentSimple)
        │                   └── ident (kind: TerminalIdentifier)
        │                       ├── leading_trivia (kind: Trivia) []
        │                       ├── token (kind: TokenIdentifier): 'a_macro'
        │                       └── trailing_trivia (kind: Trivia) []
        ├── token (kind: TokenEndOfFile).
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test `pub` alone

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: *)

//! > cairo_code
pub // trailing.

//! > top_level_kind

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1022]: Missing tokens. Expected an item after visibility.
 --> dummy_file.cairo:1:4
pub // trailing.
   ^

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList)
    │   └── child #0: Missing []
    └── eof (kind: TerminalEndOfFile)
        ├── leading_trivia (kind: Trivia)
        │   └── child #0 (kind: TriviumSkippedNode)
        │       └── node (kind: VisibilityPub)
        │           ├── pub_kw (kind: TerminalPub)
        │           │   ├── leading_trivia (kind: Trivia) []
        │           │   ├── token (kind: TokenPub): 'pub'
        │           │   └── trailing_trivia (kind: Trivia)
        │           │       ├── child #0 (kind: TokenWhitespace).
        │           │       └── child #1 (kind: TokenSingleLineComment): '// trailing.'
        │           └── argument_clause (kind: OptionVisibilityPubArgumentClauseEmpty) []
        ├── token (kind: TokenEndOfFile).
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test `pub` with an identifier after.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: *)

//! > cairo_code
pub a_macro

//! > top_level_kind

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:1:4
pub a_macro
   ^^^^^^^^

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList) []
    └── eof (kind: TerminalEndOfFile)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: VisibilityPub)
        │   │       ├── pub_kw (kind: TerminalPub)
        │   │       │   ├── leading_trivia (kind: Trivia) []
        │   │       │   ├── token (kind: TokenPub): 'pub'
        │   │       │   └── trailing_trivia (kind: Trivia)
        │   │       │       └── child #0 (kind: TokenWhitespace).
        │   │       └── argument_clause (kind: OptionVisibilityPubArgumentClauseEmpty) []
        │   └── child #1 (kind: TriviumSkippedNode)
        │       └── node (kind: ExprPath)
        │           ├── dollar (kind: OptionTerminalDollarEmpty) []
        │           └── segments (kind: ExprPathInner)
        │               └── item #0 (kind: PathSegmentSimple)
        │                   └── ident (kind: TerminalIdentifier)
        │                       ├── leading_trivia (kind: Trivia) []
        │                       ├── token (kind: TokenIdentifier): 'a_macro'
        │                       └── trailing_trivia (kind: Trivia) []
        ├── token (kind: TokenEndOfFile).
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test `pub` and attributes alone.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: *)

//! > cairo_code
#[attr]
pub

//! > top_level_kind

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1023]: Missing tokens. Expected an item after attributes.
 --> dummy_file.cairo:1:8
#[attr]
       ^

error[E1022]: Missing tokens. Expected an item after visibility.
 --> dummy_file.cairo:2:4
pub
   ^

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList)
    │   └── child #0: Missing []
    └── eof (kind: TerminalEndOfFile)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash)
        │   │           │   ├── leading_trivia (kind: Trivia) []
        │   │           │   ├── token (kind: TokenHash): '#'
        │   │           │   └── trailing_trivia (kind: Trivia) []
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath)
        │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │   │           │   └── segments (kind: ExprPathInner)
        │   │           │       └── item #0 (kind: PathSegmentSimple)
        │   │           │           └── ident (kind: TerminalIdentifier)
        │   │           │               ├── leading_trivia (kind: Trivia) []
        │   │           │               ├── token (kind: TokenIdentifier): 'attr'
        │   │           │               └── trailing_trivia (kind: Trivia) []
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   └── child #1 (kind: TriviumSkippedNode)
        │       └── node (kind: VisibilityPub)
        │           ├── pub_kw (kind: TerminalPub)
        │           │   ├── leading_trivia (kind: Trivia) []
        │           │   ├── token (kind: TokenPub): 'pub'
        │           │   └── trailing_trivia (kind: Trivia) []
        │           └── argument_clause (kind: OptionVisibilityPubArgumentClauseEmpty) []
        ├── token (kind: TokenEndOfFile).
        └── trailing_trivia (kind: Trivia) []

//! > ==========================================================================

//! > Test `pub` and attributes with an identifier after.

//! > test_runner_name
test_partial_parser_tree_with_trivia(expect_diagnostics: *)

//! > cairo_code
#[attr]
pub a_macro

//! > top_level_kind

//! > ignored_kinds
TerminalLBrace
TerminalLet
TerminalLBrack
TerminalRBrack
TerminalEq
TerminalLiteralNumber
TerminalSemicolon

//! > expected_diagnostics
error[E1000]: Skipped tokens. Expected: Const/Enum/ExternFunction/ExternType/Function/Impl/InlineMacro/Module/Struct/Trait/TypeAlias/Use or an attribute.
 --> dummy_file.cairo:1:8-2:11
  #[attr]
 ________^
| pub a_macro
|___________^

//! > expected_tree
└── root (kind: SyntaxFile)
    ├── items (kind: ModuleItemList) []
    └── eof (kind: TerminalEndOfFile)
        ├── leading_trivia (kind: Trivia)
        │   ├── child #0 (kind: TriviumSkippedNode)
        │   │   └── node (kind: AttributeList)
        │   │       └── child #0 (kind: Attribute)
        │   │           ├── hash (kind: TerminalHash)
        │   │           │   ├── leading_trivia (kind: Trivia) []
        │   │           │   ├── token (kind: TokenHash): '#'
        │   │           │   └── trailing_trivia (kind: Trivia) []
        │   │           ├── lbrack (kind: TerminalLBrack) <ignored>
        │   │           ├── attr (kind: ExprPath)
        │   │           │   ├── dollar (kind: OptionTerminalDollarEmpty) []
        │   │           │   └── segments (kind: ExprPathInner)
        │   │           │       └── item #0 (kind: PathSegmentSimple)
        │   │           │           └── ident (kind: TerminalIdentifier)
        │   │           │               ├── leading_trivia (kind: Trivia) []
        │   │           │               ├── token (kind: TokenIdentifier): 'attr'
        │   │           │               └── trailing_trivia (kind: Trivia) []
        │   │           ├── arguments (kind: OptionArgListParenthesizedEmpty) []
        │   │           └── rbrack (kind: TerminalRBrack) <ignored>
        │   ├── child #1 (kind: TriviumSkippedNode)
        │   │   └── node (kind: VisibilityPub)
        │   │       ├── pub_kw (kind: TerminalPub)
        │   │       │   ├── leading_trivia (kind: Trivia) []
        │   │       │   ├── token (kind: TokenPub): 'pub'
        │   │       │   └── trailing_trivia (kind: Trivia)
        │   │       │       └── child #0 (kind: TokenWhitespace).
        │   │       └── argument_clause (kind: OptionVisibilityPubArgumentClauseEmpty) []
        │   └── child #2 (kind: TriviumSkippedNode)
        │       └── node (kind: ExprPath)
        │           ├── dollar (kind: OptionTerminalDollarEmpty) []
        │           └── segments (kind: ExprPathInner)
        │               └── item #0 (kind: PathSegmentSimple)
        │                   └── ident (kind: TerminalIdentifier)
        │                       ├── leading_trivia (kind: Trivia) []
        │                       ├── token (kind: TokenIdentifier): 'a_macro'
        │                       └── trailing_trivia (kind: Trivia) []
        ├── token (kind: TokenEndOfFile).
        └── trailing_trivia (kind: Trivia) []
