if polyglot#init#is_disabled(expand(':p'), 'reason', 'syntax/reason.vim') finish endif " Vim syntax file " Language: Reason (Forked from Rust) " Maintainer: (Jordan - for Reason changes) Patrick Walton " Maintainer: Ben Blum " Maintainer: Chris Morgan " Last Change: January 29, 2015 " Portions Copyright (c) 2015-present, Facebook, Inc. All rights reserved. if version < 600 syntax clear elseif exists("b:current_syntax") finish endif " Syntax definitions {{{1 " Basic keywords {{{2 syn keyword reasonConditional switch match if else for in when fun syn keyword reasonOperator as syn match reasonAssert "\[^\.]"me=e-1 " Polymorphic variants syn match reasonEnumVariant "`\w\(\w\|'\)*\>" syn match reasonModPath "\<\u\w*\." syn region reasonBoxPlacement matchgroup=reasonBoxPlacementParens start="(" end=")" contains=TOP contained " Ideally we'd have syntax rules set up to match arbitrary expressions. Since " we don't, we'll just define temporary contained rules to handle balancing " delimiters. syn region reasonBoxPlacementBalance start="(" end=")" containedin=reasonBoxPlacement transparent syn region reasonBoxPlacementBalance start="\[" end="\]" containedin=reasonBoxPlacement transparent " {} are handled by reasonFoldBraces syn region reasonMacroRepeat matchgroup=reasonMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=reasonMacroRepeatCount syn match reasonMacroRepeatCount ".\?[*+]" contained syn match reasonMacroVariable "$\w\+" " Reserved (but not yet used) keywords {{{2 syn keyword reasonReservedKeyword alignof become do offsetof priv pure sizeof typeof unsized yield abstract virtual final override macro " Built-in types {{{2 syn keyword reasonType int float option list array unit ref bool string " Things from the libstd v1 prelude (src/libstd/prelude/v1.rs) {{{2 " This section is just straight transformation of the contents of the prelude, " to make it easy to update. " Reexported core operators {{{3 syn keyword reasonTrait Copy Send Sized Sync syn keyword reasonTrait Drop Fn FnMut FnOnce " Reexported functions {{{3 " There’s no point in highlighting these; when one writes drop( or drop::< it " gets the same highlighting anyway, and if someone writes `let drop = …;` we " don’t really want *that* drop to be highlighted. "syn keyword reasonFunction drop " Reexported types and traits {{{3 syn keyword reasonTrait Box syn keyword reasonTrait ToOwned syn keyword reasonTrait Clone syn keyword reasonTrait PartialEq PartialOrd Eq Ord syn keyword reasonTrait AsRef AsMut Into From syn keyword reasonTrait Default syn keyword reasonTrait Iterator Extend IntoIterator syn keyword reasonTrait DoubleEndedIterator ExactSizeIterator syn keyword reasonEnum Option syn keyword reasonEnumVariant Some None syn keyword reasonEnum Result syn keyword reasonEnumVariant Ok Err syn keyword reasonTrait SliceConcatExt syn keyword reasonTrait String ToString syn keyword reasonTrait Vec " Other syntax {{{2 syn keyword reasonSelf self syn keyword reasonBoolean true false " This is merely a convention; note also the use of [A-Z], restricting it to " latin identifiers rather than the full Unicode uppercase. I have not used " [:upper:] as it depends upon 'noignorecase' "syn match reasonCapsIdent display "[A-Z]\w\(\w\)*" syn match reasonOperator display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?" " This one isn't *quite* right, as we could have binary-& with a reference " This isn't actually correct; a closure with no arguments can be `|| { }`. " Last, because the & in && isn't a sigil syn match reasonOperator display "&&\|||" " This is reasonArrowCharacter rather than reasonArrow for the sake of matchparen, " so it skips the ->; see http://stackoverflow.com/a/30309949 for details. syn match reasonArrowCharacter display "=>" syn match reasonEscapeError display contained /\\./ syn match reasonEscape display contained /\\\([nrt0\\'"]\|x\x\{2}\)/ syn match reasonEscapeUnicode display contained /\\\(u\x\{4}\|U\x\{8}\)/ syn match reasonEscapeUnicode display contained /\\u{\x\{1,6}}/ syn match reasonStringContinuation display contained /\\\n\s*/ syn region reasonString start='{j|' end='|j}' contains=reasonMacroVariable,@Spell syn region reasonString start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=reasonEscape,reasonEscapeError,reasonStringContinuation syn region reasonString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=reasonEscape,reasonEscapeUnicode,reasonEscapeError,reasonStringContinuation,@Spell syn region reasonString start='b\?r\z(#*\)"' end='"\z1' contains=@Spell syn region reasonAttribute start="#!\?\[" end="\]" contains=reasonString,reasonDerive syn region reasonDerive start="derive(" end=")" contained contains=reasonDeriveTrait " This list comes from src/libsyntax/ext/deriving/mod.rs " Some are deprecated (Encodable, Decodable) or to be removed after a new snapshot (Show). syn keyword reasonDeriveTrait contained Clone Hash RustcEncodable RustcDecodable Encodable Decodable PartialEq Eq PartialOrd Ord Rand Show Debug Default FromPrimitive Send Sync Copy " Number literals syn match reasonDecNumber display "\<[0-9][0-9_]*\%([iu]\%(size\|8\|16\|32\|64\)\)\=" syn match reasonHexNumber display "\<0x[a-fA-F0-9_]\+\%([iu]\%(size\|8\|16\|32\|64\)\)\=" syn match reasonOctNumber display "\<0o[0-7_]\+\%([iu]\%(size\|8\|16\|32\|64\)\)\=" syn match reasonBinNumber display "\<0b[01_]\+\%([iu]\%(size\|8\|16\|32\|64\)\)\=" " Special case for numbers of the form "1." which are float literals, unless followed by " an identifier, which makes them integer literals with a method call or field access, " or by another ".", which makes them integer literals followed by the ".." token. " (This must go first so the others take precedence.) syn match reasonFloat display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\|\.\)\@!" " To mark a number as a normal float, it must have at least one of the three things integral values don't have: " a decimal point and more numbers; an exponent; and a type suffix. syn match reasonFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\=" syn match reasonFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\=" syn match reasonFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)" " For the benefit of delimitMate syn match reasonCharacterInvalid display contained /b\?'\zs[\n\r\t']\ze'/ " The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII). syn match reasonCharacterInvalidUnicode display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/ syn match reasonCharacter /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=reasonEscape,reasonEscapeError,reasonCharacterInvalid,reasonCharacterInvalidUnicode syn match reasonCharacter /'\([^\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{8}\|u{\x\{1,6}}\)\)'/ contains=reasonEscape,reasonEscapeUnicode,reasonEscapeError,reasonCharacterInvalid syn match reasonShebang /\%^#![^[].*/ syn region reasonCommentLine start="//" end="$" contains=reasonTodo,@Spell syn region reasonCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=reasonTodo,@Spell syn region reasonCommentBlock matchgroup=reasonCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=reasonTodo,reasonCommentBlockNest,@Spell syn region reasonCommentBlockDoc matchgroup=reasonCommentBlockDoc start="/\*\%(!\|\*[*/]\@!\)" end="\*/" contains=reasonTodo,reasonCommentBlockDocNest,@Spell syn region reasonCommentBlockNest matchgroup=reasonCommentBlock start="/\*" end="\*/" contains=reasonTodo,reasonCommentBlockNest,@Spell contained transparent syn region reasonCommentBlockDocNest matchgroup=reasonCommentBlockDoc start="/\*" end="\*/" contains=reasonTodo,reasonCommentBlockDocNest,@Spell contained transparent " FIXME: this is a really ugly and not fully correct implementation. Most " importantly, a case like ``/* */*`` should have the final ``*`` not being in " a comment, but in practice at present it leaves comments open two levels " deep. But as long as you stay away from that particular case, I *believe* " the highlighting is correct. Due to the way Vim's syntax engine works " (greedy for start matches, unlike Rust's tokeniser which is searching for " the earliest-starting match, start or end), I believe this cannot be solved. " Oh you who would fix it, don't bother with things like duplicating the Block " rules and putting ``\*\@