Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Soft casting with if/is #959

Merged
merged 19 commits into from
Jun 25, 2024
Merged

Soft casting with if/is #959

merged 19 commits into from
Jun 25, 2024

Commits on Jun 25, 2024

  1. Configuration menu
    Copy the full SHA
    f6f5443 View commit details
    Browse the repository at this point in the history
  2. feat: impl if/is

    This commit introduces a new feature into
    the parser, typechecker, and formatter.
    The work for code gen will be in the next commit.
    
    I was able to leverage some existing infrastructure
    by making using of `AssignmentPattern`. A new field
    `is` was introduced into `IfBranch`. This field holds
    a generic `Option<Is>` meaning a new generic has to be
    introduced into `IfBranch`. When used in `UntypedExpr`,
    `IfBranch` must use `AssignmentPattern`. When used in
    `TypedExpr`, `IfBranch` must use `TypedPattern`.
    
    The parser was updated such that we can support this
    kind of psuedo grammar:
    
    `if <expr:condition> [is [<pattern>: ]<annotation>]`
    
    This can be read as, when parsing an `if` expression,
    always expect an expression after the keyword `if`. And then
    optionally there may be this `is` stuff, and within that you
    may optionally expect a pattern followed by a colon. We will
    always expect an annotation.
    
    This first expression is still saved as the field
    `condition` in `IfBranch`. If `pattern` is not there
    AND `expr:condition` is `UntypedExpr::Var` we can set
    the pattern to be `Pattern::Var` with the same name. From
    there shadowing should allow this syntax sugar to feel
    kinda magical within the `IfBranch` block that follow.
    
    The typechecker doesn't need to be aware of the sugar
    described above. The typechecker looks at `branch.is`
    and if it's `Some(is)` then it'll use `infer_assignment`
    for some help. Because of the way that `is` can inject
    variables into the scope of the branch's block and since
    it's basically just like how `expect` works minus the error
    we get to re-use that helper method.
    
    It's important to note that in the typechecker, if `is`
    is `Some(_)` then we do not enforce that `condition` is
    of type `Bool`. This is because the bool itself will be
    whether or not the `is` itself holds true given a PlutusData
    payload.
    
    When `is` is None, we do exactly what was being done
    previously so that plain `if` expressions remain unaffected
    with no semantic changes.
    
    The formatter had to be made aware of the new changes with
    some simple changes that need no further explanation.
    rvcas committed Jun 25, 2024
    Configuration menu
    Copy the full SHA
    6fec3d5 View commit details
    Browse the repository at this point in the history
  3. feat: code gen support for if/is

    Co-authored-by: Kasey White <kwhitemsg@gmail.com>
    rvcas and MicroProofs committed Jun 25, 2024
    Configuration menu
    Copy the full SHA
    88ca7cc View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    c80ba52 View commit details
    Browse the repository at this point in the history
  5. Configuration menu
    Copy the full SHA
    654a84c View commit details
    Browse the repository at this point in the history
  6. Configuration menu
    Copy the full SHA
    497a48d View commit details
    Browse the repository at this point in the history
  7. Configuration menu
    Copy the full SHA
    676bf44 View commit details
    Browse the repository at this point in the history
  8. chore: add new snapshots

    rvcas committed Jun 25, 2024
    Configuration menu
    Copy the full SHA
    74e1010 View commit details
    Browse the repository at this point in the history
  9. Configuration menu
    Copy the full SHA
    59ac477 View commit details
    Browse the repository at this point in the history
  10. Configuration menu
    Copy the full SHA
    ffc337e View commit details
    Browse the repository at this point in the history
  11. Fix castfromData in record access cases

    MicroProofs authored and rvcas committed Jun 25, 2024
    Configuration menu
    Copy the full SHA
    4387e78 View commit details
    Browse the repository at this point in the history
  12. Configuration menu
    Copy the full SHA
    eb37371 View commit details
    Browse the repository at this point in the history
  13. Fix more tests

    MicroProofs authored and rvcas committed Jun 25, 2024
    Configuration menu
    Copy the full SHA
    8cb3cb3 View commit details
    Browse the repository at this point in the history
  14. Configuration menu
    Copy the full SHA
    defb771 View commit details
    Browse the repository at this point in the history
  15. Fix codegen tree traversal to be updated for the otherwise field and …

    …future proof the traversal function
    MicroProofs authored and rvcas committed Jun 25, 2024
    Configuration menu
    Copy the full SHA
    b63994e View commit details
    Browse the repository at this point in the history
  16. Configuration menu
    Copy the full SHA
    2a8dacd View commit details
    Browse the repository at this point in the history
  17. Fix unit tests

    MicroProofs authored and rvcas committed Jun 25, 2024
    Configuration menu
    Copy the full SHA
    86df4d8 View commit details
    Browse the repository at this point in the history
  18. Configuration menu
    Copy the full SHA
    493b053 View commit details
    Browse the repository at this point in the history
  19. Configuration menu
    Copy the full SHA
    1b1f879 View commit details
    Browse the repository at this point in the history