brighterscript 0.68.4 → 0.69.0

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 (114) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/BusyStatusTracker.d.ts +37 -7
  3. package/dist/BusyStatusTracker.js +73 -8
  4. package/dist/BusyStatusTracker.js.map +1 -1
  5. package/dist/DiagnosticCollection.d.ts +19 -5
  6. package/dist/DiagnosticCollection.js +67 -16
  7. package/dist/DiagnosticCollection.js.map +1 -1
  8. package/dist/LanguageServer.d.ts +82 -132
  9. package/dist/LanguageServer.js +403 -940
  10. package/dist/LanguageServer.js.map +1 -1
  11. package/dist/Logger.d.ts +9 -4
  12. package/dist/Logger.js +30 -6
  13. package/dist/Logger.js.map +1 -1
  14. package/dist/PluginInterface.d.ts +1 -1
  15. package/dist/PluginInterface.js.map +1 -1
  16. package/dist/Program.d.ts +20 -2
  17. package/dist/Program.js +124 -49
  18. package/dist/Program.js.map +1 -1
  19. package/dist/ProgramBuilder.d.ts +21 -7
  20. package/dist/ProgramBuilder.js +45 -22
  21. package/dist/ProgramBuilder.js.map +1 -1
  22. package/dist/Scope.js +6 -3
  23. package/dist/Scope.js.map +1 -1
  24. package/dist/SemanticTokenUtils.js +1 -1
  25. package/dist/SemanticTokenUtils.js.map +1 -1
  26. package/dist/bscPlugin/CallExpressionInfo.js +2 -1
  27. package/dist/bscPlugin/CallExpressionInfo.js.map +1 -1
  28. package/dist/bscPlugin/completions/CompletionsProcessor.js +14 -4
  29. package/dist/bscPlugin/completions/CompletionsProcessor.js.map +1 -1
  30. package/dist/bscPlugin/hover/HoverProcessor.js +1 -1
  31. package/dist/bscPlugin/hover/HoverProcessor.js.map +1 -1
  32. package/dist/bscPlugin/validation/ScopeValidator.js +9 -9
  33. package/dist/bscPlugin/validation/ScopeValidator.js.map +1 -1
  34. package/dist/common/Sequencer.d.ts +27 -0
  35. package/dist/common/Sequencer.js +113 -0
  36. package/dist/common/Sequencer.js.map +1 -0
  37. package/dist/common/Sequencer.spec.d.ts +1 -0
  38. package/dist/common/Sequencer.spec.js +75 -0
  39. package/dist/common/Sequencer.spec.js.map +1 -0
  40. package/dist/deferred.d.ts +2 -0
  41. package/dist/deferred.js +10 -0
  42. package/dist/deferred.js.map +1 -1
  43. package/dist/files/BrsFile.d.ts +1 -1
  44. package/dist/files/BrsFile.js +10 -15
  45. package/dist/files/BrsFile.js.map +1 -1
  46. package/dist/files/BrsFile.spec.js +8 -0
  47. package/dist/files/BrsFile.spec.js.map +1 -1
  48. package/dist/interfaces.d.ts +22 -2
  49. package/dist/lexer/Lexer.js +1 -1
  50. package/dist/lexer/Lexer.js.map +1 -1
  51. package/dist/logging.d.ts +6 -1
  52. package/dist/logging.js +14 -1
  53. package/dist/logging.js.map +1 -1
  54. package/dist/lsp/ActionQueue.d.ts +35 -0
  55. package/dist/lsp/ActionQueue.js +115 -0
  56. package/dist/lsp/ActionQueue.js.map +1 -0
  57. package/dist/lsp/ActionQueue.spec.d.ts +1 -0
  58. package/dist/lsp/ActionQueue.spec.js +80 -0
  59. package/dist/lsp/ActionQueue.spec.js.map +1 -0
  60. package/dist/lsp/DocumentManager.d.ts +63 -0
  61. package/dist/lsp/DocumentManager.js +122 -0
  62. package/dist/lsp/DocumentManager.js.map +1 -0
  63. package/dist/lsp/DocumentManager.spec.d.ts +1 -0
  64. package/dist/lsp/DocumentManager.spec.js +103 -0
  65. package/dist/lsp/DocumentManager.spec.js.map +1 -0
  66. package/dist/lsp/LspProject.d.ts +231 -0
  67. package/dist/lsp/LspProject.js +3 -0
  68. package/dist/lsp/LspProject.js.map +1 -0
  69. package/dist/lsp/PathFilterer.d.ts +75 -0
  70. package/dist/lsp/PathFilterer.js +196 -0
  71. package/dist/lsp/PathFilterer.js.map +1 -0
  72. package/dist/lsp/PathFilterer.spec.d.ts +1 -0
  73. package/dist/lsp/PathFilterer.spec.js +182 -0
  74. package/dist/lsp/PathFilterer.spec.js.map +1 -0
  75. package/dist/lsp/Project.d.ts +178 -0
  76. package/dist/lsp/Project.js +438 -0
  77. package/dist/lsp/Project.js.map +1 -0
  78. package/dist/lsp/Project.spec.d.ts +1 -0
  79. package/dist/lsp/Project.spec.js +236 -0
  80. package/dist/lsp/Project.spec.js.map +1 -0
  81. package/dist/lsp/ProjectManager.d.ts +221 -0
  82. package/dist/lsp/ProjectManager.js +735 -0
  83. package/dist/lsp/ProjectManager.js.map +1 -0
  84. package/dist/lsp/ProjectManager.spec.d.ts +1 -0
  85. package/dist/lsp/ProjectManager.spec.js +756 -0
  86. package/dist/lsp/ProjectManager.spec.js.map +1 -0
  87. package/dist/lsp/ReaderWriterManager.d.ts +21 -0
  88. package/dist/lsp/ReaderWriterManager.js +60 -0
  89. package/dist/lsp/ReaderWriterManager.js.map +1 -0
  90. package/dist/lsp/worker/MessageHandler.d.ts +99 -0
  91. package/dist/lsp/worker/MessageHandler.js +138 -0
  92. package/dist/lsp/worker/MessageHandler.js.map +1 -0
  93. package/dist/lsp/worker/MessageHandler.spec.d.ts +1 -0
  94. package/dist/lsp/worker/MessageHandler.spec.js +64 -0
  95. package/dist/lsp/worker/MessageHandler.spec.js.map +1 -0
  96. package/dist/lsp/worker/WorkerPool.d.ts +38 -0
  97. package/dist/lsp/worker/WorkerPool.js +78 -0
  98. package/dist/lsp/worker/WorkerPool.js.map +1 -0
  99. package/dist/lsp/worker/WorkerPool.spec.d.ts +1 -0
  100. package/dist/lsp/worker/WorkerPool.spec.js +59 -0
  101. package/dist/lsp/worker/WorkerPool.spec.js.map +1 -0
  102. package/dist/lsp/worker/WorkerThreadProject.d.ts +144 -0
  103. package/dist/lsp/worker/WorkerThreadProject.js +181 -0
  104. package/dist/lsp/worker/WorkerThreadProject.js.map +1 -0
  105. package/dist/lsp/worker/WorkerThreadProject.spec.d.ts +2 -0
  106. package/dist/lsp/worker/WorkerThreadProject.spec.js +68 -0
  107. package/dist/lsp/worker/WorkerThreadProject.spec.js.map +1 -0
  108. package/dist/lsp/worker/WorkerThreadProjectRunner.d.ts +15 -0
  109. package/dist/lsp/worker/WorkerThreadProjectRunner.js +58 -0
  110. package/dist/lsp/worker/WorkerThreadProjectRunner.js.map +1 -0
  111. package/dist/util.d.ts +31 -5
  112. package/dist/util.js +117 -19
  113. package/dist/util.js.map +1 -1
  114. package/package.json +11 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
 
