Commit Graph

126 Commits

Author SHA1 Message Date
rvcas
7f38b55c1c fix: comments in record patterns closes #946 2024-05-22 12:26:36 -04:00
KtorZ
7ff6eba869 Prefer '.clone_from' over mutating a clone.
Clippy says it's more efficient. I trust clippy. Clippy good.
2024-05-16 23:42:53 +02:00
KtorZ
b1f0dfdacd Implement parser & formatter for Pair annotations. 2024-05-04 14:04:12 -04:00
microproofs
fc0e88018e Chore:
Refactor get_uplc_type to account for constr types that don't exactly resolve to a uplc type
Check arg_stack in uplc generator has only 1 argument at the end of the generation
warning fixes
2024-05-04 14:04:12 -04:00
KtorZ
2cb2c7fa1f Add dedicated 'Pair' typed and untyped expression
Before this commit, we would parse 'Pair' as a user-defined
  data-types, and thus piggybacking on that whole record system. While
  perhaps handy for some things, it's also semantically wrong and
  induces a lot more complexity in codegen which now needs to
  systematically distinguish every data-type access between pairs, and
  others.

  So it's better to have it as a separate expression, and handle it
  similar to tuples (since it's fundamentally a 2-tuple with a special
  serialization).
2024-05-04 14:04:12 -04:00
KtorZ
5c59b816ea Add parser for 'Pair' pattern
And a few more tests along the way for others. Note that it is important here that we try to parse for a 'Pair' BEFORE we try to parse for a constructor pattern. Because the latter would swallow any Pair pattern.
2024-05-04 14:04:12 -04:00
Micah Kendall
ff4ddfbe1b Simplifying PR per reviewers request 2024-04-12 21:40:27 -04:00
Micah Kendall
d25b8f91c7 feat: Emit keyword 2024-04-12 21:40:27 -04:00
rvcas
ce2c723d0c chore: remove some dbg macros 2024-03-29 11:28:22 -04:00
rvcas
898ef74457 fix: spans for backpassing args
closes #882

Co-authored-by: Kasey White <kwhitemsg@gmail.com>
2024-03-20 17:27:17 -04:00
rvcas
945b4155cd fix(assignment-patterns): allow trailing 2024-03-12 08:10:33 -04:00
rvcas
97247ce949 chore: assignment patterns refactor tuple into struct 2024-03-12 08:10:33 -04:00
rvcas
b6b52ba508 feat(backpassing): implements multi patterns
The main trick here was transforming Assignment
to contain `Vec<UntypedPattern, Option<Annotation>>`
in a field called patterns. This then meant that I
could remove the `pattern` and `annotation` field
from `Assignment`. The parser handles `=` and `<-`
just fine because in the future `=` with multi
patterns will mean some kind of optimization on tuples.
But, since we don't have that optimization yet, when
someone uses multi patterns with an `=` there will be an
error returned from the type checker right where `infer_seq`
looks for `backpassing`. From there the rest of the work
was in `Project::backpassing` where I only needed to rework
some things to work with a list of patterns instead of just one.
2024-03-12 08:10:33 -04:00
KtorZ
435dd0d213 Refactor AssignmentKind to allow backpassing on both let and expect.
The 3rd kind of assignment kind (Bind) is gone and now reflected through a boolean parameter. Note that this parameter is completely erased by the type-checker so that the rest of the pipeline (i.e. code-generation) doesn't have to make any assumption. They simply can't see a backpassing let or expect.
2024-03-11 00:16:23 +01:00
KtorZ
1f530f3b24 Experiment with monadic bind. 2024-03-11 00:16:22 +01:00
KtorZ
191e4d47b3 Remove dead-code: 'Layer' 2024-03-09 23:14:44 +01:00
KtorZ
96da70149d Count labels in properties.
We'll piggyback on the tracing capabilities of the VM to provide labelling for prop tests. To ensure we do not interfere with normal traces, we only count traces that starts with a NUL byte as label. That convention is assumed to be known of the companion fuzz library that should then provide the labelling capabilities as a dedicated function.
2024-03-09 01:28:29 +01:00
rvcas
fe6710935d feat: impl serde on errythang 2024-03-08 19:19:07 -05:00
KtorZ
8ffa68d2f0 Fix && and || associativity.
Somehow, these have always been right-associative, when the natural thing to expect is left-associativity. It now matters when trying to crawl down binary tree to display them properly.
2024-03-07 01:17:05 +01:00
KtorZ
4097d1edb2 Fix negative integer literal parsing in fuzzer DSL. 2024-03-04 23:27:23 +01:00
KtorZ
3e922c0a52 Allow primitive literals, lists and tuples in fuzzer expressions. 2024-03-04 20:41:04 +01:00
KtorZ
bbc9fc5762 Yield proper user-facing error when inferring Fuzzer usage 2024-03-03 19:33:26 +01:00
KtorZ
cf61387a41 Allow prop test argument to be (optionally) annotated. 2024-03-03 19:33:25 +01:00
KtorZ
14f1025f0b Display counterexamples as Aiken values instead of raw UPLC. 2024-03-03 19:33:24 +01:00
KtorZ
3762473a60 Add preliminary plumbing to run property test through the CLI.
This is very very rough at the moment. But it does a couple of thing:

  1. The 'ArgVia' now contains an Expr/TypedExpr which should unify to a Fuzzer. This is to avoid having to introduce custom logic to handle fuzzer referencing. So this now accepts function call, field access etc.. so long as they unify to the right thing.

  2. I've done quite a lot of cleanup in aiken-project mostly around the tests and the naming surrounding them. What we used to call 'Script' is now called 'Test' and is an enum between UnitTest (ex-Script) and PropertyTest. I've moved some boilerplate and relevant function under those module Impl.

  3. I've completed the end-to-end pipeline of:
     - Compiling the property test
     - Compiling the fuzzer
     - Generating an initial seed
     - Running property tests sequentially, threading the seed through each step.

   An interesting finding is that, I had to wrap the prop test in a similar wrapper that we use for validator, to ensure we convert primitive types wrapped in Data back to UPLC terms. This is necessary because the fuzzer return a ProtoPair (and soon an Array) which holds 'Data'.

  At the moment, we do nothing with the size, though the size should ideally grow after each iteration (up to a certain cap).

  In addition, there are a couple of todo/fixme that I left in the code as reminders of what's left to do beyond the obvious (error and success reporting, testing, etc..)
