snyvi 1.0.2

A fast, beautiful viewer for the documents your agents produce
%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name: Zig
file_extensions:
  - zig
  - zon
scope: source.zig
contexts:
  main:
    - include: dummy_main
  block:
    - match: '([a-zA-Z_][\w.]*|@\".+\")?\s*(\{)'
      captures:
        1: storage.type.zig
        2: punctuation.section.braces.begin.zig
      push:
        - match: '(\})'
          captures:
            1: punctuation.section.braces.end.zig
          pop: true
        - include: dummy_main
  character_escapes:
    - match: \\n
      scope: constant.character.escape.newline.zig
    - match: \\r
      scope: constant.character.escape.carrigereturn.zig
    - match: \\t
      scope: constant.character.escape.tabulator.zig
    - match: \\\\
      scope: constant.character.escape.backslash.zig
    - match: \\'
      scope: constant.character.escape.single-quote.zig
    - match: \\\"
      scope: constant.character.escape.double-quote.zig
    - match: '\\x[a-fA-F\d]{2}'
      scope: constant.character.escape.hexidecimal.zig
    - match: '\\u\{[a-fA-F\d]{1,6}\}'
      scope: constant.character.escape.hexidecimal.zig
  comments:
    - match: ///
      push:
        - meta_scope: comment.line.documentation.zig
        - match: $\n?
          pop: true
    - match: '//[^/]\s*TODO'
      push:
        - meta_scope: comment.line.todo.zig
        - match: $\n?
          pop: true
    - match: "//[^/]*"
      push:
        - meta_scope: comment.line.zig
        - match: $\n?
          pop: true
  constants:
    - match: \b(null|undefined|true|false)\b
      scope: constant.language.zig
    - match: '\b(-?[\d_]+)(?!\.)\b'
      scope: constant.numeric.integer.zig
    - match: '\b(0x[a-fA-F\d_]+)(?!\.)\b'
      scope: constant.numeric.integer.hexadecimal.zig
    - match: '\b(0o[0-7_]+)(?!\.)\b'
      scope: constant.numeric.integer.octal.zig
    - match: '\b(0b[01_]+)(?!\.)\b'
      scope: constant.numeric.integer.binary.zig
    - match: '(-?\b[\d_]+(?:\.[\d_]+)?(?:[eE][+-]?[\d_]+)?)(?!\.)\b'
      scope: constant.numeric.float.zig
    - match: '(-?\b0x[a-fA-F\d_]+(?:\.[a-fA-F\d_]+)?[pP]?(?:[+-]?[\d_]+)?)(?!\.)\b'
      scope: constant.numeric.float.hexadecimal.zig
  container_decl:
    - match: '\b(?!\d)([a-zA-Z_]\w*|@\".+\")?(?=\s*=\s*(?:extern|packed)?\b\s*(?:union)\s*[(\{])'
      scope: entity.name.union.zig
    - match: '\b(?!\d)([a-zA-Z_]\w*|@\".+\")?(?=\s*=\s*(?:extern|packed)?\b\s*(?:struct)\s*[(\{])'
      scope: entity.name.struct.zig
    - match: '\b(?!\d)([a-zA-Z_]\w*|@\".+\")?(?=\s*=\s*(?:extern|packed)?\b\s*(?:enum)\s*[(\{])'
      scope: entity.name.enum.zig
    - match: '\b(?!\d)([a-zA-Z_]\w*|@\".+\")?(?=\s*=\s*(?:error)\s*[(\{])'
      scope: entity.name.error.zig
    - match: '\b(error)(\.)([a-zA-Z_]\w*|@\".+\")'
      captures:
        1: storage.type.error.zig
        2: punctuation.accessor.zig
        3: entity.name.error.zig
  dummy_main:
    - include: label
    - include: function_type
    - include: punctuation
    - include: storage_modifier
    - include: container_decl
    - include: constants
    - include: comments
    - include: strings
    - include: storage
    - include: keywords
    - include: operators
    - include: support
    - include: field_decl
    - include: block
    - include: function_def
    - include: function_call
    - include: enum_literal
    - include: variables
  enum_literal:
    - match: '(^|\s+)(\.(?:[a-zA-Z_]\w*\b|@\"[^\"]*\"))(?!\(|\s*=[^=>])'
      scope: constant.language.enum
  field_decl:
    - match: '([a-zA-Z_]\w*|@\".+\")\s*(:)\s*'
      captures:
        1: variable.other.member.zig
        2: punctuation.separator.zig
      push:
        - match: '([a-zA-Z_][\w.]*|@\".+\")?\s*(?:(,)|(=)|$)'
          captures:
            1: storage.type.zig
            2: punctuation.separator.zig
            3: keyword.operator.assignment.zig
          pop: true
        - include: dummy_main
  function_call:
    - match: '\b([a-zA-Z_]\w*|@\".+\")(?=\s*\()'
      scope: variable.function.zig
  function_def:
    - match: '\b(fn)\s+([a-zA-Z_]\w*|@\".+\")(\()'
      captures:
        1: storage.type.function.zig
        2: entity.name.function
        3: punctuation.section.parens.begin.zig
      push:
        - include: label
        - include: param_list
        - match: '([a-zA-Z_][\w.]*|@\".+\")'
          scope: storage.type.zig
        - match: '\)'
          scope: punctuation.section.parens.end.zig
          set: function_def_after_params
        - include: dummy_main
  function_def_after_params:
    # TODO: be more precise here
    - match: '\s*([a-zA-Z_][\w.]*|@\".+\")?(!)?\s*(?:([a-zA-Z_][\w.]*|@\".+\")\b(?!\s*\())?'
      captures:
        1: storage.type.zig
        2: keyword.operator.zig
        3: storage.type.zig
      pop: true
    # Bailout if we don't find what we want
    - match: (?=.)
      pop: true
  function_type:
    - match: \b(fn)\s*(\()
      captures:
        1: storage.type.function.zig
        2: punctuation.section.parens.begin.zig
      push:
        - meta_content_scope: meta.function.parameters.zig
        - include: label
        - include: param_list
        - match: '([a-zA-Z_][\w.]*|@\".+\")'
          scope: storage.type.zig
        - match: '\)'
          scope: punctuation.section.parens.end.zig
          set: function_type_after_params
        - include: dummy_main
  function_type_after_params:
    # TODO: Can we merge with function_def_after_params ? It seems similar.
    - match: '\s*([a-zA-Z_][\w.]*|@\".+\")?\s*(!)?\s*([a-zA-Z_][\w.]*|@\".+\")'
      captures:
        1: storage.type.zig
        2: keyword.operator.zig
        3: storage.type.zig
      pop: true
    - match: (?=.)
      pop: true
  keywords:
    - match: \b(while|for|break|return|continue|asm|defer|errdefer|unreachable)\b
      scope: keyword.control.zig
    - match: \b(async|await|suspend|nosuspend|resume)\b
      scope: keyword.control.async.zig
    - match: \b(if|else|switch|try|catch|orelse)\b
      scope: keyword.control.conditional.zig
    - match: (@import|@cImport|@cInclude)\b
      scope: keyword.control.import.zig
    - match: \b(usingnamespace)\b
      scope: keyword.other.usingnamespace.zig
  label:
    - match: '\b(break|continue)\s*:\s*([a-zA-Z_]\w*|@\".+\")\b|\b(?!\d)([a-zA-Z_]\w*|@\".+\")\b(?=\s*:\s*(?:\{|while\b))'
      captures:
        1: keyword.control.zig
        2: entity.name.label.zig
        3: entity.name.label.zig
  operators:
    - match: \b!\b
      scope: keyword.operator.zig
    - match: (==|(?:!|>|<)=?)
      scope: keyword.operator.logical.zig
    - match: \b(and|or)\b
      scope: keyword.operator.word.zig
    - match: '((?:(?:\+|-|\*)\%?|/|%|<<|>>|&|\|(?=[^\|])|\^)?=)'
      scope: keyword.operator.assignment.zig
    - match: ((?:\+|-|\*)\%?|/(?!/)|%)
      scope: keyword.operator.arithmetic.zig
    - match: '(<<|>>|&(?=[a-zA-Z_]|@\")|\|(?=[^\|])|\^|~)'
      scope: keyword.operator.bitwise.zig
    - match: '(\+\+|\*\*|->|\.\?|\.\*|&(?=[a-zA-Z_]|@\")|\?|\|\||\.{2,3})'
      scope: keyword.operator.other.zig
  param_list:
    - match: '([a-zA-Z_]\w*|@\".+\")\s*(:)\s*'
      captures:
        1: variable.parameter.zig
        2: punctuation.separator.zig
      push:
        # Don't consume the closing ')'
        - match: '([a-zA-Z_][\w.]*|@\".+\")?\s*(,|(?=\)))'
          captures:
            1: storage.type.zig
            2: punctuation.separator.zig
            3: punctuation.section.parens.end.zig
          pop: true
        - include: dummy_main
        - match: '([a-zA-Z_][\w.]*|@\".+\")'
          scope: storage.type.zig
  punctuation:
    - match: ","
      scope: punctuation.separator.zig
    - match: ;
      scope: punctuation.terminator.zig
    - match: (\()
      scope: punctuation.section.parens.begin.zig
    - match: (\))
      scope: punctuation.section.parens.end.zig
  storage:
    - match: '\b(anyframe)\b\s*(->)?\s*(?:([a-zA-Z_][\w.]*|@\".+\")\b(?!\s*\())?'
      captures:
        1: storage.type.zig
        2: keyword.operator.zig
        3: storage.type.zig
    - match: \btest\b
      scope: storage.type.test.zig
    - match: \bstruct\b
      scope: storage.type.struct.zig
    - match: \benum\b
      scope: storage.type.enum.zig
    - match: \bunion\b
      scope: storage.type.union.zig
    - match: \berror\b
      scope: storage.type.error.zig
  storage_modifier:
    - match: \b(const|var|extern|packed|export|pub|noalias|inline|noinline|comptime|volatile|align|linksection|threadlocal|allowzero)\b
      scope: storage.modifier.zig
  strings:
    - match: \'
      push:
        - meta_scope: string.quoted.single.zig
        - match: \'
          pop: true
        - include: character_escapes
        - match: '\\[^\''][^\'']*?'
          scope: invalid.illegal.character.zig
    - match: c?\"
      push:
        - meta_scope: string.quoted.double.zig
        - match: \"
          pop: true
        - include: character_escapes
        - match: '\\[^\''][^\'']*?'
          scope: invalid.illegal.character.zig
    - match: c?\\\\
      push:
        - meta_scope: string.quoted.other.zig
        - match: $\n?
          pop: true
  support:
    - match: '@[^\"\d][a-zA-Z_]\w*\b'
      scope: support.function.zig
  variables:
    - match: '\b[_A-Z][_A-Z0-9]+\b'
      scope: variable.constant.zig

    - match: '\b[_a-zA-Z][_a-zA-Z0-9]*_t\b'
      scope: entity.name.type.zig

    - match: '\b[A-Z][a-zA-Z0-9]*\b'
      scope: entity.name.type.zig

    - match: '\b[_a-zA-Z][_a-zA-Z0-9]*\b'
      scope: variable.zig