8
8
 
9
+ ## [0.69.0](https://github.com/rokucommunity/brighterscript/compare/v0.68.5...v0.69.0) - 2025-02-10
10
+ ### Changed
11
+ - Language Server Rewrite ([#993](https://github.com/rokucommunity/brighterscript/pull/993))
12
+
13
+
14
+
15
+ ## [0.68.5](https://github.com/rokucommunity/brighterscript/compare/v0.68.4...v0.68.5) - 2025-02-06
16
+ ### Added
17
+ - Add experimental `validate` flag to ProgramBuilder.run() ([#1409](https://github.com/rokucommunity/brighterscript/pull/1409))
18
+
19
+
20
+
9
21
  ## [0.68.4](https://github.com/rokucommunity/brighterscript/compare/v0.68.3...v0.68.4) - 2025-01-22
10
22
  ### Changed
11
23
  - upgrade to [roku-deploy@3.12.4](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#3124---2025-01-22). Notable changes since 3.12.3:
@@ -1,21 +1,50 @@
1
+ import { Deferred } from './deferred';
2
+ interface RunInfo<T> {
3
+ label: string;
4
+ startTime: Date;
5
+ scope?: T;
6
+ deferred?: Deferred;
7
+ }
1
8
  /**
2
9
  * Tracks the busy/idle status of various sync or async tasks
3
10
  * Reports the overall status to the client
4
11
  */
5
- export declare class BusyStatusTracker {
12
+ export declare class BusyStatusTracker<T = any> {
6
13
  /**
7
14
  * @readonly
8
15
  */
9
- activeRuns: Set<{
10
- label?: string;
11
- startTime?: Date;
12
- }>;
16
+ activeRuns: Array<RunInfo<T>>;
17
+ /**
18
+ * Begin a busy task. It's expected you will call `endScopeRun` when the task is complete.
19
+ * @param scope an object used for reference as to what is doing the work. Can be used to bulk-cancel all runs for a given scope.
20
+ * @param label label for the run. This is required for the `endScopedRun` method to know what to end.
21
+ */
22
+ beginScopedRun(scope: T, label: string): void;
23
+ /**
24
+ * End the earliest run for the given scope and label
25
+ * @param scope an object used for reference as to what is doing the work. Can be used to bulk-cancel all runs for a given scope.
26
+ * @param label label for the run
27
+ */
28
+ endScopedRun(scope: T, label: string): Promise<void>;
29
+ /**
30
+ * End all runs for a given scope. This is typically used when the scope is destroyed, and we want to make sure all runs are cleaned up.
31
+ * @param scope an object used for reference as to what is doing the work.
32
+ */
33
+ endAllRunsForScope(scope: T): void;
13
34
  /**
14
35
  * Start a new piece of work
15
36
  */
16
- run<T, R = T | Promise<T>>(callback: (finalize?: FinalizeBuildStatusRun) => R, label?: string): R;
37
+ run<A, R = A | Promise<A>>(callback: (finalize?: FinalizeBuildStatusRun) => R, label?: string): R;
38
+ private _run;
17
39
  private emitter;
18
- on(eventName: 'change', handler: (status: BusyStatus) => void): () => void;
40
+ once(eventName: 'active-runs-change'): Promise<{
41
+ activeRuns: Array<RunInfo<T>>;
42
+ }>;
43
+ once(eventName: 'change'): Promise<BusyStatus>;
44
+ on(eventName: 'active-runs-change', handler: (event: {
45
+ activeRuns: Array<RunInfo<T>>;
46
+ }) => void): any;
47
+ on(eventName: 'change', handler: (status: BusyStatus) => void): any;
19
48
  private emit;
20
49
  destroy(): void;
21
50
  /**
@@ -29,3 +58,4 @@ export declare enum BusyStatus {
29
58
  busy = "busy",
30
59
  idle = "idle"
31
60
  }
61
+ export {};
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BusyStatus = exports.BusyStatusTracker = void 0;
4
4
  const eventemitter3_1 = require("eventemitter3");
5
+ const deferred_1 = require("./deferred");
5
6
  /**
6
7
  * Tracks the busy/idle status of various sync or async tasks
7
8
  * Reports the overall status to the client
@@ -11,9 +12,57 @@ class BusyStatusTracker {
11
12
  /**
12
13
  * @readonly
13
14
  */
14
- this.activeRuns = new Set();
15
+ this.activeRuns = [];
15
16
  this.emitter = new eventemitter3_1.EventEmitter();
16
17
  }
18
+ /**
19
+ * Begin a busy task. It's expected you will call `endScopeRun` when the task is complete.
20
+ * @param scope an object used for reference as to what is doing the work. Can be used to bulk-cancel all runs for a given scope.
21
+ * @param label label for the run. This is required for the `endScopedRun` method to know what to end.
22
+ */
23
+ beginScopedRun(scope, label) {
24
+ const deferred = new deferred_1.Deferred();
25
+ const runInfo = {
26
+ label: label,
27
+ startTime: new Date(),
28
+ deferred: deferred,
29
+ scope: scope
30
+ };
31
+ void this._run(runInfo, () => {
32
+ //don't mark the busy run as completed until the deferred is resolved
33
+ return deferred.promise;
34
+ });
35
+ }
36
+ /**
37
+ * End the earliest run for the given scope and label
38
+ * @param scope an object used for reference as to what is doing the work. Can be used to bulk-cancel all runs for a given scope.
39
+ * @param label label for the run
40
+ */
41
+ endScopedRun(scope, label) {
42
+ const earliestRunIndex = this.activeRuns.findIndex(x => x.scope === scope && x.label === label);
43
+ if (earliestRunIndex === -1) {
44
+ return;
45
+ }
46
+ const earliestRun = this.activeRuns[earliestRunIndex];
47
+ this.activeRuns.splice(earliestRunIndex, 1);
48
+ earliestRun.deferred.resolve();
49
+ return earliestRun.deferred.promise;
50
+ }
51
+ /**
52
+ * End all runs for a given scope. This is typically used when the scope is destroyed, and we want to make sure all runs are cleaned up.
53
+ * @param scope an object used for reference as to what is doing the work.
54
+ */
55
+ endAllRunsForScope(scope) {
56
+ for (let i = this.activeRuns.length - 1; i >= 0; i--) {
57
+ const activeRun = this.activeRuns[i];
58
+ if (activeRun.scope === scope) {
59
+ //delete the active run
60
+ this.activeRuns.splice(i, 1);
61
+ //mark the run as resolved
62
+ activeRun.deferred.resolve();
63
+ }
64
+ }
65
+ }
17
66
  /**
18
67
  * Start a new piece of work
19
68
  */
@@ -22,16 +71,24 @@ class BusyStatusTracker {
22
71
  label: label,
23
72
  startTime: new Date()
24
73
  };
25
- this.activeRuns.add(run);
26
- if (this.activeRuns.size === 1) {
74
+ return this._run(run, callback);
75
+ }
76
+ _run(runInfo, callback, label) {
77
+ this.activeRuns.push(runInfo);
78
+ if (this.activeRuns.length === 1) {
27
79
  this.emit('change', BusyStatus.busy);
28
80
  }
81
+ this.emit('active-runs-change', { activeRuns: [...this.activeRuns] });
29
82
  let isFinalized = false;
30
83
  const finalizeRun = () => {
31
84
  if (isFinalized === false) {
32
85
  isFinalized = true;
33
- this.activeRuns.delete(run);
34
- if (this.activeRuns.size <= 0) {
86
+ let idx = this.activeRuns.indexOf(runInfo);
87
+ if (idx > -1) {
88
+ this.activeRuns.splice(idx, 1);
89
+ }
90
+ this.emit('active-runs-change', { activeRuns: [...this.activeRuns] });
91
+ if (this.activeRuns.length <= 0) {
35
92
  this.emit('change', BusyStatus.idle);
36
93
  }
37
94
  }
@@ -54,14 +111,22 @@ class BusyStatusTracker {
54
111
  throw e;
55
112
  }
56
113
  }
114
+ once(eventName) {
115
+ return new Promise((resolve) => {
116
+ const off = this.on(eventName, (data) => {
117
+ off();
118
+ resolve(data);
119
+ });
120
+ });
121
+ }
57
122
  on(eventName, handler) {
58
123
  this.emitter.on(eventName, handler);
59
124
  return () => {
60
125
  this.emitter.off(eventName, handler);
61
126
  };
62
127
  }
63
- emit(eventName, value) {
64
- this.emitter.emit(eventName, value);
128
+ emit(eventName, event) {
129
+ this.emitter.emit(eventName, event);
65
130
  }
66
131
  destroy() {
67
132
  this.emitter.removeAllListeners();
@@ -71,7 +136,7 @@ class BusyStatusTracker {
71
136
  * @readonly
72
137
  */
73
138
  get status() {
74
- return this.activeRuns.size === 0 ? BusyStatus.idle : BusyStatus.busy;
139
+ return this.activeRuns.length === 0 ? BusyStatus.idle : BusyStatus.busy;
75
140
  }
76
141
  }
77
142
  exports.BusyStatusTracker = BusyStatusTracker;
@@ -1 +1 @@
1
- {"version":3,"file":"BusyStatusTracker.js","sourceRoot":"","sources":["../src/BusyStatusTracker.ts"],"names":[],"mappings":";;;AAAA,iDAA6C;AAE7C;;;GAGG;AACH,MAAa,iBAAiB;IAA9B;QACI;;WAEG;QACI,eAAU,GAAG,IAAI,GAAG,EAGvB,CAAC;QA4CG,YAAO,GAAG,IAAI,4BAAY,EAAsB,CAAC;IAwB7D,CAAC;IAlEG;;OAEG;IACI,GAAG,CAAwB,QAAkD,EAAE,KAAc;QAChG,MAAM,GAAG,GAAG;YACR,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,IAAI,IAAI,EAAE;SACxB,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;SACxC;QAED,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,MAAM,WAAW,GAAG,GAAG,EAAE;YACrB,IAAI,WAAW,KAAK,KAAK,EAAE;gBACvB,WAAW,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,EAAE;oBAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;iBACxC;aACJ;QACL,CAAC,CAAC;QAEF,IAAI,MAA0B,CAAC;QAC/B,4BAA4B;QAC5B,IAAI;YACA,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC/B,+DAA+D;YAC/D,IAAI,OAAO,CAAC,MAAc,aAAd,MAAM,uBAAN,MAAM,CAAU,IAAI,CAAA,KAAK,UAAU,EAAE;gBAC7C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAQ,CAAC;aACjF;iBAAM;gBACH,WAAW,EAAE,CAAC;gBACd,OAAO,MAAM,CAAC;aACjB;SACJ;QAAC,OAAO,CAAC,EAAE;YACR,WAAW,EAAE,CAAC;YACd,MAAM,CAAC,CAAC;SACX;IACL,CAAC;IAIM,EAAE,CAAC,SAAmB,EAAE,OAAqC;QAChE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpC,OAAO,GAAG,EAAE;YACR,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC,CAAC;IACN,CAAC;IAEO,IAAI,CAAC,SAAmB,EAAE,KAAiB;QAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,IAAW,MAAM;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;IAC1E,CAAC;CACJ;AA3ED,8CA2EC;AAID,IAAY,UAGX;AAHD,WAAY,UAAU;IAClB,2BAAa,CAAA;IACb,2BAAa,CAAA;AACjB,CAAC,EAHW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAGrB"}
1
+ {"version":3,"file":"BusyStatusTracker.js","sourceRoot":"","sources":["../src/BusyStatusTracker.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,24 @@
1
- import type { BsDiagnostic } from './interfaces';
2
- import type { Project } from './LanguageServer';
1
+ import type { LspDiagnostic } from './lsp/LspProject';
3
2
  export declare class DiagnosticCollection {
4
3
  private previousDiagnosticsByFile;
5
- getPatch(projects: Project[]): {
4
+ /**
5
+ * Get a patch of any changed diagnostics since last time. This takes a single project and diagnostics, but evaluates
6
+ * the patch based on all previously seen projects. It's supposed to be a rolling patch.
7
+ * This will include _ALL_ diagnostics for a file if any diagnostics have changed for that file, due to how the language server expects diagnostics to be sent.
8
+ */
9
+ getPatch(projectId: number, diagnostics: LspDiagnostic[]): {
6
10
  [x: string]: KeyedDiagnostic[];
7
11
  };
8
- private getDiagnosticsByFileFromProjects;
12
+ /**
13
+ * Get all the previous diagnostics, remove any that were exclusive to the current project, then mix in the project's new diagnostics.
14
+ * @param projectId the id of the project that should have its diagnostics refreshed
15
+ * @param thisProjectDiagnostics diagnostics for the project
16
+ */
17
+ private getDiagnosticsByFile;
18
+ /**
19
+ * Clone the previousDiagnosticsByFile, retaining the array of project references on each diagnostic
20
+ */
21
+ private clonePreviousDiagnosticsByFile;
9
22
  /**
10
23
  * Get a patch for all the files that have been removed since last time
11
24
  */
@@ -23,7 +36,8 @@ export declare class DiagnosticCollection {
23
36
  */
24
37
  private getAddedPatch;
25
38
  }
26
- interface KeyedDiagnostic extends BsDiagnostic {
39
+ interface KeyedDiagnostic extends LspDiagnostic {
27
40
  key: string;
41
+ projectIds: Set<number>;
28
42
  }
29
43
  export {};
@@ -1,34 +1,59 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DiagnosticCollection = void 0;
4
+ const vscode_uri_1 = require("vscode-uri");
4
5
  const util_1 = require("./util");
6
+ const thenby_1 = require("thenby");
5
7
  class DiagnosticCollection {
6
8
  constructor() {
7
9
  this.previousDiagnosticsByFile = {};
8
10
  }
9
- getPatch(projects) {
10
- const diagnosticsByFile = this.getDiagnosticsByFileFromProjects(projects);
11
+ /**
12
+ * Get a patch of any changed diagnostics since last time. This takes a single project and diagnostics, but evaluates
13
+ * the patch based on all previously seen projects. It's supposed to be a rolling patch.
14
+ * This will include _ALL_ diagnostics for a file if any diagnostics have changed for that file, due to how the language server expects diagnostics to be sent.
15
+ */
16
+ getPatch(projectId, diagnostics) {
17
+ const diagnosticsByFile = this.getDiagnosticsByFile(projectId, diagnostics);
11
18
  const patch = Object.assign(Object.assign(Object.assign({}, this.getRemovedPatch(diagnosticsByFile)), this.getModifiedPatch(diagnosticsByFile)), this.getAddedPatch(diagnosticsByFile));
12
19
  //save the new list of diagnostics
13
20
  this.previousDiagnosticsByFile = diagnosticsByFile;
14
21
  return patch;
15
22
  }
16
- getDiagnosticsByFileFromProjects(projects) {
23
+ /**
24
+ * Get all the previous diagnostics, remove any that were exclusive to the current project, then mix in the project's new diagnostics.
25
+ * @param projectId the id of the project that should have its diagnostics refreshed
26
+ * @param thisProjectDiagnostics diagnostics for the project
27
+ */
28
+ getDiagnosticsByFile(projectId, thisProjectDiagnostics) {
17
29
  var _a, _b;
18
- const result = {};
19
- //get all diagnostics for all projects
20
- let diagnostics = Array.prototype.concat.apply([], projects.map((x) => x.builder.getDiagnostics()));
21
- const keys = {};
30
+ const result = this.clonePreviousDiagnosticsByFile();
31
+ const diagnosticsByKey = new Map();
32
+ //delete all diagnostics linked to this project
33
+ for (const srcPath in result) {
34
+ const diagnostics = result[srcPath];
35
+ for (let i = diagnostics.length - 1; i >= 0; i--) {
36
+ const diagnostic = diagnostics[i];
37
+ //remember this diagnostic key for use when deduplicating down below
38
+ diagnosticsByKey.set(diagnostic.key, diagnostic);
39
+ //unlink the diagnostic from this project
40
+ diagnostic.projectIds.delete(projectId);
41
+ //delete this diagnostic if it's no longer linked to any projects
42
+ if (diagnostic.projectIds.size === 0) {
43
+ diagnostics.splice(i, 1);
44
+ diagnosticsByKey.delete(diagnostic.key);
45
+ }
46
+ }
47
+ }
22
48
  //build the full current set of diagnostics by file
23
- for (let diagnostic of diagnostics) {
24
- const srcPath = (_a = diagnostic.file.srcPath) !== null && _a !== void 0 ? _a : diagnostic.file.srcPath;
49
+ for (let diagnostic of thisProjectDiagnostics) {
50
+ const srcPath = vscode_uri_1.URI.parse(diagnostic.uri).fsPath;
25
51
  //ensure the file entry exists
26
52
  if (!result[srcPath]) {
27
53
  result[srcPath] = [];
28
54
  }
29
- const diagnosticMap = result[srcPath];
30
55
  //fall back to a default range if missing
31
- const range = (_b = diagnostic === null || diagnostic === void 0 ? void 0 : diagnostic.range) !== null && _b !== void 0 ? _b : util_1.util.createRange(0, 0, 0, 0);
56
+ const range = (_a = diagnostic.range) !== null && _a !== void 0 ? _a : util_1.util.createRange(0, 0, 0, 0);
32
57
  diagnostic.key =
33
58
  srcPath.toLowerCase() + '-' +
34
59
  diagnostic.code + '-' +
@@ -37,21 +62,46 @@ class DiagnosticCollection {
37
62
  range.end.line + '-' +
38
63
  range.end.character +
39
64
  diagnostic.message;
65
+ (_b = diagnostic.projectIds) !== null && _b !== void 0 ? _b : (diagnostic.projectIds = new Set([projectId]));
40
66
  //don't include duplicates
41
- if (!keys[diagnostic.key]) {
42
- keys[diagnostic.key] = true;
43
- diagnosticMap.push(diagnostic);
67
+ if (!diagnosticsByKey.has(diagnostic.key)) {
68
+ diagnosticsByKey.set(diagnostic.key, diagnostic);
69
+ const diagnosticsForFile = result[srcPath];
70
+ diagnosticsForFile.push(diagnostic);
44
71
  }
72
+ //link this project to the diagnostic
73
+ diagnosticsByKey.get(diagnostic.key).projectIds.add(projectId);
74
+ }
75
+ //sort the list so it's easier to compare later
76
+ for (let key in result) {
77
+ result[key].sort((0, thenby_1.firstBy)(x => x.key));
45
78
  }
46
79
  return result;
47
80
  }
81
+ /**
82
+ * Clone the previousDiagnosticsByFile, retaining the array of project references on each diagnostic
83
+ */
84
+ clonePreviousDiagnosticsByFile() {
85
+ let clone = {};
86
+ for (let key in this.previousDiagnosticsByFile) {
87
+ clone[key] = [];
88
+ for (const diagnostic of this.previousDiagnosticsByFile[key]) {
89
+ clone[key].push(Object.assign(Object.assign({}, diagnostic), {
90
+ //make a copy of the projects array (but keep the project references intact)
91
+ projectIds: new Set([...diagnostic.projectIds]) }));
92
+ }
93
+ }
94
+ return clone;
95
+ }
48
96
  /**
49
97
  * Get a patch for all the files that have been removed since last time
50
98
  */
51
99
  getRemovedPatch(currentDiagnosticsByFile) {
100
+ var _a, _b;
52
101
  const result = {};
53
102
  for (const filePath in this.previousDiagnosticsByFile) {
54
- if (!currentDiagnosticsByFile[filePath]) {
103
+ //if there are no current diagnostics for this file, add an empty array to the result for that file path
104
+ if (((_b = (_a = currentDiagnosticsByFile[filePath]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) === 0) {
55
105
  result[filePath] = [];
56
106
  }
57
107
  }
@@ -90,9 +140,10 @@ class DiagnosticCollection {
90
140
  * Get diagnostics for all new files not seen since last time
91
141
  */
92
142
  getAddedPatch(currentDiagnosticsByFile) {
143
+ var _a, _b;
93
144
  const result = {};
94
145
  for (const filePath in currentDiagnosticsByFile) {
95
- if (!this.previousDiagnosticsByFile[filePath]) {
146
+ if (((_b = (_a = this.previousDiagnosticsByFile[filePath]) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) === 0) {
96
147
  result[filePath] = currentDiagnosticsByFile[filePath];
97
148
  }
98
149
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DiagnosticCollection.js","sourceRoot":"","sources":["../src/DiagnosticCollection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DiagnosticCollection.js","sourceRoot":"","sources":["../src/DiagnosticCollection.ts"],"names":[],"mappings":"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"}