@zzzen/pyright-internal 1.2.0-dev.20260705 → 1.2.0-dev.20260712

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 (94) hide show
  1. package/dist/tests/typeServer/inProcTypeServerTestUtils.d.ts +39 -0
  2. package/dist/tests/typeServer/inProcTypeServerTestUtils.js +366 -0
  3. package/dist/tests/typeServer/inProcTypeServerTestUtils.js.map +1 -0
  4. package/dist/tests/typeServer/notebook.typeServer.test.d.ts +1 -0
  5. package/dist/tests/typeServer/notebook.typeServer.test.js +315 -0
  6. package/dist/tests/typeServer/notebook.typeServer.test.js.map +1 -0
  7. package/dist/tests/typeServer/typeServer.inProc.test.d.ts +1 -0
  8. package/dist/tests/typeServer/typeServer.inProc.test.js +234 -0
  9. package/dist/tests/typeServer/typeServer.inProc.test.js.map +1 -0
  10. package/dist/tests/typeServer/typeServer.virtualFileRedirect.test.d.ts +1 -0
  11. package/dist/tests/typeServer/typeServer.virtualFileRedirect.test.js +298 -0
  12. package/dist/tests/typeServer/typeServer.virtualFileRedirect.test.js.map +1 -0
  13. package/dist/typeServer/cancellation.d.ts +5 -0
  14. package/dist/typeServer/cancellation.js +14 -0
  15. package/dist/typeServer/cancellation.js.map +1 -0
  16. package/dist/typeServer/diagnosticUtils.d.ts +4 -0
  17. package/dist/typeServer/diagnosticUtils.js +71 -0
  18. package/dist/typeServer/diagnosticUtils.js.map +1 -0
  19. package/dist/typeServer/enums.d.ts +14 -0
  20. package/dist/typeServer/enums.js +524 -0
  21. package/dist/typeServer/enums.js.map +1 -0
  22. package/dist/typeServer/eventEmitter.d.ts +12 -0
  23. package/dist/typeServer/eventEmitter.js +32 -0
  24. package/dist/typeServer/eventEmitter.js.map +1 -0
  25. package/dist/typeServer/nodeMain.d.ts +1 -0
  26. package/dist/typeServer/nodeMain.js +65 -0
  27. package/dist/typeServer/nodeMain.js.map +1 -0
  28. package/dist/typeServer/notebookCellChain.d.ts +34 -0
  29. package/dist/typeServer/notebookCellChain.js +182 -0
  30. package/dist/typeServer/notebookCellChain.js.map +1 -0
  31. package/dist/typeServer/notebookDocumentHandler.d.ts +23 -0
  32. package/dist/typeServer/notebookDocumentHandler.js +158 -0
  33. package/dist/typeServer/notebookDocumentHandler.js.map +1 -0
  34. package/dist/typeServer/notebookUriMapper.d.ts +39 -0
  35. package/dist/typeServer/notebookUriMapper.js +164 -0
  36. package/dist/typeServer/notebookUriMapper.js.map +1 -0
  37. package/dist/typeServer/profilingStub.d.ts +10 -0
  38. package/dist/typeServer/profilingStub.js +12 -0
  39. package/dist/typeServer/profilingStub.js.map +1 -0
  40. package/dist/typeServer/programTypes.d.ts +136 -0
  41. package/dist/typeServer/programTypes.js +3 -0
  42. package/dist/typeServer/programTypes.js.map +1 -0
  43. package/dist/typeServer/programWrapper.d.ts +134 -0
  44. package/dist/typeServer/programWrapper.js +731 -0
  45. package/dist/typeServer/programWrapper.js.map +1 -0
  46. package/dist/typeServer/protocol/tspSupplemental.d.ts +43 -0
  47. package/dist/typeServer/protocol/tspSupplemental.js +48 -0
  48. package/dist/typeServer/protocol/tspSupplemental.js.map +1 -0
  49. package/dist/typeServer/protocol/typeServerProtocol.d.ts +1102 -0
  50. package/dist/typeServer/protocol/typeServerProtocol.js +290 -0
  51. package/dist/typeServer/protocol/typeServerProtocol.js.map +1 -0
  52. package/dist/typeServer/server.d.ts +54 -0
  53. package/dist/typeServer/server.js +620 -0
  54. package/dist/typeServer/server.js.map +1 -0
  55. package/dist/typeServer/serverUtils.d.ts +4 -0
  56. package/dist/typeServer/serverUtils.js +21 -0
  57. package/dist/typeServer/serverUtils.js.map +1 -0
  58. package/dist/typeServer/stubGenerator.d.ts +42 -0
  59. package/dist/typeServer/stubGenerator.js +895 -0
  60. package/dist/typeServer/stubGenerator.js.map +1 -0
  61. package/dist/typeServer/typeCache.d.ts +31 -0
  62. package/dist/typeServer/typeCache.js +54 -0
  63. package/dist/typeServer/typeCache.js.map +1 -0
  64. package/dist/typeServer/typeEvalUtils.d.ts +13 -0
  65. package/dist/typeServer/typeEvalUtils.js +83 -0
  66. package/dist/typeServer/typeEvalUtils.js.map +1 -0
  67. package/dist/typeServer/typeGuards.d.ts +3 -0
  68. package/dist/typeServer/typeGuards.js +55 -0
  69. package/dist/typeServer/typeGuards.js.map +1 -0
  70. package/dist/typeServer/typeServerConversionTypes.d.ts +39 -0
  71. package/dist/typeServer/typeServerConversionTypes.js +448 -0
  72. package/dist/typeServer/typeServerConversionTypes.js.map +1 -0
  73. package/dist/typeServer/typeServerConversionUtils.d.ts +35 -0
  74. package/dist/typeServer/typeServerConversionUtils.js +524 -0
  75. package/dist/typeServer/typeServerConversionUtils.js.map +1 -0
  76. package/dist/typeServer/typeServerEvaluator.d.ts +16 -0
  77. package/dist/typeServer/typeServerEvaluator.js +36 -0
  78. package/dist/typeServer/typeServerEvaluator.js.map +1 -0
  79. package/dist/typeServer/typeServerFileSystem.d.ts +47 -0
  80. package/dist/typeServer/typeServerFileSystem.js +129 -0
  81. package/dist/typeServer/typeServerFileSystem.js.map +1 -0
  82. package/dist/typeServer/typeServerProtocolUtils.d.ts +2 -0
  83. package/dist/typeServer/typeServerProtocolUtils.js +7 -0
  84. package/dist/typeServer/typeServerProtocolUtils.js.map +1 -0
  85. package/dist/typeServer/typeServerServiceKeys.d.ts +7 -0
  86. package/dist/typeServer/typeServerServiceKeys.js +20 -0
  87. package/dist/typeServer/typeServerServiceKeys.js.map +1 -0
  88. package/dist/typeServer/typeUtils.d.ts +4 -0
  89. package/dist/typeServer/typeUtils.js +31 -0
  90. package/dist/typeServer/typeUtils.js.map +1 -0
  91. package/dist/typeServer/virtualFileOverlayFileSystem.d.ts +87 -0
  92. package/dist/typeServer/virtualFileOverlayFileSystem.js +181 -0
  93. package/dist/typeServer/virtualFileOverlayFileSystem.js.map +1 -0
  94. package/package.json +1 -1
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /*
3
+ * nodeMain.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ *
7
+ * Provides the main entrypoint to the Pyright type server when running in Node.
8
+ *
9
+ * This lives in pyright-internal (rather than the pyright-typeserver package) so that all
10
+ * vscode-languageserver usage resolves to a single copy, matching how the `pyright`
11
+ * package keeps its own entry points as thin shims over pyright-internal.
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.main = main;
18
+ const path_1 = __importDefault(require("path"));
19
+ const node_1 = require("vscode-languageserver/node");
20
+ const cacheManager_1 = require("../analyzer/cacheManager");
21
+ const asyncInitialization_1 = require("../common/asyncInitialization");
22
+ const console_1 = require("../common/console");
23
+ const fileBasedCancellationUtils_1 = require("../common/fileBasedCancellationUtils");
24
+ const realFileSystem_1 = require("../common/realFileSystem");
25
+ const serviceProviderExtensions_1 = require("../common/serviceProviderExtensions");
26
+ const uri_1 = require("../common/uri/uri");
27
+ const uriUtils_1 = require("../common/uri/uriUtils");
28
+ const nodeServer_1 = require("../nodeServer");
29
+ const partialStubService_1 = require("../partialStubService");
30
+ const server_1 = require("./server");
31
+ const notebookUriMapper_1 = require("./notebookUriMapper");
32
+ const typeServerFileSystem_1 = require("./typeServerFileSystem");
33
+ const typeServerServiceKeys_1 = require("./typeServerServiceKeys");
34
+ async function main() {
35
+ await (0, asyncInitialization_1.initializeDependencies)();
36
+ const rootDirectory = __dirname;
37
+ global.__rootDirectory = path_1.default.resolve(rootDirectory);
38
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
39
+ const version = require('../../package.json').version || '';
40
+ const connection = (0, node_1.createConnection)((0, nodeServer_1.getConnectionOptions)());
41
+ const tempFile = new realFileSystem_1.RealTempFile();
42
+ const console = new console_1.ConsoleWithLogLevel(connection.console, `TS(${process.pid})`);
43
+ const fileWatcherProvider = new realFileSystem_1.WorkspaceFileWatcherProvider();
44
+ const fileSystem = (0, realFileSystem_1.createFromRealFileSystem)(tempFile, console, fileWatcherProvider);
45
+ // The notebook URI mapper maps notebook-cell URIs to their file-scheme equivalents. It is
46
+ // shared between the file system (so mapped reads/stats resolve) and the server (so cell
47
+ // requests route to the right workspace). `tempFile` provides case-sensitivity detection.
48
+ const uriMapper = new notebookUriMapper_1.NotebookUriMapper(tempFile);
49
+ const typeServerFs = new typeServerFileSystem_1.TypeServerFileSystem(fileSystem, uriMapper);
50
+ const cacheManager = new cacheManager_1.CacheManager();
51
+ const partialStubService = new partialStubService_1.PartialStubService(typeServerFs);
52
+ const serviceProvider = (0, serviceProviderExtensions_1.createServiceProvider)(typeServerFs, tempFile, console, cacheManager, partialStubService, new fileBasedCancellationUtils_1.FileBasedCancellationProvider('bg'));
53
+ serviceProvider.add(typeServerServiceKeys_1.TypeServerServiceKeys.uriMapper, uriMapper);
54
+ const rootUri = (0, uriUtils_1.getRootUri)(serviceProvider) || uri_1.Uri.file(rootDirectory, serviceProvider);
55
+ const realPathRoot = typeServerFs.realCasePath(rootUri);
56
+ new server_1.TypeServer({
57
+ productName: 'PyrightTypeServer',
58
+ rootDirectory: realPathRoot,
59
+ version,
60
+ serviceProvider,
61
+ fileWatcherHandler: fileWatcherProvider,
62
+ maxAnalysisTimeInForeground: { openFilesTimeInMs: 50, noOpenFilesTimeInMs: 200 },
63
+ }, connection);
64
+ }
65
+ //# sourceMappingURL=nodeMain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeMain.js","sourceRoot":"","sources":["../../../../../src/typeServer/nodeMain.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AAqBH,oBA+CC;AAlED,gDAAwB;AACxB,qDAA8D;AAE9D,2DAAwD;AACxD,uEAAuE;AACvE,+CAAwD;AACxD,qFAAqF;AACrF,6DAAgH;AAChH,mFAA4E;AAC5E,2CAAwC;AACxC,qDAAoD;AACpD,8CAAqD;AACrD,8DAA2D;AAE3D,qCAAsC;AACtC,2DAAwD;AACxD,iEAA8D;AAC9D,mEAAgE;AAEzD,KAAK,UAAU,IAAI;IACtB,MAAM,IAAA,4CAAsB,GAAE,CAAC;IAE/B,MAAM,aAAa,GAAG,SAAS,CAAC;IAC/B,MAAc,CAAC,eAAe,GAAG,cAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAE9D,8DAA8D;IAC9D,MAAM,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;IAE5D,MAAM,UAAU,GAAG,IAAA,uBAAgB,EAAC,IAAA,iCAAoB,GAAE,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,IAAI,6BAAY,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,6BAAmB,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IAClF,MAAM,mBAAmB,GAAG,IAAI,6CAA4B,EAAE,CAAC;IAC/D,MAAM,UAAU,GAAG,IAAA,yCAAwB,EAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAEpF,0FAA0F;IAC1F,yFAAyF;IACzF,0FAA0F;IAC1F,MAAM,SAAS,GAAG,IAAI,qCAAiB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,IAAI,2CAAoB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;IACxC,MAAM,kBAAkB,GAAG,IAAI,uCAAkB,CAAC,YAAY,CAAC,CAAC;IAEhE,MAAM,eAAe,GAAG,IAAA,iDAAqB,EACzC,YAAY,EACZ,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,IAAI,0DAA6B,CAAC,IAAI,CAAC,CAC1C,CAAC;IACF,eAAe,CAAC,GAAG,CAAC,6CAAqB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAQ,IAAA,qBAAU,EAAC,eAAe,CAAC,IAAI,SAAG,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAExD,IAAI,mBAAU,CACV;QACI,WAAW,EAAE,mBAAmB;QAChC,aAAa,EAAE,YAAY;QAC3B,OAAO;QACP,eAAe;QACf,kBAAkB,EAAE,mBAAmB;QACvC,2BAA2B,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,mBAAmB,EAAE,GAAG,EAAE;KACnF,EACD,UAAU,CACb,CAAC;AACN,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { NotebookCellArrayChange, NotebookDocumentSyncOptions, TextDocumentIdentifier, TextDocumentItem } from 'vscode-languageserver-protocol';
2
+ import { CaseSensitivityDetector } from '../common/caseSensitivityDetector';
3
+ import { ConsoleInterface } from '../common/console';
4
+ import { Uri } from '../common/uri/uri';
5
+ import { Workspace } from '../workspaceFactory';
6
+ import { INotebookUriMapper } from './notebookUriMapper';
7
+ /**
8
+ * Notebook selector matching notebooks of any scheme with Python cells.
9
+ */
10
+ export declare const AnyNotebookDocumentSelector: NotebookDocumentSyncOptions;
11
+ /**
12
+ * The default contents of the synthetic prefix cell that precedes all notebook cells.
13
+ * Mirrors Jupyter's implicit `from IPython.display import *`.
14
+ */
15
+ export declare function getDefaultPrefixCellContents(): string;
16
+ export interface NotebookData {
17
+ notebookUri: Uri;
18
+ mappedCellUris: Uri[];
19
+ prefixCellContents: string;
20
+ prefixCellUri: Uri;
21
+ pythonPath: Uri | undefined;
22
+ pythonEnvironmentName: string | undefined;
23
+ operations: string[];
24
+ }
25
+ export declare function createNotebookData(notebookUri: Uri, cells: TextDocumentItem[], uriMapper: INotebookUriMapper, caseSensitivityDetector: CaseSensitivityDetector, prefixCellContents?: string, pythonPath?: Uri, pythonEnvironmentName?: string): NotebookData;
26
+ export declare function verifyCellChainIsLinear(notebookData: NotebookData, workspace: Workspace, console?: ConsoleInterface): void;
27
+ export declare function openNotebookCellChain(cells: TextDocumentItem[], notebookData: NotebookData, uriMapper: INotebookUriMapper, workspace: Workspace, chainedFileUri?: Uri): void;
28
+ interface NotebookStructureChange {
29
+ array: NotebookCellArrayChange;
30
+ didOpen?: TextDocumentItem[];
31
+ didClose?: TextDocumentIdentifier[];
32
+ }
33
+ export declare function updateNotebookStructure(structure: NotebookStructureChange, notebookData: NotebookData, uriMapper: INotebookUriMapper, workspace: Workspace, console?: ConsoleInterface): void;
34
+ export {};
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+ /*
3
+ * notebookCellChain.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ *
7
+ * Mode-agnostic helpers for analyzing notebook documents as chains of cell "files".
8
+ *
9
+ * A notebook is modeled as a linear chain of source files: a synthetic prefix cell followed
10
+ * by one file per code cell, each chained to its predecessor (via Pyright's chained-source-file
11
+ * support and `IPythonMode.CellDocs`). This lets symbols defined in an earlier cell be visible
12
+ * in later cells, matching Jupyter execution semantics.
13
+ *
14
+ * These functions are a near-direct port of Pylance's notebook helpers from
15
+ * `pylance-internal/src/server/common.ts`, retyped onto Pyright's `Workspace`. They only touch
16
+ * `workspace.service` (an `AnalyzerService`) so they work with any workspace implementation.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.AnyNotebookDocumentSelector = void 0;
20
+ exports.getDefaultPrefixCellContents = getDefaultPrefixCellContents;
21
+ exports.createNotebookData = createNotebookData;
22
+ exports.verifyCellChainIsLinear = verifyCellChainIsLinear;
23
+ exports.openNotebookCellChain = openNotebookCellChain;
24
+ exports.updateNotebookStructure = updateNotebookStructure;
25
+ const sourceFile_1 = require("../analyzer/sourceFile");
26
+ const uri_1 = require("../common/uri/uri");
27
+ const notebookUriMapper_1 = require("./notebookUriMapper");
28
+ /**
29
+ * Notebook selector matching notebooks of any scheme with Python cells.
30
+ */
31
+ exports.AnyNotebookDocumentSelector = {
32
+ notebookSelector: [
33
+ {
34
+ notebook: undefined,
35
+ cells: [{ language: 'python' }],
36
+ },
37
+ ],
38
+ };
39
+ /**
40
+ * The default contents of the synthetic prefix cell that precedes all notebook cells.
41
+ * Mirrors Jupyter's implicit `from IPython.display import *`.
42
+ */
43
+ function getDefaultPrefixCellContents() {
44
+ return `from IPython.display import *\n\n`;
45
+ }
46
+ function createNotebookData(notebookUri, cells, uriMapper, caseSensitivityDetector, prefixCellContents, pythonPath, pythonEnvironmentName) {
47
+ const notebookData = {
48
+ notebookUri: notebookUri,
49
+ mappedCellUris: cells.map((x) => uriMapper.getMappedCellUri(uri_1.Uri.parse(x.uri, caseSensitivityDetector))),
50
+ prefixCellUri: notebookUriMapper_1.NotebookUriMapper.getNotebookPrefixUri(notebookUri),
51
+ prefixCellContents: prefixCellContents || '',
52
+ pythonPath: pythonPath,
53
+ pythonEnvironmentName: pythonEnvironmentName,
54
+ operations: [`Created ${cells.length} cells`],
55
+ };
56
+ return notebookData;
57
+ }
58
+ function verifyCellChainIsLinear(notebookData, workspace, console) {
59
+ if (!notebookData.mappedCellUris) {
60
+ console?.error('All notebooks should have mapped cell Uris');
61
+ return;
62
+ }
63
+ // Check for duplicate URIs. When found, log which cells are duplicated and repair by
64
+ // removing the later occurrences (keeping the first).
65
+ const seenKeys = new Map(); // key -> first index where seen
66
+ const duplicateIndices = [];
67
+ for (let i = 0; i < notebookData.mappedCellUris.length; i++) {
68
+ const uri = notebookData.mappedCellUris[i];
69
+ const key = uri?.key ?? `<undefined:${i}>`;
70
+ const firstIndex = seenKeys.get(key);
71
+ if (firstIndex !== undefined) {
72
+ duplicateIndices.push(i);
73
+ console?.error(`Notebook cell chain integrity error: cell at index ${i} ` +
74
+ `(${uri?.toUserVisibleString() ?? 'undefined'}) is a duplicate of cell at index ${firstIndex}. ` +
75
+ `Removing duplicate. Operations: ${notebookData.operations.join(', ')}`);
76
+ }
77
+ else {
78
+ seenKeys.set(key, i);
79
+ }
80
+ }
81
+ if (duplicateIndices.length > 0) {
82
+ notebookData.mappedCellUris = notebookData.mappedCellUris.filter((_, index) => !duplicateIndices.includes(index));
83
+ }
84
+ // Verify that chained file paths match the expected order. When a mismatch is found,
85
+ // log the broken cell (index, URI, actual chain, expected chain) and repair it.
86
+ for (let i = notebookData.mappedCellUris.length - 1; i >= 0; --i) {
87
+ const cell = notebookData.mappedCellUris[i];
88
+ const actualChainedUri = workspace.service.getChainedUri(cell);
89
+ const expectedChainedUri = i > 0 ? notebookData.mappedCellUris[i - 1] : notebookData.prefixCellUri;
90
+ if (!actualChainedUri?.equals(expectedChainedUri)) {
91
+ console?.error(`Notebook cell chain integrity error at cell index ${i} ` +
92
+ `(${cell?.toUserVisibleString() ?? 'undefined'}): ` +
93
+ `chained to ${actualChainedUri?.toUserVisibleString() ?? 'undefined'}, ` +
94
+ `expected ${expectedChainedUri?.toUserVisibleString() ?? 'undefined'}. ` +
95
+ `Repairing. Operations: ${notebookData.operations.join(', ')}`);
96
+ workspace.service.updateChainedUri(cell, expectedChainedUri);
97
+ }
98
+ }
99
+ }
100
+ function openNotebookCellChain(cells, notebookData, uriMapper, workspace, chainedFileUri) {
101
+ // If this is the first open, (no chained file path), then we need to open the prefix cell.
102
+ if (chainedFileUri === undefined) {
103
+ chainedFileUri = notebookData.prefixCellUri;
104
+ workspace.service.setFileOpened(chainedFileUri, 0, notebookData.prefixCellContents, sourceFile_1.IPythonMode.CellDocs);
105
+ }
106
+ cells.forEach((cellTextDocument) => {
107
+ const mappedCellUri = uriMapper.getMappedCellUri(uri_1.Uri.parse(cellTextDocument.uri, workspace.service.serviceProvider));
108
+ workspace.service.setFileOpened(mappedCellUri, cellTextDocument.version, cellTextDocument.text, sourceFile_1.IPythonMode.CellDocs, chainedFileUri);
109
+ chainedFileUri = mappedCellUri;
110
+ });
111
+ }
112
+ function updateCellPaths(structure, notebookData, uriMapper, workspace) {
113
+ if (!notebookData.mappedCellUris) {
114
+ return;
115
+ }
116
+ // cell array changes
117
+ if (structure.array.deleteCount > 0) {
118
+ notebookData.mappedCellUris.splice(structure.array.start, structure.array.deleteCount);
119
+ notebookData.operations.push('Deleted');
120
+ }
121
+ if (structure.array.cells) {
122
+ if (structure.array.start < notebookData.mappedCellUris.length) {
123
+ const dummyElements = new Array(structure.array.cells.length);
124
+ notebookData.mappedCellUris.splice(structure.array.start, 0, ...dummyElements);
125
+ notebookData.operations.push('Inserted');
126
+ }
127
+ for (let i = 0; i < structure.array.cells.length; ++i) {
128
+ notebookData.mappedCellUris[structure.array.start + i] = uriMapper.getMappedCellUri(uri_1.Uri.parse(structure.array.cells[i].document, workspace.service.serviceProvider));
129
+ notebookData.operations.push(`Added at position ${structure.array.start + i}:${structure.array.cells.length}`);
130
+ }
131
+ }
132
+ }
133
+ function openAndCloseCells(structure, notebookData, uriMapper, workspace) {
134
+ if (!notebookData.mappedCellUris) {
135
+ return;
136
+ }
137
+ // deleted cells
138
+ if (structure.didClose && structure.didClose.length > 0) {
139
+ structure.didClose.forEach((closedDocument) => {
140
+ const closedUri = uriMapper.getMappedCellUri(uri_1.Uri.parse(closedDocument.uri, workspace.service.serviceProvider));
141
+ // For regular files, when a file is closed, we do not want to remove it from the source file list in
142
+ // the service since the user can re-open the file, but for the virtual file for the notebook cell, we
143
+ // want to remove the virtual file when a cell is closed. Make sure we mark the virtual file untracked
144
+ // to remove it from the list.
145
+ workspace.service.setFileClosed(closedUri);
146
+ });
147
+ }
148
+ // new cells
149
+ if (structure.didOpen && structure.didOpen.length > 0) {
150
+ const chainedFileUri = structure.array.start > 0
151
+ ? notebookData.mappedCellUris[structure.array.start - 1]
152
+ : notebookData.prefixCellUri;
153
+ openNotebookCellChain(structure.didOpen, notebookData, uriMapper, workspace, chainedFileUri);
154
+ }
155
+ }
156
+ function updateCellChain(structure, notebookData, workspace, console) {
157
+ if (!notebookData.mappedCellUris) {
158
+ return;
159
+ }
160
+ // reordered cells
161
+ if (structure.array.cells && (!structure.didOpen || structure.array.cells.length !== structure.didOpen.length)) {
162
+ for (let i = structure.array.start; i < structure.array.start + structure.array.cells.length; ++i) {
163
+ updateCellChainedFilePath(notebookData, workspace, i);
164
+ }
165
+ }
166
+ // If cells were added or deleted, we need to update the chainedFilePath of the cell
167
+ // immediately after (below) those changes to point to its new predecessor.
168
+ const dirtyTrailingCellIndex = structure.array.start + (structure.array.cells?.length ?? 0);
169
+ if (dirtyTrailingCellIndex >= 0 && dirtyTrailingCellIndex < notebookData.mappedCellUris.length) {
170
+ updateCellChainedFilePath(notebookData, workspace, dirtyTrailingCellIndex);
171
+ }
172
+ verifyCellChainIsLinear(notebookData, workspace, console);
173
+ }
174
+ function updateCellChainedFilePath(notebookData, workspace, cellIndex) {
175
+ workspace.service.updateChainedUri(notebookData.mappedCellUris[cellIndex], cellIndex > 0 ? notebookData.mappedCellUris[cellIndex - 1] : notebookData.prefixCellUri);
176
+ }
177
+ function updateNotebookStructure(structure, notebookData, uriMapper, workspace, console) {
178
+ updateCellPaths(structure, notebookData, uriMapper, workspace);
179
+ openAndCloseCells(structure, notebookData, uriMapper, workspace);
180
+ updateCellChain(structure, notebookData, workspace, console);
181
+ }
182
+ //# sourceMappingURL=notebookCellChain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebookCellChain.js","sourceRoot":"","sources":["../../../../../src/typeServer/notebookCellChain.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAiCH,oEAEC;AAYD,gDAoBC;AAED,0DAkDC;AAED,sDA2BC;AAgHD,0DAUC;AArQD,uDAAqD;AAGrD,2CAAwC;AAGxC,2DAA4E;AAE5E;;GAEG;AACU,QAAA,2BAA2B,GAAgC;IACpE,gBAAgB,EAAE;QACd;YACI,QAAQ,EAAE,SAAS;YACnB,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;SAClC;KACJ;CACJ,CAAC;AAEF;;;GAGG;AACH,SAAgB,4BAA4B;IACxC,OAAO,mCAAmC,CAAC;AAC/C,CAAC;AAYD,SAAgB,kBAAkB,CAC9B,WAAgB,EAChB,KAAyB,EACzB,SAA6B,EAC7B,uBAAgD,EAChD,kBAA2B,EAC3B,UAAgB,EAChB,qBAA8B;IAE9B,MAAM,YAAY,GAAiB;QAC/B,WAAW,EAAE,WAAW;QACxB,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC;QACvG,aAAa,EAAE,qCAAiB,CAAC,oBAAoB,CAAC,WAAW,CAAC;QAClE,kBAAkB,EAAE,kBAAkB,IAAI,EAAE;QAC5C,UAAU,EAAE,UAAU;QACtB,qBAAqB,EAAE,qBAAqB;QAC5C,UAAU,EAAE,CAAC,WAAW,KAAK,CAAC,MAAM,QAAQ,CAAC;KAChD,CAAC;IAEF,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,SAAgB,uBAAuB,CAAC,YAA0B,EAAE,SAAoB,EAAE,OAA0B;IAChH,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IAED,qFAAqF;IACrF,sDAAsD;IACtD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,gCAAgC;IAC5E,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,GAAG,EAAE,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC;QAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzB,OAAO,EAAE,KAAK,CACV,sDAAsD,CAAC,GAAG;gBACtD,IAAI,GAAG,EAAE,mBAAmB,EAAE,IAAI,WAAW,qCAAqC,UAAU,IAAI;gBAChG,mCAAmC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC;IACL,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,YAAY,CAAC,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,MAAM,CAC5D,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAClD,CAAC;IACN,CAAC;IAED,qFAAqF;IACrF,gFAAgF;IAChF,KAAK,IAAI,CAAC,GAAG,YAAY,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC;QAEnG,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,KAAK,CACV,qDAAqD,CAAC,GAAG;gBACrD,IAAI,IAAI,EAAE,mBAAmB,EAAE,IAAI,WAAW,KAAK;gBACnD,cAAc,gBAAgB,EAAE,mBAAmB,EAAE,IAAI,WAAW,IAAI;gBACxE,YAAY,kBAAkB,EAAE,mBAAmB,EAAE,IAAI,WAAW,IAAI;gBACxE,0BAA0B,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrE,CAAC;YACF,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAgB,qBAAqB,CACjC,KAAyB,EACzB,YAA0B,EAC1B,SAA6B,EAC7B,SAAoB,EACpB,cAAoB;IAEpB,2FAA2F;IAC3F,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAC/B,cAAc,GAAG,YAAY,CAAC,aAAa,CAAC;QAC5C,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC,EAAE,YAAY,CAAC,kBAAkB,EAAE,wBAAW,CAAC,QAAQ,CAAC,CAAC;IAC9G,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,EAAE;QAC/B,MAAM,aAAa,GAAG,SAAS,CAAC,gBAAgB,CAC5C,SAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CACrE,CAAC;QACF,SAAS,CAAC,OAAO,CAAC,aAAa,CAC3B,aAAa,EACb,gBAAgB,CAAC,OAAO,EACxB,gBAAgB,CAAC,IAAI,EACrB,wBAAW,CAAC,QAAQ,EACpB,cAAc,CACjB,CAAC;QAEF,cAAc,GAAG,aAAa,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC;AAQD,SAAS,eAAe,CACpB,SAAkC,EAClC,YAA0B,EAC1B,SAA6B,EAC7B,SAAoB;IAEpB,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO;IACX,CAAC;IAED,qBAAqB;IACrB,IAAI,SAAS,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;QAClC,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvF,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,YAAY,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAC7D,MAAM,aAAa,GAAG,IAAI,KAAK,CAAM,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACnE,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC;YAC/E,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACpD,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,gBAAgB,CAC/E,SAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAClF,CAAC;YACF,YAAY,CAAC,UAAU,CAAC,IAAI,CACxB,qBAAqB,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CACnF,CAAC;QACN,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,iBAAiB,CACtB,SAAkC,EAClC,YAA0B,EAC1B,SAA6B,EAC7B,SAAoB;IAEpB,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO;IACX,CAAC;IAED,gBAAgB;IAChB,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;YAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,gBAAgB,CACxC,SAAG,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CACnE,CAAC;YAEF,qGAAqG;YACrG,sGAAsG;YACtG,sGAAsG;YACtG,8BAA8B;YAC9B,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,YAAY;IACZ,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,cAAc,GAChB,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;YACrB,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;YACxD,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC;QAErC,qBAAqB,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACjG,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CACpB,SAAkC,EAClC,YAA0B,EAC1B,SAAoB,EACpB,OAA0B;IAE1B,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC;QAC/B,OAAO;IACX,CAAC;IAED,kBAAkB;IAClB,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7G,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YAChG,yBAAyB,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;IACL,CAAC;IAED,oFAAoF;IACpF,2EAA2E;IAC3E,MAAM,sBAAsB,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;IAC5F,IAAI,sBAAsB,IAAI,CAAC,IAAI,sBAAsB,GAAG,YAAY,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAC7F,yBAAyB,CAAC,YAAY,EAAE,SAAS,EAAE,sBAAsB,CAAC,CAAC;IAC/E,CAAC;IAED,uBAAuB,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,yBAAyB,CAAC,YAA0B,EAAE,SAAoB,EAAE,SAAiB;IAClG,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAC9B,YAAY,CAAC,cAAc,CAAC,SAAS,CAAC,EACtC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,aAAa,CAC1F,CAAC;AACN,CAAC;AAED,SAAgB,uBAAuB,CACnC,SAAkC,EAClC,YAA0B,EAC1B,SAA6B,EAC7B,SAAoB,EACpB,OAA0B;IAE1B,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/D,iBAAiB,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACjE,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { DidChangeNotebookDocumentParams, DidCloseNotebookDocumentParams, DidOpenNotebookDocumentParams } from 'vscode-languageserver';
2
+ import { CaseSensitivityDetector } from '../common/caseSensitivityDetector';
3
+ import { ConsoleInterface } from '../common/console';
4
+ import { Uri } from '../common/uri/uri';
5
+ import { Workspace } from '../workspaceFactory';
6
+ import { NotebookData } from './notebookCellChain';
7
+ import { NotebookUriMapper } from './notebookUriMapper';
8
+ export declare class NotebookDocumentHandler {
9
+ private readonly _uriMapper;
10
+ private readonly _caseDetector;
11
+ private readonly _console;
12
+ private readonly _getWorkspace;
13
+ private readonly _eventQueue;
14
+ private readonly _notebookMap;
15
+ constructor(_uriMapper: NotebookUriMapper, _caseDetector: CaseSensitivityDetector, _console: ConsoleInterface, _getWorkspace: (fileUri: Uri) => Promise<Workspace>);
16
+ test_whenIdle(): Promise<void>;
17
+ getNotebookDataForCell(cellUri: Uri): Promise<NotebookData | undefined>;
18
+ onDidOpenNotebookDocument(params: DidOpenNotebookDocumentParams): void;
19
+ onDidChangeNotebookDocument(params: DidChangeNotebookDocumentParams): void;
20
+ onDidCloseNotebookDocument(params: DidCloseNotebookDocumentParams): void;
21
+ private _getNotebookData;
22
+ private _chainNotebookData;
23
+ }
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /*
3
+ * notebookDocumentHandler.ts
4
+ * Copyright (c) Microsoft Corporation.
5
+ * Licensed under the MIT license.
6
+ *
7
+ * Handles notebook document lifecycle events (open/change/close) for the type server, keeping
8
+ * each notebook's cell chain in sync with the analyzer so cells analyze as a linear chain of
9
+ * chained source files.
10
+ *
11
+ * This is a slimmed-down port of Pylance's `DefaultNotebookDocumentHandler`. It preserves the
12
+ * event-ordering model (a serial event queue plus a per-notebook deferred data chain) and the
13
+ * cell-chain maintenance, but drops the Pylance-specific machinery (per-notebook Python-path /
14
+ * kernel resolution, settings transformers, startup commands, and test signals). The type
15
+ * server resolves Python paths from workspace configuration the same way it does for regular
16
+ * files.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.NotebookDocumentHandler = void 0;
20
+ const vscode_languageserver_textdocument_1 = require("vscode-languageserver-textdocument");
21
+ const sourceFile_1 = require("../analyzer/sourceFile");
22
+ const deferred_1 = require("../common/deferred");
23
+ const uri_1 = require("../common/uri/uri");
24
+ const notebookCellChain_1 = require("./notebookCellChain");
25
+ const notebookUriMapper_1 = require("./notebookUriMapper");
26
+ /**
27
+ * A minimal serial task queue: each queued task runs only after the previous one settles,
28
+ * preserving the order in which notebook events arrive regardless of their async work.
29
+ */
30
+ class Sequencer {
31
+ constructor() {
32
+ this._current = Promise.resolve(null);
33
+ }
34
+ queue(task) {
35
+ return (this._current = this._current.then(() => task(), () => task()));
36
+ }
37
+ whenIdle() {
38
+ return this._current.then(() => { }, () => { });
39
+ }
40
+ }
41
+ class NotebookDocumentHandler {
42
+ constructor(_uriMapper, _caseDetector, _console, _getWorkspace) {
43
+ this._uriMapper = _uriMapper;
44
+ this._caseDetector = _caseDetector;
45
+ this._console = _console;
46
+ this._getWorkspace = _getWorkspace;
47
+ this._eventQueue = new Sequencer();
48
+ this._notebookMap = new Map();
49
+ }
50
+ test_whenIdle() {
51
+ return this._eventQueue.whenIdle();
52
+ }
53
+ async getNotebookDataForCell(cellUri) {
54
+ if (!notebookUriMapper_1.NotebookUriMapper.isNotebookCell(cellUri)) {
55
+ return undefined;
56
+ }
57
+ const notebookUri = this._uriMapper.getNotebookUriFromCell(cellUri);
58
+ return this._getNotebookData(notebookUri);
59
+ }
60
+ onDidOpenNotebookDocument(params) {
61
+ const notebookUri = this._uriMapper.parseNotebookOpen(params);
62
+ const chain = this._chainNotebookData(notebookUri);
63
+ void this._eventQueue
64
+ .queue(async () => {
65
+ let notebookData = await chain.old;
66
+ try {
67
+ notebookData = (0, notebookCellChain_1.createNotebookData)(notebookUri, params.cellTextDocuments, this._uriMapper, this._caseDetector, (0, notebookCellChain_1.getDefaultPrefixCellContents)());
68
+ const workspace = await this._getWorkspace(notebookData.prefixCellUri);
69
+ (0, notebookCellChain_1.openNotebookCellChain)(params.cellTextDocuments, notebookData, this._uriMapper, workspace);
70
+ (0, notebookCellChain_1.verifyCellChainIsLinear)(notebookData, workspace, this._console);
71
+ }
72
+ finally {
73
+ chain.new.resolve(notebookData);
74
+ }
75
+ })
76
+ .catch((error) => {
77
+ this._console.error(`Error handling notebook open for (${params.notebookDocument.uri}): ${error instanceof Error ? error.message : String(error)}`);
78
+ });
79
+ }
80
+ onDidChangeNotebookDocument(params) {
81
+ const notebookUri = this._uriMapper.parseNotebookChange(params);
82
+ if (this._notebookMap.get(notebookUri.key) === undefined) {
83
+ this._console.error(`Notebook was never opened but we got a change event for it (${notebookUri})`);
84
+ return;
85
+ }
86
+ const chain = this._chainNotebookData(notebookUri);
87
+ void this._eventQueue
88
+ .queue(async () => {
89
+ const notebookData = await chain.old;
90
+ try {
91
+ const workspace = await this._getWorkspace(notebookData.prefixCellUri);
92
+ if (params.change.cells?.structure) {
93
+ (0, notebookCellChain_1.updateNotebookStructure)(params.change.cells.structure, notebookData, this._uriMapper, workspace, this._console);
94
+ }
95
+ params.change.cells?.textContent?.forEach((textContent) => {
96
+ const mappedUri = this._uriMapper.getMappedCellUri(uri_1.Uri.parse(textContent.document.uri, this._caseDetector));
97
+ const contents = workspace.service.getSourceFile(mappedUri)?.getFileContent() || '';
98
+ const textDocument = vscode_languageserver_textdocument_1.TextDocument.create(textContent.document.uri, 'python', textContent.document.version - 1, contents);
99
+ vscode_languageserver_textdocument_1.TextDocument.update(textDocument, textContent.changes, textContent.document.version);
100
+ workspace.service.updateOpenFileContents(mappedUri, textContent.document.version, textDocument.getText(), sourceFile_1.IPythonMode.CellDocs);
101
+ });
102
+ }
103
+ finally {
104
+ chain.new.resolve(notebookData);
105
+ }
106
+ })
107
+ .catch((error) => {
108
+ this._console.error(`Error handling notebook change for (${params.notebookDocument.uri}): ${error instanceof Error ? error.message : String(error)}`);
109
+ });
110
+ }
111
+ onDidCloseNotebookDocument(params) {
112
+ const notebookUri = this._uriMapper.parseNotebookClose(params);
113
+ const chain = this._chainNotebookData(notebookUri);
114
+ void this._eventQueue
115
+ .queue(async () => {
116
+ const notebookData = await chain.old;
117
+ try {
118
+ const workspace = await this._getWorkspace(notebookData.prefixCellUri);
119
+ const cellPaths = [notebookData.prefixCellUri, ...notebookData.mappedCellUris];
120
+ cellPaths.forEach((cellPath) => {
121
+ workspace.service.setFileClosed(cellPath);
122
+ });
123
+ const existing = this._notebookMap.get(notebookUri.key);
124
+ if (existing === chain.continuation) {
125
+ this._notebookMap.delete(notebookUri.key);
126
+ }
127
+ }
128
+ finally {
129
+ chain.new.resolve(notebookData);
130
+ }
131
+ })
132
+ .catch((error) => {
133
+ this._console.error(`Error handling notebook close for (${params.notebookDocument.uri}): ${error instanceof Error ? error.message : String(error)}`);
134
+ });
135
+ }
136
+ _getNotebookData(notebookUri) {
137
+ const notebookData = this._notebookMap.get(notebookUri.key);
138
+ return notebookData ?? Promise.resolve(undefined);
139
+ }
140
+ _chainNotebookData(fileUri) {
141
+ const old = this._notebookMap.get(fileUri.key) ||
142
+ Promise.resolve({
143
+ notebookUri: fileUri,
144
+ mappedCellUris: [],
145
+ prefixCellContents: '',
146
+ prefixCellUri: notebookUriMapper_1.NotebookUriMapper.getNotebookPrefixUri(fileUri),
147
+ pythonPath: undefined,
148
+ pythonEnvironmentName: undefined,
149
+ operations: ['updated'],
150
+ });
151
+ const deferred = (0, deferred_1.createDeferred)();
152
+ const continuation = old.then(() => deferred.promise);
153
+ this._notebookMap.set(fileUri.key, continuation);
154
+ return { old, new: deferred, continuation };
155
+ }
156
+ }
157
+ exports.NotebookDocumentHandler = NotebookDocumentHandler;
158
+ //# sourceMappingURL=notebookDocumentHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notebookDocumentHandler.js","sourceRoot":"","sources":["../../../../../src/typeServer/notebookDocumentHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { DidChangeNotebookDocumentParams, DidCloseNotebookDocumentParams, DidOpenNotebookDocumentParams } from 'vscode-languageserver-protocol';
2
+ import { CaseSensitivityDetector } from '../common/caseSensitivityDetector';
3
+ import { Uri } from '../common/uri/uri';
4
+ export interface INotebookUriMapper {
5
+ parseNotebookOpen(params: DidOpenNotebookDocumentParams): Uri;
6
+ parseNotebookClose(params: DidCloseNotebookDocumentParams): Uri;
7
+ parseNotebookChange(params: DidChangeNotebookDocumentParams): Uri;
8
+ getOriginalCellUri(cellUri: Uri): Uri;
9
+ getMappedCellUri(original: Uri): Uri;
10
+ getNotebookUriFromCell(cellUri: Uri): Uri;
11
+ markUsing(uri: Uri, using: boolean): void;
12
+ }
13
+ export declare namespace INotebookUriMapper {
14
+ function is(obj: any): obj is INotebookUriMapper;
15
+ }
16
+ export declare class NotebookUriMapper implements INotebookUriMapper {
17
+ private readonly _caseDetector;
18
+ private _originalToMapped;
19
+ private _mappedToOriginal;
20
+ private _pendingDeletes;
21
+ private _inUseUris;
22
+ constructor(_caseDetector: CaseSensitivityDetector);
23
+ parseNotebookOpen(params: DidOpenNotebookDocumentParams): Uri;
24
+ parseNotebookChange(params: DidChangeNotebookDocumentParams): Uri;
25
+ parseNotebookClose(params: DidCloseNotebookDocumentParams): Uri;
26
+ markUsing(uri: Uri, using: boolean): void;
27
+ getOriginalCellUri(cellUri: Uri): Uri;
28
+ getMappedCellUri(cellUri: Uri): Uri;
29
+ getNotebookUriFromCell(cellUri: Uri): Uri;
30
+ static isNotebookPrefixCell(uri: Uri): boolean;
31
+ static isNotebookFile(uri: Uri): boolean;
32
+ static isNotebookCell(uri: Uri): boolean;
33
+ static getNotebookPrefixUri(notebookUri: Uri): import("../common/uri/uriInterface").Uri;
34
+ private _generateCellMappedUri;
35
+ private _clearPendingDeletes;
36
+ private _pendDelete;
37
+ private _save;
38
+ private _delete;
39
+ }