Commit Graph

877 Commits

Author SHA1 Message Date
KtorZ c440026e36
Fix generated projects' README + rename 'certify' -> 'publish'
This hints to how this particular purpose is about publishing
  certificate (either delegation or key de-registration).
2023-01-18 16:48:42 +01:00
KtorZ 071dc00624
Implement various visual improvements for the doc generator
- Display function's signature next to the function name
    (instead of being repeated below the function documentation).

  - Same for module constants

  - Display record constructors in a more concise manner, with
    constructors fields next to constructors.

  - Display generic parameters, if any, next to the type

  - Plus some minor color and icon rework.
2023-01-18 15:12:15 +01:00
Kasey White 33d902ba2a feat: Now opaque types with one constr and one field are converted to inner field type 2023-01-17 08:44:28 -05:00
Kasey White 98d2cb5afc in progress: working on taking special opaque types and converting them to their inner type 2023-01-17 08:44:28 -05:00
Kasey White 0da4560792 fix failing unit tests 2023-01-17 03:02:06 -05:00
rvcas 5ceb3b07fb
fix: call was not capturing full span 2023-01-16 15:26:07 -05:00
rvcas 4024add4da feat: error when an expression is implicitly discarded 2023-01-16 15:17:39 -05:00
KtorZ 844570caf5
Fix multi-line type-alias tuple definitions
Somehow missed it when reworking tuples. We need to allow the new
  'NewLineLeftParen' token in this situation as well. Especially because
  this is what the formatter outputs.
2023-01-16 11:30:20 +01:00
rvcas 1adac64585 feat(imports): return a nice error if a validator module is imported 2023-01-15 18:54:35 -05:00
rvcas f114905f7d fix: small typos in error messages 2023-01-15 18:54:35 -05:00
rvcas c66d07a54c feat: validator fns no longer need to be public
If the function doesn't match a script purpose
and is unused then it will till present as a
warning.
2023-01-15 12:33:10 -05:00
rvcas 00f2150eed feat: add identity, always, & flip 2023-01-14 23:33:49 -05:00
rvcas b69c1f66d7 feat: return err if data type contains functions
Due to how PlutusData works it doesn't make sense
to allow user defined types to contain
functions.

```
type Foo {
  bar: fn(Int) -> Int
}
```

The above definition will now return an error.
2023-01-14 22:03:56 -05:00
KtorZ 5b7147fc43
Remove leading '#' for tuple definitions.
This possibly breaks many Aiken programs out there, but it's for the
  best. We haven't released the alpha yet so we still have a bit of
  freedom when it comes to breaking change.

  Plus, the migration path is easy, simply run:

  ```
  find . -name "*.ak" | xargs sed -i "s/#(/(/g"
  ```

  (or `-i ''` on MacOS).
