roku-debug 0.23.10 → 0.23.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/adapters/DebugProtocolAdapter.d.ts +3 -0
- package/dist/adapters/DebugProtocolAdapter.js +4 -1
- package/dist/adapters/DebugProtocolAdapter.js.map +1 -1
- package/dist/adapters/TelnetAdapter.d.ts +3 -0
- package/dist/adapters/TelnetAdapter.js.map +1 -1
- package/dist/debugProtocol/client/DebugProtocolClient.js +4 -1
- package/dist/debugProtocol/client/DebugProtocolClient.js.map +1 -1
- package/dist/debugProtocol/client/ProtocolCapabilities.d.ts +5 -0
- package/dist/debugProtocol/client/ProtocolCapabilities.js +7 -0
- package/dist/debugProtocol/client/ProtocolCapabilities.js.map +1 -1
- package/dist/debugProtocol/events/requests/ThreadsRequest.d.ts +9 -0
- package/dist/debugProtocol/events/requests/ThreadsRequest.js +24 -2
- package/dist/debugProtocol/events/requests/ThreadsRequest.js.map +1 -1
- package/dist/debugProtocol/events/responses/ThreadsResponse.d.ts +12 -0
- package/dist/debugProtocol/events/responses/ThreadsResponse.js +21 -4
- package/dist/debugProtocol/events/responses/ThreadsResponse.js.map +1 -1
- package/dist/debugSession/BrightScriptDebugSession.d.ts +7 -0
- package/dist/debugSession/BrightScriptDebugSession.js +57 -14
- package/dist/debugSession/BrightScriptDebugSession.js.map +1 -1
- package/dist/managers/BreakpointManager.d.ts +98 -3
- package/dist/managers/BreakpointManager.js +239 -13
- package/dist/managers/BreakpointManager.js.map +1 -1
- package/dist/managers/ProjectManager.d.ts +15 -0
- package/dist/managers/ProjectManager.js +68 -16
- package/dist/managers/ProjectManager.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ThreadsRequest = void 0;
|
|
3
|
+
exports.ThreadRequestFlags = exports.ThreadsRequest = void 0;
|
|
4
|
+
/* eslint-disable no-bitwise */
|
|
4
5
|
const smart_buffer_1 = require("smart-buffer");
|
|
5
6
|
const Constants_1 = require("../../Constants");
|
|
6
7
|
const ProtocolUtil_1 = require("../../ProtocolUtil");
|
|
@@ -12,29 +13,50 @@ class ThreadsRequest {
|
|
|
12
13
|
*/
|
|
13
14
|
this.readOffset = undefined;
|
|
14
15
|
this.data = {
|
|
15
|
-
//common props
|
|
16
16
|
packetLength: undefined,
|
|
17
17
|
requestId: undefined,
|
|
18
18
|
command: Constants_1.Command.Threads
|
|
19
19
|
};
|
|
20
20
|
}
|
|
21
21
|
static fromJson(data) {
|
|
22
|
+
var _a;
|
|
23
|
+
var _b;
|
|
22
24
|
const request = new ThreadsRequest();
|
|
23
25
|
ProtocolUtil_1.protocolUtil.loadJson(request, data);
|
|
26
|
+
//default any missing value to false
|
|
27
|
+
(_a = (_b = request.data).includeIdentityInfo) !== null && _a !== void 0 ? _a : (_b.includeIdentityInfo = false);
|
|
24
28
|
return request;
|
|
25
29
|
}
|
|
26
30
|
static fromBuffer(buffer) {
|
|
27
31
|
const request = new ThreadsRequest();
|
|
28
32
|
ProtocolUtil_1.protocolUtil.bufferLoaderHelper(request, buffer, 12, (smartBuffer) => {
|
|
29
33
|
ProtocolUtil_1.protocolUtil.loadCommonRequestFields(request, smartBuffer);
|
|
34
|
+
//the flags field is only present on firmware that supports it; older firmware omits it entirely
|
|
35
|
+
if (smartBuffer.remaining() >= 4) {
|
|
36
|
+
const threadsRequestFlags = smartBuffer.readUInt32LE(); // threads_request_flags
|
|
37
|
+
request.data.includeIdentityInfo = !!(threadsRequestFlags & ThreadRequestFlags.includeIdentityInfo);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
request.data.includeIdentityInfo = false;
|
|
41
|
+
}
|
|
30
42
|
});
|
|
31
43
|
return request;
|
|
32
44
|
}
|
|
33
45
|
toBuffer() {
|
|
34
46
|
const smartBuffer = new smart_buffer_1.SmartBuffer();
|
|
47
|
+
//older firmware doesn't expect the flags field at all, so we only include it when configured.
|
|
48
|
+
if (this.data.includeIdentityInfo) {
|
|
49
|
+
let threadsRequestFlags = 0;
|
|
50
|
+
threadsRequestFlags |= this.data.includeIdentityInfo ? ThreadRequestFlags.includeIdentityInfo : 0;
|
|
51
|
+
smartBuffer.writeUInt32LE(threadsRequestFlags); // threads_request_flags
|
|
52
|
+
}
|
|
35
53
|
ProtocolUtil_1.protocolUtil.insertCommonRequestFields(this, smartBuffer);
|
|
36
54
|
return smartBuffer.toBuffer();
|
|
37
55
|
}
|
|
38
56
|
}
|
|
39
57
|
exports.ThreadsRequest = ThreadsRequest;
|
|
58
|
+
var ThreadRequestFlags;
|
|
59
|
+
(function (ThreadRequestFlags) {
|
|
60
|
+
ThreadRequestFlags[ThreadRequestFlags["includeIdentityInfo"] = 1] = "includeIdentityInfo";
|
|
61
|
+
})(ThreadRequestFlags = exports.ThreadRequestFlags || (exports.ThreadRequestFlags = {}));
|
|
40
62
|
//# sourceMappingURL=ThreadsRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadsRequest.js","sourceRoot":"","sources":["../../../../src/debugProtocol/events/requests/ThreadsRequest.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAC3C,+CAA0C;AAC1C,qDAAkD;AAGlD,MAAa,cAAc;IAA3B;
|
|
1
|
+
{"version":3,"file":"ThreadsRequest.js","sourceRoot":"","sources":["../../../../src/debugProtocol/events/requests/ThreadsRequest.ts"],"names":[],"mappings":";;;AAAA,+BAA+B;AAC/B,+CAA2C;AAC3C,+CAA0C;AAC1C,qDAAkD;AAGlD,MAAa,cAAc;IAA3B;QAqCW,YAAO,GAAG,KAAK,CAAC;QACvB;;WAEG;QACI,eAAU,GAAW,SAAS,CAAC;QAE/B,SAAI,GASP;YACI,YAAY,EAAE,SAAmB;YACjC,SAAS,EAAE,SAAmB;YAC9B,OAAO,EAAE,mBAAO,CAAC,OAAO;SAC3B,CAAC;IACV,CAAC;IAvDU,MAAM,CAAC,QAAQ,CAAC,IAA0D;;;QAC7E,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QACrC,2BAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrC,oCAAoC;QACpC,YAAA,OAAO,CAAC,IAAI,EAAC,mBAAmB,uCAAnB,mBAAmB,GAAK,KAAK,EAAC;QAC3C,OAAO,OAAO,CAAC;IACnB,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,MAAc;QACnC,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;QACrC,2BAAY,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE;YACjE,2BAAY,CAAC,uBAAuB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAC3D,gGAAgG;YAChG,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;gBAC9B,MAAM,mBAAmB,GAAG,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,wBAAwB;gBAChF,OAAO,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,mBAAmB,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;aACvG;iBAAM;gBACH,OAAO,CAAC,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;aAC5C;QACL,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACnB,CAAC;IAEM,QAAQ;QACX,MAAM,WAAW,GAAG,IAAI,0BAAW,EAAE,CAAC;QACtC,8FAA8F;QAC9F,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC/B,IAAI,mBAAmB,GAAG,CAAC,CAAC;YAC5B,mBAAmB,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;YAClG,WAAW,CAAC,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,wBAAwB;SAC3E;QACD,2BAAY,CAAC,yBAAyB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC1D,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;CAsBJ;AAzDD,wCAyDC;AAED,IAAY,kBAEX;AAFD,WAAY,kBAAkB;IAC1B,yFAA4B,CAAA;AAChC,CAAC,EAFW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAE7B"}
|
|
@@ -56,4 +56,16 @@ export interface ThreadInfo {
|
|
|
56
56
|
* The code causing the stop or failure.
|
|
57
57
|
*/
|
|
58
58
|
codeSnippet: string;
|
|
59
|
+
/**
|
|
60
|
+
* The ID of the thread (optional for debug protocol version ).
|
|
61
|
+
*/
|
|
62
|
+
osThreadId?: string;
|
|
63
|
+
/**
|
|
64
|
+
* The name of the thread (optional).
|
|
65
|
+
*/
|
|
66
|
+
name?: string;
|
|
67
|
+
/**
|
|
68
|
+
* The type of the thread (optional).
|
|
69
|
+
*/
|
|
70
|
+
type?: string;
|
|
59
71
|
}
|
|
@@ -42,25 +42,33 @@ class ThreadsResponse {
|
|
|
42
42
|
const flags = smartBuffer.readUInt8();
|
|
43
43
|
thread.isPrimary = (flags & ThreadInfoFlags.isPrimary) > 0;
|
|
44
44
|
thread.isDetached = (flags & ThreadInfoFlags.isDetached) > 0;
|
|
45
|
+
const includesIdentityInfo = (flags & ThreadInfoFlags.includesIdentityInfo) > 0;
|
|
45
46
|
thread.stopReason = Constants_1.StopReasonCode[smartBuffer.readUInt32LE()]; // stop_reason
|
|
46
47
|
thread.stopReasonDetail = ProtocolUtil_1.protocolUtil.readStringNT(smartBuffer); // stop_reason_detail
|
|
47
48
|
thread.lineNumber = smartBuffer.readUInt32LE(); // line_number
|
|
48
49
|
thread.functionName = ProtocolUtil_1.protocolUtil.readStringNT(smartBuffer); // function_name
|
|
49
50
|
thread.filePath = ProtocolUtil_1.protocolUtil.readStringNT(smartBuffer); // file_path
|
|
50
51
|
thread.codeSnippet = ProtocolUtil_1.protocolUtil.readStringNT(smartBuffer); // code_snippet
|
|
52
|
+
if (includesIdentityInfo) {
|
|
53
|
+
thread.osThreadId = ProtocolUtil_1.protocolUtil.readStringNT(smartBuffer); // id
|
|
54
|
+
thread.name = ProtocolUtil_1.protocolUtil.readStringNT(smartBuffer); // name
|
|
55
|
+
thread.type = ProtocolUtil_1.protocolUtil.readStringNT(smartBuffer); // type
|
|
56
|
+
}
|
|
51
57
|
response.data.threads.push(thread);
|
|
52
58
|
}
|
|
53
59
|
});
|
|
54
60
|
return response;
|
|
55
61
|
}
|
|
56
62
|
toBuffer() {
|
|
57
|
-
var _a, _b, _c;
|
|
63
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
58
64
|
const smartBuffer = new smart_buffer_1.SmartBuffer();
|
|
59
65
|
smartBuffer.writeUInt32LE((_b = (_a = this.data.threads) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0); // threads_count
|
|
60
|
-
|
|
66
|
+
const includesIdentityInfo = (_d = (_c = this.data.threads) === null || _c === void 0 ? void 0 : _c.some(t => t.osThreadId || t.name || t.type)) !== null && _d !== void 0 ? _d : false;
|
|
67
|
+
for (const thread of (_e = this.data.threads) !== null && _e !== void 0 ? _e : []) {
|
|
61
68
|
let flags = 0;
|
|
62
|
-
flags |= thread.isPrimary ?
|
|
63
|
-
flags |= thread.isDetached ?
|
|
69
|
+
flags |= thread.isPrimary ? ThreadInfoFlags.isPrimary : 0;
|
|
70
|
+
flags |= thread.isDetached ? ThreadInfoFlags.isDetached : 0;
|
|
71
|
+
flags |= includesIdentityInfo ? ThreadInfoFlags.includesIdentityInfo : 0;
|
|
64
72
|
smartBuffer.writeUInt8(flags); //flags
|
|
65
73
|
//stop_reason is an 8-bit value (same as the other locations in this protocol); however, it is sent in this response as a 32bit value for historical purposes
|
|
66
74
|
smartBuffer.writeUInt32LE(Constants_1.StopReasonCode[thread.stopReason]); // stop_reason
|
|
@@ -69,6 +77,11 @@ class ThreadsResponse {
|
|
|
69
77
|
smartBuffer.writeStringNT(thread.functionName); // function_name
|
|
70
78
|
smartBuffer.writeStringNT(thread.filePath); // file_path
|
|
71
79
|
smartBuffer.writeStringNT(thread.codeSnippet); // code_snippet
|
|
80
|
+
if (includesIdentityInfo) {
|
|
81
|
+
smartBuffer.writeStringNT((_f = thread.osThreadId) !== null && _f !== void 0 ? _f : '');
|
|
82
|
+
smartBuffer.writeStringNT((_g = thread.name) !== null && _g !== void 0 ? _g : '');
|
|
83
|
+
smartBuffer.writeStringNT((_h = thread.type) !== null && _h !== void 0 ? _h : '');
|
|
84
|
+
}
|
|
72
85
|
}
|
|
73
86
|
ProtocolUtil_1.protocolUtil.insertCommonResponseFields(this, smartBuffer);
|
|
74
87
|
return smartBuffer.toBuffer();
|
|
@@ -79,5 +92,9 @@ var ThreadInfoFlags;
|
|
|
79
92
|
(function (ThreadInfoFlags) {
|
|
80
93
|
ThreadInfoFlags[ThreadInfoFlags["isPrimary"] = 1] = "isPrimary";
|
|
81
94
|
ThreadInfoFlags[ThreadInfoFlags["isDetached"] = 2] = "isDetached";
|
|
95
|
+
/**
|
|
96
|
+
* Does the response include the optional identity info fields (id, name, type)?
|
|
97
|
+
*/
|
|
98
|
+
ThreadInfoFlags[ThreadInfoFlags["includesIdentityInfo"] = 4] = "includesIdentityInfo";
|
|
82
99
|
})(ThreadInfoFlags || (ThreadInfoFlags = {}));
|
|
83
100
|
//# sourceMappingURL=ThreadsResponse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadsResponse.js","sourceRoot":"","sources":["../../../../src/debugProtocol/events/responses/ThreadsResponse.ts"],"names":[],"mappings":";;;AAAA,+BAA+B;AAC/B,+CAA2C;AAE3C,+CAA4D;AAC5D,qDAAkD;AAElD,MAAa,eAAe;IAA5B;
|
|
1
|
+
{"version":3,"file":"ThreadsResponse.js","sourceRoot":"","sources":["../../../../src/debugProtocol/events/responses/ThreadsResponse.ts"],"names":[],"mappings":"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"}
|
|
@@ -178,6 +178,13 @@ export declare class BrightScriptDebugSession extends LoggingDebugSession {
|
|
|
178
178
|
setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments): Promise<void>;
|
|
179
179
|
protected exceptionInfoRequest(response: DebugProtocol.ExceptionInfoResponse, args: DebugProtocol.ExceptionInfoArguments): void;
|
|
180
180
|
protected threadsRequest(response: DebugProtocol.ThreadsResponse): Promise<void>;
|
|
181
|
+
/**
|
|
182
|
+
* Get the thread name to display in the UI based on the thread info we have.
|
|
183
|
+
* This is what displays in the `call stack` region in vscode
|
|
184
|
+
* @param thread
|
|
185
|
+
* @returns
|
|
186
|
+
*/
|
|
187
|
+
private getThreadName;
|
|
181
188
|
protected stackTraceRequest(response: DebugProtocol.StackTraceResponse, args: DebugProtocol.StackTraceArguments): Promise<void>;
|
|
182
189
|
protected scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments): Promise<void>;
|
|
183
190
|
protected continueRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): Promise<void>;
|
|
@@ -680,7 +680,7 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
680
680
|
* Activate all required functionality for profiling
|
|
681
681
|
*/
|
|
682
682
|
async initializeProfiling() {
|
|
683
|
-
var _a, _b, _c, _d, _e;
|
|
683
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
684
684
|
// Initialize PerfettoManager
|
|
685
685
|
this.perfettoManager = new PerfettoManager_1.PerfettoManager({
|
|
686
686
|
host: this.launchConfiguration.host,
|
|
@@ -724,6 +724,13 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
724
724
|
else if (((_e = (_d = this.launchConfiguration.profiling) === null || _d === void 0 ? void 0 : _d.tracing) === null || _e === void 0 ? void 0 : _e.enable) === false && this.supportsPerfettoTracing) {
|
|
725
725
|
this.logger.info('Disabling perfetto tracing because it is disabled in the launch configuration');
|
|
726
726
|
//TODO implement a way to disable perfetto tracing on the device
|
|
727
|
+
//tracing was requested but the device firmware does not meet the minimum requirement
|
|
728
|
+
}
|
|
729
|
+
else if (((_g = (_f = this.launchConfiguration.profiling) === null || _f === void 0 ? void 0 : _f.tracing) === null || _g === void 0 ? void 0 : _g.enable) && !this.supportsPerfettoTracing) {
|
|
730
|
+
const firmwareVersion = (_j = (_h = this.deviceInfo) === null || _h === void 0 ? void 0 : _h.softwareVersion) !== null && _j !== void 0 ? _j : 'unknown';
|
|
731
|
+
const message = `Perfetto profiling is not available: device firmware ${firmwareVersion} is below the minimum required version (15.2). The Perfetto profiling buttons will not be available during this session.`;
|
|
732
|
+
this.logger.warn(message);
|
|
733
|
+
this.showPopupMessage(message, 'warn').catch(e => this.logger.error('Failed to show Perfetto unavailable notification', e));
|
|
727
734
|
//profiling.tracing.enabled is set to `undefined`, which means we should do nothing
|
|
728
735
|
}
|
|
729
736
|
else {
|
|
@@ -734,7 +741,7 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
734
741
|
* If profiling was marked "connectOnStart", try connecting right away
|
|
735
742
|
*/
|
|
736
743
|
async tryProfilingConnectOnStart() {
|
|
737
|
-
var _a, _b;
|
|
744
|
+
var _a, _b, _c, _d, _e, _f;
|
|
738
745
|
if (((_b = (_a = this.launchConfiguration.profiling) === null || _a === void 0 ? void 0 : _a.tracing) === null || _b === void 0 ? void 0 : _b.connectOnStart) && this.supportsPerfettoTracing) {
|
|
739
746
|
try {
|
|
740
747
|
await this.perfettoManager.startTracing();
|
|
@@ -743,6 +750,12 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
743
750
|
this.logger.error('Failed to start perfetto tracing on start', e);
|
|
744
751
|
}
|
|
745
752
|
}
|
|
753
|
+
else if (((_d = (_c = this.launchConfiguration.profiling) === null || _c === void 0 ? void 0 : _c.tracing) === null || _d === void 0 ? void 0 : _d.connectOnStart) && !this.supportsPerfettoTracing) {
|
|
754
|
+
const firmwareVersion = (_f = (_e = this.deviceInfo) === null || _e === void 0 ? void 0 : _e.softwareVersion) !== null && _f !== void 0 ? _f : 'unknown';
|
|
755
|
+
const message = `Perfetto profiling is not available: device firmware ${firmwareVersion} is below the minimum required version (15.2). Tracing will not start automatically.`;
|
|
756
|
+
this.logger.warn(message);
|
|
757
|
+
this.showPopupMessage(message, 'warn').catch(e => this.logger.error('Failed to show Perfetto unavailable notification', e));
|
|
758
|
+
}
|
|
746
759
|
}
|
|
747
760
|
/**
|
|
748
761
|
* Clear certain properties that need reset whenever a debug session is restarted (via vscode or launched from the Roku home screen)
|
|
@@ -751,7 +764,9 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
751
764
|
// launchRequest gets invoked by our restart session flow.
|
|
752
765
|
// We need to clear/reset some state to avoid issues.
|
|
753
766
|
this.entryBreakpointWasHandled = false;
|
|
754
|
-
|
|
767
|
+
//reset all per-session breakpoint state (diff baseline + cached parsed ASTs) since a restart
|
|
768
|
+
//re-stages the project
|
|
769
|
+
this.breakpointManager.reset();
|
|
755
770
|
}
|
|
756
771
|
/**
|
|
757
772
|
* Activate rendezvous tracking (IF enabled in the LaunchConfig)
|
|
@@ -1095,10 +1110,8 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
1095
1110
|
var _a;
|
|
1096
1111
|
//add breakpoint lines to source files and then publish
|
|
1097
1112
|
util_1.util.log('Adding stop statements for active breakpoints');
|
|
1098
|
-
//
|
|
1099
|
-
|
|
1100
|
-
await this.breakpointManager.writeBreakpointsForProject(this.projectManager.mainProject);
|
|
1101
|
-
}
|
|
1113
|
+
//validate breakpoints for all debugger types (and write `stop` statements for telnet — decided internally)
|
|
1114
|
+
await this.breakpointManager.validateAndWriteBreakpointsForProject(this.projectManager.mainProject);
|
|
1102
1115
|
if (this.launchConfiguration.packageTask) {
|
|
1103
1116
|
util_1.util.log(`Executing task '${this.launchConfiguration.packageTask}' to assemble the app`);
|
|
1104
1117
|
await this.sendCustomRequest('executeTask', { task: this.launchConfiguration.packageTask });
|
|
@@ -1205,11 +1218,9 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
1205
1218
|
const componentLibrariesOutDir = (0, FileUtils_1.standardizePath) `${this.launchConfiguration.outDir}/component-libraries`;
|
|
1206
1219
|
// Add breakpoint lines to the staging files and before publishing
|
|
1207
1220
|
util_1.util.log('Adding stop statements for active breakpoints in Component Libraries');
|
|
1208
|
-
//write STOPs
|
|
1221
|
+
//validate breakpoints (and write STOPs for telnet), postfix, and zip each complib in parallel — each targets distinct files
|
|
1209
1222
|
const packagePromises = this.projectManager.componentLibraryProjects.map(async (compLibProject) => {
|
|
1210
|
-
|
|
1211
|
-
await this.breakpointManager.writeBreakpointsForProject(compLibProject);
|
|
1212
|
-
}
|
|
1223
|
+
await this.breakpointManager.validateAndWriteBreakpointsForProject(compLibProject);
|
|
1213
1224
|
await compLibProject.postfixFiles();
|
|
1214
1225
|
await compLibProject.zipPackage({ retainStagingFolder: true });
|
|
1215
1226
|
});
|
|
@@ -1304,9 +1315,7 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
1304
1315
|
if (this.rokuAdapter.isAtDebuggerPrompt) {
|
|
1305
1316
|
let rokuThreads = await this.rokuAdapter.getThreads();
|
|
1306
1317
|
for (let thread of rokuThreads) {
|
|
1307
|
-
const threadName = thread
|
|
1308
|
-
? `Thread ${thread.threadId} [detached]`
|
|
1309
|
-
: `Thread ${thread.threadId}`;
|
|
1318
|
+
const threadName = this.getThreadName(thread);
|
|
1310
1319
|
threads.push(new debugadapter_1.Thread(thread.threadId, threadName));
|
|
1311
1320
|
}
|
|
1312
1321
|
if (threads.length === 0) {
|
|
@@ -1326,6 +1335,40 @@ class BrightScriptDebugSession extends debugadapter_1.LoggingDebugSession {
|
|
|
1326
1335
|
};
|
|
1327
1336
|
this.sendResponse(response);
|
|
1328
1337
|
}
|
|
1338
|
+
/**
|
|
1339
|
+
* Get the thread name to display in the UI based on the thread info we have.
|
|
1340
|
+
* This is what displays in the `call stack` region in vscode
|
|
1341
|
+
* @param thread
|
|
1342
|
+
* @returns
|
|
1343
|
+
*/
|
|
1344
|
+
getThreadName(thread) {
|
|
1345
|
+
let threadName = '';
|
|
1346
|
+
if (thread.type || thread.name || thread.osThreadId) {
|
|
1347
|
+
//build the name from only the parts that are present, so missing values don't leak into the name
|
|
1348
|
+
const parts = [];
|
|
1349
|
+
if (thread.type) {
|
|
1350
|
+
parts.push(`[${thread.type}]`);
|
|
1351
|
+
}
|
|
1352
|
+
if (thread.name) {
|
|
1353
|
+
parts.push(thread.name);
|
|
1354
|
+
}
|
|
1355
|
+
if (thread.osThreadId) {
|
|
1356
|
+
parts.push(thread.osThreadId);
|
|
1357
|
+
}
|
|
1358
|
+
threadName = parts.join(' ');
|
|
1359
|
+
}
|
|
1360
|
+
//remove any extraneous whitespace to deal with missing values
|
|
1361
|
+
threadName = threadName.replace(/\s+/g, ' ').trim();
|
|
1362
|
+
if (threadName === '') {
|
|
1363
|
+
threadName = `Thread ${thread.threadId}`;
|
|
1364
|
+
}
|
|
1365
|
+
if (thread.isDetached) {
|
|
1366
|
+
threadName += ' [detached]';
|
|
1367
|
+
}
|
|
1368
|
+
//remove any extraneous whitespace to deal with missing values
|
|
1369
|
+
threadName = threadName.replace(/\s+/g, ' ').trim();
|
|
1370
|
+
return threadName;
|
|
1371
|
+
}
|
|
1329
1372
|
async stackTraceRequest(response, args) {
|
|
1330
1373
|
var _a, _b;
|
|
1331
1374
|
try {
|