/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
define(["require", "exports"], function (require, exports) {
    'use strict';
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.conf = {
        comments: {
            lineComment: '//',
            blockComment: ['/*', '*/'],
        },
        brackets: [['[', ']'], ['(', ')'], ['{', '}']],
        autoClosingPairs: [
            { open: '"', close: '"', notIn: ['string', 'comment'] },
            { open: '\'', close: '\'', notIn: ['string', 'comment'] },
            { open: '[', close: ']', notIn: ['string', 'comment'] },
            { open: '(', close: ')', notIn: ['string', 'comment'] },
            { open: '{', close: '}', notIn: ['string', 'comment'] },
        ]
    };
    exports.language = {
        defaultToken: '',
        tokenPostfix: '.msdax',
        ignoreCase: true,
        brackets: [
            { open: '[', close: ']', token: 'delimiter.square' },
            { open: '{', close: '}', token: 'delimiter.brackets' },
            { open: '(', close: ')', token: 'delimiter.parenthesis' }
        ],
        keywords: [
            // Query keywords
            'VAR',
            'RETURN',
            'NOT',
            'EVALUATE',
            'DATATABLE',
            'ORDER',
            'BY',
            'START',
            'AT',
            'DEFINE',
            'MEASURE',
            'ASC',
            'DESC',
            'IN',
            // Datatable types
            'BOOLEAN',
            'DOUBLE',
            'INTEGER',
            'DATETIME',
            'CURRENCY',
            'STRING'
        ],
        functions: [
            // Relational
            'CLOSINGBALANCEMONTH', 'CLOSINGBALANCEQUARTER', 'CLOSINGBALANCEYEAR', 'DATEADD', 'DATESBETWEEN',
            'DATESINPERIOD', 'DATESMTD', 'DATESQTD', 'DATESYTD', 'ENDOFMONTH',
            'ENDOFQUARTER', 'ENDOFYEAR', 'FIRSTDATE', 'FIRSTNONBLANK', 'LASTDATE',
            'LASTNONBLANK', 'NEXTDAY', 'NEXTMONTH', 'NEXTQUARTER', 'NEXTYEAR',
            'OPENINGBALANCEMONTH', 'OPENINGBALANCEQUARTER', 'OPENINGBALANCEYEAR', 'PARALLELPERIOD', 'PREVIOUSDAY',
            'PREVIOUSMONTH', 'PREVIOUSQUARTER', 'PREVIOUSYEAR', 'SAMEPERIODLASTYEAR', 'STARTOFMONTH',
            'STARTOFQUARTER', 'STARTOFYEAR', 'TOTALMTD', 'TOTALQTD', 'TOTALYTD',
            'ADDCOLUMNS', 'ADDMISSINGITEMS', 'ALL', 'ALLEXCEPT', 'ALLNOBLANKROW',
            'ALLSELECTED', 'CALCULATE', 'CALCULATETABLE', 'CALENDAR', 'CALENDARAUTO',
            'CROSSFILTER', 'CROSSJOIN', 'CURRENTGROUP', 'DATATABLE', 'DETAILROWS',
            'DISTINCT', 'EARLIER', 'EARLIEST', 'EXCEPT', 'FILTER',
            'FILTERS', 'GENERATE', 'GENERATEALL', 'GROUPBY', 'IGNORE',
            'INTERSECT', 'ISONORAFTER', 'KEEPFILTERS', 'LOOKUPVALUE', 'NATURALINNERJOIN',
            'NATURALLEFTOUTERJOIN', 'RELATED', 'RELATEDTABLE', 'ROLLUP', 'ROLLUPADDISSUBTOTAL',
            'ROLLUPGROUP', 'ROLLUPISSUBTOTAL', 'ROW', 'SAMPLE', 'SELECTCOLUMNS',
            'SUBSTITUTEWITHINDEX', 'SUMMARIZE', 'SUMMARIZECOLUMNS', 'TOPN', 'TREATAS',
            'UNION', 'USERELATIONSHIP', 'VALUES', 'SUM', 'SUMX',
            'PATH', 'PATHCONTAINS', 'PATHITEM', 'PATHITEMREVERSE', 'PATHLENGTH',
            'AVERAGE', 'AVERAGEA', 'AVERAGEX', 'COUNT', 'COUNTA',
            'COUNTAX', 'COUNTBLANK', 'COUNTROWS', 'COUNTX', 'DISTINCTCOUNT',
            'DIVIDE', 'GEOMEAN', 'GEOMEANX', 'MAX', 'MAXA',
            'MAXX', 'MEDIAN', 'MEDIANX', 'MIN', 'MINA',
            'MINX', 'PERCENTILE.EXC', 'PERCENTILE.INC', 'PERCENTILEX.EXC', 'PERCENTILEX.INC',
            'PRODUCT', 'PRODUCTX', 'RANK.EQ', 'RANKX', 'STDEV.P',
            'STDEV.S', 'STDEVX.P', 'STDEVX.S', 'VAR.P', 'VAR.S',
            'VARX.P', 'VARX.S', 'XIRR', 'XNPV',
            // Scalar
            'DATE', 'DATEDIFF', 'DATEVALUE', 'DAY', 'EDATE',
            'EOMONTH', 'HOUR', 'MINUTE', 'MONTH', 'NOW',
            'SECOND', 'TIME', 'TIMEVALUE', 'TODAY', 'WEEKDAY',
            'WEEKNUM', 'YEAR', 'YEARFRAC', 'CONTAINS', 'CONTAINSROW',
            'CUSTOMDATA', 'ERROR', 'HASONEFILTER', 'HASONEVALUE', 'ISBLANK',
            'ISCROSSFILTERED', 'ISEMPTY', 'ISERROR', 'ISEVEN', 'ISFILTERED',
            'ISLOGICAL', 'ISNONTEXT', 'ISNUMBER', 'ISODD', 'ISSUBTOTAL',
            'ISTEXT', 'USERNAME', 'USERPRINCIPALNAME', 'AND', 'FALSE',
            'IF', 'IFERROR', 'NOT', 'OR', 'SWITCH',
            'TRUE', 'ABS', 'ACOS', 'ACOSH', 'ACOT',
            'ACOTH', 'ASIN', 'ASINH', 'ATAN', 'ATANH',
            'BETA.DIST', 'BETA.INV', 'CEILING', 'CHISQ.DIST', 'CHISQ.DIST.RT',
            'CHISQ.INV', 'CHISQ.INV.RT', 'COMBIN', 'COMBINA', 'CONFIDENCE.NORM',
            'CONFIDENCE.T', 'COS', 'COSH', 'COT', 'COTH',
            'CURRENCY', 'DEGREES', 'EVEN', 'EXP', 'EXPON.DIST',
            'FACT', 'FLOOR', 'GCD', 'INT', 'ISO.CEILING',
            'LCM', 'LN', 'LOG', 'LOG10', 'MOD',
            'MROUND', 'ODD', 'PERMUT', 'PI', 'POISSON.DIST',
            'POWER', 'QUOTIENT', 'RADIANS', 'RAND', 'RANDBETWEEN',
            'ROUND', 'ROUNDDOWN', 'ROUNDUP', 'SIGN', 'SIN',
            'SINH', 'SQRT', 'SQRTPI', 'TAN', 'TANH',
            'TRUNC', 'BLANK', 'CONCATENATE', 'CONCATENATEX', 'EXACT',
            'FIND', 'FIXED', 'FORMAT', 'LEFT', 'LEN',
            'LOWER', 'MID', 'REPLACE', 'REPT', 'RIGHT',
            'SEARCH', 'SUBSTITUTE', 'TRIM', 'UNICHAR', 'UNICODE',
            'UPPER', 'VALUE'
        ],
        tokenizer: {
            root: [
                { include: '@comments' },
                { include: '@whitespace' },
                { include: '@numbers' },
                { include: '@strings' },
                { include: '@complexIdentifiers' },
                [/[;,.]/, 'delimiter'],
                [/[({})]/, '@brackets'],
                [/[a-z_][a-zA-Z0-9_]*/, {
                        cases: {
                            '@keywords': 'keyword',
                            '@functions': 'keyword',
                            '@default': 'identifier'
                        }
                    }],
                [/[<>=!%&+\-*/|~^]/, 'operator'],
            ],
            whitespace: [
                [/\s+/, 'white']
            ],
            comments: [
                [/\/\/+.*/, 'comment'],
                [/\/\*/, { token: 'comment.quote', next: '@comment' }]
            ],
            comment: [
                [/[^*/]+/, 'comment'],
                [/\*\//, { token: 'comment.quote', next: '@pop' }],
                [/./, 'comment']
            ],
            numbers: [
                [/0[xX][0-9a-fA-F]*/, 'number'],
                [/[$][+-]*\d*(\.\d*)?/, 'number'],
                [/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/, 'number']
            ],
            strings: [
                [/N"/, { token: 'string', next: '@string' }],
                [/"/, { token: 'string', next: '@string' }]
            ],
            string: [
                [/[^"]+/, 'string'],
                [/""/, 'string'],
                [/"/, { token: 'string', next: '@pop' }]
            ],
            complexIdentifiers: [
                [/\[/, { token: 'identifier.quote', next: '@bracketedIdentifier' }],
                [/'/, { token: 'identifier.quote', next: '@quotedIdentifier' }]
            ],
            bracketedIdentifier: [
                [/[^\]]+/, 'identifier'],
                [/]]/, 'identifier'],
                [/]/, { token: 'identifier.quote', next: '@pop' }]
            ],
            quotedIdentifier: [
                [/[^']+/, 'identifier'],
                [/''/, 'identifier'],
                [/'/, { token: 'identifier.quote', next: '@pop' }]
            ]
        }
    };
});
