/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
'use strict';
export var conf = {
    comments: {
        lineComment: ';;',
    },
    brackets: [
        ['[', ']'],
        ['(', ')'],
        ['{', '}']
    ],
    autoClosingPairs: [
        { open: '[', close: ']' },
        { open: '"', close: '"' },
        { open: '(', close: ')' },
        { open: '{', close: '}' },
    ],
    surroundingPairs: [
        { open: '[', close: ']' },
        { open: '"', close: '"' },
        { open: '(', close: ')' },
        { open: '{', close: '}' },
    ],
};
export var language = {
    defaultToken: '',
    ignoreCase: true,
    tokenPostfix: '.clj',
    brackets: [
        { open: '[', close: ']', token: 'delimiter.square' },
        { open: '(', close: ')', token: 'delimiter.parenthesis' },
        { open: '{', close: '}', token: 'delimiter.curly' },
    ],
    constants: ['true', 'false', 'nil'],
    // delimiters: /[\\\[\]\s"#'(),;@^`{}~]|$/,
    numbers: /^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/,
    characters: /^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/,
    escapes: /^\\(?:["'\\bfnrt]|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
    // simple-namespace := /^[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*/
    // simple-symbol    := /^(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)/
    // qualified-symbol := (<simple-namespace>(<.><simple-namespace>)*</>)?<simple-symbol>
    qualifiedSymbols: /^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/,
    specialForms: [
        '.',
        'catch',
        'def',
        'do',
        'if',
        'monitor-enter',
        'monitor-exit',
        'new',
        'quote',
        'recur',
        'set!',
        'throw',
        'try',
        'var',
    ],
    coreSymbols: [
        '*',
        '*\'',
        '*1',
        '*2',
        '*3',
        '*agent*',
        '*allow-unresolved-vars*',
        '*assert*',
        '*clojure-version*',
        '*command-line-args*',
        '*compile-files*',
        '*compile-path*',
        '*compiler-options*',
        '*data-readers*',
        '*default-data-reader-fn*',
        '*e',
        '*err*',
        '*file*',
        '*flush-on-newline*',
        '*fn-loader*',
        '*in*',
        '*math-context*',
        '*ns*',
        '*out*',
        '*print-dup*',
        '*print-length*',
        '*print-level*',
        '*print-meta*',
        '*print-namespace-maps*',
        '*print-readably*',
        '*read-eval*',
        '*reader-resolver*',
        '*source-path*',
        '*suppress-read*',
        '*unchecked-math*',
        '*use-context-classloader*',
        '*verbose-defrecords*',
        '*warn-on-reflection*',
        '+',
        '+\'',
        '-',
        '-\'',
        '->',
        '->>',
        '->ArrayChunk',
        '->Eduction',
        '->Vec',
        '->VecNode',
        '->VecSeq',
        '-cache-protocol-fn',
        '-reset-methods',
        '..',
        '/',
        '<',
        '<=',
        '=',
        '==',
        '>',
        '>=',
        'EMPTY-NODE',
        'Inst',
        'StackTraceElement->vec',
        'Throwable->map',
        'accessor',
        'aclone',
        'add-classpath',
        'add-watch',
        'agent',
        'agent-error',
        'agent-errors',
        'aget',
        'alength',
        'alias',
        'all-ns',
        'alter',
        'alter-meta!',
        'alter-var-root',
        'amap',
        'ancestors',
        'and',
        'any?',
        'apply',
        'areduce',
        'array-map',
        'as->',
        'aset',
        'aset-boolean',
        'aset-byte',
        'aset-char',
        'aset-double',
        'aset-float',
        'aset-int',
        'aset-long',
        'aset-short',
        'assert',
        'assoc',
        'assoc!',
        'assoc-in',
        'associative?',
        'atom',
        'await',
        'await-for',
        'await1',
        'bases',
        'bean',
        'bigdec',
        'bigint',
        'biginteger',
        'binding',
        'bit-and',
        'bit-and-not',
        'bit-clear',
        'bit-flip',
        'bit-not',
        'bit-or',
        'bit-set',
        'bit-shift-left',
        'bit-shift-right',
        'bit-test',
        'bit-xor',
        'boolean',
        'boolean-array',
        'boolean?',
        'booleans',
        'bound-fn',
        'bound-fn*',
        'bound?',
        'bounded-count',
        'butlast',
        'byte',
        'byte-array',
        'bytes',
        'bytes?',
        'case',
        'cast',
        'cat',
        'char',
        'char-array',
        'char-escape-string',
        'char-name-string',
        'char?',
        'chars',
        'chunk',
        'chunk-append',
        'chunk-buffer',
        'chunk-cons',
        'chunk-first',
        'chunk-next',
        'chunk-rest',
        'chunked-seq?',
        'class',
        'class?',
        'clear-agent-errors',
        'clojure-version',
        'coll?',
        'comment',
        'commute',
        'comp',
        'comparator',
        'compare',
        'compare-and-set!',
        'compile',
        'complement',
        'completing',
        'concat',
        'cond',
        'cond->',
        'cond->>',
        'condp',
        'conj',
        'conj!',
        'cons',
        'constantly',
        'construct-proxy',
        'contains?',
        'count',
        'counted?',
        'create-ns',
        'create-struct',
        'cycle',
        'dec',
        'dec\'',
        'decimal?',
        'declare',
        'dedupe',
        'default-data-readers',
        'definline',
        'definterface',
        'defmacro',
        'defmethod',
        'defmulti',
        'defn',
        'defn-',
        'defonce',
        'defprotocol',
        'defrecord',
        'defstruct',
        'deftype',
        'delay',
        'delay?',
        'deliver',
        'denominator',
        'deref',
        'derive',
        'descendants',
        'destructure',
        'disj',
        'disj!',
        'dissoc',
        'dissoc!',
        'distinct',
        'distinct?',
        'doall',
        'dorun',
        'doseq',
        'dosync',
        'dotimes',
        'doto',
        'double',
        'double-array',
        'double?',
        'doubles',
        'drop',
        'drop-last',
        'drop-while',
        'eduction',
        'empty',
        'empty?',
        'ensure',
        'ensure-reduced',
        'enumeration-seq',
        'error-handler',
        'error-mode',
        'eval',
        'even?',
        'every-pred',
        'every?',
        'ex-data',
        'ex-info',
        'extend',
        'extend-protocol',
        'extend-type',
        'extenders',
        'extends?',
        'false?',
        'ffirst',
        'file-seq',
        'filter',
        'filterv',
        'find',
        'find-keyword',
        'find-ns',
        'find-protocol-impl',
        'find-protocol-method',
        'find-var',
        'first',
        'flatten',
        'float',
        'float-array',
        'float?',
        'floats',
        'flush',
        'fn',
        'fn?',
        'fnext',
        'fnil',
        'for',
        'force',
        'format',
        'frequencies',
        'future',
        'future-call',
        'future-cancel',
        'future-cancelled?',
        'future-done?',
        'future?',
        'gen-class',
        'gen-interface',
        'gensym',
        'get',
        'get-in',
        'get-method',
        'get-proxy-class',
        'get-thread-bindings',
        'get-validator',
        'group-by',
        'halt-when',
        'hash',
        'hash-combine',
        'hash-map',
        'hash-ordered-coll',
        'hash-set',
        'hash-unordered-coll',
        'ident?',
        'identical?',
        'identity',
        'if-let',
        'if-not',
        'if-some',
        'ifn?',
        'import',
        'in-ns',
        'inc',
        'inc\'',
        'indexed?',
        'init-proxy',
        'inst-ms',
        'inst-ms*',
        'inst?',
        'instance?',
        'int',
        'int-array',
        'int?',
        'integer?',
        'interleave',
        'intern',
        'interpose',
        'into',
        'into-array',
        'ints',
        'io!',
        'isa?',
        'iterate',
        'iterator-seq',
        'juxt',
        'keep',
        'keep-indexed',
        'key',
        'keys',
        'keyword',
        'keyword?',
        'last',
        'lazy-cat',
        'lazy-seq',
        'let',
        'letfn',
        'line-seq',
        'list',
        'list*',
        'list?',
        'load',
        'load-file',
        'load-reader',
        'load-string',
        'loaded-libs',
        'locking',
        'long',
        'long-array',
        'longs',
        'loop',
        'macroexpand',
        'macroexpand-1',
        'make-array',
        'make-hierarchy',
        'map',
        'map-entry?',
        'map-indexed',
        'map?',
        'mapcat',
        'mapv',
        'max',
        'max-key',
        'memfn',
        'memoize',
        'merge',
        'merge-with',
        'meta',
        'method-sig',
        'methods',
        'min',
        'min-key',
        'mix-collection-hash',
        'mod',
        'munge',
        'name',
        'namespace',
        'namespace-munge',
        'nat-int?',
        'neg-int?',
        'neg?',
        'newline',
        'next',
        'nfirst',
        'nil?',
        'nnext',
        'not',
        'not-any?',
        'not-empty',
        'not-every?',
        'not=',
        'ns',
        'ns-aliases',
        'ns-imports',
        'ns-interns',
        'ns-map',
        'ns-name',
        'ns-publics',
        'ns-refers',
        'ns-resolve',
        'ns-unalias',
        'ns-unmap',
        'nth',
        'nthnext',
        'nthrest',
        'num',
        'number?',
        'numerator',
        'object-array',
        'odd?',
        'or',
        'parents',
        'partial',
        'partition',
        'partition-all',
        'partition-by',
        'pcalls',
        'peek',
        'persistent!',
        'pmap',
        'pop',
        'pop!',
        'pop-thread-bindings',
        'pos-int?',
        'pos?',
        'pr',
        'pr-str',
        'prefer-method',
        'prefers',
        'primitives-classnames',
        'print',
        'print-ctor',
        'print-dup',
        'print-method',
        'print-simple',
        'print-str',
        'printf',
        'println',
        'println-str',
        'prn',
        'prn-str',
        'promise',
        'proxy',
        'proxy-call-with-super',
        'proxy-mappings',
        'proxy-name',
        'proxy-super',
        'push-thread-bindings',
        'pvalues',
        'qualified-ident?',
        'qualified-keyword?',
        'qualified-symbol?',
        'quot',
        'rand',
        'rand-int',
        'rand-nth',
        'random-sample',
        'range',
        'ratio?',
        'rational?',
        'rationalize',
        're-find',
        're-groups',
        're-matcher',
        're-matches',
        're-pattern',
        're-seq',
        'read',
        'read-line',
        'read-string',
        'reader-conditional',
        'reader-conditional?',
        'realized?',
        'record?',
        'reduce',
        'reduce-kv',
        'reduced',
        'reduced?',
        'reductions',
        'ref',
        'ref-history-count',
        'ref-max-history',
        'ref-min-history',
        'ref-set',
        'refer',
        'refer-clojure',
        'reify',
        'release-pending-sends',
        'rem',
        'remove',
        'remove-all-methods',
        'remove-method',
        'remove-ns',
        'remove-watch',
        'repeat',
        'repeatedly',
        'replace',
        'replicate',
        'require',
        'reset!',
        'reset-meta!',
        'reset-vals!',
        'resolve',
        'rest',
        'restart-agent',
        'resultset-seq',
        'reverse',
        'reversible?',
        'rseq',
        'rsubseq',
        'run!',
        'satisfies?',
        'second',
        'select-keys',
        'send',
        'send-off',
        'send-via',
        'seq',
        'seq?',
        'seqable?',
        'seque',
        'sequence',
        'sequential?',
        'set',
        'set-agent-send-executor!',
        'set-agent-send-off-executor!',
        'set-error-handler!',
        'set-error-mode!',
        'set-validator!',
        'set?',
        'short',
        'short-array',
        'shorts',
        'shuffle',
        'shutdown-agents',
        'simple-ident?',
        'simple-keyword?',
        'simple-symbol?',
        'slurp',
        'some',
        'some->',
        'some->>',
        'some-fn',
        'some?',
        'sort',
        'sort-by',
        'sorted-map',
        'sorted-map-by',
        'sorted-set',
        'sorted-set-by',
        'sorted?',
        'special-symbol?',
        'spit',
        'split-at',
        'split-with',
        'str',
        'string?',
        'struct',
        'struct-map',
        'subs',
        'subseq',
        'subvec',
        'supers',
        'swap!',
        'swap-vals!',
        'symbol',
        'symbol?',
        'sync',
        'tagged-literal',
        'tagged-literal?',
        'take',
        'take-last',
        'take-nth',
        'take-while',
        'test',
        'the-ns',
        'thread-bound?',
        'time',
        'to-array',
        'to-array-2d',
        'trampoline',
        'transduce',
        'transient',
        'tree-seq',
        'true?',
        'type',
        'unchecked-add',
        'unchecked-add-int',
        'unchecked-byte',
        'unchecked-char',
        'unchecked-dec',
        'unchecked-dec-int',
        'unchecked-divide-int',
        'unchecked-double',
        'unchecked-float',
        'unchecked-inc',
        'unchecked-inc-int',
        'unchecked-int',
        'unchecked-long',
        'unchecked-multiply',
        'unchecked-multiply-int',
        'unchecked-negate',
        'unchecked-negate-int',
        'unchecked-remainder-int',
        'unchecked-short',
        'unchecked-subtract',
        'unchecked-subtract-int',
        'underive',
        'unquote',
        'unquote-splicing',
        'unreduced',
        'unsigned-bit-shift-right',
        'update',
        'update-in',
        'update-proxy',
        'uri?',
        'use',
        'uuid?',
        'val',
        'vals',
        'var-get',
        'var-set',
        'var?',
        'vary-meta',
        'vec',
        'vector',
        'vector-of',
        'vector?',
        'volatile!',
        'volatile?',
        'vreset!',
        'vswap!',
        'when',
        'when-first',
        'when-let',
        'when-not',
        'when-some',
        'while',
        'with-bindings',
        'with-bindings*',
        'with-in-str',
        'with-loading-context',
        'with-local-vars',
        'with-meta',
        'with-open',
        'with-out-str',
        'with-precision',
        'with-redefs',
        'with-redefs-fn',
        'xml-seq',
        'zero?',
        'zipmap',
    ],
    tokenizer: {
        root: [
            // whitespaces and comments
            { include: '@whitespace' },
            // numbers
            [/@numbers/, 'number'],
            // characters
            [/@characters/, 'string'],
            // strings
            { include: '@string' },
            // brackets
            [/[()\[\]{}]/, '@brackets'],
            // regular expressions
            [/\/#"(?:\.|(?:")|[^"\n])*"\/g/, 'regexp'],
            // reader macro characters
            [/[#'@^`~]/, 'meta'],
            // symbols
            [/@qualifiedSymbols/, {
                    cases: {
                        '^:.+$': 'constant',
                        '@specialForms': 'keyword',
                        '@coreSymbols': 'keyword',
                        '@constants': 'constant',
                        '@default': 'identifier',
                    },
                },
            ],
        ],
        whitespace: [
            [/\s+/, 'white'],
            [/;.*$/, 'comment'],
            [/\(comment\b/, 'comment', '@comment'],
        ],
        comment: [
            [/\(/, 'comment', '@push'],
            [/\)/, 'comment', '@pop'],
            [/[^()]/, 'comment'],
        ],
        string: [
            [/"/, 'string', '@multiLineString'],
        ],
        multiLineString: [
            [/"/, 'string', '@popall'],
            [/@escapes/, 'string.escape'],
            [/./, 'string']
        ],
    },
};
