import lexer_example
@with_lexer(foo_lexer)
grammar foo_grammar {
    @main_rule main_rule <- item
    item <- or(couple | literal)
    couple <- Couple("(" item "," item ")")
    literal <- Literal(@number)

}

@abstract class FooNode : Node {

    @export fun first_set (): Bool = self.info.md.is_first

    @export fun second_set (): Bool = self.info.md.is_second

    @export fun test_main (): FooNode =
    node.as_entity.as[Couple].first_entity().first
}

class Couple : FooNode {
    @parse_field first : FooNode
    @parse_field second : FooNode

    fun first_entity (): Couple =
    node.as_entity.get_entity(Metadata(is_first=true, is_second=false))

    fun get_entity (md : Metadata): Couple = Couple(
        node=node, info=EntityInfo(
            md=md, rebindings=null, from_rebound=false
        )
    )

    @export fun property_on_entity (): Couple =
    # Check that we can do ".get_entity" even when the prefix is an entity
    node.as_entity.get_entity(node.as_entity.info.md)
}

class Literal : FooNode implements TokenNode {
}
