scopeName: source.squiggle
patterns:
  - include: "#statement"
  - include: "#expression"
  - include: "#comment-block"
  - include: "#comment-line"
repository:
  statement:
    patterns:
      - include: "#let"
      - include: "#defun"
  expression:
    patterns:
      - include: "#integer"
      - include: "#float"
      - include: "#string"
      - include: "#block"
      - include: "#function-call"
      - include: "#keywords"
  let:
    match: ^\s*(\w+)\s*=
    captures:
      "1":
        name: variable.other.squiggle
  defun:
    begin: ^\s*(\w+)\s*(\()
    end: (\))\s*=
    beginCaptures:
      "1":
        name: entity.name.function.squiggle
      "2":
        name: punctuation.definition.arguments.begin.squiggle
    endCaptures:
      "1":
        name: punctuation.definition.arguments.end.squiggle
    patterns:
      - include: "#array-parameters"
  array-parameters:
    begin: \b([\$_a-z]+[\$_a-zA-Z0-9]*)
    end: \s*(?:(,)|(?=\)))
    beginCaptures:
      "1":
        name: variable.parameter.function.squiggle
  function-call:
    begin: (\w+)\s*(\()
    end: (\))
    beginCaptures:
      "1":
        name: entity.name.function.squiggle
      "2":
        name: punctuation.definition.arguments.begin.squiggle
    endCaptures:
      "1":
        name: punctuation.definition.arguments.end.squiggle
    patterns:
      - include: "$self"
  comment-block:
    begin: /\*
    end: \*/
    name: comment.block.squiggle
  comment-line:
    patterns:
      - include: "#comment-line-double-slash"
      - include: "#comment-line-number-sign"
  comment-line-double-slash:
    match: //.*
    name: comment.line.double-slash.squiggle
  comment-line-number-sign:
    match: "#.*"
    name: comment.line.number-sign.squiggle
  block:
    begin: "{"
    end: "}"
    beginCaptures:
      "0":
        name: punctuation.definition.block.squiggle
    endCaptures:
      "0":
        name: punctuation.definition.block.squiggle
    patterns:
      - include: "$self"
  keywords:
    match: \b(if|then|else|to)\b
    name: keyword.control.squiggle
  integer:
    match: \b\d+([_a-zA-Z]+[_a-zA-Z0-9]*)?
    name: constant.numeric.integer.squiggle
  float:
    match: \b(\d+\.\d*|\.?\d+)([eE]-?\d+)?([_a-zA-Z]+[_a-zA-Z0-9]*)?
    name: constant.numeric.float.squiggle
  string:
    match: \".*?\"
    name: string.quoted.double.squiggle