Как включить многострочное сопоставление в пользовательском провайдере токенов - PullRequest
1 голос
/ 07 мая 2020

У меня есть собственный токенизатор Monarch для имен функций в Monaco, который хорошо работает, когда открытый парен появляется в той же строке:

image

Но токенизатор не может правильно идентифицировать имя функции, если открытая скобка отображается в отдельной строке:

image

Обратите внимание, что функция foo в строке 1 выделена правильно, но токенизатор теряется, когда дело доходит до функция foo в строке 5, поэтому она выделяет ее как «недопустимую» (по умолчанию). ( Для дальтоников, извините за зеленый / красный цвет ... это тема по умолчанию. )

Токенизатор использует регулярные выражения, но похоже, что я ничего не могу сделать, чтобы заставить регулярное выражение должно охватывать больше, чем текущая строка. Есть ли способ указать токенизатору Монако использовать многострочное сопоставление, или это просто известное ограничение? Я не могу найти ни одного упоминания об этом в документации , так или иначе.

Вот простая реплика, которую вы можете скопировать / вставить в Monaco Editor Playground :

// Register a new language
monaco.languages.register({ id: 'mySpecialLanguage' });

// Register a tokens provider for the language
monaco.languages.setMonarchTokensProvider('mySpecialLanguage', {
    defaultToken: "invalid",
    tokenizer: {
        root: [
            [
                /(foo)([\s\n\r]*)([(])/,
                ["type.function", "", "@brackets"],
            ],

            [
                /"/,
                {
                    token: "string.quote",
                    bracket: "@open",
                    next: "@string",
                },
            ],

            [
                /[()\[\]]/,
                "@brackets",
            ],
        ],

        string: [
            [
                /[^"]+/,
                "string",
            ],
            [
                /"/,
                {
                    token: "string.quote",
                    bracket: "@close",
                    next: "@pop",
                },
            ],
        ],
    }
});

monaco.editor.create(document.getElementById("container"), {
    theme: 'vs',
    value: 'foo\t(\n\t\t"bar"\n\t)\n\nfoo\n\t(\n\t\t"bar"\n\t)\n',
    language: 'mySpecialLanguage'
});
...