brighterscript 1.0.0-alpha.51 → 1.0.0-alpha.53
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/README.md +12 -5
- package/bsconfig.schema.json +151 -0
- package/dist/BsConfig.d.ts +158 -44
- package/dist/BsConfig.js +24 -0
- package/dist/BsConfig.js.map +1 -1
- package/dist/BusyStatusTracker.js +3 -0
- package/dist/BusyStatusTracker.js.map +1 -1
- package/dist/CrossScopeValidator.js +5 -0
- package/dist/CrossScopeValidator.js.map +1 -1
- package/dist/DiagnosticFilterer.d.ts +17 -1
- package/dist/DiagnosticFilterer.js +69 -6
- package/dist/DiagnosticFilterer.js.map +1 -1
- package/dist/DiagnosticManager.d.ts +11 -1
- package/dist/DiagnosticManager.js +22 -3
- package/dist/DiagnosticManager.js.map +1 -1
- package/dist/DiagnosticMessages.d.ts +93 -4
- package/dist/DiagnosticMessages.js +91 -5
- package/dist/DiagnosticMessages.js.map +1 -1
- package/dist/LanguageServer.d.ts +17 -4
- package/dist/LanguageServer.js +65 -6
- package/dist/LanguageServer.js.map +1 -1
- package/dist/Logger.d.ts +7 -7
- package/dist/Logger.js +2 -2
- package/dist/Logger.js.map +1 -1
- package/dist/PluginInterface.js +2 -1
- package/dist/PluginInterface.js.map +1 -1
- package/dist/Program.d.ts +110 -9
- package/dist/Program.js +293 -23
- package/dist/Program.js.map +1 -1
- package/dist/ProgramBuilder.js +6 -0
- package/dist/ProgramBuilder.js.map +1 -1
- package/dist/RokuConstants.d.ts +123 -0
- package/dist/RokuConstants.js +87 -0
- package/dist/RokuConstants.js.map +1 -0
- package/dist/ScopeNamespaceLookup.js.map +1 -1
- package/dist/Stopwatch.js +2 -2
- package/dist/Stopwatch.js.map +1 -1
- package/dist/SymbolTable.d.ts +1 -0
- package/dist/SymbolTable.js +20 -12
- package/dist/SymbolTable.js.map +1 -1
- package/dist/Throttler.d.ts +1 -1
- package/dist/Throttler.js.map +1 -1
- package/dist/astUtils/reflection.d.ts +6 -1
- package/dist/astUtils/reflection.js +15 -4
- package/dist/astUtils/reflection.js.map +1 -1
- package/dist/astUtils/visitors.d.ts +1 -1
- package/dist/astUtils/visitors.js +2 -0
- package/dist/astUtils/visitors.js.map +1 -1
- package/dist/bscPlugin/BscPlugin.d.ts +3 -2
- package/dist/bscPlugin/BscPlugin.js +5 -1
- package/dist/bscPlugin/BscPlugin.js.map +1 -1
- package/dist/bscPlugin/CallExpressionInfo.js.map +1 -1
- package/dist/bscPlugin/SignatureHelpUtil.js.map +1 -1
- package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.d.ts +3 -3
- package/dist/bscPlugin/codeActions/FixAllCodeActionsProcessor.js.map +1 -1
- package/dist/bscPlugin/completions/CompletionsProcessor.js +2 -3
- package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
- package/dist/bscPlugin/definition/DefinitionProvider.d.ts +67 -2
- package/dist/bscPlugin/definition/DefinitionProvider.js +244 -5
- package/dist/bscPlugin/definition/DefinitionProvider.js.map +1 -1
- package/dist/bscPlugin/inlayHints/InlayHintProcessor.d.ts +23 -0
- package/dist/bscPlugin/inlayHints/InlayHintProcessor.js +186 -0
- package/dist/bscPlugin/inlayHints/InlayHintProcessor.js.map +1 -0
- package/dist/bscPlugin/references/ReferencesProvider.js +7 -1
- package/dist/bscPlugin/references/ReferencesProvider.js.map +1 -1
- package/dist/bscPlugin/validation/BrsFileValidator.d.ts +40 -6
- package/dist/bscPlugin/validation/BrsFileValidator.js +109 -18
- package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
- package/dist/bscPlugin/validation/ProgramValidator.d.ts +10 -0
- package/dist/bscPlugin/validation/ProgramValidator.js +54 -0
- package/dist/bscPlugin/validation/ProgramValidator.js.map +1 -1
- package/dist/bscPlugin/validation/ScopeValidator.js +55 -30
- package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
- package/dist/bscPlugin/validation/XmlFileValidator.d.ts +18 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js +51 -0
- package/dist/bscPlugin/validation/XmlFileValidator.js.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/diagnosticUtils.d.ts +1 -1
- package/dist/diagnosticUtils.js.map +1 -1
- package/dist/files/BrsFile.d.ts +2 -2
- package/dist/files/BrsFile.js +2 -2
- package/dist/files/BrsFile.js.map +1 -1
- package/dist/files/XmlFile.d.ts +51 -1
- package/dist/files/XmlFile.js +264 -0
- package/dist/files/XmlFile.js.map +1 -1
- package/dist/formatUtils.d.ts +20 -0
- package/dist/formatUtils.js +38 -0
- package/dist/formatUtils.js.map +1 -0
- package/dist/globalCallables.d.ts +1 -1
- package/dist/globalCallables.js +4 -1
- package/dist/globalCallables.js.map +1 -1
- package/dist/interfaces.d.ts +93 -5
- package/dist/interfaces.js.map +1 -1
- package/dist/lexer/Lexer.d.ts +26 -0
- package/dist/lexer/Lexer.js +140 -15
- package/dist/lexer/Lexer.js.map +1 -1
- package/dist/lexer/TokenKind.d.ts +27 -0
- package/dist/lexer/TokenKind.js +77 -3
- package/dist/lexer/TokenKind.js.map +1 -1
- package/dist/lsp/ActionQueue.js +1 -2
- package/dist/lsp/ActionQueue.js.map +1 -1
- package/dist/lsp/DocumentManager.js +4 -0
- package/dist/lsp/DocumentManager.js.map +1 -1
- package/dist/lsp/LspProject.d.ts +9 -2
- package/dist/lsp/Project.d.ts +6 -2
- package/dist/lsp/Project.js +8 -0
- package/dist/lsp/Project.js.map +1 -1
- package/dist/lsp/ProjectManager.d.ts +11 -2
- package/dist/lsp/ProjectManager.js +15 -1
- package/dist/lsp/ProjectManager.js.map +1 -1
- package/dist/lsp/worker/MessageHandler.d.ts +1 -0
- package/dist/lsp/worker/MessageHandler.js +9 -0
- package/dist/lsp/worker/MessageHandler.js.map +1 -1
- package/dist/lsp/worker/WorkerPool.d.ts +51 -17
- package/dist/lsp/worker/WorkerPool.js +118 -40
- package/dist/lsp/worker/WorkerPool.js.map +1 -1
- package/dist/lsp/worker/WorkerThreadProject.d.ts +20 -3
- package/dist/lsp/worker/WorkerThreadProject.js +53 -10
- package/dist/lsp/worker/WorkerThreadProject.js.map +1 -1
- package/dist/lsp/worker/WorkerThreadProjectRunner.js +6 -0
- package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -1
- package/dist/lsp/worker/run.js +20 -3
- package/dist/lsp/worker/run.js.map +1 -1
- package/dist/parser/AstNode.d.ts +59 -2
- package/dist/parser/AstNode.js +63 -5
- package/dist/parser/AstNode.js.map +1 -1
- package/dist/parser/BrsTranspileState.d.ts +44 -0
- package/dist/parser/BrsTranspileState.js +49 -0
- package/dist/parser/BrsTranspileState.js.map +1 -1
- package/dist/parser/Expression.d.ts +56 -8
- package/dist/parser/Expression.js +91 -8
- package/dist/parser/Expression.js.map +1 -1
- package/dist/parser/Parser.d.ts +0 -5
- package/dist/parser/Parser.js +5 -9
- package/dist/parser/Parser.js.map +1 -1
- package/dist/parser/SGParser.d.ts +7 -1
- package/dist/parser/SGParser.js +20 -10
- package/dist/parser/SGParser.js.map +1 -1
- package/dist/parser/SGTypes.js +8 -2
- package/dist/parser/SGTypes.js.map +1 -1
- package/dist/parser/Statement.d.ts +21 -10
- package/dist/parser/Statement.js +61 -1
- package/dist/parser/Statement.js.map +1 -1
- package/dist/parser/TranspileState.js +3 -0
- package/dist/parser/TranspileState.js.map +1 -1
- package/dist/preprocessor/Manifest.d.ts +16 -0
- package/dist/preprocessor/Manifest.js +21 -5
- package/dist/preprocessor/Manifest.js.map +1 -1
- package/dist/roku-types/index.d.ts +3 -0
- package/dist/types/BuiltInInterfaceAdder.js +1 -1
- package/dist/types/BuiltInInterfaceAdder.js.map +1 -1
- package/dist/types/InheritableType.d.ts +0 -1
- package/dist/types/InheritableType.js +12 -11
- package/dist/types/InheritableType.js.map +1 -1
- package/dist/types/InterfaceType.js +6 -0
- package/dist/types/InterfaceType.js.map +1 -1
- package/dist/types/IntersectionType.d.ts +1 -1
- package/dist/types/IntersectionType.js +7 -7
- package/dist/types/IntersectionType.js.map +1 -1
- package/dist/types/ReferenceType.js +1 -1
- package/dist/types/ReferenceType.js.map +1 -1
- package/dist/types/helpers.d.ts +2 -2
- package/dist/types/helpers.js +8 -5
- package/dist/types/helpers.js.map +1 -1
- package/dist/util.d.ts +38 -4
- package/dist/util.js +296 -29
- package/dist/util.js.map +1 -1
- package/package.json +14 -19
|
@@ -38,6 +38,35 @@ class WorkerThreadProject {
|
|
|
38
38
|
var _a;
|
|
39
39
|
this.isStandaloneProject = false;
|
|
40
40
|
this.activationDeferred = new deferred_1.Deferred();
|
|
41
|
+
/**
|
|
42
|
+
* True once `dispose()` has run. Used to distinguish an intentional worker shutdown from an unexpected crash.
|
|
43
|
+
*/
|
|
44
|
+
this.isDisposed = false;
|
|
45
|
+
/**
|
|
46
|
+
* Called if this project's worker thread exits. If we didn't cause that ourselves via `dispose()`,
|
|
47
|
+
* treat it as a critical failure so the user finds out instead of every request just hanging forever.
|
|
48
|
+
*/
|
|
49
|
+
this.handleWorkerExit = (code) => {
|
|
50
|
+
var _a, _b;
|
|
51
|
+
if (this.isDisposed) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
//the worker is gone, so this project can never serve another request. Mark it dead BEFORE emitting so
|
|
55
|
+
//anything reacting to the critical-failure sees an accurate `isDisposed`
|
|
56
|
+
this.isDisposed = true;
|
|
57
|
+
this.logger.error(`Worker thread for project #${this.projectNumber} exited unexpectedly with code ${code}`);
|
|
58
|
+
//emit() is async; this handler can't be, so void it
|
|
59
|
+
void this.emit('critical-failure', {
|
|
60
|
+
message: `The BrighterScript language server's worker thread crashed unexpectedly (exit code ${code}). This project (and any others sharing its worker thread) will stop responding until the language server is reloaded - there is currently no automatic recovery for a crashed worker thread.`
|
|
61
|
+
});
|
|
62
|
+
//reject any in-flight requests instead of leaving callers hanging forever on a worker that's gone
|
|
63
|
+
(_a = this.messageHandler) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
64
|
+
//give up our slot on the (now-dead) worker so co-tenant projects keep an accurate projectCount
|
|
65
|
+
(_b = this.port) === null || _b === void 0 ? void 0 : _b.close();
|
|
66
|
+
if (this.worker) {
|
|
67
|
+
exports.workerPool.releaseProject(this.worker);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
41
70
|
this.emitter = new EventEmitter();
|
|
42
71
|
this.disposables = [];
|
|
43
72
|
this.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) !== null && _a !== void 0 ? _a : (0, logging_1.createLogger)();
|
|
@@ -50,11 +79,14 @@ class WorkerThreadProject {
|
|
|
50
79
|
this.projectKey = options.projectKey ? util_1.default.standardizePath(options.projectKey) : (_a = options.bsconfigPath) !== null && _a !== void 0 ? _a : options.projectDir;
|
|
51
80
|
this.workspaceFolder = options.workspaceFolder ? util_1.default.standardizePath(options.workspaceFolder) : options.workspaceFolder;
|
|
52
81
|
this.projectNumber = options.projectNumber;
|
|
53
|
-
//
|
|
54
|
-
|
|
82
|
+
// get a dedicated MessagePort on a (possibly shared) worker thread
|
|
83
|
+
const assignment = exports.workerPool.assignProject();
|
|
84
|
+
this.worker = assignment.worker;
|
|
85
|
+
this.port = assignment.port;
|
|
86
|
+
this.worker.on('exit', this.handleWorkerExit);
|
|
55
87
|
this.messageHandler = new MessageHandler_1.MessageHandler({
|
|
56
88
|
name: 'MainThread',
|
|
57
|
-
port: this.
|
|
89
|
+
port: this.port,
|
|
58
90
|
onRequest: this.processRequest.bind(this),
|
|
59
91
|
onUpdate: this.processUpdate.bind(this)
|
|
60
92
|
});
|
|
@@ -166,6 +198,9 @@ class WorkerThreadProject {
|
|
|
166
198
|
async getSelectionRanges(options) {
|
|
167
199
|
return this.sendStandardRequest('getSelectionRanges', options);
|
|
168
200
|
}
|
|
201
|
+
async getInlayHints(options) {
|
|
202
|
+
return this.sendStandardRequest('getInlayHints', options);
|
|
203
|
+
}
|
|
169
204
|
async getCompletions(options) {
|
|
170
205
|
return this.sendStandardRequest('getCompletions', options);
|
|
171
206
|
}
|
|
@@ -173,11 +208,13 @@ class WorkerThreadProject {
|
|
|
173
208
|
}
|
|
174
209
|
processUpdate(update) {
|
|
175
210
|
//for now, all updates are treated like "events"
|
|
176
|
-
this.emit(update.name, update.data);
|
|
211
|
+
void this.emit(update.name, update.data);
|
|
177
212
|
}
|
|
178
213
|
on(eventName, handler) {
|
|
214
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
179
215
|
this.emitter.on(eventName, handler);
|
|
180
216
|
return () => {
|
|
217
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
181
218
|
this.emitter.removeListener(eventName, handler);
|
|
182
219
|
};
|
|
183
220
|
}
|
|
@@ -189,16 +226,22 @@ class WorkerThreadProject {
|
|
|
189
226
|
this.emitter.emit('all', eventName, data);
|
|
190
227
|
}
|
|
191
228
|
dispose() {
|
|
192
|
-
var _a, _b, _c;
|
|
193
|
-
|
|
194
|
-
|
|
229
|
+
var _a, _b, _c, _d, _e;
|
|
230
|
+
if (this.isDisposed) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
this.isDisposed = true;
|
|
234
|
+
(_a = this.worker) === null || _a === void 0 ? void 0 : _a.off('exit', this.handleWorkerExit);
|
|
235
|
+
for (let disposable of (_b = this.disposables) !== null && _b !== void 0 ? _b : []) {
|
|
236
|
+
(_c = disposable === null || disposable === void 0 ? void 0 : disposable.dispose) === null || _c === void 0 ? void 0 : _c.call(disposable);
|
|
195
237
|
}
|
|
196
238
|
this.disposables = [];
|
|
197
|
-
//
|
|
239
|
+
//close our dedicated port and release our slot on the worker (which terminates the worker if it's now empty)
|
|
240
|
+
(_d = this.port) === null || _d === void 0 ? void 0 : _d.close();
|
|
198
241
|
if (this.worker) {
|
|
199
|
-
exports.workerPool.
|
|
242
|
+
exports.workerPool.releaseProject(this.worker);
|
|
200
243
|
}
|
|
201
|
-
(
|
|
244
|
+
(_e = this.emitter) === null || _e === void 0 ? void 0 : _e.removeAllListeners();
|
|
202
245
|
}
|
|
203
246
|
}
|
|
204
247
|
exports.WorkerThreadProject = WorkerThreadProject;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerThreadProject.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProject.ts"],"names":[],"mappings":";;;AAAA,8CAA8C;AAC9C,mDAAwC;
|
|
1
|
+
{"version":3,"file":"WorkerThreadProject.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProject.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,12 @@ class WorkerThreadProjectRunner {
|
|
|
37
37
|
}
|
|
38
38
|
});
|
|
39
39
|
this.requestInterceptors.activate = this.onActivate.bind(this);
|
|
40
|
+
//dispose this project's Program when its dedicated port closes, even though the shared worker keeps running
|
|
41
|
+
parentPort.on('close', () => {
|
|
42
|
+
var _a, _b;
|
|
43
|
+
(_a = this.project) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
44
|
+
(_b = this.messageHandler) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
45
|
+
});
|
|
40
46
|
}
|
|
41
47
|
/**
|
|
42
48
|
* Fired anytime we get an `activate` request from the client. This allows us to clean up the previous project and make a new one
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkerThreadProjectRunner.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProjectRunner.ts"],"names":[],"mappings":";;;AAAA,2CAAkD;AAElD,wCAAqC;AAErC,qDAAkD;AAGlD;;GAEG;AACH,MAAa,yBAAyB;IAAtC;QACI,sEAAsE;QAC9D,wBAAmB,GAAG,EAAyD,CAAC;
|
|
1
|
+
{"version":3,"file":"WorkerThreadProjectRunner.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProjectRunner.ts"],"names":[],"mappings":";;;AAAA,2CAAkD;AAElD,wCAAqC;AAErC,qDAAkD;AAGlD;;GAEG;AACH,MAAa,yBAAyB;IAAtC;QACI,sEAAsE;QAC9D,wBAAmB,GAAG,EAAyD,CAAC;IA0D5F,CAAC;IApDU,GAAG,CAAC,UAAuB;QAC9B,8CAA8C;QAC9C,IAAA,2BAAiB,GAAE,CAAC;QAEpB,IAAI,CAAC,cAAc,GAAG,IAAI,+BAAc,CAAC;YACrC,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,UAAU;YAChB,SAAS,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;;gBACxC,IAAI;oBACA,qEAAqE;oBACrE,MAAA,MAAA,IAAI,CAAC,mBAAmB,EAAC,OAAO,CAAC,IAAI,CAAC,mDAAG,OAAO,CAAC,IAAI,CAAC,CAAC;oBAEvD,wIAAwI;oBACxI,IAAI,YAAY,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,MAAA,OAAO,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAC;oBAC3E,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;oBAElE,uFAAuF;iBAC1F;gBAAC,OAAO,CAAC,EAAE;oBACR,MAAM,KAAK,GAAU,CAAQ,CAAC;oBAC9B,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;iBAC/D;YACL,CAAC;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAErB,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/D,4GAA4G;QAC5G,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;;YACxB,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,EAAE,CAAC;YACxB,MAAA,IAAI,CAAC,cAAc,0CAAE,OAAO,EAAE,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,UAAU;;QACd,+BAA+B;QAC/B,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,EAAE,CAAC;QAExB,0FAA0F;QAC1F,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,EAAE,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,SAAiB,EAAE,IAAS,EAAE,EAAE;YACpD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,EAAE;gBACtC,IAAI,EAAE,IAAI;aACb,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AA5DD,8DA4DC"}
|
package/dist/lsp/worker/run.js
CHANGED
|
@@ -2,13 +2,30 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
/**
|
|
4
4
|
* This script is the entry point for worker threads that run LSP Projects.
|
|
5
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* A worker thread can host multiple projects at once (see `WorkerPool.assignProject()`): each project
|
|
7
|
+
* gets its own dedicated `MessagePort`, delivered to this worker as an `attachProject` message on
|
|
8
|
+
* `parentPort`. For every such message, we spin up a new `WorkerThreadProjectRunner` bound to that
|
|
9
|
+
* project's port, so each project's request/response traffic stays fully independent even though they
|
|
10
|
+
* share this worker's JS realm (and its module-level caches).
|
|
6
11
|
*/
|
|
7
12
|
const worker_threads_1 = require("worker_threads");
|
|
8
13
|
const WorkerThreadProjectRunner_1 = require("./WorkerThreadProjectRunner");
|
|
9
|
-
const runner = new WorkerThreadProjectRunner_1.WorkerThreadProjectRunner();
|
|
10
14
|
if (!worker_threads_1.parentPort) {
|
|
11
15
|
throw new Error('This script must be run as a worker thread');
|
|
12
16
|
}
|
|
13
|
-
|
|
17
|
+
worker_threads_1.parentPort.on('message', (message) => {
|
|
18
|
+
if ((message === null || message === void 0 ? void 0 : message.type) === 'attachProject') {
|
|
19
|
+
try {
|
|
20
|
+
const runner = new WorkerThreadProjectRunner_1.WorkerThreadProjectRunner();
|
|
21
|
+
runner.run(message.port);
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
//don't let one project's setup failure crash this worker thread and take down every other project sharing it
|
|
25
|
+
console.error('Failed to attach project to worker thread', e);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
//tell the main thread this worker has booted and is actually ready to receive `attachProject` messages (see WorkerPool)
|
|
30
|
+
worker_threads_1.parentPort.postMessage({ type: 'ready' });
|
|
14
31
|
//# sourceMappingURL=run.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/lsp/worker/run.ts"],"names":[],"mappings":";;AAAA
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/lsp/worker/run.ts"],"names":[],"mappings":";;AAAA;;;;;;;;GAQG;AACH,mDAA4C;AAE5C,2EAAwE;AAExE,IAAI,CAAC,2BAAU,EAAE;IACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;CACjE;AAED,2BAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAA4C,EAAE,EAAE;IACtE,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,eAAe,EAAE;QACnC,IAAI;YACA,MAAM,MAAM,GAAG,IAAI,qDAAyB,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC5B;QAAC,OAAO,CAAC,EAAE;YACR,6GAA6G;YAC7G,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,CAAC,CAAC,CAAC;SACjE;KACJ;AACL,CAAC,CAAC,CAAC;AAEH,wHAAwH;AACxH,2BAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC"}
|
package/dist/parser/AstNode.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { WalkVisitor, WalkOptions } from '../astUtils/visitors';
|
|
2
|
-
import type { Location, Position } from 'vscode-languageserver';
|
|
2
|
+
import type { Location, Position, Range } from 'vscode-languageserver';
|
|
3
3
|
import { CancellationTokenSource } from 'vscode-languageserver';
|
|
4
4
|
import { InternalWalkMode } from '../astUtils/visitors';
|
|
5
5
|
import type { SymbolTable } from '../SymbolTable';
|
|
@@ -17,6 +17,10 @@ export declare abstract class AstNode {
|
|
|
17
17
|
* The starting and ending location of the node.
|
|
18
18
|
*/
|
|
19
19
|
abstract location?: Location | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* @deprecated use `location.range` instead
|
|
22
|
+
*/
|
|
23
|
+
get range(): Range | undefined;
|
|
20
24
|
abstract transpile(state: BrsTranspileState): TranspileResult;
|
|
21
25
|
/**
|
|
22
26
|
* Optional property, set at the top level with a map of conditional compile consts and their values
|
|
@@ -49,6 +53,7 @@ export declare abstract class AstNode {
|
|
|
49
53
|
* @param matcher a function called for each node. If you return true, this function returns the specified node. If you return a node, that node is returned. all other return values continue the loop
|
|
50
54
|
* The function's second parameter is a cancellation token. If you'd like to short-circuit the walk, call `cancellationToken.cancel()`, then this function will return `undefined`
|
|
51
55
|
*/
|
|
56
|
+
findAncestor<TNode extends AstNode = AstNode>(matcher: (node: AstNode) => node is TNode): TNode | undefined;
|
|
52
57
|
findAncestor<TNode extends AstNode = AstNode>(matcher: (node: AstNode, cancellationToken: CancellationTokenSource) => boolean | AstNode | undefined | void): TNode | undefined;
|
|
53
58
|
/**
|
|
54
59
|
* Find the first child where the matcher evaluates to true.
|
|
@@ -88,11 +93,62 @@ export declare abstract class AstNode {
|
|
|
88
93
|
*/
|
|
89
94
|
get endTrivia(): Token[];
|
|
90
95
|
getBsConsts(): any;
|
|
96
|
+
/**
|
|
97
|
+
* The previous step in this expression, or undefined if this node doesn't build on another
|
|
98
|
+
* expression. Overridden by dotted/indexed gets, calls, and other chaining nodes.
|
|
99
|
+
*
|
|
100
|
+
* Each node in a chain spans a whole prefix of the source, so this walks to the next-shorter
|
|
101
|
+
* prefix. Given `a.b.c`, there are only three nodes:
|
|
102
|
+
* ```
|
|
103
|
+
* a.b.c .previousInChain -> a.b
|
|
104
|
+
* a.b .previousInChain -> a
|
|
105
|
+
* a .previousInChain -> undefined
|
|
106
|
+
* ```
|
|
107
|
+
*
|
|
108
|
+
* This walks toward the AST *child*, since chains are stored inverted: the full expression is
|
|
109
|
+
* the top node and its base is the deepest descendant. It is not `parent` reversed though -
|
|
110
|
+
* arguments and index values have a `parent`, but are never anything's `previousInChain`,
|
|
111
|
+
* because they're separate expressions that merely sit inside this one:
|
|
112
|
+
* ```
|
|
113
|
+
* a.b(arg) //CallExpression.previousInChain is `a.b`, NOT `arg`
|
|
114
|
+
* a[i] //IndexedGetExpression.previousInChain is `a`, NOT `i`
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
get previousInChain(): AstNode | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* Is this node a complete expression, rather than one step inside a longer one?
|
|
120
|
+
*
|
|
121
|
+
* True when nothing chains onto this node. Statements are always terminal. Use this to find
|
|
122
|
+
* whole expressions while walking, instead of also matching every prefix inside them.
|
|
123
|
+
*
|
|
124
|
+
* ```
|
|
125
|
+
* print a.b.c(arg)
|
|
126
|
+
*
|
|
127
|
+
* //a.b.c(arg) yes - the whole expression
|
|
128
|
+
* //a.b.c no - a.b.c(arg) chains onto it
|
|
129
|
+
* //a.b no - a.b.c chains onto it
|
|
130
|
+
* //a no - a.b chains onto it
|
|
131
|
+
* //arg yes - an argument, so an expression of its own
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
134
|
+
* An argument is terminal no matter how long it is, because nothing chains onto it. Both of
|
|
135
|
+
* these are terminal, even though they sit inside the call:
|
|
136
|
+
* ```
|
|
137
|
+
* print doSomething(x.y, 1 + 2)
|
|
138
|
+
*
|
|
139
|
+
* //x.y yes
|
|
140
|
+
* //1 + 2 yes
|
|
141
|
+
* ```
|
|
142
|
+
*
|
|
143
|
+
* Requires `parent` to be set, so the node must already be linked (see `link()`). An
|
|
144
|
+
* unlinked node has no parent, so it reports `true`.
|
|
145
|
+
*/
|
|
146
|
+
isTerminal(): boolean;
|
|
91
147
|
/**
|
|
92
148
|
* Clone this node and all of its children. This creates a completely detached and identical copy of the AST.
|
|
93
149
|
* All tokens, statements, expressions, range, and location are cloned.
|
|
94
150
|
*/
|
|
95
|
-
abstract clone():
|
|
151
|
+
abstract clone(): AstNode;
|
|
96
152
|
/**
|
|
97
153
|
* Helper function for creating a clone. This will clone any attached annotations, as well as reparent the cloned node's children to the clone
|
|
98
154
|
*/
|
|
@@ -120,6 +176,7 @@ export declare abstract class Expression extends AstNode {
|
|
|
120
176
|
* When being considered by the walk visitor, this describes what type of element the current class is.
|
|
121
177
|
*/
|
|
122
178
|
visitMode: InternalWalkMode;
|
|
179
|
+
abstract clone(): Expression;
|
|
123
180
|
}
|
|
124
181
|
export declare enum AstNodeKind {
|
|
125
182
|
Body = "Body",
|
package/dist/parser/AstNode.js
CHANGED
|
@@ -17,6 +17,13 @@ class AstNode {
|
|
|
17
17
|
*/
|
|
18
18
|
this.visitMode = visitors_2.InternalWalkMode.visitStatements;
|
|
19
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* @deprecated use `location.range` instead
|
|
22
|
+
*/
|
|
23
|
+
get range() {
|
|
24
|
+
var _a;
|
|
25
|
+
return (_a = this.location) === null || _a === void 0 ? void 0 : _a.range;
|
|
26
|
+
}
|
|
20
27
|
/**
|
|
21
28
|
* Get the typedef for this node. (defaults to transpiling the node, should be overridden by subclasses if there's a more specific typedef requirement)
|
|
22
29
|
*/
|
|
@@ -39,11 +46,6 @@ class AstNode {
|
|
|
39
46
|
//but it is not so easy to convince the typechecker of this.
|
|
40
47
|
return undefined;
|
|
41
48
|
}
|
|
42
|
-
/**
|
|
43
|
-
* Walk upward and return the first node that results in `true` from the matcher.
|
|
44
|
-
* @param matcher a function called for each node. If you return true, this function returns the specified node. If you return a node, that node is returned. all other return values continue the loop
|
|
45
|
-
* The function's second parameter is a cancellation token. If you'd like to short-circuit the walk, call `cancellationToken.cancel()`, then this function will return `undefined`
|
|
46
|
-
*/
|
|
47
49
|
findAncestor(matcher) {
|
|
48
50
|
let node = this.parent;
|
|
49
51
|
const cancel = new vscode_languageserver_1.CancellationTokenSource();
|
|
@@ -149,6 +151,62 @@ class AstNode {
|
|
|
149
151
|
var _a, _b, _c;
|
|
150
152
|
return (_a = this.bsConsts) !== null && _a !== void 0 ? _a : (_c = (_b = this.parent) === null || _b === void 0 ? void 0 : _b.getBsConsts) === null || _c === void 0 ? void 0 : _c.call(_b);
|
|
151
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* The previous step in this expression, or undefined if this node doesn't build on another
|
|
156
|
+
* expression. Overridden by dotted/indexed gets, calls, and other chaining nodes.
|
|
157
|
+
*
|
|
158
|
+
* Each node in a chain spans a whole prefix of the source, so this walks to the next-shorter
|
|
159
|
+
* prefix. Given `a.b.c`, there are only three nodes:
|
|
160
|
+
* ```
|
|
161
|
+
* a.b.c .previousInChain -> a.b
|
|
162
|
+
* a.b .previousInChain -> a
|
|
163
|
+
* a .previousInChain -> undefined
|
|
164
|
+
* ```
|
|
165
|
+
*
|
|
166
|
+
* This walks toward the AST *child*, since chains are stored inverted: the full expression is
|
|
167
|
+
* the top node and its base is the deepest descendant. It is not `parent` reversed though -
|
|
168
|
+
* arguments and index values have a `parent`, but are never anything's `previousInChain`,
|
|
169
|
+
* because they're separate expressions that merely sit inside this one:
|
|
170
|
+
* ```
|
|
171
|
+
* a.b(arg) //CallExpression.previousInChain is `a.b`, NOT `arg`
|
|
172
|
+
* a[i] //IndexedGetExpression.previousInChain is `a`, NOT `i`
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
get previousInChain() {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Is this node a complete expression, rather than one step inside a longer one?
|
|
180
|
+
*
|
|
181
|
+
* True when nothing chains onto this node. Statements are always terminal. Use this to find
|
|
182
|
+
* whole expressions while walking, instead of also matching every prefix inside them.
|
|
183
|
+
*
|
|
184
|
+
* ```
|
|
185
|
+
* print a.b.c(arg)
|
|
186
|
+
*
|
|
187
|
+
* //a.b.c(arg) yes - the whole expression
|
|
188
|
+
* //a.b.c no - a.b.c(arg) chains onto it
|
|
189
|
+
* //a.b no - a.b.c chains onto it
|
|
190
|
+
* //a no - a.b chains onto it
|
|
191
|
+
* //arg yes - an argument, so an expression of its own
|
|
192
|
+
* ```
|
|
193
|
+
*
|
|
194
|
+
* An argument is terminal no matter how long it is, because nothing chains onto it. Both of
|
|
195
|
+
* these are terminal, even though they sit inside the call:
|
|
196
|
+
* ```
|
|
197
|
+
* print doSomething(x.y, 1 + 2)
|
|
198
|
+
*
|
|
199
|
+
* //x.y yes
|
|
200
|
+
* //1 + 2 yes
|
|
201
|
+
* ```
|
|
202
|
+
*
|
|
203
|
+
* Requires `parent` to be set, so the node must already be linked (see `link()`). An
|
|
204
|
+
* unlinked node has no parent, so it reports `true`.
|
|
205
|
+
*/
|
|
206
|
+
isTerminal() {
|
|
207
|
+
//walk up, then back down: if we don't land on ourselves, nothing chains onto us
|
|
208
|
+
return this.parent === undefined || this.parent.previousInChain !== this;
|
|
209
|
+
}
|
|
152
210
|
/**
|
|
153
211
|
* Helper function for creating a clone. This will clone any attached annotations, as well as reparent the cloned node's children to the clone
|
|
154
212
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AstNode.js","sourceRoot":"","sources":["../../src/parser/AstNode.ts"],"names":[],"mappings":";;;AACA,mDAAgD;AAEhD,iEAAgE;AAChE,mDAAwD;AAKxD,kCAA2B;AAC3B,sDAAmD;AAGnD,uDAAwF;AAExF;;GAEG;AACH,MAAsB,OAAO;IAA7B;
|
|
1
|
+
{"version":3,"file":"AstNode.js","sourceRoot":"","sources":["../../src/parser/AstNode.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Location } from 'vscode-languageserver';
|
|
2
2
|
import { Editor } from '../astUtils/Editor';
|
|
3
3
|
import type { BrsFile } from '../files/BrsFile';
|
|
4
|
+
import type { FirmwareCapabilities } from '../RokuConstants';
|
|
4
5
|
import type { ClassStatement, ConditionalCompileStatement } from './Statement';
|
|
5
6
|
import { TranspileState } from './TranspileState';
|
|
6
7
|
import type { Statement } from './AstNode';
|
|
@@ -39,4 +40,47 @@ export declare class BrsTranspileState extends TranspileState {
|
|
|
39
40
|
* Transpile all leading trivia for a given statement, including comments mixed between annotations
|
|
40
41
|
*/
|
|
41
42
|
transpileAnnotations(node: Statement): (string | import("source-map").SourceNode)[][];
|
|
43
|
+
/**
|
|
44
|
+
* What the target firmware natively understands. Captured once when the state is created —
|
|
45
|
+
* capabilities are derived from config and cannot change partway through a transpile.
|
|
46
|
+
*/
|
|
47
|
+
readonly firmwareCapabilities: FirmwareCapabilities;
|
|
48
|
+
/**
|
|
49
|
+
* Stack of loop-label trackers, one per enclosing loop currently being transpiled. Only used
|
|
50
|
+
* when `continue` must be rewritten as a `goto` for firmware older than
|
|
51
|
+
* CONTINUE_MIN_FIRMWARE_VERSION.
|
|
52
|
+
*/
|
|
53
|
+
private loopLabels;
|
|
54
|
+
private loopLabelSequence;
|
|
55
|
+
/**
|
|
56
|
+
* Begin tracking a loop label for the loop about to be transpiled. The label is allocated
|
|
57
|
+
* eagerly but only emitted if a nested `continue` actually asks for it via `getLoopLabel()`.
|
|
58
|
+
* `blockDepth` records the depth the loop's own body block will occupy, so the block that
|
|
59
|
+
* emits the label can tell whether the label belongs to it or to a nested loop.
|
|
60
|
+
*/
|
|
61
|
+
pushLoopLabel(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Look at the innermost loop label without removing it. Used by Block.transpile to decide
|
|
64
|
+
* whether it owns the pending label.
|
|
65
|
+
*/
|
|
66
|
+
peekLoopLabel(): {
|
|
67
|
+
label: string;
|
|
68
|
+
wasAccessed: boolean;
|
|
69
|
+
blockDepth: number;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Stop tracking the innermost loop label. Returns the tracker so the loop can decide whether
|
|
73
|
+
* it needs to emit the end-of-body label (i.e. when `wasAccessed` is true).
|
|
74
|
+
*/
|
|
75
|
+
popLoopLabel(): {
|
|
76
|
+
label: string;
|
|
77
|
+
wasAccessed: boolean;
|
|
78
|
+
blockDepth: number;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Get the label marking the end of the innermost loop body, flagging it as needed so the
|
|
82
|
+
* enclosing loop knows to emit the label itself. Returns undefined when there is no enclosing
|
|
83
|
+
* loop (a `continue` outside a loop, which validation already flags as an error).
|
|
84
|
+
*/
|
|
85
|
+
getLoopLabel(): string;
|
|
42
86
|
}
|
|
@@ -21,7 +21,15 @@ class BrsTranspileState extends TranspileState_1.TranspileState {
|
|
|
21
21
|
* Do not transpile leading comments
|
|
22
22
|
*/
|
|
23
23
|
this.skipLeadingComments = false;
|
|
24
|
+
/**
|
|
25
|
+
* Stack of loop-label trackers, one per enclosing loop currently being transpiled. Only used
|
|
26
|
+
* when `continue` must be rewritten as a `goto` for firmware older than
|
|
27
|
+
* CONTINUE_MIN_FIRMWARE_VERSION.
|
|
28
|
+
*/
|
|
29
|
+
this.loopLabels = [];
|
|
30
|
+
this.loopLabelSequence = 0;
|
|
24
31
|
this.bslibPrefix = this.file.program.bslibPrefix;
|
|
32
|
+
this.firmwareCapabilities = this.file.program.firmwareCapabilities;
|
|
25
33
|
}
|
|
26
34
|
/**
|
|
27
35
|
* Transpile all leading trivia for a given statement, including comments mixed between annotations
|
|
@@ -32,6 +40,47 @@ class BrsTranspileState extends TranspileState_1.TranspileState {
|
|
|
32
40
|
return x.transpile(this);
|
|
33
41
|
});
|
|
34
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Begin tracking a loop label for the loop about to be transpiled. The label is allocated
|
|
45
|
+
* eagerly but only emitted if a nested `continue` actually asks for it via `getLoopLabel()`.
|
|
46
|
+
* `blockDepth` records the depth the loop's own body block will occupy, so the block that
|
|
47
|
+
* emits the label can tell whether the label belongs to it or to a nested loop.
|
|
48
|
+
*/
|
|
49
|
+
pushLoopLabel() {
|
|
50
|
+
this.loopLabels.push({
|
|
51
|
+
label: `BRIGHTERSCRIPT_CONTINUE_${this.loopLabelSequence++}`,
|
|
52
|
+
wasAccessed: false,
|
|
53
|
+
//the loop body block increments blockDepth before emitting its statements
|
|
54
|
+
blockDepth: this.blockDepth + 1
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Look at the innermost loop label without removing it. Used by Block.transpile to decide
|
|
59
|
+
* whether it owns the pending label.
|
|
60
|
+
*/
|
|
61
|
+
peekLoopLabel() {
|
|
62
|
+
return this.loopLabels[this.loopLabels.length - 1];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Stop tracking the innermost loop label. Returns the tracker so the loop can decide whether
|
|
66
|
+
* it needs to emit the end-of-body label (i.e. when `wasAccessed` is true).
|
|
67
|
+
*/
|
|
68
|
+
popLoopLabel() {
|
|
69
|
+
return this.loopLabels.pop();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get the label marking the end of the innermost loop body, flagging it as needed so the
|
|
73
|
+
* enclosing loop knows to emit the label itself. Returns undefined when there is no enclosing
|
|
74
|
+
* loop (a `continue` outside a loop, which validation already flags as an error).
|
|
75
|
+
*/
|
|
76
|
+
getLoopLabel() {
|
|
77
|
+
const loopLabel = this.loopLabels[this.loopLabels.length - 1];
|
|
78
|
+
if (!loopLabel) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
loopLabel.wasAccessed = true;
|
|
82
|
+
return loopLabel.label;
|
|
83
|
+
}
|
|
35
84
|
}
|
|
36
85
|
exports.BrsTranspileState = BrsTranspileState;
|
|
37
86
|
//# sourceMappingURL=BrsTranspileState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrsTranspileState.js","sourceRoot":"","sources":["../../src/parser/BrsTranspileState.ts"],"names":[],"mappings":";;;AACA,+CAA4C;
|
|
1
|
+
{"version":3,"file":"BrsTranspileState.js","sourceRoot":"","sources":["../../src/parser/BrsTranspileState.ts"],"names":[],"mappings":";;;AACA,+CAA4C;AAI5C,qDAAkD;AAGlD,MAAa,iBAAkB,SAAQ,+BAAc;IACjD,YACW,IAAa;QAEpB,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAFnC,SAAI,GAAJ,IAAI,CAAS;QAYxB;;;WAGG;QACH,YAAO,GAAG,EAER,CAAC;QAOH;;;WAGG;QACI,WAAM,GAAG,IAAI,eAAM,EAAE,CAAC;QAO7B;;WAEG;QACI,wBAAmB,GAAG,KAAK,CAAC;QAgBnC;;;;WAIG;QACK,eAAU,GAAG,EAAwE,CAAC;QAEtF,sBAAiB,GAAG,CAAC,CAAC;QA3D1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACjD,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACvE,CAAC;IAoCD;;OAEG;IACI,oBAAoB,CAAC,IAAe;;QACvC,OAAO,CAAC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,WAAW,mCAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACrC,OAAO,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAgBD;;;;;OAKG;IACI,aAAa;QAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACjB,KAAK,EAAE,2BAA2B,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC5D,WAAW,EAAE,KAAK;YAClB,0EAA0E;YAC1E,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC;SAClC,CAAC,CAAC;IACP,CAAC;IAED;;;OAGG;IACI,aAAa;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACI,YAAY;QACf,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACI,YAAY;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,EAAE;YACZ,OAAO,SAAS,CAAC;SACpB;QACD,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;QAC7B,OAAO,SAAS,CAAC,KAAK,CAAC;IAC3B,CAAC;CACJ;AA9GD,8CA8GC"}
|