Я поддерживаю расширение отладчика 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
- это массив, но мы не знаем его размера и не должны с нетерпением искать его размер, потому что для этого требуется отдельная команда, которая замедлит весь процесс отладки.
Далее на панели просмотра VSCode пользователь раскрывает свойство employeeNames
и vscode вызывает variableRequest . Мое расширение отладки запускает команду telnet print business.employeeNames
и возвращает следующее:
<Component: roArray> =
[
"Michael"
"Jim"
"Pam"
"Dwight"
]
На данный момент я хочу обновить employeeNames
type, чтобы показать количество массивов, например так:
Вот 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, что переменная на панели наблюдения изменилась и должна быть обновлена?