HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/quadcode.com/node_modules/eslint-plugin-svelte/lib/rules/indent-helpers/es.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.defineVisitor = void 0;
const commons_1 = require("./commons");
const eslint_utils_1 = require("@eslint-community/eslint-utils");
const ast_utils_1 = require("../../utils/ast-utils");
function defineVisitor(context) {
    const { sourceCode, offsets, options } = context;
    function getRootLeft(node) {
        let target = node;
        let parent = (0, ast_utils_1.getParent)(target);
        while (parent &&
            (parent.type === "AssignmentExpression" ||
                parent.type === "AssignmentPattern" ||
                parent.type === "BinaryExpression" ||
                parent.type === "LogicalExpression")) {
            const prevToken = sourceCode.getTokenBefore(target);
            if (prevToken && (0, eslint_utils_1.isOpeningParenToken)(prevToken)) {
                break;
            }
            target = parent;
            parent = (0, ast_utils_1.getParent)(target);
        }
        return target.left;
    }
    const visitor = {
        Program(node) {
            for (const body of node.body) {
                if (body.type === "SvelteText" && !body.value.trim()) {
                    continue;
                }
                offsets.setStartOffsetToken(sourceCode.getFirstToken(body), 0);
            }
        },
        ArrayExpression(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const rightToken = sourceCode.getTokenAfter(node.elements[node.elements.length - 1] || firstToken, { filter: eslint_utils_1.isClosingBracketToken, includeComments: false });
            offsets.setOffsetElementList(node.elements, firstToken, rightToken, 1);
        },
        ArrayPattern(node) {
            visitor.ArrayExpression(node);
        },
        ArrowFunctionExpression(node) {
            const [firstToken, secondToken] = sourceCode.getFirstTokens(node, {
                count: 2,
                includeComments: false,
            });
            const leftToken = node.async ? secondToken : firstToken;
            const arrowToken = sourceCode.getTokenBefore(node.body, {
                filter: eslint_utils_1.isArrowToken,
                includeComments: false,
            });
            if (node.async) {
                offsets.setOffsetToken(secondToken, 1, firstToken);
            }
            if ((0, eslint_utils_1.isOpeningParenToken)(leftToken)) {
                const rightToken = sourceCode.getTokenAfter(node.params[node.params.length - 1] || leftToken, { filter: eslint_utils_1.isClosingParenToken, includeComments: false });
                offsets.setOffsetElementList(node.params, leftToken, rightToken, 1);
            }
            offsets.setOffsetToken(arrowToken, 1, firstToken);
            const bodyFirstToken = sourceCode.getFirstToken(node.body);
            offsets.setOffsetToken(bodyFirstToken, (0, eslint_utils_1.isOpeningBraceToken)(bodyFirstToken) ? 0 : 1, firstToken);
        },
        AssignmentExpression(node) {
            const leftNode = getRootLeft(node);
            const opToken = sourceCode.getTokenAfter(node.left, {
                filter: eslint_utils_1.isNotClosingParenToken,
                includeComments: false,
            });
            const rightToken = (0, commons_1.getFirstAndLastTokens)(sourceCode, node.right).firstToken;
            offsets.setOffsetToken([opToken, rightToken], 1, (0, commons_1.getFirstAndLastTokens)(sourceCode, leftNode).firstToken);
        },
        AssignmentPattern(node) {
            visitor.AssignmentExpression(node);
        },
        BinaryExpression(node) {
            visitor.AssignmentExpression(node);
        },
        LogicalExpression(node) {
            visitor.AssignmentExpression(node);
        },
        AwaitExpression(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const nextToken = sourceCode.getTokenAfter(firstToken);
            offsets.setOffsetToken(nextToken, 1, firstToken);
        },
        RestElement(node) {
            visitor.AwaitExpression(node);
        },
        SpreadElement(node) {
            visitor.AwaitExpression(node);
        },
        UnaryExpression(node) {
            visitor.AwaitExpression(node);
        },
        BlockStatement(node) {
            offsets.setOffsetElementList(node.body, sourceCode.getFirstToken(node), sourceCode.getLastToken(node), 1);
        },
        ClassBody(node) {
            visitor.BlockStatement(node);
        },
        BreakStatement(node) {
            if (node.label) {
                const firstToken = sourceCode.getFirstToken(node);
                const nextToken = sourceCode.getTokenAfter(firstToken);
                offsets.setOffsetToken(nextToken, 1, firstToken);
            }
        },
        ContinueStatement(node) {
            visitor.BreakStatement(node);
        },
        CallExpression(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const leftParenToken = sourceCode.getTokenAfter(node.typeParameters || node.callee, {
                filter: eslint_utils_1.isOpeningParenToken,
                includeComments: false,
            });
            const rightParenToken = sourceCode.getLastToken(node);
            if (node.typeParameters) {
                offsets.setOffsetToken(sourceCode.getFirstToken(node.typeParameters), 1, firstToken);
            }
            for (const optionalToken of sourceCode.getTokensBetween(sourceCode.getLastToken(node.typeParameters || node.callee), leftParenToken, { filter: isOptionalToken, includeComments: false })) {
                offsets.setOffsetToken(optionalToken, 1, firstToken);
            }
            offsets.setOffsetToken(leftParenToken, 1, firstToken);
            offsets.setOffsetElementList(node.arguments, leftParenToken, rightParenToken, 1);
        },
        CatchClause(node) {
            const catchToken = sourceCode.getFirstToken(node);
            if (node.param != null) {
                const leftParenToken = sourceCode.getTokenBefore(node.param);
                const rightParenToken = sourceCode.getTokenAfter(node.param);
                offsets.setOffsetToken(leftParenToken, 1, catchToken);
                offsets.setOffsetElementList([node.param], leftParenToken, rightParenToken, 1);
            }
            const bodyToken = sourceCode.getFirstToken(node.body);
            offsets.setOffsetToken(bodyToken, 0, catchToken);
        },
        ClassDeclaration(node) {
            const classToken = sourceCode.getFirstToken(node);
            if (node.id != null) {
                offsets.setOffsetToken(sourceCode.getFirstToken(node.id), 1, classToken);
            }
            if (node.superClass != null) {
                const extendsToken = sourceCode.getTokenBefore(node.superClass);
                const superClassToken = sourceCode.getTokenAfter(extendsToken);
                offsets.setOffsetToken(extendsToken, 1, classToken);
                offsets.setOffsetToken(superClassToken, 1, extendsToken);
            }
            const bodyToken = sourceCode.getFirstToken(node.body);
            offsets.setOffsetToken(bodyToken, 0, classToken);
        },
        ClassExpression(node) {
            visitor.ClassDeclaration(node);
        },
        ConditionalExpression(node) {
            const questionToken = sourceCode.getTokenAfter(node.test, {
                filter: eslint_utils_1.isNotClosingParenToken,
                includeComments: false,
            });
            const consequentToken = sourceCode.getTokenAfter(questionToken);
            const colonToken = sourceCode.getTokenAfter(node.consequent, {
                filter: eslint_utils_1.isNotClosingParenToken,
                includeComments: false,
            });
            const alternateToken = sourceCode.getTokenAfter(colonToken);
            let baseNode = node;
            let parent = (0, ast_utils_1.getParent)(baseNode);
            while (parent &&
                parent.type === "ConditionalExpression" &&
                parent.alternate === baseNode) {
                baseNode = parent;
                parent = (0, ast_utils_1.getParent)(baseNode);
            }
            const baseToken = sourceCode.getFirstToken(baseNode);
            offsets.setOffsetToken([questionToken, colonToken], 1, baseToken);
            offsets.setOffsetToken(consequentToken, 1, questionToken);
            offsets.setOffsetToken(alternateToken, 1, colonToken);
        },
        DoWhileStatement(node) {
            const doToken = sourceCode.getFirstToken(node);
            const whileToken = sourceCode.getTokenAfter(node.body, {
                filter: eslint_utils_1.isNotClosingParenToken,
                includeComments: false,
            });
            const leftParenToken = sourceCode.getTokenAfter(whileToken);
            const rightParenToken = sourceCode.getTokenAfter(node.test);
            const bodyFirstToken = sourceCode.getFirstToken(node.body);
            offsets.setOffsetToken(bodyFirstToken, (0, eslint_utils_1.isOpeningBraceToken)(bodyFirstToken) ? 0 : 1, doToken);
            offsets.setOffsetToken(whileToken, 0, doToken);
            offsets.setOffsetToken(leftParenToken, 1, whileToken);
            offsets.setOffsetElementList([node.test], leftParenToken, rightParenToken, 1);
        },
        ExportAllDeclaration(node) {
            const exportToken = sourceCode.getFirstToken(node);
            const tokens = sourceCode.getTokensBetween(exportToken, node.source);
            const fromIndex = tokens.findIndex((t) => t.value === "from");
            const fromToken = tokens[fromIndex];
            const beforeTokens = tokens.slice(0, fromIndex);
            const afterTokens = [
                ...tokens.slice(fromIndex + 1),
                sourceCode.getFirstToken(node.source),
            ];
            if (!node.exported) {
                offsets.setOffsetToken(beforeTokens, 1, exportToken);
            }
            else {
                const asIndex = beforeTokens.findIndex((t) => t.value === "as");
                offsets.setOffsetToken(beforeTokens.slice(0, asIndex), 1, exportToken);
                offsets.setOffsetToken(beforeTokens.slice(asIndex), 1, beforeTokens[asIndex - 1]);
            }
            offsets.setOffsetToken(fromToken, 0, exportToken);
            offsets.setOffsetToken(afterTokens, 1, fromToken);
            const lastToken = sourceCode.getLastToken(node, {
                filter: eslint_utils_1.isNotSemicolonToken,
                includeComments: false,
            });
            const assertionTokens = sourceCode.getTokensBetween(node.source, lastToken);
            if (assertionTokens.length) {
                const assertToken = assertionTokens.shift();
                offsets.setOffsetToken(assertToken, 0, exportToken);
                const assertionOpen = assertionTokens.shift();
                if (assertionOpen) {
                    offsets.setOffsetToken(assertionOpen, 1, assertToken);
                    offsets.setOffsetElementList(assertionTokens, assertionOpen, lastToken, 1);
                }
            }
        },
        ExportDefaultDeclaration(node) {
            const exportToken = sourceCode.getFirstToken(node);
            const declarationToken = (0, commons_1.getFirstAndLastTokens)(sourceCode, node.declaration).firstToken;
            const defaultTokens = sourceCode.getTokensBetween(exportToken, declarationToken);
            offsets.setOffsetToken([...defaultTokens, declarationToken], 1, exportToken);
        },
        ExportNamedDeclaration(node) {
            const exportToken = sourceCode.getFirstToken(node);
            if (node.declaration) {
                const declarationToken = sourceCode.getFirstToken(node.declaration);
                offsets.setOffsetToken(declarationToken, 1, exportToken);
            }
            else {
                const firstSpecifier = node.specifiers[0];
                if (!firstSpecifier || firstSpecifier.type === "ExportSpecifier") {
                    const leftBraceTokens = firstSpecifier
                        ? sourceCode.getTokensBetween(exportToken, firstSpecifier)
                        : [sourceCode.getTokenAfter(exportToken)];
                    const rightBraceToken = node.source
                        ? sourceCode.getTokenBefore(node.source, {
                            filter: eslint_utils_1.isClosingBraceToken,
                            includeComments: false,
                        })
                        : sourceCode.getLastToken(node, {
                            filter: eslint_utils_1.isClosingBraceToken,
                            includeComments: false,
                        });
                    offsets.setOffsetToken(leftBraceTokens, 0, exportToken);
                    offsets.setOffsetElementList(node.specifiers, leftBraceTokens[leftBraceTokens.length - 1], rightBraceToken, 1);
                    if (node.source) {
                        const [fromToken, ...tokens] = sourceCode.getTokensBetween(rightBraceToken, node.source);
                        offsets.setOffsetToken(fromToken, 0, exportToken);
                        offsets.setOffsetToken([...tokens, sourceCode.getFirstToken(node.source)], 1, fromToken);
                        const lastToken = sourceCode.getLastToken(node, {
                            filter: eslint_utils_1.isNotSemicolonToken,
                            includeComments: false,
                        });
                        const assertionTokens = sourceCode.getTokensBetween(node.source, lastToken);
                        if (assertionTokens.length) {
                            const assertToken = assertionTokens.shift();
                            offsets.setOffsetToken(assertToken, 0, exportToken);
                            const assertionOpen = assertionTokens.shift();
                            if (assertionOpen) {
                                offsets.setOffsetToken(assertionOpen, 1, assertToken);
                                offsets.setOffsetElementList(assertionTokens, assertionOpen, lastToken, 1);
                            }
                        }
                    }
                }
                else {
                }
            }
        },
        ExportSpecifier(node) {
            const tokens = sourceCode.getTokens(node);
            let firstToken = tokens.shift();
            if (firstToken.value === "type") {
                const typeToken = firstToken;
                firstToken = tokens.shift();
                offsets.setOffsetToken(firstToken, 0, typeToken);
            }
            offsets.setOffsetToken(tokens, 1, firstToken);
        },
        ForInStatement(node) {
            const forToken = sourceCode.getFirstToken(node);
            const awaitToken = (node.type === "ForOfStatement" &&
                node.await &&
                sourceCode.getTokenAfter(forToken)) ||
                null;
            const leftParenToken = sourceCode.getTokenAfter(awaitToken || forToken);
            const leftToken = sourceCode.getFirstToken(node.left);
            const inOrOfToken = sourceCode.getTokenAfter(node.left, {
                filter: eslint_utils_1.isNotClosingParenToken,
                includeComments: false,
            });
            const rightToken = sourceCode.getTokenAfter(inOrOfToken);
            const rightParenToken = sourceCode.getTokenBefore(node.body, {
                filter: eslint_utils_1.isNotOpeningParenToken,
                includeComments: false,
            });
            if (awaitToken != null) {
                offsets.setOffsetToken(awaitToken, 0, forToken);
            }
            offsets.setOffsetToken(leftParenToken, 1, forToken);
            offsets.setOffsetToken(leftToken, 1, leftParenToken);
            offsets.setOffsetToken([inOrOfToken, rightToken], 1, leftToken);
            offsets.setOffsetToken(rightParenToken, 0, leftParenToken);
            const bodyFirstToken = sourceCode.getFirstToken(node.body);
            offsets.setOffsetToken(bodyFirstToken, (0, eslint_utils_1.isOpeningBraceToken)(bodyFirstToken) ? 0 : 1, forToken);
        },
        ForOfStatement(node) {
            visitor.ForInStatement(node);
        },
        ForStatement(node) {
            const forToken = sourceCode.getFirstToken(node);
            const leftParenToken = sourceCode.getTokenAfter(forToken);
            const rightParenToken = sourceCode.getTokenBefore(node.body, {
                filter: eslint_utils_1.isNotOpeningParenToken,
                includeComments: false,
            });
            offsets.setOffsetToken(leftParenToken, 1, forToken);
            offsets.setOffsetElementList([node.init, node.test, node.update], leftParenToken, rightParenToken, 1);
            const bodyFirstToken = sourceCode.getFirstToken(node.body);
            offsets.setOffsetToken(bodyFirstToken, (0, eslint_utils_1.isOpeningBraceToken)(bodyFirstToken) ? 0 : 1, forToken);
        },
        FunctionDeclaration(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const leftParenToken = sourceCode.getTokenBefore(node.params[0] ||
                node.returnType ||
                sourceCode.getTokenBefore(node.body), {
                filter: eslint_utils_1.isOpeningParenToken,
                includeComments: false,
            });
            let bodyBaseToken = null;
            if (firstToken.type === "Punctuator") {
                bodyBaseToken = sourceCode.getFirstToken((0, ast_utils_1.getParent)(node));
            }
            else {
                let tokenOffset = 0;
                for (const token of sourceCode.getTokensBetween(firstToken, leftParenToken)) {
                    if (token.value === "<") {
                        break;
                    }
                    if (token.value === "*" ||
                        (node.id && token.range[0] === node.id.range[0])) {
                        tokenOffset = 1;
                    }
                    offsets.setOffsetToken(token, tokenOffset, firstToken);
                }
                bodyBaseToken = firstToken;
            }
            const rightParenToken = sourceCode.getTokenAfter(node.params[node.params.length - 1] || leftParenToken, { filter: eslint_utils_1.isClosingParenToken, includeComments: false });
            offsets.setOffsetToken(leftParenToken, 1, bodyBaseToken);
            offsets.setOffsetElementList(node.params, leftParenToken, rightParenToken, 1);
            const bodyToken = sourceCode.getFirstToken(node.body);
            offsets.setOffsetToken(bodyToken, 0, bodyBaseToken);
        },
        FunctionExpression(node) {
            visitor.FunctionDeclaration(node);
        },
        IfStatement(node) {
            const [ifToken, ifLeftParenToken] = sourceCode.getFirstTokens(node, {
                count: 2,
                includeComments: false,
            });
            const ifRightParenToken = sourceCode.getTokenBefore(node.consequent, {
                filter: eslint_utils_1.isClosingParenToken,
                includeComments: false,
            });
            offsets.setOffsetToken(ifLeftParenToken, 1, ifToken);
            offsets.setOffsetToken(ifRightParenToken, 0, ifLeftParenToken);
            const consequentFirstToken = sourceCode.getFirstToken(node.consequent);
            offsets.setOffsetToken(consequentFirstToken, (0, eslint_utils_1.isOpeningBraceToken)(consequentFirstToken) ? 0 : 1, ifToken);
            if (node.alternate != null) {
                const elseToken = sourceCode.getTokenAfter(node.consequent, {
                    filter: eslint_utils_1.isNotClosingParenToken,
                    includeComments: false,
                });
                offsets.setOffsetToken(elseToken, 0, ifToken);
                const alternateFirstToken = sourceCode.getFirstToken(node.alternate);
                offsets.setOffsetToken(alternateFirstToken, (0, eslint_utils_1.isOpeningBraceToken)(alternateFirstToken) ? 0 : 1, elseToken);
            }
        },
        ImportDeclaration(node) {
            const importToken = sourceCode.getFirstToken(node);
            const tokens = sourceCode.getTokensBetween(importToken, node.source);
            const fromIndex = tokens.map((t) => t.value).lastIndexOf("from");
            const { fromToken, beforeTokens, afterTokens } = fromIndex >= 0
                ? {
                    fromToken: tokens[fromIndex],
                    beforeTokens: tokens.slice(0, fromIndex),
                    afterTokens: [
                        ...tokens.slice(fromIndex + 1),
                        sourceCode.getFirstToken(node.source),
                    ],
                }
                : {
                    fromToken: null,
                    beforeTokens: [...tokens, sourceCode.getFirstToken(node.source)],
                    afterTokens: [],
                };
            const namedSpecifiers = [];
            for (const specifier of node.specifiers) {
                if (specifier.type === "ImportSpecifier") {
                    namedSpecifiers.push(specifier);
                }
                else {
                    const removeTokens = sourceCode.getTokens(specifier);
                    removeTokens.shift();
                    for (const token of removeTokens) {
                        const i = beforeTokens.indexOf(token);
                        if (i >= 0) {
                            beforeTokens.splice(i, 1);
                        }
                    }
                }
            }
            if (namedSpecifiers.length) {
                const leftBrace = sourceCode.getTokenBefore(namedSpecifiers[0]);
                const rightBrace = sourceCode.getTokenAfter(namedSpecifiers[namedSpecifiers.length - 1], { filter: eslint_utils_1.isClosingBraceToken, includeComments: false });
                offsets.setOffsetElementList(namedSpecifiers, leftBrace, rightBrace, 1);
                for (const token of [
                    ...sourceCode.getTokensBetween(leftBrace, rightBrace),
                    rightBrace,
                ]) {
                    const i = beforeTokens.indexOf(token);
                    if (i >= 0) {
                        beforeTokens.splice(i, 1);
                    }
                }
            }
            if (beforeTokens.every((t) => (0, eslint_utils_1.isOpeningBraceToken)(t) || (0, eslint_utils_1.isClosingBraceToken)(t))) {
                offsets.setOffsetToken(beforeTokens, 0, importToken);
            }
            else {
                offsets.setOffsetToken(beforeTokens, 1, importToken);
            }
            if (fromToken) {
                offsets.setOffsetToken(fromToken, 0, importToken);
                offsets.setOffsetToken(afterTokens, 1, fromToken);
            }
            const lastToken = sourceCode.getLastToken(node, {
                filter: eslint_utils_1.isNotSemicolonToken,
                includeComments: false,
            });
            const assertionTokens = sourceCode.getTokensBetween(node.source, lastToken);
            if (assertionTokens.length) {
                const assertToken = assertionTokens.shift();
                offsets.setOffsetToken(assertToken, 0, importToken);
                const assertionOpen = assertionTokens.shift();
                if (assertionOpen) {
                    offsets.setOffsetToken(assertionOpen, 1, assertToken);
                    offsets.setOffsetElementList(assertionTokens, assertionOpen, lastToken, 1);
                }
            }
        },
        ImportExpression(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const rightToken = sourceCode.getLastToken(node);
            const leftToken = sourceCode.getTokenAfter(firstToken, {
                filter: eslint_utils_1.isOpeningParenToken,
                includeComments: false,
            });
            offsets.setOffsetToken(leftToken, 1, firstToken);
            offsets.setOffsetElementList([node.source], leftToken, rightToken, 1);
        },
        ImportNamespaceSpecifier(node) {
            const tokens = sourceCode.getTokens(node);
            const firstToken = tokens.shift();
            offsets.setOffsetToken(tokens, 1, firstToken);
        },
        ImportSpecifier(node) {
            visitor.ExportSpecifier(node);
        },
        LabeledStatement(node) {
            const labelToken = sourceCode.getFirstToken(node);
            const colonToken = sourceCode.getTokenAfter(labelToken);
            const bodyToken = sourceCode.getTokenAfter(colonToken);
            offsets.setOffsetToken([colonToken, bodyToken], 1, labelToken);
        },
        SvelteReactiveStatement(node) {
            visitor.LabeledStatement(node);
        },
        MemberExpression(node) {
            const objectToken = sourceCode.getFirstToken(node);
            if (node.type === "MemberExpression" && node.computed) {
                const leftBracketToken = sourceCode.getTokenBefore(node.property, {
                    filter: eslint_utils_1.isOpeningBracketToken,
                    includeComments: false,
                });
                const rightBracketToken = sourceCode.getTokenAfter(node.property, {
                    filter: eslint_utils_1.isClosingBracketToken,
                    includeComments: false,
                });
                for (const optionalToken of sourceCode.getTokensBetween(sourceCode.getLastToken(node.object), leftBracketToken, { filter: isOptionalToken, includeComments: false })) {
                    offsets.setOffsetToken(optionalToken, 1, objectToken);
                }
                offsets.setOffsetToken(leftBracketToken, 1, objectToken);
                offsets.setOffsetElementList([node.property], leftBracketToken, rightBracketToken, 1);
            }
            else {
                const dotToken = sourceCode.getTokenBefore(node.property);
                const propertyToken = sourceCode.getTokenAfter(dotToken);
                offsets.setOffsetToken([dotToken, propertyToken], 1, objectToken);
            }
        },
        MetaProperty(node) {
            visitor.MemberExpression(node);
        },
        MethodDefinition(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const keyTokens = (0, commons_1.getFirstAndLastTokens)(sourceCode, node.key);
            const prefixTokens = sourceCode.getTokensBetween(firstToken, keyTokens.firstToken);
            if (node.computed) {
                prefixTokens.pop();
            }
            offsets.setOffsetToken(prefixTokens, 0, firstToken);
            let lastKeyToken;
            if (node.computed) {
                const leftBracketToken = sourceCode.getTokenBefore(keyTokens.firstToken);
                const rightBracketToken = (lastKeyToken = sourceCode.getTokenAfter(keyTokens.lastToken));
                offsets.setOffsetToken(leftBracketToken, 0, firstToken);
                offsets.setOffsetElementList([node.key], leftBracketToken, rightBracketToken, 1);
            }
            else {
                offsets.setOffsetToken(keyTokens.firstToken, 0, firstToken);
                lastKeyToken = keyTokens.lastToken;
            }
            if (node.value) {
                const initToken = sourceCode.getFirstToken(node.value);
                offsets.setOffsetToken([...sourceCode.getTokensBetween(lastKeyToken, initToken), initToken], 1, lastKeyToken);
            }
        },
        Property(node) {
            visitor.MethodDefinition(node);
        },
        NewExpression(node) {
            const newToken = sourceCode.getFirstToken(node);
            const calleeTokens = (0, commons_1.getFirstAndLastTokens)(sourceCode, node.callee);
            offsets.setOffsetToken(calleeTokens.firstToken, 1, newToken);
            if (node.typeParameters) {
                offsets.setOffsetToken(sourceCode.getFirstToken(node.typeParameters), 1, calleeTokens.firstToken);
            }
            const leftParenBefore = node.typeParameters || calleeTokens.lastToken;
            if (node.arguments.length || leftParenBefore.range[1] < node.range[1]) {
                const rightParenToken = sourceCode.getLastToken(node);
                const leftParenToken = sourceCode.getTokenAfter(leftParenBefore);
                offsets.setOffsetToken(leftParenToken, 1, calleeTokens.firstToken);
                offsets.setOffsetElementList(node.arguments, leftParenToken, rightParenToken, 1);
            }
        },
        ObjectExpression(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const rightToken = sourceCode.getTokenAfter(node.properties[node.properties.length - 1] || firstToken, { filter: eslint_utils_1.isClosingBraceToken, includeComments: false });
            offsets.setOffsetElementList(node.properties, firstToken, rightToken, 1);
        },
        ObjectPattern(node) {
            visitor.ObjectExpression(node);
        },
        PropertyDefinition(node) {
            visitor.MethodDefinition(node);
        },
        ReturnStatement(node) {
            if (node.argument) {
                const firstToken = sourceCode.getFirstToken(node);
                const nextToken = sourceCode.getTokenAfter(firstToken);
                offsets.setOffsetToken(nextToken, 1, firstToken);
            }
        },
        ThrowStatement(node) {
            visitor.ReturnStatement(node);
        },
        SequenceExpression(node) {
            const firstToken = sourceCode.getFirstToken(node);
            offsets.setOffsetElementList(node.expressions, firstToken, null, 0);
        },
        SwitchCase(node) {
            const caseToken = sourceCode.getFirstToken(node);
            if (node.test != null) {
                const testTokens = (0, commons_1.getFirstAndLastTokens)(sourceCode, node.test);
                const colonToken = sourceCode.getTokenAfter(testTokens.lastToken);
                offsets.setOffsetToken([testTokens.firstToken, colonToken], 1, caseToken);
            }
            else {
                const colonToken = sourceCode.getTokenAfter(caseToken);
                offsets.setOffsetToken(colonToken, 1, caseToken);
            }
            if (node.consequent.length === 1 &&
                node.consequent[0].type === "BlockStatement") {
                offsets.setOffsetToken(sourceCode.getFirstToken(node.consequent[0]), 0, caseToken);
            }
            else {
                for (const statement of node.consequent) {
                    offsets.setOffsetToken((0, commons_1.getFirstAndLastTokens)(sourceCode, statement).firstToken, 1, caseToken);
                }
            }
        },
        SwitchStatement(node) {
            const switchToken = sourceCode.getFirstToken(node);
            const { firstToken: leftParenToken, lastToken: rightParenToken } = (0, commons_1.getFirstAndLastTokens)(sourceCode, node.discriminant);
            const leftBraceToken = sourceCode.getTokenAfter(rightParenToken);
            const rightBraceToken = sourceCode.getLastToken(node);
            offsets.setOffsetToken(leftParenToken, 1, switchToken);
            offsets.setOffsetElementList([node.discriminant], leftParenToken, rightParenToken, 1);
            offsets.setOffsetToken(leftBraceToken, 0, switchToken);
            offsets.setOffsetElementList(node.cases, leftBraceToken, rightBraceToken, options.switchCase);
        },
        TaggedTemplateExpression(node) {
            const tagTokens = (0, commons_1.getFirstAndLastTokens)(sourceCode, node.tag);
            offsets.setOffsetToken(sourceCode.getFirstToken(node.quasi), 1, tagTokens.firstToken);
        },
        TemplateLiteral(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const quasiTokens = node.quasis
                .slice(1)
                .map((n) => sourceCode.getFirstToken(n));
            const expressionToken = node.quasis
                .slice(0, -1)
                .map((n) => sourceCode.getTokenAfter(n));
            offsets.setOffsetToken(quasiTokens, 0, firstToken);
            offsets.setOffsetToken(expressionToken, 1, firstToken);
        },
        TryStatement(node) {
            const tryToken = sourceCode.getFirstToken(node);
            const tryBlockToken = sourceCode.getFirstToken(node.block);
            offsets.setOffsetToken(tryBlockToken, 0, tryToken);
            if (node.handler != null) {
                const catchToken = sourceCode.getFirstToken(node.handler);
                offsets.setOffsetToken(catchToken, 0, tryToken);
            }
            if (node.finalizer != null) {
                const finallyToken = sourceCode.getTokenBefore(node.finalizer);
                const finallyBlockToken = sourceCode.getFirstToken(node.finalizer);
                offsets.setOffsetToken([finallyToken, finallyBlockToken], 0, tryToken);
            }
        },
        UpdateExpression(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const nextToken = sourceCode.getTokenAfter(firstToken);
            offsets.setOffsetToken(nextToken, 1, firstToken);
        },
        VariableDeclaration(node) {
            offsets.setOffsetElementList(node.declarations, sourceCode.getFirstToken(node), null, 1);
        },
        VariableDeclarator(node) {
            if (node.init != null) {
                const idToken = sourceCode.getFirstToken(node);
                const eqToken = sourceCode.getTokenAfter(node.id);
                const initToken = sourceCode.getTokenAfter(eqToken);
                offsets.setOffsetToken([eqToken, initToken], 1, idToken);
            }
        },
        WhileStatement(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const leftParenToken = sourceCode.getTokenAfter(firstToken);
            const rightParenToken = sourceCode.getTokenBefore(node.body, {
                filter: eslint_utils_1.isClosingParenToken,
                includeComments: false,
            });
            offsets.setOffsetToken(leftParenToken, 1, firstToken);
            offsets.setOffsetToken(rightParenToken, 0, leftParenToken);
            const bodyFirstToken = sourceCode.getFirstToken(node.body);
            offsets.setOffsetToken(bodyFirstToken, (0, eslint_utils_1.isOpeningBraceToken)(bodyFirstToken) ? 0 : 1, firstToken);
        },
        WithStatement(node) {
            visitor.WhileStatement(node);
        },
        YieldExpression(node) {
            if (node.argument != null) {
                const [yieldToken, secondToken] = sourceCode.getFirstTokens(node, {
                    count: 2,
                    includeComments: false,
                });
                offsets.setOffsetToken(secondToken, 1, yieldToken);
                if (node.delegate) {
                    offsets.setOffsetToken(sourceCode.getTokenAfter(secondToken), 1, yieldToken);
                }
            }
        },
        DebuggerStatement() {
        },
        Identifier() {
        },
        ImportDefaultSpecifier() {
        },
        Literal() {
        },
        PrivateIdentifier() {
        },
        Super() {
        },
        TemplateElement() {
        },
        ThisExpression() {
        },
        ExpressionStatement() {
        },
        ChainExpression() {
        },
        EmptyStatement() {
        },
    };
    const commonVisitor = {
        ":statement, PropertyDefinition"(node) {
            const firstToken = sourceCode.getFirstToken(node);
            const lastToken = sourceCode.getLastToken(node);
            if ((0, eslint_utils_1.isSemicolonToken)(lastToken) && firstToken !== lastToken) {
                const next = sourceCode.getTokenAfter(lastToken);
                if (!next || lastToken.loc.start.line < next.loc.start.line) {
                    offsets.setOffsetToken(lastToken, 0, firstToken);
                }
            }
        },
        ":expression"(node) {
            let leftToken = sourceCode.getTokenBefore(node);
            let rightToken = sourceCode.getTokenAfter(node);
            let firstToken = sourceCode.getFirstToken(node);
            while (leftToken &&
                (0, eslint_utils_1.isOpeningParenToken)(leftToken) &&
                rightToken &&
                (0, eslint_utils_1.isClosingParenToken)(rightToken)) {
                offsets.setOffsetToken(firstToken, 1, leftToken);
                offsets.setOffsetToken(rightToken, 0, leftToken);
                firstToken = leftToken;
                leftToken = sourceCode.getTokenBefore(leftToken);
                rightToken = sourceCode.getTokenAfter(rightToken);
            }
        },
    };
    const v = visitor;
    return {
        ...v,
        ...commonVisitor,
    };
}
exports.defineVisitor = defineVisitor;
function isOptionalToken(token) {
    return token.type === "Punctuator" && token.value === "?.";
}