2023-01-14 20:22:19 +01:00
KtorZ 2d99c07dd3 Support (and default to) parenthesis for block expressions
This changes allow to use parenthesis `(` `)` to encapsulate
  expressions in addition to braces `{` `}` used to define blocks.

  The main use-case is for arithmetic and boolean expressions for which
  developers are used to using parenthesis. For example:

  ```
  { 14 + 42 } * 1337
  ```

  can now be written as:

  ```
  ( 14 + 42 ) * 1337
  ```

  This may sound straightforward at first but wasn't necessarily trivial
  in Aiken given that (a) everything is an expression, (b) whitespaces
  do not generally matter and (c) there's no symbol indicating the end
  of a 'statement' (because there's no statement).

  Thus, we have to properly disambiguate between:

  ```
  let foo = bar(14 + 42)
  ```

  and

  ```
  let foo = bar
  (14 + 42)
  ```

  Before this commit, the latter would be interpreted as a function call
  and would lead to a somewhat puzzling error. Now, the newline serves
  as a delimiting symbol. The trade-off being that for a function call,
  the left parenthesis has to be on the same line as the function name
  identifier -- which is a fair trade off. So this is still allowed:

  ```
  let foo = bar(
    14 + 42
  )
  ```

  As there's very little ambiguity about it.

  This fixes #236 and would seemingly allow us to get rid of the leading
  `#` in front of tuples.
2023-01-14 11:49:45 -05:00
KtorZ b791131fd0
Small tweak on error messages; better grammer. 2023-01-14 14:13:30 +01:00
Kasey White 7b023911af add assert and record
Record is a more efficient air for making records
Assert guarantees a custom is of a certain variant.
2023-01-13 13:50:27 -05:00
Kasey White 1721c3945b Refactors:
Add test 40
refactor how we get data type from type
Call contains type now to handle certain record cases
2023-01-13 13:50:27 -05:00
rvcas 59ef63b513 chore: field might not always need to be plural 2023-01-11 20:47:47 -05:00
rvcas 99a334b132 fix(check): the expected arity with hardcoded to 0 2023-01-11 20:47:47 -05:00
rvcas 3be05b1545 fix(fmt): error fmt was removing label 2023-01-11 19:47:11 -05:00
Kasey White eac8f7a80e replace discard assignment with nothing 2023-01-11 09:46:37 -05:00
rvcas 6ea9ad9c41 chore: clippy warnings 2023-01-09 18:12:18 -05:00
Kasey White ce2de96226 clippy fix 2023-01-08 19:42:49 -05:00
Kasey White 42c8d50fa1 feat: finish record update 2023-01-08 19:42:49 -05:00
Kasey White ea135e6f42 refactor term::apply to apply_wrap. Fixed a list eq binop 2023-01-08 19:42:49 -05:00
Kasey White 1a29ee3b72
my discard add got lost in the rebasing -_- 2023-01-06 14:23:46 +01:00
Kasey White dc052bf9b8
fix nested lists without removing discard pop
Also fix bool constants created as a data type like in a list

start on record update

fix: nested list issues in when statements
2023-01-06 14:23:45 +01:00
KtorZ 4b34617466
Revert "fix: nested list issues in when statements"
This reverts commit 542962a2ea.
2023-01-06 06:50:42 +01:00
Kasey White 542962a2ea fix: nested list issues in when statements 2023-01-03 01:31:18 -05:00
Kasey White 67e4ff8317 feat: allow functions from prelude
Co-authored-by: rvcas <x@rvcas.dev>
2022-12-31 00:09:02 -05:00
Kasey White e495eefb34 feat implement tuple index 2022-12-31 00:09:02 -05:00
Kasey White 3514e66234 Fix to variant name creation for dependencies.
Last few changes to go Tuple Index,
Assert, Check, not

change test 35 to produce intended functionality
2022-12-30 14:01:11 -05:00
Kasey White b0ea187151 better data deserialization errors and test hint
now runs even being in a sequence
2022-12-30 14:01:11 -05:00
Kasey White 34d398ab3b fix dependencies ordering so now test 34 passes 2022-12-29 17:14:23 -05:00
Kasey White 306fa891a0 validator params are now converted to type from data 2022-12-29 17:14:23 -05:00
KtorZ 85a6a711e1
Add more colors to error messages.
And, let 'formatdoc' insert newlines when relevant to
  format the text to the same column length.
2022-12-29 17:38:34 +01:00
KtorZ 3139c85fe8
Support declaring bytearray literals as base16 strings. 2022-12-29 13:08:58 +01:00
KtorZ 1701cacb52
Add builtin functions to the prelude
Starting with 'not', will add 'always' and 'identity' later.
2022-12-29 12:05:30 +01:00
Kasey White cce76bbd63 fix issue with constructor clauses and clause props 2022-12-28 18:00:11 -05:00
KtorZ c4c0ace3a6
Align warnings message's style with errors. 2022-12-28 18:45:04 +01:00
KtorZ 7c1b8e8f3b
Map remaining relevant builtins. 2022-12-28 18:27:28 +01:00
KtorZ f2e716dd86
Fix else/if formatter. 2022-12-28 17:55:11 +01:00
KtorZ bae8267f18
Fix formatter for unary operation
Was wrongly converting any unary operation into '!'
2022-12-28 17:51:00 +01:00
Kasey White 722117bfc4 one minor scope fix 2022-12-27 22:33:09 -05:00
Kasey White 551d4eea93 fix test 28 2022-12-27 22:33:09 -05:00
Kasey White 010024fb95 fix: acceptance test 031
Co-authored-by: rvcas <x@rvcas.dev>
2022-12-27 22:33:09 -05:00
Kasey White 083b7fcb5f feat: support negation of int
* add unary op
* parse, typecheck, and code gen it
* express boolean not as unary op as well, previously called negate

Co-authored-by: rvcas <x@rvcas.dev>
2022-12-27 20:39:03 -05:00
Kasey White 542e39f093 feat: finish up zero arg issues with dependencies 2022-12-27 19:35:08 -05:00
Kasey White 30487cc232 fix test 23 2022-12-27 19:35:08 -05:00
Kasey White 919ea6c723 tuple destructuring nested and not now works 2022-12-27 19:35:08 -05:00
Kasey White a08c615da4 checkpoint 2022-12-27 19:35:08 -05:00
Kasey White b7d506a8db nested lists now work 2022-12-27 19:35:08 -05:00
Kasey White 6126ee4cb4 checkpoint 2022-12-27 19:35:08 -05:00
rvcas 38a716d94e feat: allow error to hold a label 2022-12-23 15:52:44 -05:00
rvcas 37196a29ee feat: error keyword 2022-12-23 15:52:44 -05:00
KtorZ 7b9ea5dabb
Add links to the user-manual to errors, when applicable. 2022-12-23 19:50:14 +01:00
KtorZ 69f060e675
Rework all errors to provide better help text. 2022-12-23 19:27:06 +01:00
KtorZ c47c50ffb8
Show most type-checking error on a single line; reads better. 2022-12-23 00:25:18 +01:00
KtorZ ce0c6e0d0f
Use smart-constructor for UnexpectedLabeledArg errors.
Reduce duplications and keep the formatting of the error inside the error module.
2022-12-23 00:24:57 +01:00
KtorZ dca633da48
Refactor 'UnknownVariable' and 'UnknownTypeConstructor' as smart-constructor. 2022-12-23 00:09:07 +01:00
KtorZ aa2a235790
Suggest possible candidate on unknown imports.
## Before

  ```
  × Type-checking
  ╰─▶ Unknown module field 'ValidityRaneg' in module 'aiken/transaction'
  ```

  ## After

  ```
    × Type-checking
    ╰─▶ Unknown import 'ValidityRaneg' from module 'aiken/transaction'

     ╭─[../stdlib/validators/tmp.ak:2:1]
   2 │ use aiken/interval.{Interval, IntervalBound, IntervalBoundType}
   3 │ use aiken/transaction.{ScriptContext, ValidityRaneg}
     ·                                       ─────────────
   4 │
     ╰────
    help: Did you mean to import 'ValidityRange'?
  ```
2022-12-22 23:46:17 +01:00
KtorZ 70b1ec4324
Add function to calculate lenvenshtein distance of two strings
Will be useful to make import or usage suggestions.
2022-12-22 23:44:15 +01:00
KtorZ 666761efef
Make 'UnexpectedLabelArg' errors more helpful
## Before

  ```
   × Checking
   ╰─▶ Unexpected labeled argument

       t

     ╭─[/Users/mati/Devel/OpenSource/time_lock_aiken/validators/time_lock.ak:13:1]
  13 │   let now = when context.transaction.validity_range.lower_bound.bound_type is {
  14 │     Finite { t } -> t
     ·              ─
  15 │     NegativeInfinity -> 0
     ╰────
  ```

  ## After

  ```
    × Type-checking
    ╰─▶ Unexpected labeled argument 't'

      ╭─[../stdlib/validators/tmp.ak:10:1]
   10 │   let now = when context.transaction.validity_range.lower_bound.bound_type is {
   11 │     interval.Finite { t } -> t
      ·                       ─
   12 │     interval.NegativeInfinity -> 0
      ╰────
    help: The constructor 'Finite' does not have any labeled field. Its fields
          must therefore be matched only by position.

          Perhaps, try the following:

          ╰─▶  interval.Finite(t)
  ```
2022-12-22 21:45:49 +01:00
KtorZ 0682781460
Better errors when using unknown data-type constructor.
## Before

  ```
    × Checking
    ╰─▶ Unknown variable

            Finite

      ╭─[../stdlib/validators/tmp.ak:10:1]
   10 │   let now = when context.transaction.validity_range.lower_bound.bound_type is {
   11 │     Finite { t } -> t
      ·     ────────────
   12 │     NegativeInfinity -> 0
      ╰────
  ```

  ## After

  ```
    × Type-checking
    ╰─▶ Unknown data-type constructor 'Finite'

      ╭─[../stdlib/validators/tmp.ak:10:1]
   10 │   let now = when context.transaction.validity_range.lower_bound.bound_type is {
   11 │     Finite { t } -> t
      ·     ────────────
   12 │     NegativeInfinity -> 0
      ╰────
    help: Did you forget to import it?

          Data-type constructors are not automatically imported, even if their type is
          imported. So, if a module `aiken/pet` defines the following type:

           ┍━ aiken/pet.ak ━━━━━━━━
           │ pub type Pet {
           │   Cat
           │   Dog
           │ }

          You must import its constructors explicitly to use them, or prefix them
          with the module's name.

           ┍━ foo.ak ━━━━━━━━
           │ use aiken/pet.{Pet, Dog}
           │
           │ fn foo(pet : Pet) {
           │   when pet is {
           │     pet.Cat -> // ...
           │     Dog -> // ...
           │   }
           │ }
  ```
2022-12-22 19:34:50 +01:00
KtorZ 2aa4429231
Rename Unit -> Void 2022-12-22 18:52:28 +01:00
KtorZ 5cf9742e5e
Move tuple-index hint as diagnostic's help 2022-12-22 18:52:28 +01:00
KtorZ 1f15c2ca20
Sort import alphabetically when formatting.
Fixes #211.
2022-12-22 18:00:25 +01:00
KtorZ 1ca705005d
Fix formatting of if-expressions
Fixes #129.
2022-12-22 16:51:23 +01:00
Matthias Benkort a129a8a0d3
Merge pull request #208 from aiken-lang/tuple-when2
fix todo and list and tuple not equal operator
2022-12-22 10:28:06 +01:00
KtorZ 7ad8babf17
Rename ArgName::{Discard,NamedLabeled} as ArgName::{Discarded,Named}
Now that the other variants are gone, this is clearer.
2022-12-22 09:36:44 +01:00
KtorZ 8ab05509b1
Remove Named & DiscardLabeled, now unused
And unify everything into either 'Discard' or 'NamedLabeled'
2022-12-22 09:36:44 +01:00
KtorZ bf7cdfba73
Implement parser & type-checker for tuple indexes.
```aiken
  fn foo() {
    let tuple = #(1, 2, 3, 4)
    tuple.1st + tuple.2nd + tuple.3rd + tuple.4th
  }
  ```
2022-12-22 09:14:23 +01:00
Kasey White b1dec1259d fix todo and list and tuple not equal comparator 2022-12-22 01:09:06 -05:00
rvcas 7867793bcd feat: on fmt if label and name are the same only print one 2022-12-21 19:17:15 -05:00
rvcas 4c4e454ea3 feat: all function args are now labeled implicitly 2022-12-21 19:17:15 -05:00
rvcas 42204d2d71 chore: make folder names match crate name 2022-12-21 18:11:07 -05:00