" Vim syntax file " Language: Dart
" Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
" for details. All rights reserved. Use of this source code is governed by a
" BSD-style license that can be found in the LICENSE file.

if !exists("g:main_syntax")
  if version < 600
    syntax clear
  elseif exists("b:current_syntax")
    finish
  endif
  let g:main_syntax = 'dart'
  syntax region dartFold start="{" end="}" transparent fold
endif

" Ensure long multiline strings are highlighted.
syntax sync fromstart

" keyword definitions
syntax keyword dartConditional    if else switch
syntax keyword dartRepeat         do while for
syntax keyword dartBoolean        true false
syntax keyword dartConstant       null
syntax keyword dartTypedef        this super class typedef
syntax keyword dartOperator       new is as in factory
syntax match   dartOperator       "+=\=\|-=\=\|*=\=\|/=\=\|%=\=\|\~/=\=\|<<=\=\|>>=\=\|[<>]=\=\|===\=\|\!==\=\|&=\=\|\^=\=\||=\=\|||\|&&\|\[\]=\=\|=>\|!\|\~\|?\|:"
syntax keyword dartType           void var bool int double num dynamic
syntax keyword dartStatement      return
syntax keyword dartStorageClass   static abstract final const
syntax keyword dartExceptions     throw rethrow try on catch finally
syntax keyword dartAssert         assert
syntax keyword dartClassDecl      extends with implements
syntax keyword dartBranch         break continue nextgroup=dartUserLabelRef skipwhite
syntax keyword dartKeyword        get set operator call external
syntax match   dartUserLabelRef   "\k\+" contained

syntax region  dartLabelRegion   transparent matchgroup=dartLabel start="\<case\>" matchgroup=NONE end=":"
syntax keyword dartLabel         default

syntax match dartLibrary         "^\(import\|part of\|part\|export\|library\|show\|hide\)\s"

" Comments
syntax keyword dartTodo          contained TODO FIXME XXX
syntax region  dartComment       start="/\*"  end="\*/" contains=dartTodo,dartDocLink,@Spell
syntax match   dartLineComment   "//.*" contains=dartTodo,@Spell
syntax match   dartLineDocComment "///.*" contains=dartTodo,dartDocLink,@Spell
syntax region  dartDocLink       contained start=+\[+ end=+\]+

" Strings
syntax region  dartString        start=+\z(["']\)+ end=+\z1+ contains=@Spell,dartInterpolation,dartSpecialChar
syntax region  dartRawString     start=+r\z(["']\)+ end=+\z1+ contains=@Spell
syntax region  dartMultilineString     start=+\z("\{3\}\|'\{3\}\)+ end=+\z1+ contains=@Spell,dartInterpolation,dartSpecialChar
syntax region  dartRawMultilineString     start=+r\z("\{3\}\|'\{3\}\)+ end=+\z1+ contains=@Spell
syntax match   dartInterpolation contained "\$\(\w\+\|{[^}]\+}\)"
syntax match   dartSpecialChar   contained "\\\(u\x\{4\}\|u{\x\+}\|x\x\x\|x{\x\+}\|.\)"

" Numbers
syntax match dartNumber         "\<\d\+\(\.\d\+\)\=\>"

" TODO(antonm): consider conditional highlighting of corelib classes.
syntax keyword dartCoreClasses    BidirectionalIterator Comparable DateTime Duration Expando Function Invocation Iterable Iterator List Map Match Object Pattern RegExp RuneIterator Runes Set StackTrace Stopwatch String StringBuffer StringSink Symbol Type
syntax keyword dartCoreTypedefs   Comparator
syntax keyword dartCoreExceptions AbstractClassInstantiationError ArgumentError AssertionError CastError ConcurrentModificationError Error Exception FallThroughError FormatException IntegerDivisionByZeroException NoSuchMethodError NullThrownError OutOfMemoryError RangeError RuntimeError StackOverflowError StateError TypeError UnimplementedError UnsupportedError


" The default highlighting.
highlight default link dartBranch          Conditional
highlight default link dartUserLabelRef    dartUserLabel
highlight default link dartLabel           Label
highlight default link dartUserLabel       Label
highlight default link dartConditional     Conditional
highlight default link dartRepeat          Repeat
highlight default link dartExceptions      Exception
highlight default link dartAssert          Statement
highlight default link dartStorageClass    StorageClass
highlight default link dartClassDecl       dartStorageClass
highlight default link dartBoolean         Boolean
highlight default link dartString          String
highlight default link dartRawString       String
highlight default link dartMultilineString String
highlight default link dartRawMultilineString String
highlight default link dartNumber          Number
highlight default link dartStatement       Statement
highlight default link dartOperator        Operator
highlight default link dartComment         Comment
highlight default link dartLineComment     Comment
highlight default link dartLineDocComment  Comment
highlight default link dartConstant        Constant
highlight default link dartTypedef         Typedef
highlight default link dartTodo            Todo
highlight default link dartKeyword         Keyword
highlight default link dartType            Type
highlight default link dartInterpolation   PreProc
highlight default link dartDocLink         SpecialComment
highlight default link dartSpecialChar     SpecialChar
highlight default link dartLibrary         Include
highlight default link dartCoreClasses     Type
highlight default link dartCoreTypedefs    Typedef
highlight default link dartCoreExceptions  Exception

let b:current_syntax = "dart"
let b:spell_options = "contained"

if g:main_syntax is# 'dart'
  unlet g:main_syntax
endif
