123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- // CodeMirror, copyright (c) by Marijn Haverbeke and others
- // Distributed under an MIT license: https://codemirror.net/LICENSE
- // Swift mode created by Michael Kaminsky https://github.com/mkaminsky11
- ;(function (mod) {
- if (typeof exports == 'object' && typeof module == 'object') mod(require('../../lib/codemirror'))
- else if (typeof define == 'function' && define.amd) define(['../../lib/codemirror'], mod)
- else mod(CodeMirror)
- })(function (CodeMirror) {
- 'use strict'
- function wordSet(words) {
- var set = {}
- for (var i = 0; i < words.length; i++) set[words[i]] = true
- return set
- }
- var keywords = wordSet([
- '_',
- 'var',
- 'let',
- 'class',
- 'enum',
- 'extension',
- 'import',
- 'protocol',
- 'struct',
- 'func',
- 'typealias',
- 'associatedtype',
- 'open',
- 'public',
- 'internal',
- 'fileprivate',
- 'private',
- 'deinit',
- 'init',
- 'new',
- 'override',
- 'self',
- 'subscript',
- 'super',
- 'convenience',
- 'dynamic',
- 'final',
- 'indirect',
- 'lazy',
- 'required',
- 'static',
- 'unowned',
- 'unowned(safe)',
- 'unowned(unsafe)',
- 'weak',
- 'as',
- 'is',
- 'break',
- 'case',
- 'continue',
- 'default',
- 'else',
- 'fallthrough',
- 'for',
- 'guard',
- 'if',
- 'in',
- 'repeat',
- 'switch',
- 'where',
- 'while',
- 'defer',
- 'return',
- 'inout',
- 'mutating',
- 'nonmutating',
- 'catch',
- 'do',
- 'rethrows',
- 'throw',
- 'throws',
- 'try',
- 'didSet',
- 'get',
- 'set',
- 'willSet',
- 'assignment',
- 'associativity',
- 'infix',
- 'left',
- 'none',
- 'operator',
- 'postfix',
- 'precedence',
- 'precedencegroup',
- 'prefix',
- 'right',
- 'Any',
- 'AnyObject',
- 'Type',
- 'dynamicType',
- 'Self',
- 'Protocol',
- '__COLUMN__',
- '__FILE__',
- '__FUNCTION__',
- '__LINE__',
- ])
- var definingKeywords = wordSet(['var', 'let', 'class', 'enum', 'extension', 'import', 'protocol', 'struct', 'func', 'typealias', 'associatedtype', 'for'])
- var atoms = wordSet(['true', 'false', 'nil', 'self', 'super', '_'])
- var types = wordSet([
- 'Array',
- 'Bool',
- 'Character',
- 'Dictionary',
- 'Double',
- 'Float',
- 'Int',
- 'Int8',
- 'Int16',
- 'Int32',
- 'Int64',
- 'Never',
- 'Optional',
- 'Set',
- 'String',
- 'UInt8',
- 'UInt16',
- 'UInt32',
- 'UInt64',
- 'Void',
- ])
- var operators = '+-/*%=|&<>~^?!'
- var punc = ':;,.(){}[]'
- var binary = /^\-?0b[01][01_]*/
- var octal = /^\-?0o[0-7][0-7_]*/
- var hexadecimal = /^\-?0x[\dA-Fa-f][\dA-Fa-f_]*(?:(?:\.[\dA-Fa-f][\dA-Fa-f_]*)?[Pp]\-?\d[\d_]*)?/
- var decimal = /^\-?\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee]\-?\d[\d_]*)?/
- var identifier = /^\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1/
- var property = /^\.(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/
- var instruction = /^\#[A-Za-z]+/
- var attribute = /^@(?:\$\d+|(`?)[_A-Za-z][_A-Za-z$0-9]*\1)/
- //var regexp = /^\/(?!\s)(?:\/\/)?(?:\\.|[^\/])+\//
- function tokenBase(stream, state, prev) {
- if (stream.sol()) state.indented = stream.indentation()
- if (stream.eatSpace()) return null
- var ch = stream.peek()
- if (ch == '/') {
- if (stream.match('//')) {
- stream.skipToEnd()
- return 'comment'
- }
- if (stream.match('/*')) {
- state.tokenize.push(tokenComment)
- return tokenComment(stream, state)
- }
- }
- if (stream.match(instruction)) return 'builtin'
- if (stream.match(attribute)) return 'attribute'
- if (stream.match(binary)) return 'number'
- if (stream.match(octal)) return 'number'
- if (stream.match(hexadecimal)) return 'number'
- if (stream.match(decimal)) return 'number'
- if (stream.match(property)) return 'property'
- if (operators.indexOf(ch) > -1) {
- stream.next()
- return 'operator'
- }
- if (punc.indexOf(ch) > -1) {
- stream.next()
- stream.match('..')
- return 'punctuation'
- }
- var stringMatch
- if ((stringMatch = stream.match(/("""|"|')/))) {
- var tokenize = tokenString.bind(null, stringMatch[0])
- state.tokenize.push(tokenize)
- return tokenize(stream, state)
- }
- if (stream.match(identifier)) {
- var ident = stream.current()
- if (types.hasOwnProperty(ident)) return 'variable-2'
- if (atoms.hasOwnProperty(ident)) return 'atom'
- if (keywords.hasOwnProperty(ident)) {
- if (definingKeywords.hasOwnProperty(ident)) state.prev = 'define'
- return 'keyword'
- }
- if (prev == 'define') return 'def'
- return 'variable'
- }
- stream.next()
- return null
- }
- function tokenUntilClosingParen() {
- var depth = 0
- return function (stream, state, prev) {
- var inner = tokenBase(stream, state, prev)
- if (inner == 'punctuation') {
- if (stream.current() == '(') ++depth
- else if (stream.current() == ')') {
- if (depth == 0) {
- stream.backUp(1)
- state.tokenize.pop()
- return state.tokenize[state.tokenize.length - 1](stream, state)
- } else --depth
- }
- }
- return inner
- }
- }
- function tokenString(openQuote, stream, state) {
- var singleLine = openQuote.length == 1
- var ch,
- escaped = false
- while ((ch = stream.peek())) {
- if (escaped) {
- stream.next()
- if (ch == '(') {
- state.tokenize.push(tokenUntilClosingParen())
- return 'string'
- }
- escaped = false
- } else if (stream.match(openQuote)) {
- state.tokenize.pop()
- return 'string'
- } else {
- stream.next()
- escaped = ch == '\\'
- }
- }
- if (singleLine) {
- state.tokenize.pop()
- }
- return 'string'
- }
- function tokenComment(stream, state) {
- var ch
- while (true) {
- stream.match(/^[^/*]+/, true)
- ch = stream.next()
- if (!ch) break
- if (ch === '/' && stream.eat('*')) {
- state.tokenize.push(tokenComment)
- } else if (ch === '*' && stream.eat('/')) {
- state.tokenize.pop()
- }
- }
- return 'comment'
- }
- function Context(prev, align, indented) {
- this.prev = prev
- this.align = align
- this.indented = indented
- }
- function pushContext(state, stream) {
- var align = stream.match(/^\s*($|\/[\/\*])/, false) ? null : stream.column() + 1
- state.context = new Context(state.context, align, state.indented)
- }
- function popContext(state) {
- if (state.context) {
- state.indented = state.context.indented
- state.context = state.context.prev
- }
- }
- CodeMirror.defineMode('swift', function (config) {
- return {
- startState: function () {
- return {
- prev: null,
- context: null,
- indented: 0,
- tokenize: [],
- }
- },
- token: function (stream, state) {
- var prev = state.prev
- state.prev = null
- var tokenize = state.tokenize[state.tokenize.length - 1] || tokenBase
- var style = tokenize(stream, state, prev)
- if (!style || style == 'comment') state.prev = prev
- else if (!state.prev) state.prev = style
- if (style == 'punctuation') {
- var bracket = /[\(\[\{]|([\]\)\}])/.exec(stream.current())
- if (bracket) (bracket[1] ? popContext : pushContext)(state, stream)
- }
- return style
- },
- indent: function (state, textAfter) {
- var cx = state.context
- if (!cx) return 0
- var closing = /^[\]\}\)]/.test(textAfter)
- if (cx.align != null) return cx.align - (closing ? 1 : 0)
- return cx.indented + (closing ? 0 : config.indentUnit)
- },
- electricInput: /^\s*[\)\}\]]$/,
- lineComment: '//',
- blockCommentStart: '/*',
- blockCommentEnd: '*/',
- fold: 'brace',
- closeBrackets: '()[]{}\'\'""``',
- }
- })
- CodeMirror.defineMIME('text/x-swift', 'swift')
- })
|