summaryrefslogtreecommitdiffstats
path: root/syntax/swift.vim
diff options
context:
space:
mode:
Diffstat (limited to 'syntax/swift.vim')
-rw-r--r--syntax/swift.vim267
1 files changed, 214 insertions, 53 deletions
diff --git a/syntax/swift.vim b/syntax/swift.vim
index cbe46d35..4f5230ae 100644
--- a/syntax/swift.vim
+++ b/syntax/swift.vim
@@ -1,68 +1,229 @@
if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'swift') == -1
-" Language: Swift<https://developer.apple.com/swift/>
-" Maintainer: toyama satoshi <toyamarinyon@gmail.com>
-" URL: http://github.com/toyamarinyon/vim-swift
-" License: GPL
+" File: swift.vim
+" Author: Keith Smiley
+" Description: Runtime files for Swift
+" Last Modified: June 15, 2014
-" Bail if our syntax is already loaded.
-if exists('b:current_syntax') && b:current_syntax == 'swift'
+if exists("b:current_syntax")
finish
endif
-" {{{ Whitespace and Comments
-syntax region swiftComment start=#\/\*# end=#\*\/#
-syntax match swiftComment /\/\/.*/
-highlight default link swiftComment Comment
-" }}}
+" Comments
+" Shebang
+syntax match swiftShebang "\v#!.*$"
-" {{{ Identifiers
-syntax match swiftIdentifier /[[:alpha:]_][[:alnum:]_]*/
-highlight default link swiftIdentifier Identifier
-" }}}
+" Comment contained keywords
+syntax keyword swiftTodos contained TODO XXX FIXME NOTE
+syntax keyword swiftMarker contained MARK
+syntax match swiftDocString "\v^\s*-\s*parameter"hs=s+1 contained
+syntax match swiftDocString "\v^\s*-\s*returns"hs=s+1 contained
-" {{{ Keywords
-" Keywords used in declarations:
-syntax keyword swiftDeclarationKeywords class deinit enum extension func import init let protocol static struct subscript typealias var
-highlight default link swiftDeclarationKeywords Keyword
-" Keywords used in statements:
-syntax keyword swiftStatementKeywords break case continue default do else fallthrough if in for return switch where while
-highlight default link swiftStatementKeywords Keyword
-" Keywords used in expressions and types:
-syntax keyword swiftExpressionTypeKeywords as dynamicType is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ __LINE__
-highlight default link swiftExpressionTypeKeywords Keyword
-" Keywords reserved in particular contexts:
-syntax keyword swiftReserveKeywords associativity didSet get infix inout left mutating none nonmutating operator override postfix precedence prefix right set unowned unowned(safe) unowned(unsafe) weak willSet
-highlight default link swiftReserveKeywords Keyword
-" }}}
+" Literals
+" Strings
+syntax region swiftString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=swiftInterpolatedWrapper
+syntax region swiftInterpolatedWrapper start="\v[^\\]\\\(\s*" end="\v\s*\)" contained containedin=swiftString contains=swiftInterpolatedString
+syntax match swiftInterpolatedString "\v\w+(\(\))?" contained containedin=swiftInterpolatedWrapper
-" {{{ Literals
-" Integer literal
-syntax match swiftIntegerLiteral /\<\d\+\%(_\d\+\)*\%(\.\d\+\%(_\d\+\)*\)\=\>/
-syntax match swiftIntegerLiteral /\<\d\+\%(_\d\+\)*\%(\.\d\+\%(_\d\+\)*\)\=\%([eE][-+]\=\d\+\%(_\d\+\)*\)\>/
-syntax match swiftIntegerLiteral /\<0x\x\+\%(_\x\+\)*\>/
-syntax match swiftIntegerLiteral /\<0o\o\+\%(_\o\+\)*\>/
-syntax match swiftIntegerLiteral /\<0b[01]\+\%(_[01]\+\)*\>/
-highlight default link swiftIntegerLiteral Number
-" String literal
-syntax region swiftStringLiteral start=/"/ skip=/\\"/ end=/"/
-highlight default link swiftStringLiteral String
-" }}}
+" Numbers
+syntax match swiftNumber "\v<\d+>"
+syntax match swiftNumber "\v<(\d+_+)+\d+(\.\d+(_+\d+)*)?>"
+syntax match swiftNumber "\v<\d+\.\d+>"
+syntax match swiftNumber "\v<\d*\.?\d+([Ee]-?)?\d+>"
+syntax match swiftNumber "\v<0x\x+([Pp]-?)?\x+>"
+syntax match swiftNumber "\v<0b[01]+>"
+syntax match swiftNumber "\v<0o\o+>"
-" {{{ Operators
-syntax keyword swiftOperatorKeywords / = - + ! * % < > & \| ^ ~ .
-highlight default link swiftOperatorKeywords Operator
-" }}}
+" BOOLs
+syntax keyword swiftBoolean
+ \ true
+ \ false
+
+
+" Operators
+syntax match swiftOperator "\v\~"
+syntax match swiftOperator "\v\s+!"
+syntax match swiftOperator "\v\%"
+syntax match swiftOperator "\v\^"
+syntax match swiftOperator "\v\&"
+syntax match swiftOperator "\v\*"
+syntax match swiftOperator "\v-"
+syntax match swiftOperator "\v\+"
+syntax match swiftOperator "\v\="
+syntax match swiftOperator "\v\|"
+syntax match swiftOperator "\v\/"
+syntax match swiftOperator "\v\."
+syntax match swiftOperator "\v\<"
+syntax match swiftOperator "\v\>"
+syntax match swiftOperator "\v\?\?"
-" {{{ Type
-syntax match swiftTypeIdentifier /\<[[:alpha:]_][[:alnum:]_.]*/ contained
-syntax match swiftType /: .*/ contains=swiftTypeIdentifier
-highlight default link swiftType Operator
-highlight default link swiftTypeIdentifier Type
+" Methods/Functions
+syntax match swiftMethod "\(\.\)\@<=\w\+\((\)\@="
+
+" Swift closure arguments
+syntax match swiftClosureArgument "\$\d\+\(\.\d\+\)\?"
+
+syntax match swiftAvailability "\v((\*(\s*,\s*[a-zA-Z="0-9.]+)*)|(\w+\s+\d+(\.\d+(.\d+)?)?\s*,\s*)+\*)" contains=swiftString
+syntax keyword swiftPlatforms OSX iOS watchOS OSXApplicationExtension iOSApplicationExtension contained containedin=swiftAvailability
+syntax keyword swiftAvailabilityArg renamed unavailable introduced deprecated obsoleted message contained containedin=swiftAvailability
+
+" Keywords {{{
+syntax keyword swiftKeywords
+ \ as
+ \ atexit
+ \ break
+ \ case
+ \ catch
+ \ class
+ \ continue
+ \ convenience
+ \ default
+ \ defer
+ \ deinit
+ \ didSet
+ \ do
+ \ dynamic
+ \ else
+ \ extension
+ \ fallthrough
+ \ final
+ \ for
+ \ func
+ \ get
+ \ guard
+ \ if
+ \ import
+ \ in
+ \ indirect
+ \ infix
+ \ init
+ \ inout
+ \ internal
+ \ is
+ \ lazy
+ \ let
+ \ mutating
+ \ nil
+ \ nonmutating
+ \ operator
+ \ optional
+ \ override
+ \ postfix
+ \ prefix
+ \ private
+ \ protocol
+ \ public
+ \ repeat
+ \ required
+ \ rethrows
+ \ return
+ \ self
+ \ set
+ \ static
+ \ subscript
+ \ super
+ \ switch
+ \ throw
+ \ throws
+ \ try
+ \ typealias
+ \ unowned
+ \ var
+ \ weak
+ \ where
+ \ while
+ \ willSet
" }}}
-if !exists('b:current_syntax')
- let b:current_syntax = 'swift'
-endif
+" Names surrounded by backticks. This aren't limited to keywords because 1)
+" Swift doesn't limit them to keywords and 2) I couldn't make the keywords not
+" highlight at the same time
+syntax region swiftEscapedReservedWord start="`" end="`" oneline
+
+syntax keyword swiftAttributes
+ \ @assignment
+ \ @autoclosure
+ \ @available
+ \ @convention
+ \ @exported
+ \ @IBAction
+ \ @IBDesignable
+ \ @IBInspectable
+ \ @IBOutlet
+ \ @noescape
+ \ @nonobjc
+ \ @noreturn
+ \ @NSApplicationMain
+ \ @NSCopying
+ \ @NSManaged
+ \ @objc
+ \ @testable
+ \ @UIApplicationMain
+ \ @warn_unused_result
+
+syntax keyword swiftConditionStatement #available
+
+syntax keyword swiftStructure
+ \ struct
+ \ enum
+
+syntax region swiftTypeWrapper start="\v:\s*" skip="\s*,\s*$*\s*" end="$" contains=swiftString,swiftBoolean,swiftNumber,swiftType,swiftGenericsWrapper transparent
+syntax region swiftGenericsWrapper start="\v\<" end="\v\>" contains=swiftType transparent oneline
+syntax region swiftLiteralWrapper start="\v\=\s*" skip="\v[^\[\]]\(\)" end="\v(\[\]|\(\))" contains=swiftType,swiftString transparent oneline
+syntax region swiftReturnWrapper start="\v-\>\s*" end="\v(\{|$)" contains=swiftType transparent oneline
+syntax match swiftType "\v<\u\w*" contained containedin=swiftGenericsWrapper,swiftTypeWrapper,swiftLiteralWrapper,swiftGenericsWrapper
+
+syntax keyword swiftImports import
+
+
+" 'preprocesor' stuff
+syntax keyword swiftPreprocessor
+ \ #if
+ \ #elseif
+ \ #else
+ \ #endif
+
+
+" Comment patterns
+syntax match swiftComment "\v\/\/.*$"
+ \ contains=swiftTodos,swiftDocString,swiftMarker,@Spell oneline
+syntax region swiftComment start="/\*" end="\*/"
+ \ contains=swiftTodos,swiftDocString,swiftMarker,swiftComment,@Spell fold
+
+
+" Set highlights
+highlight default link swiftTodos Todo
+highlight default link swiftDocString String
+highlight default link swiftShebang Comment
+highlight default link swiftComment Comment
+highlight default link swiftMarker Comment
+
+highlight default link swiftString String
+highlight default link swiftInterpolatedWrapper Delimiter
+highlight default link swiftNumber Number
+highlight default link swiftBoolean Boolean
+
+highlight default link swiftOperator Operator
+highlight default link swiftKeywords Keyword
+highlight default link swiftEscapedReservedWord Normal
+highlight default link swiftClosureArgument Operator
+highlight default link swiftAttributes PreProc
+highlight default link swiftConditionStatement PreProc
+highlight default link swiftStructure Structure
+highlight default link swiftType Type
+highlight default link swiftImports Include
+highlight default link swiftPreprocessor PreProc
+highlight default link swiftMethod Function
+
+highlight default link swiftConditionStatement PreProc
+highlight default link swiftAvailability Normal
+highlight default link swiftAvailabilityArg Normal
+highlight default link swiftPlatforms Keyword
+
+" Force vim to sync at least x lines. This solves the multiline comment not
+" being highlighted issue
+syn sync minlines=100
+
+let b:current_syntax = "swift"
endif