brighterscript 1.0.0-alpha.44 → 1.0.0-alpha.46

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.
Files changed (229) hide show
  1. package/bsconfig.schema.json +6 -1
  2. package/dist/AstValidationSegmenter.js +6 -1
  3. package/dist/AstValidationSegmenter.js.map +1 -1
  4. package/dist/BsConfig.d.ts +4 -0
  5. package/dist/BusyStatusTracker.d.ts +37 -7
  6. package/dist/BusyStatusTracker.js +73 -8
  7. package/dist/BusyStatusTracker.js.map +1 -1
  8. package/dist/Cache.d.ts +0 -4
  9. package/dist/Cache.js +0 -6
  10. package/dist/Cache.js.map +1 -1
  11. package/dist/CodeActionUtil.d.ts +6 -1
  12. package/dist/CodeActionUtil.js +3 -0
  13. package/dist/CodeActionUtil.js.map +1 -1
  14. package/dist/CrossScopeValidator.d.ts +1 -1
  15. package/dist/CrossScopeValidator.js +8 -7
  16. package/dist/CrossScopeValidator.js.map +1 -1
  17. package/dist/DiagnosticCollection.d.ts +19 -5
  18. package/dist/DiagnosticCollection.js +71 -23
  19. package/dist/DiagnosticCollection.js.map +1 -1
  20. package/dist/DiagnosticFilterer.d.ts +14 -1
  21. package/dist/DiagnosticFilterer.js +130 -12
  22. package/dist/DiagnosticFilterer.js.map +1 -1
  23. package/dist/DiagnosticManager.d.ts +11 -1
  24. package/dist/DiagnosticManager.js +192 -35
  25. package/dist/DiagnosticManager.js.map +1 -1
  26. package/dist/DiagnosticMessages.d.ts +19 -7
  27. package/dist/DiagnosticMessages.js +21 -9
  28. package/dist/DiagnosticMessages.js.map +1 -1
  29. package/dist/LanguageServer.d.ts +82 -139
  30. package/dist/LanguageServer.js +402 -980
  31. package/dist/LanguageServer.js.map +1 -1
  32. package/dist/Logger.d.ts +9 -4
  33. package/dist/Logger.js +30 -6
  34. package/dist/Logger.js.map +1 -1
  35. package/dist/PluginInterface.d.ts +8 -8
  36. package/dist/PluginInterface.js.map +1 -1
  37. package/dist/Program.d.ts +23 -4
  38. package/dist/Program.js +294 -194
  39. package/dist/Program.js.map +1 -1
  40. package/dist/ProgramBuilder.d.ts +22 -7
  41. package/dist/ProgramBuilder.js +44 -21
  42. package/dist/ProgramBuilder.js.map +1 -1
  43. package/dist/Scope.d.ts +11 -6
  44. package/dist/Scope.js +60 -36
  45. package/dist/Scope.js.map +1 -1
  46. package/dist/SemanticTokenUtils.js +1 -1
  47. package/dist/SemanticTokenUtils.js.map +1 -1
  48. package/dist/astUtils/CachedLookups.js +0 -1
  49. package/dist/astUtils/CachedLookups.js.map +1 -1
  50. package/dist/astUtils/reflection.d.ts +4 -4
  51. package/dist/astUtils/reflection.js +12 -10
  52. package/dist/astUtils/reflection.js.map +1 -1
  53. package/dist/bscPlugin/BscPlugin.d.ts +3 -3
  54. package/dist/bscPlugin/BscPlugin.js.map +1 -1
  55. package/dist/bscPlugin/CallExpressionInfo.js +4 -2
  56. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -1
  57. package/dist/bscPlugin/codeActions/CodeActionsProcessor.d.ts +2 -0
  58. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js +147 -0
  59. package/dist/bscPlugin/codeActions/CodeActionsProcessor.js.map +1 -1
  60. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js +44 -0
  61. package/dist/bscPlugin/codeActions/CodeActionsProcessor.spec.js.map +1 -1
  62. package/dist/bscPlugin/completions/CompletionsProcessor.d.ts +1 -1
  63. package/dist/bscPlugin/completions/CompletionsProcessor.js +15 -15
  64. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
  65. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js +82 -5
  66. package/dist/bscPlugin/completions/CompletionsProcessor.spec.js.map +1 -1
  67. package/dist/bscPlugin/hover/HoverProcessor.js +3 -0
  68. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  69. package/dist/bscPlugin/hover/HoverProcessor.spec.js +44 -0
  70. package/dist/bscPlugin/hover/HoverProcessor.spec.js.map +1 -1
  71. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js +4 -0
  72. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.js.map +1 -1
  73. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js +17 -0
  74. package/dist/bscPlugin/semanticTokens/BrsFileSemanticTokensProcessor.spec.js.map +1 -1
  75. package/dist/bscPlugin/validation/BrsFileValidator.js +21 -0
  76. package/dist/bscPlugin/validation/BrsFileValidator.js.map +1 -1
  77. package/dist/bscPlugin/validation/BrsFileValidator.spec.js +161 -7
  78. package/dist/bscPlugin/validation/BrsFileValidator.spec.js.map +1 -1
  79. package/dist/bscPlugin/validation/ScopeValidator.d.ts +4 -1
  80. package/dist/bscPlugin/validation/ScopeValidator.js +166 -63
  81. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  82. package/dist/bscPlugin/validation/ScopeValidator.spec.js +21 -9
  83. package/dist/bscPlugin/validation/ScopeValidator.spec.js.map +1 -1
  84. package/dist/common/Sequencer.d.ts +53 -0
  85. package/dist/common/Sequencer.js +233 -0
  86. package/dist/common/Sequencer.js.map +1 -0
  87. package/dist/common/Sequencer.spec.d.ts +1 -0
  88. package/dist/common/Sequencer.spec.js +75 -0
  89. package/dist/common/Sequencer.spec.js.map +1 -0
  90. package/dist/deferred.d.ts +2 -0
  91. package/dist/deferred.js +10 -0
  92. package/dist/deferred.js.map +1 -1
  93. package/dist/examples/plugins/removePrint.d.ts +2 -2
  94. package/dist/examples/plugins/removePrint.js.map +1 -1
  95. package/dist/files/BrsFile.d.ts +1 -1
  96. package/dist/files/BrsFile.js +22 -42
  97. package/dist/files/BrsFile.js.map +1 -1
  98. package/dist/files/BrsFile.spec.js +155 -4
  99. package/dist/files/BrsFile.spec.js.map +1 -1
  100. package/dist/files/BscFile.d.ts +1 -0
  101. package/dist/files/LazyFileData.d.ts +1 -0
  102. package/dist/files/XmlFile.spec.js +1 -1
  103. package/dist/files/XmlFile.spec.js.map +1 -1
  104. package/dist/globalCallables.js +189 -189
  105. package/dist/globalCallables.js.map +1 -1
  106. package/dist/interfaces.d.ts +56 -13
  107. package/dist/interfaces.js.map +1 -1
  108. package/dist/lexer/Lexer.js +1 -1
  109. package/dist/lexer/Lexer.js.map +1 -1
  110. package/dist/logging.d.ts +6 -1
  111. package/dist/logging.js +14 -1
  112. package/dist/logging.js.map +1 -1
  113. package/dist/lsp/ActionQueue.d.ts +35 -0
  114. package/dist/lsp/ActionQueue.js +115 -0
  115. package/dist/lsp/ActionQueue.js.map +1 -0
  116. package/dist/lsp/ActionQueue.spec.d.ts +1 -0
  117. package/dist/lsp/ActionQueue.spec.js +80 -0
  118. package/dist/lsp/ActionQueue.spec.js.map +1 -0
  119. package/dist/lsp/DocumentManager.d.ts +63 -0
  120. package/dist/lsp/DocumentManager.js +122 -0
  121. package/dist/lsp/DocumentManager.js.map +1 -0
  122. package/dist/lsp/DocumentManager.spec.d.ts +1 -0
  123. package/dist/lsp/DocumentManager.spec.js +103 -0
  124. package/dist/lsp/DocumentManager.spec.js.map +1 -0
  125. package/dist/lsp/LspProject.d.ts +231 -0
  126. package/dist/lsp/LspProject.js +3 -0
  127. package/dist/lsp/LspProject.js.map +1 -0
  128. package/dist/lsp/PathFilterer.d.ts +75 -0
  129. package/dist/lsp/PathFilterer.js +196 -0
  130. package/dist/lsp/PathFilterer.js.map +1 -0
  131. package/dist/lsp/PathFilterer.spec.d.ts +1 -0
  132. package/dist/lsp/PathFilterer.spec.js +182 -0
  133. package/dist/lsp/PathFilterer.spec.js.map +1 -0
  134. package/dist/lsp/Project.d.ts +167 -0
  135. package/dist/lsp/Project.js +432 -0
  136. package/dist/lsp/Project.js.map +1 -0
  137. package/dist/lsp/Project.spec.d.ts +1 -0
  138. package/dist/lsp/Project.spec.js +220 -0
  139. package/dist/lsp/Project.spec.js.map +1 -0
  140. package/dist/lsp/ProjectManager.d.ts +221 -0
  141. package/dist/lsp/ProjectManager.js +754 -0
  142. package/dist/lsp/ProjectManager.js.map +1 -0
  143. package/dist/lsp/ProjectManager.spec.d.ts +1 -0
  144. package/dist/lsp/ProjectManager.spec.js +783 -0
  145. package/dist/lsp/ProjectManager.spec.js.map +1 -0
  146. package/dist/lsp/ReaderWriterManager.d.ts +21 -0
  147. package/dist/lsp/ReaderWriterManager.js +60 -0
  148. package/dist/lsp/ReaderWriterManager.js.map +1 -0
  149. package/dist/lsp/worker/MessageHandler.d.ts +99 -0
  150. package/dist/lsp/worker/MessageHandler.js +138 -0
  151. package/dist/lsp/worker/MessageHandler.js.map +1 -0
  152. package/dist/lsp/worker/MessageHandler.spec.d.ts +1 -0
  153. package/dist/lsp/worker/MessageHandler.spec.js +64 -0
  154. package/dist/lsp/worker/MessageHandler.spec.js.map +1 -0
  155. package/dist/lsp/worker/WorkerPool.d.ts +38 -0
  156. package/dist/lsp/worker/WorkerPool.js +78 -0
  157. package/dist/lsp/worker/WorkerPool.js.map +1 -0
  158. package/dist/lsp/worker/WorkerPool.spec.d.ts +1 -0
  159. package/dist/lsp/worker/WorkerPool.spec.js +59 -0
  160. package/dist/lsp/worker/WorkerPool.spec.js.map +1 -0
  161. package/dist/lsp/worker/WorkerThreadProject.d.ts +144 -0
  162. package/dist/lsp/worker/WorkerThreadProject.js +183 -0
  163. package/dist/lsp/worker/WorkerThreadProject.js.map +1 -0
  164. package/dist/lsp/worker/WorkerThreadProject.spec.d.ts +2 -0
  165. package/dist/lsp/worker/WorkerThreadProject.spec.js +68 -0
  166. package/dist/lsp/worker/WorkerThreadProject.spec.js.map +1 -0
  167. package/dist/lsp/worker/WorkerThreadProjectRunner.d.ts +15 -0
  168. package/dist/lsp/worker/WorkerThreadProjectRunner.js +58 -0
  169. package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -0
  170. package/dist/parser/Expression.d.ts +1 -0
  171. package/dist/parser/Expression.js +65 -3
  172. package/dist/parser/Expression.js.map +1 -1
  173. package/dist/parser/Parser.spec.js +12 -0
  174. package/dist/parser/Parser.spec.js.map +1 -1
  175. package/dist/parser/Statement.js +2 -2
  176. package/dist/parser/Statement.js.map +1 -1
  177. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js +47 -0
  178. package/dist/parser/tests/expression/NullCoalescenceExpression.spec.js.map +1 -1
  179. package/dist/parser/tests/expression/TemplateStringExpression.spec.js +51 -5
  180. package/dist/parser/tests/expression/TemplateStringExpression.spec.js.map +1 -1
  181. package/dist/parser/tests/expression/TernaryExpression.spec.js +44 -0
  182. package/dist/parser/tests/expression/TernaryExpression.spec.js.map +1 -1
  183. package/dist/roku-types/data.json +880 -756
  184. package/dist/roku-types/index.d.ts +17 -0
  185. package/dist/types/BooleanType.d.ts +0 -2
  186. package/dist/types/BooleanType.js +4 -6
  187. package/dist/types/BooleanType.js.map +1 -1
  188. package/dist/types/BscType.js +5 -0
  189. package/dist/types/BscType.js.map +1 -1
  190. package/dist/types/BuiltInInterfaceAdder.d.ts +1 -0
  191. package/dist/types/BuiltInInterfaceAdder.js +24 -17
  192. package/dist/types/BuiltInInterfaceAdder.js.map +1 -1
  193. package/dist/types/DoubleType.d.ts +0 -2
  194. package/dist/types/DoubleType.js +4 -6
  195. package/dist/types/DoubleType.js.map +1 -1
  196. package/dist/types/DynamicType.d.ts +0 -2
  197. package/dist/types/DynamicType.js +3 -5
  198. package/dist/types/DynamicType.js.map +1 -1
  199. package/dist/types/FloatType.d.ts +0 -2
  200. package/dist/types/FloatType.js +4 -6
  201. package/dist/types/FloatType.js.map +1 -1
  202. package/dist/types/FunctionType.d.ts +0 -2
  203. package/dist/types/FunctionType.js +5 -7
  204. package/dist/types/FunctionType.js.map +1 -1
  205. package/dist/types/IntegerType.d.ts +0 -2
  206. package/dist/types/IntegerType.js +4 -6
  207. package/dist/types/IntegerType.js.map +1 -1
  208. package/dist/types/LongIntegerType.d.ts +0 -2
  209. package/dist/types/LongIntegerType.js +4 -6
  210. package/dist/types/LongIntegerType.js.map +1 -1
  211. package/dist/types/ObjectType.d.ts +3 -3
  212. package/dist/types/ObjectType.js +6 -8
  213. package/dist/types/ObjectType.js.map +1 -1
  214. package/dist/types/StringType.d.ts +0 -2
  215. package/dist/types/StringType.js +4 -6
  216. package/dist/types/StringType.js.map +1 -1
  217. package/dist/types/VoidType.d.ts +0 -2
  218. package/dist/types/VoidType.js +4 -6
  219. package/dist/types/VoidType.js.map +1 -1
  220. package/dist/types/helpers.d.ts +4 -0
  221. package/dist/types/helpers.js +5 -1
  222. package/dist/types/helpers.js.map +1 -1
  223. package/dist/util.d.ts +48 -16
  224. package/dist/util.js +203 -70
  225. package/dist/util.js.map +1 -1
  226. package/dist/validators/ClassValidator.js +2 -2
  227. package/dist/validators/ClassValidator.js.map +1 -1
  228. package/package.json +15 -5
  229. package/CHANGELOG.md +0 -2352
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerPool.spec.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerPool.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import type { LspDiagnostic, ActivateResponse, ProjectConfig } from '../LspProject';
2
+ import { type LspProject } from '../LspProject';
3
+ import { WorkerPool } from './WorkerPool';
4
+ import type { Hover, MaybePromise, SemanticToken } from '../../interfaces';
5
+ import type { DocumentAction, DocumentActionWithStatus } from '../DocumentManager';
6
+ import type { FileTranspileResult, SignatureInfoObj } from '../../Program';
7
+ import type { Position, Range, Location, DocumentSymbol, WorkspaceSymbol, CodeAction, CompletionList } from 'vscode-languageserver-protocol';
8
+ import type { Logger } from '../../logging';
9
+ export declare const workerPool: WorkerPool;
10
+ export declare class WorkerThreadProject implements LspProject {
11
+ constructor(options?: {
12
+ logger?: Logger;
13
+ projectIdentifier?: string;
14
+ });
15
+ activate(options: ProjectConfig): Promise<ActivateResponse>;
16
+ logger: Logger;
17
+ isStandaloneProject: boolean;
18
+ private activationDeferred;
19
+ /**
20
+ * Options used to activate this project
21
+ */
22
+ activateOptions: ProjectConfig;
23
+ /**
24
+ * The root directory of the project
25
+ */
26
+ rootDir: string;
27
+ /**
28
+ * The file patterns from bsconfig.json that were used to find all files for this project
29
+ */
30
+ filePatterns: string[];
31
+ /**
32
+ * Path to a bsconfig.json file that will be used for this project
33
+ */
34
+ bsconfigPath?: string;
35
+ /**
36
+ * The contents of the bsconfig.json file. This is used to detect when the bsconfig file has not actually been changed (even if the fs says it did).
37
+ *
38
+ * Only available after `.activate()` has completed.
39
+ * @deprecated do not depend on this property. This will certainly be removed in a future release
40
+ */
41
+ bsconfigFileContents?: string;
42
+ /**
43
+ * The worker thread where the actual project will execute
44
+ */
45
+ private worker;
46
+ /**
47
+ * The path to where the project resides
48
+ */
49
+ projectPath: string;
50
+ /**
51
+ * A unique number for this project, generated during this current language server session. Mostly used so we can identify which project is doing logging
52
+ */
53
+ projectNumber: number;
54
+ /**
55
+ * A unique name for this project used in logs to help keep track of everything
56
+ */
57
+ projectIdentifier: string;
58
+ /**
59
+ * The path to the workspace where this project resides. A workspace can have multiple projects (by adding a bsconfig.json to each folder).
60
+ * Defaults to `.projectPath` if not set
61
+ */
62
+ workspaceFolder: string;
63
+ /**
64
+ * Promise that resolves when the project finishes activating
65
+ * @returns a promise that resolves when the project finishes activating
66
+ */
67
+ whenActivated(): Promise<void>;
68
+ /**
69
+ * Validate the project. This will trigger a full validation on any scopes that were changed since the last validation,
70
+ * and will also eventually emit a new 'diagnostics' event that includes all diagnostics for the project
71
+ */
72
+ validate(): Promise<void>;
73
+ /**
74
+ * Cancel any active validation that's running
75
+ */
76
+ cancelValidate(): Promise<void>;
77
+ getDiagnostics(): Promise<LspDiagnostic[]>;
78
+ /**
79
+ * Apply a series of file changes to the project. This is safe to call any time. Changes will be queued and flushed at the correct times
80
+ * during the program's lifecycle flow
81
+ */
82
+ applyFileChanges(documentActions: DocumentAction[]): Promise<DocumentActionWithStatus[]>;
83
+ /**
84
+ * Send a request with the standard structure
85
+ * @param name the name of the request
86
+ * @param data the array of data to send
87
+ * @returns the response from the request
88
+ */
89
+ private sendStandardRequest;
90
+ /**
91
+ * Get the full list of semantic tokens for the given file path
92
+ */
93
+ getSemanticTokens(options: {
94
+ srcPath: string;
95
+ }): Promise<SemanticToken[]>;
96
+ transpileFile(options: {
97
+ srcPath: string;
98
+ }): Promise<FileTranspileResult>;
99
+ getHover(options: {
100
+ srcPath: string;
101
+ position: Position;
102
+ }): Promise<Hover[]>;
103
+ getDefinition(options: {
104
+ srcPath: string;
105
+ position: Position;
106
+ }): Promise<Location[]>;
107
+ getSignatureHelp(options: {
108
+ srcPath: string;
109
+ position: Position;
110
+ }): Promise<SignatureInfoObj[]>;
111
+ getDocumentSymbol(options: {
112
+ srcPath: string;
113
+ }): Promise<DocumentSymbol[]>;
114
+ getWorkspaceSymbol(): Promise<WorkspaceSymbol[]>;
115
+ getReferences(options: {
116
+ srcPath: string;
117
+ position: Position;
118
+ }): Promise<Location[]>;
119
+ getCodeActions(options: {
120
+ srcPath: string;
121
+ range: Range;
122
+ }): Promise<CodeAction[]>;
123
+ getCompletions(options: {
124
+ srcPath: string;
125
+ position: Position;
126
+ }): Promise<CompletionList>;
127
+ /**
128
+ * Handles request/response/update messages from the worker thread
129
+ */
130
+ private messageHandler;
131
+ private processRequest;
132
+ private processUpdate;
133
+ on(eventName: 'critical-failure', handler: (data: {
134
+ message: string;
135
+ }) => void): any;
136
+ on(eventName: 'diagnostics', handler: (data: {
137
+ diagnostics: LspDiagnostic[];
138
+ }) => MaybePromise<void>): any;
139
+ on(eventName: 'all', handler: (eventName: string, data: any) => MaybePromise<void>): any;
140
+ private emit;
141
+ private emitter;
142
+ disposables: LspProject['disposables'];
143
+ dispose(): void;
144
+ }
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerThreadProject = exports.workerPool = void 0;
4
+ const EventEmitter = require("eventemitter3");
5
+ const worker_threads_1 = require("worker_threads");
6
+ const MessageHandler_1 = require("./MessageHandler");
7
+ const util_1 = require("../../util");
8
+ const worker_threads_2 = require("worker_threads");
9
+ const WorkerThreadProjectRunner_1 = require("./WorkerThreadProjectRunner");
10
+ const WorkerPool_1 = require("./WorkerPool");
11
+ const deferred_1 = require("../../deferred");
12
+ const logging_1 = require("../../logging");
13
+ const fsExtra = require("fs-extra");
14
+ exports.workerPool = new WorkerPool_1.WorkerPool(() => {
15
+ return new worker_threads_1.Worker(__filename, {
16
+ //this needs to align with the same flag in the if statement below
17
+ argv: ['--run-worker-thread-project-runner'],
18
+ //wire up ts-node if we're running in ts-node
19
+ execArgv: /\.ts$/i.test(__filename)
20
+ ? ['--require', 'ts-node/register']
21
+ /* istanbul ignore next */
22
+ : undefined
23
+ });
24
+ });
25
+ //if this script is running in a Worker, start the project runner
26
+ /* istanbul ignore next */
27
+ if (!worker_threads_2.isMainThread && process.argv.includes('--run-worker-thread-project-runner')) {
28
+ const runner = new WorkerThreadProjectRunner_1.WorkerThreadProjectRunner();
29
+ runner.run(worker_threads_2.parentPort);
30
+ }
31
+ class WorkerThreadProject {
32
+ constructor(options) {
33
+ var _a, _b;
34
+ this.isStandaloneProject = false;
35
+ this.activationDeferred = new deferred_1.Deferred();
36
+ this.emitter = new EventEmitter();
37
+ this.disposables = [];
38
+ this.logger = (_a = options === null || options === void 0 ? void 0 : options.logger) !== null && _a !== void 0 ? _a : (0, logging_1.createLogger)();
39
+ this.projectIdentifier = (_b = options === null || options === void 0 ? void 0 : options.projectIdentifier) !== null && _b !== void 0 ? _b : '';
40
+ }
41
+ async activate(options) {
42
+ this.activateOptions = options;
43
+ this.projectPath = options.projectPath ? util_1.default.standardizePath(options.projectPath) : options.projectPath;
44
+ this.workspaceFolder = options.workspaceFolder ? util_1.default.standardizePath(options.workspaceFolder) : options.workspaceFolder;
45
+ this.projectNumber = options.projectNumber;
46
+ this.bsconfigPath = options.bsconfigPath ? util_1.default.standardizePath(options.bsconfigPath) : options.bsconfigPath;
47
+ // start a new worker thread or get an unused existing thread
48
+ this.worker = exports.workerPool.getWorker();
49
+ this.messageHandler = new MessageHandler_1.MessageHandler({
50
+ name: 'MainThread',
51
+ port: this.worker,
52
+ onRequest: this.processRequest.bind(this),
53
+ onUpdate: this.processUpdate.bind(this)
54
+ });
55
+ this.disposables.push(this.messageHandler);
56
+ const activateResponse = await this.messageHandler.sendRequest('activate', { data: [options] });
57
+ this.bsconfigPath = activateResponse.data.bsconfigPath;
58
+ this.rootDir = activateResponse.data.rootDir;
59
+ this.filePatterns = activateResponse.data.filePatterns;
60
+ this.logger.logLevel = activateResponse.data.logLevel;
61
+ //load the bsconfig file contents (used for performance optimizations externally)
62
+ try {
63
+ this.bsconfigFileContents = (await fsExtra.readFile(this.bsconfigPath)).toString();
64
+ }
65
+ catch (_a) { }
66
+ this.activationDeferred.resolve();
67
+ return activateResponse.data;
68
+ }
69
+ /**
70
+ * Promise that resolves when the project finishes activating
71
+ * @returns a promise that resolves when the project finishes activating
72
+ */
73
+ whenActivated() {
74
+ return this.activationDeferred.promise;
75
+ }
76
+ /**
77
+ * Validate the project. This will trigger a full validation on any scopes that were changed since the last validation,
78
+ * and will also eventually emit a new 'diagnostics' event that includes all diagnostics for the project
79
+ */
80
+ async validate() {
81
+ const response = await this.messageHandler.sendRequest('validate');
82
+ return response.data;
83
+ }
84
+ /**
85
+ * Cancel any active validation that's running
86
+ */
87
+ async cancelValidate() {
88
+ const response = await this.messageHandler.sendRequest('cancelValidate');
89
+ return response.data;
90
+ }
91
+ async getDiagnostics() {
92
+ const response = await this.messageHandler.sendRequest('getDiagnostics');
93
+ return response.data;
94
+ }
95
+ /**
96
+ * Apply a series of file changes to the project. This is safe to call any time. Changes will be queued and flushed at the correct times
97
+ * during the program's lifecycle flow
98
+ */
99
+ async applyFileChanges(documentActions) {
100
+ const response = await this.messageHandler.sendRequest('applyFileChanges', {
101
+ data: [documentActions]
102
+ });
103
+ return response.data;
104
+ }
105
+ /**
106
+ * Send a request with the standard structure
107
+ * @param name the name of the request
108
+ * @param data the array of data to send
109
+ * @returns the response from the request
110
+ */
111
+ async sendStandardRequest(name, ...data) {
112
+ const response = await this.messageHandler.sendRequest(name, {
113
+ data: data
114
+ });
115
+ return response.data;
116
+ }
117
+ /**
118
+ * Get the full list of semantic tokens for the given file path
119
+ */
120
+ async getSemanticTokens(options) {
121
+ return this.sendStandardRequest('getSemanticTokens', options);
122
+ }
123
+ async transpileFile(options) {
124
+ return this.sendStandardRequest('transpileFile', options);
125
+ }
126
+ async getHover(options) {
127
+ return this.sendStandardRequest('getHover', options);
128
+ }
129
+ async getDefinition(options) {
130
+ return this.sendStandardRequest('getDefinition', options);
131
+ }
132
+ async getSignatureHelp(options) {
133
+ return this.sendStandardRequest('getSignatureHelp', options);
134
+ }
135
+ async getDocumentSymbol(options) {
136
+ return this.sendStandardRequest('getDocumentSymbol', options);
137
+ }
138
+ async getWorkspaceSymbol() {
139
+ return this.sendStandardRequest('getWorkspaceSymbol');
140
+ }
141
+ async getReferences(options) {
142
+ return this.sendStandardRequest('getReferences', options);
143
+ }
144
+ async getCodeActions(options) {
145
+ return this.sendStandardRequest('getCodeActions', options);
146
+ }
147
+ async getCompletions(options) {
148
+ return this.sendStandardRequest('getCompletions', options);
149
+ }
150
+ processRequest(request) {
151
+ }
152
+ processUpdate(update) {
153
+ //for now, all updates are treated like "events"
154
+ this.emit(update.name, update.data);
155
+ }
156
+ on(eventName, handler) {
157
+ this.emitter.on(eventName, handler);
158
+ return () => {
159
+ this.emitter.removeListener(eventName, handler);
160
+ };
161
+ }
162
+ async emit(eventName, data) {
163
+ //emit these events on next tick, otherwise they will be processed immediately which could cause issues
164
+ await util_1.default.sleep(0);
165
+ this.emitter.emit(eventName, data);
166
+ //emit the 'all' event
167
+ this.emitter.emit('all', eventName, data);
168
+ }
169
+ dispose() {
170
+ var _a, _b, _c;
171
+ for (let disposable of (_a = this.disposables) !== null && _a !== void 0 ? _a : []) {
172
+ (_b = disposable === null || disposable === void 0 ? void 0 : disposable.dispose) === null || _b === void 0 ? void 0 : _b.call(disposable);
173
+ }
174
+ this.disposables = [];
175
+ //move the worker back to the pool so it can be used again
176
+ if (this.worker) {
177
+ exports.workerPool.releaseWorker(this.worker);
178
+ }
179
+ (_c = this.emitter) === null || _c === void 0 ? void 0 : _c.removeAllListeners();
180
+ }
181
+ }
182
+ exports.WorkerThreadProject = WorkerThreadProject;
183
+ //# sourceMappingURL=WorkerThreadProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerThreadProject.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProject.ts"],"names":[],"mappings":";;;AAAA,8CAA8C;AAC9C,mDAAwC;AAExC,qDAAkD;AAClD,qCAA8B;AAG9B,mDAA0D;AAC1D,2EAAwE;AACxE,6CAA0C;AAG1C,6CAA0C;AAI1C,2CAA6C;AAC7C,oCAAoC;AAEvB,QAAA,UAAU,GAAG,IAAI,uBAAU,CAAC,GAAG,EAAE;IAC1C,OAAO,IAAI,uBAAM,CACb,UAAU,EACV;QACI,kEAAkE;QAClE,IAAI,EAAE,CAAC,oCAAoC,CAAC;QAC5C,6CAA6C;QAC7C,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/B,CAAC,CAAC,CAAC,WAAW,EAAE,kBAAkB,CAAC;YACnC,0BAA0B;YAC1B,CAAC,CAAC,SAAS;KAClB,CACJ,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,iEAAiE;AACjE,0BAA0B;AAC1B,IAAI,CAAC,6BAAY,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,oCAAoC,CAAC,EAAE;IAC9E,MAAM,MAAM,GAAG,IAAI,qDAAyB,EAAE,CAAC;IAC/C,MAAM,CAAC,GAAG,CAAC,2BAAU,CAAC,CAAC;CAC1B;AAED,MAAa,mBAAmB;IAC5B,YACI,OAGC;;QAyCE,wBAAmB,GAAG,KAAK,CAAC;QAE3B,uBAAkB,GAAG,IAAI,mBAAQ,EAAE,CAAC;QA2LpC,YAAO,GAAG,IAAI,YAAY,EAAE,CAAC;QAE9B,gBAAW,GAA8B,EAAE,CAAC;QAtO/C,IAAI,CAAC,MAAM,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,IAAA,sBAAY,GAAE,CAAC;QAChD,IAAI,CAAC,iBAAiB,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,mCAAI,EAAE,CAAC;IAC9D,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,OAAsB;QACxC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,cAAI,CAAC,eAAe,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;QACzG,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,cAAI,CAAC,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;QACzH,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,cAAI,CAAC,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QAE7G,6DAA6D;QAC7D,IAAI,CAAC,MAAM,GAAG,kBAAU,CAAC,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,IAAI,+BAAc,CAAa;YACjD,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,IAAI,CAAC,MAAM;YACjB,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YACzC,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;SAC1C,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3C,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAmB,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClH,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;QACvD,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7C,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAEtD,iFAAiF;QACjF,IAAI;YACA,IAAI,CAAC,oBAAoB,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;SACtF;QAAC,WAAM,GAAG;QAGX,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAClC,OAAO,gBAAgB,CAAC,IAAI,CAAC;IACjC,CAAC;IA8DD;;;OAGG;IACI,aAAa;QAChB,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;IAC3C,CAAC;IAGD;;;OAGG;IACI,KAAK,CAAC,QAAQ;QACjB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAO,UAAU,CAAC,CAAC;QACzE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAO,gBAAgB,CAAC,CAAC;QAC/E,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,cAAc;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAkB,gBAAgB,CAAC,CAAC;QAC1F,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,gBAAgB,CAAC,eAAiC;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAA6B,kBAAkB,EAAE;YACnG,IAAI,EAAE,CAAC,eAAe,CAAC;SAC1B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,mBAAmB,CAAI,IAAY,EAAE,GAAG,IAAW;QAC7D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAI,IAAW,EAAE;YACnE,IAAI,EAAE,IAAI;SACb,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAAC,OAA4B;QACvD,OAAO,IAAI,CAAC,mBAAmB,CAAkB,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAA4B;QACnD,OAAO,IAAI,CAAC,mBAAmB,CAAsB,eAAe,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,OAAgD;QAClE,OAAO,IAAI,CAAC,mBAAmB,CAAU,UAAU,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAgD;QACvE,OAAO,IAAI,CAAC,mBAAmB,CAAa,eAAe,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,OAAgD;QAC1E,OAAO,IAAI,CAAC,mBAAmB,CAAqB,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACrF,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,OAA4B;QACvD,OAAO,IAAI,CAAC,mBAAmB,CAAmB,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACpF,CAAC;IAEM,KAAK,CAAC,kBAAkB;QAC3B,OAAO,IAAI,CAAC,mBAAmB,CAAoB,oBAAoB,CAAC,CAAC;IAC7E,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAAgD;QACvE,OAAO,IAAI,CAAC,mBAAmB,CAAa,eAAe,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,OAA0C;QAClE,OAAO,IAAI,CAAC,mBAAmB,CAAe,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC7E,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,OAAgD;QACxE,OAAO,IAAI,CAAC,mBAAmB,CAAiB,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAOO,cAAc,CAAC,OAAsB;IAE7C,CAAC;IAEO,aAAa,CAAC,MAAqB;QACvC,gDAAgD;QAChD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAKM,EAAE,CAAC,SAAiB,EAAE,OAA+C;QACxE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAc,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,OAAc,CAAC,CAAC;QAC3D,CAAC,CAAC;IACN,CAAC;IAIO,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,IAAK;QACvC,uGAAuG;QACvG,MAAM,cAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACnC,sBAAsB;QACtB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAKM,OAAO;;QACV,KAAK,IAAI,UAAU,IAAI,MAAA,IAAI,CAAC,WAAW,mCAAI,EAAE,EAAE;YAC3C,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,0DAAI,CAAC;SAC3B;QACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QAEtB,0DAA0D;QAC1D,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,kBAAU,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACzC;QACD,MAAA,IAAI,CAAC,OAAO,0CAAE,kBAAkB,EAAE,CAAC;IACvC,CAAC;CACJ;AA3PD,kDA2PC"}
@@ -0,0 +1,2 @@
1
+ export declare function wakeWorkerThread(): Promise<void>;
2
+ export declare function getWakeWorkerThreadPromise(): Promise<any>;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getWakeWorkerThreadPromise = exports.wakeWorkerThread = void 0;
4
+ const testHelpers_spec_1 = require("../../testHelpers.spec");
5
+ const fsExtra = require("fs-extra");
6
+ const WorkerThreadProject_1 = require("./WorkerThreadProject");
7
+ const DiagnosticMessages_1 = require("../../DiagnosticMessages");
8
+ const chai_1 = require("chai");
9
+ async function wakeWorkerThread() {
10
+ console.log('waking up a worker thread');
11
+ const project = new WorkerThreadProject_1.WorkerThreadProject();
12
+ try {
13
+ await project.activate({
14
+ projectPath: testHelpers_spec_1.rootDir,
15
+ projectNumber: 1
16
+ });
17
+ }
18
+ finally {
19
+ project.dispose();
20
+ }
21
+ }
22
+ exports.wakeWorkerThread = wakeWorkerThread;
23
+ let wakeWorkerThreadPromise1;
24
+ function getWakeWorkerThreadPromise() {
25
+ if (wakeWorkerThreadPromise1 === undefined) {
26
+ wakeWorkerThreadPromise1 = wakeWorkerThread();
27
+ }
28
+ return wakeWorkerThreadPromise1;
29
+ }
30
+ exports.getWakeWorkerThreadPromise = getWakeWorkerThreadPromise;
31
+ after(() => {
32
+ WorkerThreadProject_1.workerPool.dispose();
33
+ });
34
+ describe('WorkerThreadProject', () => {
35
+ let project;
36
+ before(async function workerThreadWarmup() {
37
+ this.timeout(40000);
38
+ await getWakeWorkerThreadPromise();
39
+ });
40
+ beforeEach(() => {
41
+ project === null || project === void 0 ? void 0 : project.dispose();
42
+ project = new WorkerThreadProject_1.WorkerThreadProject();
43
+ fsExtra.emptyDirSync(testHelpers_spec_1.tempDir);
44
+ });
45
+ afterEach(() => {
46
+ fsExtra.emptyDirSync(testHelpers_spec_1.tempDir);
47
+ project === null || project === void 0 ? void 0 : project.dispose();
48
+ });
49
+ describe('activate', () => {
50
+ it('shows diagnostics after running', async () => {
51
+ fsExtra.outputFileSync(`${testHelpers_spec_1.rootDir}/source/main.brs`, `
52
+ sub main()
53
+ print varNotThere
54
+ end sub
55
+ `);
56
+ await project.activate({
57
+ projectPath: testHelpers_spec_1.rootDir,
58
+ projectNumber: 1
59
+ });
60
+ const diagnostics = await project.getDiagnostics();
61
+ (0, chai_1.expect)(diagnostics).lengthOf(1);
62
+ await (0, testHelpers_spec_1.expectDiagnosticsAsync)(diagnostics, [
63
+ DiagnosticMessages_1.DiagnosticMessages.cannotFindName('varNotThere').message
64
+ ]);
65
+ });
66
+ });
67
+ });
68
+ //# sourceMappingURL=WorkerThreadProject.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkerThreadProject.spec.js","sourceRoot":"","sources":["../../../src/lsp/worker/WorkerThreadProject.spec.ts"],"names":[],"mappings":";;;AAAA,6DAAkF;AAClF,oCAAoC;AACpC,+DAAwE;AACxE,iEAA8D;AAC9D,+BAA8B;AAEvB,KAAK,UAAU,gBAAgB;IAClC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,yCAAmB,EAAE,CAAC;IAC1C,IAAI;QACA,MAAM,OAAO,CAAC,QAAQ,CAAC;YACnB,WAAW,EAAE,0BAAO;YACpB,aAAa,EAAE,CAAC;SACZ,CAAC,CAAC;KACb;YAAS;QACN,OAAO,CAAC,OAAO,EAAE,CAAC;KACrB;AACL,CAAC;AAXD,4CAWC;AAED,IAAI,wBAAsC,CAAC;AAC3C,SAAgB,0BAA0B;IACtC,IAAI,wBAAwB,KAAK,SAAS,EAAE;QACxC,wBAAwB,GAAG,gBAAgB,EAAE,CAAC;KACjD;IACD,OAAO,wBAAwB,CAAC;AACpC,CAAC;AALD,gEAKC;AAED,KAAK,CAAC,GAAG,EAAE;IACP,gCAAU,CAAC,OAAO,EAAE,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,IAAI,OAA4B,CAAC;IACjC,MAAM,CAAC,KAAK,UAAU,kBAAkB;QACpC,IAAI,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;QACrB,MAAM,0BAA0B,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACZ,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,EAAE,CAAC;QACnB,OAAO,GAAG,IAAI,yCAAmB,EAAE,CAAC;QACpC,OAAO,CAAC,YAAY,CAAC,0BAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,YAAY,CAAC,0BAAO,CAAC,CAAC;QAC9B,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC7C,OAAO,CAAC,cAAc,CAAC,GAAG,0BAAO,kBAAkB,EAAE;;;;aAIpD,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,QAAQ,CAAC;gBACnB,WAAW,EAAE,0BAAO;gBACpB,aAAa,EAAE,CAAC;aACZ,CAAC,CAAC;YACV,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;YACnD,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,IAAA,yCAAsB,EAAC,WAAW,EAAE;gBACtC,uCAAkB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,OAAO;aAC3D,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /// <reference types="node" />
2
+ import type { MessagePort } from 'worker_threads';
3
+ /**
4
+ * Runner logic for Running a Project in a worker thread.
5
+ */
6
+ export declare class WorkerThreadProjectRunner {
7
+ private requestInterceptors;
8
+ private project;
9
+ private messageHandler;
10
+ run(parentPort: MessagePort): void;
11
+ /**
12
+ * Fired anytime we get an `activate` request from the client. This allows us to clean up the previous project and make a new one
13
+ */
14
+ private onActivate;
15
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerThreadProjectRunner = void 0;
4
+ const logging_1 = require("../../logging");
5
+ const Project_1 = require("../Project");
6
+ const MessageHandler_1 = require("./MessageHandler");
7
+ /**
8
+ * Runner logic for Running a Project in a worker thread.
9
+ */
10
+ class WorkerThreadProjectRunner {
11
+ constructor() {
12
+ //collection of interceptors that will be called when events are fired
13
+ this.requestInterceptors = {};
14
+ }
15
+ run(parentPort) {
16
+ //ensure the lgoger is configured for LSP mode
17
+ (0, logging_1.setLspLoggerProps)();
18
+ this.messageHandler = new MessageHandler_1.MessageHandler({
19
+ name: 'WorkerThread',
20
+ port: parentPort,
21
+ onRequest: async (request) => {
22
+ var _a, _b, _c;
23
+ try {
24
+ //if we have a request interceptor registered for this event, call it
25
+ (_b = (_a = this.requestInterceptors)[request.name]) === null || _b === void 0 ? void 0 : _b.call(_a, request.data);
26
+ //only the LspProject interface method names will be passed as request names, so just call those functions on the Project class directly
27
+ let responseData = await this.project[request.name](...(_c = request.data) !== null && _c !== void 0 ? _c : []);
28
+ this.messageHandler.sendResponse(request, { data: responseData });
29
+ //we encountered a runtime crash. Pass that error along as the response to this request
30
+ }
31
+ catch (e) {
32
+ const error = e;
33
+ this.messageHandler.sendResponse(request, { error: error });
34
+ }
35
+ },
36
+ onUpdate: (update) => {
37
+ }
38
+ });
39
+ this.requestInterceptors.activate = this.onActivate.bind(this);
40
+ }
41
+ /**
42
+ * Fired anytime we get an `activate` request from the client. This allows us to clean up the previous project and make a new one
43
+ */
44
+ onActivate() {
45
+ var _a;
46
+ //clean up any existing project
47
+ (_a = this.project) === null || _a === void 0 ? void 0 : _a.dispose();
48
+ //make a new instance of the project (which is the same way we run it in the main thread).
49
+ this.project = new Project_1.Project();
50
+ this.project.on('all', (eventName, data) => {
51
+ this.messageHandler.sendUpdate(eventName, {
52
+ data: data
53
+ });
54
+ });
55
+ }
56
+ }
57
+ exports.WorkerThreadProjectRunner = WorkerThreadProjectRunner;
58
+ //# sourceMappingURL=WorkerThreadProjectRunner.js.map
@@ -0,0 +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;IAoD5F,CAAC;IA9CU,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;IACnE,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;AAtDD,8DAsDC"}
@@ -100,6 +100,7 @@ export declare class FunctionExpression extends Expression implements TypedefPro
100
100
  getTypedef(state: BrsTranspileState): SourceNode[];
101
101
  walk(visitor: WalkVisitor, options: WalkOptions): void;
102
102
  getType(options: GetTypeOptions): TypedFunctionType;
103
+ private get requiresReturnType();
103
104
  clone(): FunctionExpression;
104
105
  }
