Skip to content

Consider removing StructExprTuple and StructExprUnit #1802

Description

@ehuss

Struct expressions are defined with the grammar:

StructExpression ->
      StructExprStruct
    | StructExprTuple
    | StructExprUnit

However, this isn't how struct expressions actually work. Only the curly braced form is a unique kind of expression. The tuple form is just a CallExpression (referring to the constructor in the value namespace), and the Unit form is just a PathExpression (referring to the const in the value namespace). In terms of building an AST, these forms don't exist.

I can understand presenting "struct expressions" as an "expression constructing a struct", and not trying to immediately confront the actual complexity of how it works. However, I think there is also risk of causing confusion with this presentation approach, since it isn't actually correct.

I recommend removing StructExprTuple and StructExprTuple entirely, removing expr.struct.tuple and expr.struct.unit, and replace the latter two with a note block that explains how the call and unit syntax works.

I traced some history back to rust-lang/rust@8554d5e which started this way of presenting it (and rust-lang/rust@332c046 for unit structs). I don't actually know if Rust has always modeled tuple structs as callable functions in the value namespace (as opposed to a constructor in the type namespace like the braced syntax), but I assume it was and that the docs were just written this way to make it easier for the reader to understand.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-grammarArea: Syntax and parsing

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions