/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
define('vs/basic-languages/julia/julia',["require", "exports"], function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.language = exports.conf = void 0;
    exports.conf = {
        brackets: [
            ['{', '}'],
            ['[', ']'],
            ['(', ')']
        ],
        autoClosingPairs: [
            { open: '{', close: '}' },
            { open: '[', close: ']' },
            { open: '(', close: ')' },
            { open: '"', close: '"' },
            { open: "'", close: "'" }
        ],
        surroundingPairs: [
            { open: '{', close: '}' },
            { open: '[', close: ']' },
            { open: '(', close: ')' },
            { open: '"', close: '"' },
            { open: "'", close: "'" }
        ]
    };
    exports.language = {
        tokenPostfix: '.julia',
        keywords: [
            'begin',
            'while',
            'if',
            'for',
            'try',
            'return',
            'break',
            'continue',
            'function',
            'macro',
            'quote',
            'let',
            'local',
            'global',
            'const',
            'do',
            'struct',
            'module',
            'baremodule',
            'using',
            'import',
            'export',
            'end',
            'else',
            'elseif',
            'catch',
            'finally',
            'mutable',
            'primitive',
            'abstract',
            'type',
            'in',
            'isa',
            'where',
            'new'
        ],
        types: [
            'LinRange',
            'LineNumberNode',
            'LinearIndices',
            'LoadError',
            'MIME',
            'Matrix',
            'Method',
            'MethodError',
            'Missing',
            'MissingException',
            'Module',
            'NTuple',
            'NamedTuple',
            'Nothing',
            'Number',
            'OrdinalRange',
            'OutOfMemoryError',
            'OverflowError',
            'Pair',
            'PartialQuickSort',
            'PermutedDimsArray',
            'Pipe',
            'Ptr',
            'QuoteNode',
            'Rational',
            'RawFD',
            'ReadOnlyMemoryError',
            'Real',
            'ReentrantLock',
            'Ref',
            'Regex',
            'RegexMatch',
            'RoundingMode',
            'SegmentationFault',
            'Set',
            'Signed',
            'Some',
            'StackOverflowError',
            'StepRange',
            'StepRangeLen',
            'StridedArray',
            'StridedMatrix',
            'StridedVecOrMat',
            'StridedVector',
            'String',
            'StringIndexError',
            'SubArray',
            'SubString',
            'SubstitutionString',
            'Symbol',
            'SystemError',
            'Task',
            'Text',
            'TextDisplay',
            'Timer',
            'Tuple',
            'Type',
            'TypeError',
            'TypeVar',
            'UInt',
            'UInt128',
            'UInt16',
            'UInt32',
            'UInt64',
            'UInt8',
            'UndefInitializer',
            'AbstractArray',
            'UndefKeywordError',
            'AbstractChannel',
            'UndefRefError',
            'AbstractChar',
            'UndefVarError',
            'AbstractDict',
            'Union',
            'AbstractDisplay',
            'UnionAll',
            'AbstractFloat',
            'UnitRange',
            'AbstractIrrational',
            'Unsigned',
            'AbstractMatrix',
            'AbstractRange',
            'Val',
            'AbstractSet',
            'Vararg',
            'AbstractString',
            'VecElement',
            'AbstractUnitRange',
            'VecOrMat',
            'AbstractVecOrMat',
            'Vector',
            'AbstractVector',
            'VersionNumber',
            'Any',
            'WeakKeyDict',
            'ArgumentError',
            'WeakRef',
            'Array',
            'AssertionError',
            'BigFloat',
            'BigInt',
            'BitArray',
            'BitMatrix',
            'BitSet',
            'BitVector',
            'Bool',
            'BoundsError',
            'CapturedException',
            'CartesianIndex',
            'CartesianIndices',
            'Cchar',
            'Cdouble',
            'Cfloat',
            'Channel',
            'Char',
            'Cint',
            'Cintmax_t',
            'Clong',
            'Clonglong',
            'Cmd',
            'Colon',
            'Complex',
            'ComplexF16',
            'ComplexF32',
            'ComplexF64',
            'CompositeException',
            'Condition',
            'Cptrdiff_t',
            'Cshort',
            'Csize_t',
            'Cssize_t',
            'Cstring',
            'Cuchar',
            'Cuint',
            'Cuintmax_t',
            'Culong',
            'Culonglong',
            'Cushort',
            'Cvoid',
            'Cwchar_t',
            'Cwstring',
            'DataType',
            'DenseArray',
            'DenseMatrix',
            'DenseVecOrMat',
            'DenseVector',
            'Dict',
            'DimensionMismatch',
            'Dims',
            'DivideError',
            'DomainError',
            'EOFError',
            'Enum',
            'ErrorException',
            'Exception',
            'ExponentialBackOff',
            'Expr',
            'Float16',
            'Float32',
            'Float64',
            'Function',
            'GlobalRef',
            'HTML',
            'IO',
            'IOBuffer',
            'IOContext',
            'IOStream',
            'IdDict',
            'IndexCartesian',
            'IndexLinear',
            'IndexStyle',
            'InexactError',
            'InitError',
            'Int',
            'Int128',
            'Int16',
            'Int32',
            'Int64',
            'Int8',
            'Integer',
            'InterruptException',
            'InvalidStateException',
            'Irrational',
            'KeyError'
        ],
        keywordops: ['<:', '>:', ':', '=>', '...', '.', '->', '?'],
        allops: /[^\w\d\s()\[\]{}"'#]+/,
        constants: [
            'true',
            'false',
            'nothing',
            'missing',
            'undef',
            'Inf',
            'pi',
            'NaN',
            'π',
            'ℯ',
            'ans',
            'PROGRAM_FILE',
            'ARGS',
            'C_NULL',
            'VERSION',
            'DEPOT_PATH',
            'LOAD_PATH'
        ],
        operators: [
            '!',
            '!=',
            '!==',
            '%',
            '&',
            '*',
            '+',
            '-',
            '/',
            '//',
            '<',
            '<<',
            '<=',
            '==',
            '===',
            '=>',
            '>',
            '>=',
            '>>',
            '>>>',
            '\\',
            '^',
            '|',
            '|>',
            '~',
            '÷',
            '∈',
            '∉',
            '∋',
            '∌',
            '∘',
            '√',
            '∛',
            '∩',
            '∪',
            '≈',
            '≉',
            '≠',
            '≡',
            '≢',
            '≤',
            '≥',
            '⊆',
            '⊇',
            '⊈',
            '⊉',
            '⊊',
            '⊋',
            '⊻'
        ],
        brackets: [
            { open: '(', close: ')', token: 'delimiter.parenthesis' },
            { open: '{', close: '}', token: 'delimiter.curly' },
            { open: '[', close: ']', token: 'delimiter.square' }
        ],
        ident: /π|ℯ|\b(?!\d)\w+\b/,
        // escape sequences
        escape: /(?:[abefnrstv\\"'\n\r]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2}|u[0-9A-Fa-f]{4})/,
        escapes: /\\(?:C\-(@escape|.)|c(@escape|.)|@escape)/,
        // The main tokenizer for our languages
        tokenizer: {
            root: [
                [/(::)\s*|\b(isa)\s+/, 'keyword', '@typeanno'],
                [/\b(isa)(\s*\(@ident\s*,\s*)/, ['keyword', { token: '', next: '@typeanno' }]],
                [/\b(type|struct)[ \t]+/, 'keyword', '@typeanno'],
                // symbols
                [/^\s*:@ident[!?]?/, 'metatag'],
                [/(return)(\s*:@ident[!?]?)/, ['keyword', 'metatag']],
                [/(\(|\[|\{|@allops)(\s*:@ident[!?]?)/, ['', 'metatag']],
                [/:\(/, 'metatag', '@quote'],
                // regular expressions
                [/r"""/, 'regexp.delim', '@tregexp'],
                [/r"/, 'regexp.delim', '@sregexp'],
                // strings
                [/raw"""/, 'string.delim', '@rtstring'],
                [/[bv]?"""/, 'string.delim', '@dtstring'],
                [/raw"/, 'string.delim', '@rsstring'],
                [/[bv]?"/, 'string.delim', '@dsstring'],
                [
                    /(@ident)\{/,
                    {
                        cases: {
                            '$1@types': { token: 'type', next: '@gen' },
                            '@default': { token: 'type', next: '@gen' }
                        }
                    }
                ],
                [
                    /@ident[!?'']?(?=\.?\()/,
                    {
                        cases: {
                            '@types': 'type',
                            '@keywords': 'keyword',
                            '@constants': 'variable',
                            '@default': 'keyword.flow'
                        }
                    }
                ],
                [
                    /@ident[!?']?/,
                    {
                        cases: {
                            '@types': 'type',
                            '@keywords': 'keyword',
                            '@constants': 'variable',
                            '@default': 'identifier'
                        }
                    }
                ],
                [/\$\w+/, 'key'],
                [/\$\(/, 'key', '@paste'],
                [/@@ident/, 'annotation'],
                // whitespace
                { include: '@whitespace' },
                // characters
                [/'(?:@escapes|.)'/, 'string.character'],
                // delimiters and operators
                [/[()\[\]{}]/, '@brackets'],
                [
                    /@allops/,
                    {
                        cases: {
                            '@keywordops': 'keyword',
                            '@operators': 'operator'
                        }
                    }
                ],
                [/[;,]/, 'delimiter'],
                // numbers
                [/0[xX][0-9a-fA-F](_?[0-9a-fA-F])*/, 'number.hex'],
                [/0[_oO][0-7](_?[0-7])*/, 'number.octal'],
                [/0[bB][01](_?[01])*/, 'number.binary'],
                [/[+\-]?\d+(\.\d+)?(im?|[eE][+\-]?\d+(\.\d+)?)?/, 'number']
            ],
            // type
            typeanno: [
                [/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/, 'type', '@gen'],
                [/([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*)(\s*<:\s*)/, ['type', 'keyword']],
                [/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/, 'type', '@pop'],
                ['', '', '@pop']
            ],
            // generic type
            gen: [
                [/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*\{/, 'type', '@push'],
                [/[a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*)*/, 'type'],
                [/<:/, 'keyword'],
                [/(\})(\s*<:\s*)/, ['type', { token: 'keyword', next: '@pop' }]],
                [/\}/, 'type', '@pop'],
                { include: '@root' }
            ],
            // $(...)
            quote: [
                [/\$\(/, 'key', '@paste'],
                [/\(/, '@brackets', '@paren'],
                [/\)/, 'metatag', '@pop'],
                { include: '@root' }
            ],
            // :(...)
            paste: [
                [/:\(/, 'metatag', '@quote'],
                [/\(/, '@brackets', '@paren'],
                [/\)/, 'key', '@pop'],
                { include: '@root' }
            ],
            // (...)
            paren: [
                [/\$\(/, 'key', '@paste'],
                [/:\(/, 'metatag', '@quote'],
                [/\(/, '@brackets', '@push'],
                [/\)/, '@brackets', '@pop'],
                { include: '@root' }
            ],
            // r"egex string"
            sregexp: [
                [/^.*/, 'invalid'],
                [/[^\\"()\[\]{}]/, 'regexp'],
                [/[()\[\]{}]/, '@brackets'],
                [/\\./, 'operator.scss'],
                [/"[imsx]*/, 'regexp.delim', '@pop']
            ],
            tregexp: [
                [/[^\\"()\[\]{}]/, 'regexp'],
                [/[()\[\]{}]/, '@brackets'],
                [/\\./, 'operator.scss'],
                [/"(?!"")/, 'string'],
                [/"""[imsx]*/, 'regexp.delim', '@pop']
            ],
            // raw"string"
            rsstring: [
                [/^.*/, 'invalid'],
                [/[^\\"]/, 'string'],
                [/\\./, 'string.escape'],
                [/"/, 'string.delim', '@pop']
            ],
            rtstring: [
                [/[^\\"]/, 'string'],
                [/\\./, 'string.escape'],
                [/"(?!"")/, 'string'],
                [/"""/, 'string.delim', '@pop']
            ],
            // "string".
            dsstring: [
                [/^.*/, 'invalid'],
                [/[^\\"\$]/, 'string'],
                [/\$/, '', '@interpolated'],
                [/@escapes/, 'string.escape'],
                [/\\./, 'string.escape.invalid'],
                [/"/, 'string.delim', '@pop']
            ],
            dtstring: [
                [/[^\\"\$]/, 'string'],
                [/\$/, '', '@interpolated'],
                [/@escapes/, 'string.escape'],
                [/\\./, 'string.escape.invalid'],
                [/"(?!"")/, 'string'],
                [/"""/, 'string.delim', '@pop']
            ],
            // interpolated sequence
            interpolated: [
                [/\(/, { token: '', switchTo: '@interpolated_compound' }],
                [/[a-zA-Z_]\w*/, 'identifier'],
                ['', '', '@pop'] // just a $ is interpreted as a $
            ],
            // any code
            interpolated_compound: [[/\)/, '', '@pop'], { include: '@root' }],
            // whitespace & comments
            whitespace: [
                [/[ \t\r\n]+/, ''],
                [/#=/, 'comment', '@multi_comment'],
                [/#.*$/, 'comment']
            ],
            multi_comment: [
                [/#=/, 'comment', '@push'],
                [/=#/, 'comment', '@pop'],
                [/=(?!#)|#(?!=)/, 'comment'],
                [/[^#=]+/, 'comment']
            ]
        }
    };
});

