# MakeupCure

A [Makeup](https://hex.pm/packages/makeup) lexer for the
[Cure](https://cure-lang.org) programming language.

## Supported Cure version

The lexer tracks the surface syntax of Cure as of **v0.34.1** (see the Cure
[`CHANGELOG.md`](https://github.com/am-kantox/cure/blob/main/CHANGELOG.md)),
including the `macro`/`syntax family` definition surface and the bare-slash
regex literal introduced ahead of that release.
Features covered include:

- Container and type declarations: `mod`, `fn`, `rec`, `type`, `typealias`, `opaque`,
  `primitive`, `indexed`, `indices`, `interface`, `implementation` (and legacy `proto`/`impl`),
  `deriving`, `fsm`, `actor`, `sup`, `app`, `proof`, `quote`, `unsafe`, `precedencegroup`,
  `infix`, `prefix`, `postfix`.
- The `macro` definition surface: the `macro Name` container itself, plus its body vocabulary
  `syntax`, `becomes`, `computed`, `literal`, `accepts`, `expands`, `explain`, `fail`, `open`,
  `contextual`, and the `syntax family` sub-grammar (`family`, `includes`, `optional`,
  `repeated`, `one_or_more`, `by`, `directly`). Also `lift module` and `public use`.
- Control flow and pattern matching: `if`/`elif`/`else`/`then`, `pickup` (v0.33.0+ conditional dispatch),
  `match`/`when`, `for`/`in`, `try`/`catch`/`finally`, `throw`, `return`, `yield`, `end`,
  `requires`, `have`.
- Dependent-type and proof constructs: `assert_type`, `rewrite`, `check ... else fail ...`,
  `simplify`, `induction`, typed holes (bare `?` for the anonymous hole, `?name` for named holes),
  implicit arguments, predicate identifiers (`even?`, `is_empty?`).
- Operators & bitwise words: pipe `|>`, string concat `<>`, range `..` / `..=`, ellipsis `...`,
  Melquiades send `<-|` (and its unicode alias `✉`), binary-comprehension generator `<-`,
  bitstring segment specifier `::`, augmented assignment `+=` / `-=` / `*=` / `/=`,
  FSM transitions `--event-->`, monadic/applicative operators (`>>=`, `>>`, `<*>`, `<*`, `*>`, `<$`, `$>`),
  logical (`&&`, `||`), bitwise words (`band`, `bor`, `bxor`, `bsl`, `bsr`, `bnot`), splice open `$(`.
- Literals: integers (including `0xFF`, `0b1010`, digit-grouped), floats,
  booleans, atoms, chars, backtick-quoted identifiers (`` `foo` ``), strings with `#{...}` interpolation,
  bare `/pattern/flags` regexes (contextual, like division vs. regex in JavaScript —
  `/` only opens a regex where an expression can start, e.g. after `= -> => ( [ { , : ; | |>`
  or `return`), maps `%{...}`, tuples `%[...]`, binaries `<<...>>`.
- Comments: plain `#`, single-line doc `##`, fenced multi-line `###...###`
  (the last two are highlighted as `:string_doc`).

Stdlib-defined field names inside macro-generated DSL blocks (e.g. an actor's
`on_start`/`on_message`/`on_stop`) are **not** language keywords — they are
ordinary identifiers chosen by whichever `syntax family` schema is in use, so
they are lexed and highlighted as plain names.

## Installation

Add `makeup_cure` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:makeup_cure, "~> 0.2"}
  ]
end
```

The lexer will be automatically registered in Makeup for
the language name `"cure"` and the file extension `.cure`.

## Usage

Once installed, ExDoc and any other tool using Makeup will automatically
syntax-highlight Cure code blocks (tagged with `cure` as the language).

You can also use it directly:

```elixir
alias Makeup.Lexers.CureLexer
CureLexer.lex("fn add(a: Int, b: Int) -> Int = a + b")
```

## License

MIT—see [LICENSE](LICENSE) for details.
