Обновление / обновление объекта в панели наблюдения VSCode программно с сервера отладки - PullRequest
1 голос
/ 09 июля 2019

Я поддерживаю расширение отладчика VSCode для языка RoScript BrightScript. Roku не имеет формального протокола отладки, поэтому мой отладчик использует утилиту командной строки telnet для выдачи различных команд отладки (таких как переменная печати, продолжение, шаг и т. Д.). Поскольку Roku является сетевым устройством, и мы выполняем синтаксический анализ строк, каждая команда выполняется довольно медленно по сравнению с отладкой программ на компьютере, таких как узел или C #. Поэтому мы стараемся загружать данные лениво, а не загружать их по возможности.

Возьмите этот объект, например:

business = {
    employeeNames: ["Michael", "Jim", "Pam", "Dwight"],
    name: "Dunder Mifflin Paper Company"
}

Когда пользователь добавляет business на панель часов, vscode выдает valuRequest для "business". За кулисами я запускаю команду telnet print business, которая возвращает следующее:

<Component: roAssociativeArray> =
{
    employeeNames: <Component: roArray>
    name: "Dunder Mifflin Paper Company"
}

На данный момент мы знаем, что employeeNames - это массив, но мы не знаем его размера и не должны с нетерпением искать его размер, потому что для этого требуется отдельная команда, которая замедлит весь процесс отладки.

enter image description here

Далее на панели просмотра VSCode пользователь раскрывает свойство employeeNames и vscode вызывает variableRequest . Мое расширение отладки запускает команду telnet print business.employeeNames и возвращает следующее:

<Component: roArray> =
[
    "Michael"
    "Jim"
    "Pam"
    "Dwight"
]

На данный момент я хочу обновить employeeNames type, чтобы показать количество массивов, например так: enter image description here

Вот DebugProtocol.Variable, который я бы изменил в расширении отладки ... но я не знаю, как отправить это в VSCode, когда VSCode не запрашивал обновления для этой переменной.

//hardcoded for the sake of this question...is dynamic in actual code
var variableName = "business.employeeNames"
var arrayValues= getArrayValues(variableName); // ["Michael", "Jim", "Pam", "Dwight"]
let variable: DebugProtocol.Variable = {
    name: "employeeNames";
    evaluateName: "business.employeeNames";
    type: `roArray (${arrayValues})`;
    value: arrayValues;
    children: [];
}

Я пытался обмануть vscode, чтобы он перезапрашивал все, но VSCode не запрашивал новые переменные, потому что он был достаточно умен, чтобы понять, что StoppedEvent находится в том же месте, где он был ранее остановлен.

//send a continue
this.sendEvent(new ContinuedEvent(0, true));
//wait a short time
setTimeout(()=>{
    //send a stopped event
    this.sendEvent(new StoppedEvent('exception', threadId, exception.message));
}, 10);

Как автор отладочного расширения, из кода расширения отладки, как мне сообщить VSCode, что переменная на панели наблюдения изменилась и должна быть обновлена?

...