2024-03-03 19:33:24 +01:00
KtorZ
aadf3cfb48 Allow test definition to carry one parameter
The parameter is special as it takes no annotation but a 'via' keyword followed by an expression that should unify to a Fuzzer<a>, where Fuzzer<a> = fn(Seed) -> (Seed, a). The current commit only allow name identifiers for now. Ultimately, this may allow full expressions.
2024-03-03 19:33:24 +01:00
KtorZ
54a1b50138 Make behavior between curly- and paren-delimited blocks consistent.
Note that the formatter rewrite parens-block sequences as curly-block
  sequences anyway. Albeit weird looking syntax, they are valid
  nonetheless.

  I also clarified a bit the hints and description of the
  'illegal::return' error as it would mistakenly say 'function' instead
  of 'block'.
2024-01-20 10:37:07 +01:00
KtorZ
bf96c3afd2 Add more tests & rename 'Invalid' -> 'Unfinished' 2024-01-20 10:26:33 +01:00
Matthias Benkort
cb6fd59dbd Fix minor typo in error label 2024-01-20 09:58:36 +01:00
rvcas
25a837ab3f feat: parser and check fixes
- do not erase sequences if the sole expression is an assignment
- emit parse error if an assignment is assigned to an assignment
- do not allow assignments in logical op chains
2024-01-19 14:32:21 -05:00
rvcas
c910e0054e test(bls): constant parsing tests 2023-11-15 15:55:56 -05:00
rvcas
7073fd29b3 test(bls): literal parsing tests 2023-11-15 15:55:56 -05:00
microproofs
8b89ba3b93 feat: implement bls primitives in code gen 2023-11-15 15:55:56 -05:00
rvcas
3675762c3e feat(bls): aiken level g1 and g2 literals 2023-11-15 15:55:56 -05:00
microproofs
2f694b01cb chore: use insta snapshot for blueprint validator tests 2023-11-06 15:37:04 -05:00
rvcas
e5801f9c19 feat: support doc comments for functions args and validator params
- Add support to the formatter for these doc comments
- Add a new field to `Arg` `doc: Option<String>`
- Don't attach docs immediately after typechecking a module
  - instead we should do it on demand in docs, build, and lsp
  - the check command doesn't need to have any docs attached
  - doing it more lazily defers the computation until later making
    typechecking feedback a bit faster
- Add support for function arg and validator param docs in
  `attach_module_docs` methods
- Update some snapshots
- Add put_doc to Arg

closes #685
2023-10-16 13:38:23 -04:00
KtorZ
f379039efc Fix record shorthand causing parsing ambiguity in if/else expressions.
Fixes #735.
2023-09-15 09:41:00 +02:00
rvcas
d808197507 chore: clippy fix 2023-09-13 18:17:59 -04:00
KtorZ
8ba5946c32 Preserve escape sequence after formatting
Bumped into this randomly. We do correctly parse escape sequence, but
  the format would simply but the unescaped string back on save. Now it
  properly re-escapes strings before flushing them back. I also removed
  the escape sequence for 'backspace' and 'new page' form feed as I
  don't see any use case for those in an Aiken program really...
2023-09-08 12:12:15 +02:00
rvcas
dca09811c1 fix: empty records crashing code gen closes #728 2023-08-31 17:39:38 -04:00
rvcas
2c2f3c90fb feat: new snapshots 2023-08-15 09:58:35 -04:00
rvcas
ab3a418b9c feat(parser): add support for and/or chaining 2023-08-15 09:58:35 -04:00
microproofs
1d9878c5ee fix: code gen tests now up to date using trace
fix: Formatter should take ErrorTerm and return "fail"
fix: fail with no reason should just return ErrorTerm
2023-08-07 12:02:44 -04:00
rvcas
77a627817b chore: prepare changelog for release 2023-07-15 21:34:41 -04:00
rvcas
1b8e94fe32 feat: expect boolean sugar 2023-07-15 20:50:02 -04:00
rvcas
db3b5c74bb fix: todo and fail spans 2023-07-15 20:08:16 -04:00
rvcas
69fdee9f7e fix: trace expr 2023-07-15 20:08:16 -04:00
rvcas
2edfd33594 fix: some attempted adjustments 2023-07-15 20:08:16 -04:00
rvcas
eafe3cdf75 test: fail with expr relates to #675 2023-07-14 13:09:55 -04:00
rvcas
e7c1b28b52 feat: add ability to reference validators in tests closes #632 2023-07-12 18:29:03 -04:00