Расширение VS Code, как редактировать в контексте?

Это тот класс, который я использую автоматически с заглавными буквами true, false, ...

export class StUpdater {
    private _lines: number;
    private _strings: Array<string>;

    constructor() {
        this._lines = 0;
        this._strings = ['true', 'false', 'exit', 'continue', 'return'];
    }

    Update(Cntx: boolean = false) {
        let editor = window.activeTextEditor;
        if (!editor || (editor.document.languageId != 'st')) {
            window.showErrorMessage('No editor!')
            return;
        }

        let doc = editor.document;

        if (Cntx == false) {
            if (this._lines >= doc.lineCount) {
                this._lines = doc.lineCount;
                return;
            }
            this._lines = doc.lineCount;

            let AutoFormat = workspace.getConfiguration('st').get('autoFormat');

            if (!AutoFormat) {
                return;
            }
        }


        let edit = new WorkspaceEdit();

        for (let line = 0; line < doc.lineCount; line++) {
            const element = doc.lineAt(line);
            for (let i = 0; i < this._strings.length; i++) {
                let str = this._strings[i];
                let last_char = 0;
                while (element.text.indexOf(str, last_char) >= 0) {
                    let char = element.text.indexOf(str, last_char);
                    last_char = char + str.length;
                    edit.replace(
                        doc.uri,
                        new Range(
                            new Position(line, char),
                            new Position(line, last_char)
                        ),
                        str.toUpperCase()
                    );
                }
            }
        }

        return workspace.applyEdit(edit);
    }

    public dispose() {

    }
}

Этот код работает нормально, но я не хочу заменять его внутри строки или комментария. Как я могу это сделать? Я не могу найти предварительную версию replace, и даже если я найду, в одной строке я не знаю, является ли это комментарием или нет, если это многострочный комментарий.


person Sergey Romanov    schedule 16.05.2018    source источник


Ответы (1)


Если я правильно вас понял, вы хотите использовать только определенные элементы (возможно, идентификаторы), но не слова в комментариях или строках, правильно? Для этого необходимо идентифицировать лексические элементы в тексте, которые представляют собой отображение диапазона букв в лексический тип. Обычно это выполняется лексером. Нетрудно написать один вручную, который перебирает символы поверх текущей обработки и находит те диапазоны, которыми можно манипулировать.

person Mike Lischke    schedule 17.05.2018
comment
Это едва ли ответ на мой вопрос. У меня есть точный пример того, что есть сейчас. Если я буду анализировать документ как текст и использовать стандартные функции JS, я не думаю, что у меня возникнут проблемы. Я хочу использовать VS Code API или Formatter API для этого. - person Sergey Romanov; 18.05.2018
comment
Вы не упомянули об этом в своем вопросе. Тогда я думаю, для тебя нет решения. AFAIK не существует API-интерфейсов, которые могут использоваться расширением для получения лексической информации для текста. - person Mike Lischke; 18.05.2018