" Vim syntax file for Lux
" Language: Lux
" Maintainer: Lux Team

if exists("b:current_syntax")
  finish
endif

" Keywords
syn keyword luxKeyword fn let type effect handler trait impl for import export
syn keyword luxKeyword match if then else with run resume is
syn keyword luxKeyword nextgroup=luxFunction skipwhite

" Boolean literals
syn keyword luxBoolean true false

" Built-in types
syn keyword luxType Int Float Bool String Char Unit Option Result List
syn keyword luxType Some None Ok Err

" Operators
syn match luxOperator /[+\-*/%=<>!&|]/
syn match luxOperator /==/
syn match luxOperator /!=/
syn match luxOperator /<=/
syn match luxOperator />=/
syn match luxOperator /&&/
syn match luxOperator /||/
syn match luxOperator /|>/
syn match luxOperator /=>/

" Delimiters
syn match luxDelimiter /[(){}\[\],;:]/
syn match luxDelimiter /|/ contained

" Numbers
syn match luxNumber /\<\d\+\>/
syn match luxFloat /\<\d\+\.\d\+\>/

" Strings
syn region luxString start=/"/ skip=/\\./ end=/"/ contains=luxEscape,luxInterpolation
syn match luxEscape /\\[nrt\\'"0{}]/ contained
syn region luxInterpolation start=/{/ end=/}/ contained contains=TOP

" Characters
syn region luxChar start=/'/ skip=/\\./ end=/'/

" Comments
syn match luxComment /\/\/.*$/
syn match luxDocComment /\/\/\/.*$/

" Function definitions
syn match luxFunction /\<[a-z_][a-zA-Z0-9_]*\>/ contained
syn match luxFunctionCall /\<[a-z_][a-zA-Z0-9_]*\>\s*(/me=e-1

" Type definitions and constructors
syn match luxTypedef /\<[A-Z][a-zA-Z0-9_]*\>/

" Module access
syn match luxModule /\<[A-Z][a-zA-Z0-9_]*\>\./me=e-1

" Effect signatures
syn region luxEffectSig start=/with\s*{/ end=/}/ contains=luxType,luxDelimiter

" Properties
syn match luxProperty /\<is\s\+\(pure\|total\|idempotent\|commutative\|associative\)\>/

" Highlight groups
hi def link luxKeyword Keyword
hi def link luxBoolean Boolean
hi def link luxType Type
hi def link luxOperator Operator
hi def link luxDelimiter Delimiter
hi def link luxNumber Number
hi def link luxFloat Float
hi def link luxString String
hi def link luxEscape SpecialChar
hi def link luxInterpolation Special
hi def link luxChar Character
hi def link luxComment Comment
hi def link luxDocComment SpecialComment
hi def link luxFunction Function
hi def link luxFunctionCall Function
hi def link luxTypedef Type
hi def link luxModule Include
hi def link luxEffectSig Special
hi def link luxProperty PreProc

let b:current_syntax = "lux"