105
106
  export declare class FunctionParameterExpression extends Expression {
@@ -238,7 +238,7 @@ class FunctionExpression extends AstNode_1.Expression {
238
238
  //right paren
239
239
  results.push(state.transpileToken(this.tokens.rightParen, ')'));
240
240
  //as [Type]
241
- if (!state.options.removeParameterTypes && this.returnTypeExpression) {
241
+ if (this.tokens.as && this.returnTypeExpression && (this.requiresReturnType || !state.options.removeParameterTypes)) {
242
242
  results.push(' ',
243
243
  //as
244
244
  state.transpileToken(this.tokens.as, 'as'), ' ',
@@ -334,6 +334,38 @@ class FunctionExpression extends AstNode_1.Expression {
334
334
  (_d = options.typeChain) === null || _d === void 0 ? void 0 : _d.push(new interfaces_1.TypeChainEntry({ name: funcName, type: resultType, data: options.data, astNode: this }));
335
335
  return resultType;
336
336
  }
337
+ get requiresReturnType() {
338
+ /**
339
+ * RokuOS methods can be written several different ways:
340
+ * 1. Function() : return withValue
341
+ * 2. Function() as type : return withValue
342
+ * 3. Function() as void : return
343
+ *
344
+ * 4. Sub() : return
345
+ * 5. Sub () as void : return
346
+ * 6. Sub() as type : return withValue
347
+ *
348
+ * Formats (1), (2), and (6) throw a compile error if there IS NOT a return value in the function body.
349
+ * Formats (3), (4), and (5) throw a compile error if there IS a return value in the function body.
350
+ *
351
+ * 7. Additionally, as a special case, the OS requires that `onKeyEvent()` be defined with `as boolean`
352
+ */
353
+ var _a, _b, _c, _d, _e;
354
+ if (((0, reflection_1.isFunctionStatement)(this.parent) || (0, reflection_1.isMethodStatement)(this.parent)) && ((_c = (_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.tokens) === null || _b === void 0 ? void 0 : _b.name) === null || _c === void 0 ? void 0 : _c.text.toLowerCase()) === 'onkeyevent') {
355
+ // onKeyEvent() requires 'as Boolean' otherwise RokuOS throws errors
356
+ return true;
357
+ }
358
+ const isSub = ((_d = this.tokens.functionType) === null || _d === void 0 ? void 0 : _d.text.toLowerCase()) === 'sub';
359
+ const returnType = (_e = this.returnTypeExpression) === null || _e === void 0 ? void 0 : _e.getType({ flags: 2 /* SymbolTypeFlag.typetime */ });
360
+ const isVoidReturnType = (0, reflection_1.isVoidType)(returnType);
361
+ if (isSub && !isVoidReturnType) { // format (6)
362
+ return true;
363
+ }
364
+ else if (isVoidReturnType) { // format (3)
365
+ return true;
366
+ }
367
+ return false;
368
+ }
337
369
  clone() {
338
370
  var _a, _b, _c;
339
371
  return this.finalizeClone(new FunctionExpression({
@@ -1345,7 +1377,8 @@ class TemplateStringExpression extends AstNode_1.Expression {
1345
1377
  return StringType_1.StringType.instance;
1346
1378
  }
1347
1379
  transpile(state) {
1348
- if (this.quasis.length === 1 && this.expressions.length === 0) {
1380
+ //if this is essentially just a normal brightscript string but with backticks, transpile it as a normal string without parens
1381
+ if (this.expressions.length === 0 && this.quasis.length === 1 && this.quasis[0].expressions.length === 1) {
1349
1382
  return this.quasis[0].transpile(state);
1350
1383
  }
1351
1384
  let result = ['('];
@@ -1540,6 +1573,10 @@ class TernaryExpression extends AstNode_1.Expression {
1540
1573
  let alternateInfo = util_1.default.getExpressionInfo(this.alternate, file);
1541
1574
  //get all unique variable names used in the consequent and alternate, and sort them alphabetically so the output is consistent
1542
1575
  let allUniqueVarNames = [...new Set([...consequentInfo.uniqueVarNames, ...alternateInfo.uniqueVarNames])].sort();
1576
+ //discard names of global functions that cannot be passed by reference
1577
+ allUniqueVarNames = allUniqueVarNames.filter(name => {
1578
+ return !nonReferenceableFunctions.includes(name.toLowerCase());
1579
+ });
1543
1580
  let mutatingExpressions = [
1544
1581
  ...consequentInfo.expressions,
1545
1582
  ...alternateInfo.expressions
@@ -1597,6 +1634,10 @@ class NullCoalescingExpression extends AstNode_1.Expression {
1597
1634
  let alternateInfo = util_1.default.getExpressionInfo(this.alternate, state.file);
1598
1635
  //get all unique variable names used in the consequent and alternate, and sort them alphabetically so the output is consistent
1599
1636
  let allUniqueVarNames = [...new Set([...consequentInfo.uniqueVarNames, ...alternateInfo.uniqueVarNames])].sort();
1637
+ //discard names of global functions that cannot be passed by reference
1638
+ allUniqueVarNames = allUniqueVarNames.filter(name => {
1639
+ return !nonReferenceableFunctions.includes(name.toLowerCase());
1640
+ });
1600
1641
  let hasMutatingExpression = [
1601
1642
  ...consequentInfo.expressions,
1602
1643
  ...alternateInfo.expressions
@@ -1739,7 +1780,11 @@ class TypeExpression extends AstNode_1.Expression {
1739
1780
  this.location = util_1.default.cloneLocation((_a = this.expression) === null || _a === void 0 ? void 0 : _a.location);
1740
1781
  }
1741
1782
  transpile(state) {
1742
- return [this.getType({ flags: 2 /* SymbolTypeFlag.typetime */ }).toTypeString()];
1783
+ const exprType = this.getType({ flags: 2 /* SymbolTypeFlag.typetime */ });
1784
+ if ((0, reflection_1.isNativeType)(exprType)) {
1785
+ return this.expression.transpile(state);
1786
+ }
1787
+ return [exprType.toTypeString()];
1743
1788
  }
1744
1789
  walk(visitor, options) {
1745
1790
  if (options.walkMode & visitors_2.InternalWalkMode.walkExpressions) {
@@ -1842,4 +1887,21 @@ class TypedArrayExpression extends AstNode_1.Expression {
1842
1887
  }
1843
1888
  }
1844
1889
  exports.TypedArrayExpression = TypedArrayExpression;
1890
+ /**
1891
+ * A list of names of functions that are restricted from being stored to a
1892
+ * variable, property, or passed as an argument. (i.e. `type` or `createobject`).
1893
+ * Names are stored in lower case.
1894
+ */
1895
+ const nonReferenceableFunctions = [
1896
+ 'createobject',
1897
+ 'type',
1898
+ 'getglobalaa',
1899
+ 'box',
1900
+ 'run',
1901
+ 'eval',
1902
+ 'getlastruncompileerror',
1903
+ 'getlastrunruntimeerror',
1904
+ 'tab',
1905
+ 'pos'
1906
+ ];
1845
1907
  //# sourceMappingURL=Expression.js.map