• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1namespace ts.projectSystem {
2    describe("unittests:: tsserver:: with project references and tsbuild source map", () => {
3        const dependecyLocation = `${tscWatch.projectRoot}/dependency`;
4        const dependecyDeclsLocation = `${tscWatch.projectRoot}/decls`;
5        const mainLocation = `${tscWatch.projectRoot}/main`;
6        const dependencyTs: File = {
7            path: `${dependecyLocation}/FnS.ts`,
8            content: `export function fn1() { }
9export function fn2() { }
10export function fn3() { }
11export function fn4() { }
12export function fn5() { }
13`
14        };
15        const dependencyConfig: File = {
16            path: `${dependecyLocation}/tsconfig.json`,
17            content: JSON.stringify({ compilerOptions: { composite: true, declarationMap: true, declarationDir: "../decls" } })
18        };
19
20        const mainTs: File = {
21            path: `${mainLocation}/main.ts`,
22            content: `import {
23    fn1,
24    fn2,
25    fn3,
26    fn4,
27    fn5
28} from '../decls/fns'
29
30fn1();
31fn2();
32fn3();
33fn4();
34fn5();
35`
36        };
37        const mainConfig: File = {
38            path: `${mainLocation}/tsconfig.json`,
39            content: JSON.stringify({
40                compilerOptions: { composite: true, declarationMap: true },
41                references: [{ path: "../dependency" }]
42            })
43        };
44
45        const randomFile: File = {
46            path: `${tscWatch.projectRoot}/random/random.ts`,
47            content: "let a = 10;"
48        };
49        const randomConfig: File = {
50            path: `${tscWatch.projectRoot}/random/tsconfig.json`,
51            content: "{}"
52        };
53        const dtsLocation = `${dependecyDeclsLocation}/FnS.d.ts`;
54        const dtsPath = dtsLocation.toLowerCase() as Path;
55        const dtsMapLocation = `${dependecyDeclsLocation}/FnS.d.ts.map`;
56        const dtsMapPath = dtsMapLocation.toLowerCase() as Path;
57
58        const files = [dependencyTs, dependencyConfig, mainTs, mainConfig, libFile, randomFile, randomConfig];
59
60        function changeDtsFile(host: TestServerHost) {
61            host.writeFile(
62                dtsLocation,
63                host.readFile(dtsLocation)!.replace(
64                    "//# sourceMappingURL=FnS.d.ts.map",
65                    `export declare function fn6(): void;
66//# sourceMappingURL=FnS.d.ts.map`
67                )
68            );
69        }
70
71        function changeDtsMapFile(host: TestServerHost) {
72            host.writeFile(
73                dtsMapLocation,
74                `{"version":3,"file":"FnS.d.ts","sourceRoot":"","sources":["../dependency/FnS.ts"],"names":[],"mappings":"AAAA,wBAAgB,GAAG,SAAM;AACzB,wBAAgB,GAAG,SAAM;AACzB,wBAAgB,GAAG,SAAM;AACzB,wBAAgB,GAAG,SAAM;AACzB,wBAAgB,GAAG,SAAM;AACzB,eAAO,MAAM,CAAC,KAAK,CAAC"}`
75            );
76        }
77
78        function goToDefFromMainTs(fn: number): Partial<protocol.DefinitionAndBoundSpanRequest> {
79            return {
80                command: protocol.CommandTypes.DefinitionAndBoundSpan,
81                arguments: { file: mainTs.path, line: fn + 8, offset: 1 }
82            };
83        }
84
85        function renameFromDependencyTs(fn: number): Partial<protocol.RenameRequest> {
86            return {
87                command: protocol.CommandTypes.Rename,
88                arguments: { file: dependencyTs.path, line: fn, offset: 17 }
89            };
90        }
91
92        function renameFromDependencyTsWithDependencyChange(fn: number) {
93            return renameFromDependencyTs(fn + 1);
94        }
95
96        function verifyDocumentPositionMapper(
97            session: TestSession,
98            dependencyMap: server.ScriptInfo | undefined,
99            documentPositionMapper: server.ScriptInfo["documentPositionMapper"],
100            equal: boolean,
101            debugInfo?: string,
102        ) {
103            assert.strictEqual(session.getProjectService().filenameToScriptInfo.get(dtsMapPath), dependencyMap, `${debugInfo} dependencyMap`);
104            if (dependencyMap) {
105                verifyEquality(dependencyMap.documentPositionMapper, documentPositionMapper, equal, `${debugInfo} DocumentPositionMapper`);
106            }
107        }
108
109        function verifyDocumentPositionMapperEqual(
110            session: TestSession,
111            dependencyMap: server.ScriptInfo | undefined,
112            documentPositionMapper: server.ScriptInfo["documentPositionMapper"],
113            debugInfo?: string,
114        ) {
115            verifyDocumentPositionMapper(session, dependencyMap, documentPositionMapper, /*equal*/ true, debugInfo);
116        }
117
118        function verifyEquality<T>(actual: T, expected: T, equal: boolean, debugInfo?: string) {
119            if (equal) {
120                assert.strictEqual(actual, expected, debugInfo);
121            }
122            else {
123                assert.notStrictEqual(actual, expected, debugInfo);
124            }
125        }
126
127        function verifyAllFnAction<Req extends protocol.Request>(
128            session: TestSession,
129            action: (fn: number) => Partial<Req>,
130            existingDependencyMap: server.ScriptInfo | undefined,
131            existingDocumentPositionMapper: server.ScriptInfo["documentPositionMapper"],
132            existingMapEqual: boolean,
133            existingDocumentPositionMapperEqual: boolean,
134            skipMapPathInDtsInfo?: boolean
135        ) {
136            let sourceMapPath: server.ScriptInfo["sourceMapFilePath"] | undefined;
137            let dependencyMap: server.ScriptInfo | undefined;
138            let documentPositionMapper: server.ScriptInfo["documentPositionMapper"];
139            for (let fn = 1; fn <= 5; fn++) {
140                const fnAction = action(fn);
141                session.executeCommandSeq(fnAction);
142                const debugInfo = `${JSON.stringify(fnAction)}:: ${fn}`;
143                const dtsInfo = session.getProjectService().getScriptInfoForPath(dtsPath);
144                const dtsMapInfo = session.getProjectService().getScriptInfoForPath(dtsMapPath);
145
146                if (fn === 1) {
147                    if (dtsInfo) {
148                        if (!skipMapPathInDtsInfo) {
149                            if (dtsMapInfo) {
150                                assert.equal(dtsInfo.sourceMapFilePath, dtsMapPath, `${debugInfo} sourceMapFilePath`);
151                            }
152                            else {
153                                assert.isNotString(dtsInfo.sourceMapFilePath, `${debugInfo} sourceMapFilePath`);
154                                assert.isNotFalse(dtsInfo.sourceMapFilePath, `${debugInfo} sourceMapFilePath`);
155                                assert.isDefined(dtsInfo.sourceMapFilePath, `${debugInfo} sourceMapFilePath`);
156                            }
157                        }
158                    }
159                    verifyEquality(dtsMapInfo, existingDependencyMap, existingMapEqual, `${debugInfo} dependencyMap`);
160                    verifyEquality(existingDocumentPositionMapper, dtsMapInfo?.documentPositionMapper, existingDocumentPositionMapperEqual, `${debugInfo} DocumentPositionMapper`);
161                    sourceMapPath = dtsInfo?.sourceMapFilePath;
162                    dependencyMap = dtsMapInfo;
163                    documentPositionMapper = dependencyMap?.documentPositionMapper;
164                }
165                else {
166                    assert.equal(dtsInfo?.sourceMapFilePath, sourceMapPath, `${debugInfo} sourceMapFilePath`);
167                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper, debugInfo);
168                }
169            }
170        }
171
172        function verifyScriptInfoCollectionWith(
173            session: TestSession,
174            openFiles: readonly File[],
175        ) {
176            const { dependencyMap, documentPositionMapper } = getDocumentPositionMapper(session);
177
178            // Collecting at this point retains dependency.d.ts and map
179            closeFilesForSession([randomFile], session);
180            openFilesForSession([randomFile], session);
181
182            // If map is not collected, document position mapper shouldnt change
183            if (session.getProjectService().filenameToScriptInfo.has(dtsMapPath)) {
184                verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
185            }
186
187            // Closing open file, removes dependencies too
188            closeFilesForSession([...openFiles, randomFile], session);
189            openFilesForSession([randomFile], session);
190        }
191
192        type OnHostCreate = (host: TestServerHost) => void;
193        type CreateSessionFn = (onHostCreate?: OnHostCreate) => { host: TestServerHost; session: TestSession; };
194        function setupWith(createSession: CreateSessionFn, openFiles: readonly File[], onHostCreate: OnHostCreate | undefined) {
195            const result = createSession(onHostCreate);
196            openFilesForSession(openFiles, result.session);
197            return result;
198        }
199
200        function setupWithMainTs(createSession: CreateSessionFn, onHostCreate: OnHostCreate | undefined) {
201            return setupWith(createSession, [mainTs, randomFile], onHostCreate);
202        }
203
204        function setupWithDependencyTs(createSession: CreateSessionFn, onHostCreate: OnHostCreate | undefined) {
205            return setupWith(createSession, [dependencyTs, randomFile], onHostCreate);
206        }
207
208        function setupWithMainTsAndDependencyTs(createSession: CreateSessionFn, onHostCreate: OnHostCreate | undefined) {
209            return setupWith(createSession, [mainTs, dependencyTs, randomFile], onHostCreate);
210        }
211
212        function createSessionWithoutProjectReferences(onHostCreate?: OnHostCreate) {
213            const host = createHostWithSolutionBuild(files, [mainConfig.path]);
214            // Erase project reference
215            host.writeFile(mainConfig.path, JSON.stringify({
216                compilerOptions: { composite: true, declarationMap: true }
217            }));
218            onHostCreate?.(host);
219            const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host) });
220            return { host, session };
221        }
222
223        function createSessionWithProjectReferences(onHostCreate?: OnHostCreate) {
224            const host = createHostWithSolutionBuild(files, [mainConfig.path]);
225            onHostCreate?.(host);
226            const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host) });
227            return { host, session };
228        }
229
230        function createSessionWithDisabledProjectReferences(onHostCreate?: OnHostCreate) {
231            const host = createHostWithSolutionBuild(files, [mainConfig.path]);
232            // Erase project reference
233            host.writeFile(mainConfig.path, JSON.stringify({
234                compilerOptions: {
235                    composite: true,
236                    declarationMap: true,
237                    disableSourceOfProjectReferenceRedirect: true
238                },
239                references: [{ path: "../dependency" }]
240            }));
241            onHostCreate?.(host);
242            const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host) });
243            return { host, session };
244        }
245
246        function getDocumentPositionMapper(session: TestSession) {
247            const dependencyMap = session.getProjectService().filenameToScriptInfo.get(dtsMapPath);
248            const documentPositionMapper = dependencyMap?.documentPositionMapper;
249            return { dependencyMap, documentPositionMapper };
250        }
251
252        function makeChangeToMainTs(session: TestSession) {
253            session.executeCommandSeq<protocol.ChangeRequest>({
254                command: protocol.CommandTypes.Change,
255                arguments: {
256                    file: mainTs.path,
257                    line: 14,
258                    offset: 1,
259                    endLine: 14,
260                    endOffset: 1,
261                    insertString: "const x = 10;"
262                }
263            });
264        }
265
266        function makeChangeToDependencyTs(session: TestSession) {
267            session.executeCommandSeq<protocol.ChangeRequest>({
268                command: protocol.CommandTypes.Change,
269                arguments: {
270                    file: dependencyTs.path,
271                    line: 6,
272                    offset: 1,
273                    endLine: 6,
274                    endOffset: 1,
275                    insertString: "const x = 10;"
276                }
277            });
278        }
279
280
281        describe("from project that uses dependency: goToDef", () => {
282            function setupWithActionWith(setup: (onHostCreate?: OnHostCreate) => ReturnType<CreateSessionFn>, onHostCreate: OnHostCreate | undefined) {
283                const result = setup(onHostCreate);
284                result.session.executeCommandSeq(goToDefFromMainTs(1));
285                return { ...result, ...getDocumentPositionMapper(result.session) };
286            }
287
288            describe("when main tsconfig doesnt have project reference", () => {
289                function setup(onHostCreate?: OnHostCreate) {
290                    return setupWithMainTs(createSessionWithoutProjectReferences, onHostCreate);
291                }
292
293                function setupWithAction(onHostCreate?: OnHostCreate) {
294                    return setupWithActionWith(setup, onHostCreate);
295                }
296
297                it("can go to definition correctly", () => {
298                    const { session } = setup();
299                    verifyAllFnAction(
300                        session,
301                        goToDefFromMainTs,
302                        /*existingDependencyMap*/ undefined,
303                        /*existingDocumentPositionMapper*/ undefined,
304                        /*existingMapEqual*/ false,
305                        /*existingDocumentPositionMapperEqual*/ false
306                    );
307                    verifyScriptInfoCollectionWith(session, [mainTs]);
308                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/can go to definition correctly", session);
309                });
310
311                // Edit
312                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
313                    // Create DocumentPositionMapper
314                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
315
316                    // change
317                    makeChangeToMainTs(session);
318                    host.runQueuedTimeoutCallbacks();
319                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
320
321                    // action
322                    verifyAllFnAction(
323                        session,
324                        goToDefFromMainTs,
325                        dependencyMap,
326                        documentPositionMapper,
327                        /*existingMapEqual*/ true,
328                        /*existingDocumentPositionMapperEqual*/ true
329                    );
330                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/usage file changes with timeout before request", session);
331                });
332                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
333                    // Create DocumentPositionMapper
334                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
335
336                    // change
337                    makeChangeToMainTs(session);
338
339                    // action
340                    verifyAllFnAction(
341                        session,
342                        goToDefFromMainTs,
343                        dependencyMap,
344                        documentPositionMapper,
345                        /*existingMapEqual*/ true,
346                        /*existingDocumentPositionMapperEqual*/ true
347                    );
348                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/usage file changes", session);
349                });
350
351                // Edit dts to add new fn
352                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
353                    // Create DocumentPositionMapper
354                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
355
356                    // change
357                    changeDtsFile(host);
358                    host.runQueuedTimeoutCallbacks();
359                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
360
361                    // action
362                    verifyAllFnAction(
363                        session,
364                        goToDefFromMainTs,
365                        dependencyMap,
366                        documentPositionMapper,
367                       /*existingMapEqual*/ true,
368                       /*existingDocumentPositionMapperEqual*/ true
369                    );
370                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts changes with timeout before request", session);
371                });
372                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
373                    // Create DocumentPositionMapper
374                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
375
376                    // change
377                    changeDtsFile(host);
378
379                    // action
380                    verifyAllFnAction(
381                        session,
382                        goToDefFromMainTs,
383                        dependencyMap,
384                        documentPositionMapper,
385                       /*existingMapEqual*/ true,
386                       /*existingDocumentPositionMapperEqual*/ true
387                    );
388                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts changes", session);
389                });
390
391                // Edit map file to represent added new line
392                it(`when dependency file's map changes, when timeout occurs before request`, () => {
393                    // Create DocumentPositionMapper
394                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
395
396                    // change
397                    changeDtsMapFile(host);
398                    host.runQueuedTimeoutCallbacks();
399                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
400
401                    // action
402                    verifyAllFnAction(
403                        session,
404                        goToDefFromMainTs,
405                        dependencyMap,
406                        documentPositionMapper,
407                       /*existingMapEqual*/ true,
408                       /*existingDocumentPositionMapperEqual*/ false
409                    );
410                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap changes with timeout before request", session);
411                });
412                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
413                    // Create DocumentPositionMapper
414                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
415
416                    // change
417                    changeDtsMapFile(host);
418
419                    // action
420                    verifyAllFnAction(
421                        session,
422                        goToDefFromMainTs,
423                        dependencyMap,
424                        documentPositionMapper,
425                       /*existingMapEqual*/ true,
426                       /*existingDocumentPositionMapperEqual*/ false
427                    );
428                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap changes", session);
429                });
430
431                it(`with depedency files map file, when file is not present`, () => {
432                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
433
434                    verifyAllFnAction(
435                        session,
436                        goToDefFromMainTs,
437                        /*existingDependencyMap*/ undefined,
438                        /*existingDocumentPositionMapper*/ undefined,
439                        /*existingMapEqual*/ true,
440                        /*existingDocumentPositionMapperEqual*/ true
441                    );
442                    verifyScriptInfoCollectionWith(session, [mainTs]);
443                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap not present", session);
444                });
445                it(`with depedency files map file, when file is created after actions on projects`, () => {
446                    let fileContents: string;
447                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
448                        fileContents = host.readFile(dtsMapLocation)!;
449                        host.deleteFile(dtsMapLocation);
450                    });
451
452                    host.writeFile(dtsMapLocation, fileContents!);
453                    verifyAllFnAction(
454                        session,
455                        goToDefFromMainTs,
456                        dependencyMap,
457                        documentPositionMapper,
458                        /*existingMapEqual*/ false,
459                        /*existingDocumentPositionMapperEqual*/ false
460                    );
461                    verifyScriptInfoCollectionWith(session, [mainTs]);
462                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap created", session);
463                });
464                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
465                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
466
467                    // The dependency file is deleted when orphan files are collected
468                    host.deleteFile(dtsMapLocation);
469                    verifyAllFnAction(
470                        session,
471                        goToDefFromMainTs,
472                        dependencyMap,
473                        documentPositionMapper,
474                        /*existingMapEqual*/ false,
475                        /*existingDocumentPositionMapperEqual*/ false
476                    );
477                    verifyScriptInfoCollectionWith(session, [mainTs]);
478                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dtsMap deleted", session);
479                });
480
481                it(`with depedency .d.ts file, when file is not present`, () => {
482                    const { session } = setup(host => host.deleteFile(dtsLocation));
483
484                    verifyAllFnAction(
485                        session,
486                        goToDefFromMainTs,
487                        /*existingDependencyMap*/ undefined,
488                        /*existingDocumentPositionMapper*/ undefined,
489                        /*existingMapEqual*/ true,
490                        /*existingDocumentPositionMapperEqual*/ true
491                    );
492                    verifyScriptInfoCollectionWith(session, [mainTs]);
493                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts not present", session);
494                });
495                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
496                    let fileContents: string;
497                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
498                        fileContents = host.readFile(dtsLocation)!;
499                        host.deleteFile(dtsLocation);
500                    });
501
502                    host.writeFile(dtsLocation, fileContents!);
503                    verifyAllFnAction(
504                        session,
505                        goToDefFromMainTs,
506                        dependencyMap,
507                        documentPositionMapper,
508                        /*existingMapEqual*/ false,
509                        /*existingDocumentPositionMapperEqual*/ false
510                    );
511                    verifyScriptInfoCollectionWith(session, [mainTs]);
512                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts created", session);
513                });
514                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
515                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
516
517                    // The dependency file is deleted when orphan files are collected
518                    host.deleteFile(dtsLocation);
519                    verifyAllFnAction(
520                        session,
521                        goToDefFromMainTs,
522                        dependencyMap,
523                        documentPositionMapper,
524                        /*existingMapEqual*/ true,
525                        /*existingDocumentPositionMapperEqual*/ true
526                    );
527                    verifyScriptInfoCollectionWith(session, [mainTs]);
528                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configHasNoReference/dependency dts deleted", session);
529                });
530            });
531            describe("when main tsconfig has project reference", () => {
532                function setup(onHostCreate?: OnHostCreate) {
533                    return setupWithMainTs(createSessionWithProjectReferences, onHostCreate);
534                }
535
536                function setupWithAction(onHostCreate?: OnHostCreate) {
537                    return setupWithActionWith(setup, onHostCreate);
538                }
539
540                it("can go to definition correctly", () => {
541                    const { session } = setup();
542                    verifyAllFnAction(
543                        session,
544                        goToDefFromMainTs,
545                        /*existingDependencyMap*/ undefined,
546                        /*existingDocumentPositionMapper*/ undefined,
547                        /*existingMapEqual*/ true,
548                        /*existingDocumentPositionMapperEqual*/ true
549                    );
550                    verifyScriptInfoCollectionWith(session, [mainTs]);
551                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/can go to definition correctly", session);
552                });
553
554                // Edit
555                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
556                    // Create DocumentPositionMapper
557                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
558
559                    // change
560                    makeChangeToMainTs(session);
561                    host.runQueuedTimeoutCallbacks();
562                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
563
564                    // action
565                    verifyAllFnAction(
566                        session,
567                        goToDefFromMainTs,
568                        dependencyMap,
569                        documentPositionMapper,
570                       /*existingMapEqual*/ true,
571                       /*existingDocumentPositionMapperEqual*/ true
572                    );
573                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/usage file changes with timeout before request", session);
574                });
575                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
576                    // Create DocumentPositionMapper
577                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
578
579                    // change
580                    makeChangeToMainTs(session);
581
582                    // action
583                    verifyAllFnAction(
584                        session,
585                        goToDefFromMainTs,
586                        dependencyMap,
587                        documentPositionMapper,
588                       /*existingMapEqual*/ true,
589                       /*existingDocumentPositionMapperEqual*/ true
590                    );
591                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/usage file changes", session);
592                });
593
594                // Edit dts to add new fn
595                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
596                    // Create DocumentPositionMapper
597                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
598
599                    // change
600                    changeDtsFile(host);
601                    host.runQueuedTimeoutCallbacks();
602                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
603
604                    // action
605                    verifyAllFnAction(
606                        session,
607                        goToDefFromMainTs,
608                        dependencyMap,
609                        documentPositionMapper,
610                       /*existingMapEqual*/ true,
611                       /*existingDocumentPositionMapperEqual*/ true
612                    );
613                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts changes with timeout before request", session);
614                });
615                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
616                    // Create DocumentPositionMapper
617                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
618
619                    // change
620                    changeDtsFile(host);
621
622                    // action
623                    verifyAllFnAction(
624                        session,
625                        goToDefFromMainTs,
626                        dependencyMap,
627                        documentPositionMapper,
628                        /*existingMapEqual*/ true,
629                        /*existingDocumentPositionMapperEqual*/ true
630                    );
631                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts changes", session);
632                });
633
634                // Edit map file to represent added new line
635                it(`when dependency file's map changes, when timeout occurs before request`, () => {
636                    // Create DocumentPositionMapper
637                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
638
639                    // change
640                    changeDtsMapFile(host);
641                    host.runQueuedTimeoutCallbacks();
642                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
643
644                    // action
645                    verifyAllFnAction(
646                        session,
647                        goToDefFromMainTs,
648                        dependencyMap,
649                        documentPositionMapper,
650                        /*existingMapEqual*/ true,
651                        /*existingDocumentPositionMapperEqual*/ true
652                    );
653                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap changes with timeout before request", session);
654                });
655                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
656                    // Create DocumentPositionMapper
657                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
658
659                    // change
660                    changeDtsMapFile(host);
661
662                    // action
663                    verifyAllFnAction(
664                        session,
665                        goToDefFromMainTs,
666                        dependencyMap,
667                        documentPositionMapper,
668                         /*existingMapEqual*/ true,
669                         /*existingDocumentPositionMapperEqual*/ true
670                    );
671                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap changes", session);
672                });
673
674                it(`with depedency files map file, when file is not present`, () => {
675                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
676
677                    verifyAllFnAction(
678                        session,
679                        goToDefFromMainTs,
680                        /*existingDependencyMap*/ undefined,
681                        /*existingDocumentPositionMapper*/ undefined,
682                        /*existingMapEqual*/ true,
683                        /*existingDocumentPositionMapperEqual*/ true
684                    );
685                    verifyScriptInfoCollectionWith(session, [mainTs]);
686                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap not present", session);
687                });
688                it(`with depedency files map file, when file is created after actions on projects`, () => {
689                    let fileContents: string;
690                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
691                        fileContents = host.readFile(dtsMapLocation)!;
692                        host.deleteFile(dtsMapLocation);
693                    });
694
695                    host.writeFile(dtsMapLocation, fileContents!);
696                    verifyAllFnAction(
697                        session,
698                        goToDefFromMainTs,
699                        dependencyMap,
700                        documentPositionMapper,
701                        /*existingMapEqual*/ true,
702                        /*existingDocumentPositionMapperEqual*/ true
703                    );
704                    verifyScriptInfoCollectionWith(session, [mainTs]);
705                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap created", session);
706                });
707                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
708                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
709
710                    // The dependency file is deleted when orphan files are collected
711                    host.deleteFile(dtsMapLocation);
712                    verifyAllFnAction(
713                        session,
714                        goToDefFromMainTs,
715                        dependencyMap,
716                        documentPositionMapper,
717                        /*existingMapEqual*/ true,
718                        /*existingDocumentPositionMapperEqual*/ true
719                    );
720                    verifyScriptInfoCollectionWith(session, [mainTs]);
721                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dtsMap deleted", session);
722                });
723
724                it(`with depedency .d.ts file, when file is not present`, () => {
725                    const { session } = setup(host => host.deleteFile(dtsLocation));
726
727                    verifyAllFnAction(
728                        session,
729                        goToDefFromMainTs,
730                        /*existingDependencyMap*/ undefined,
731                        /*existingDocumentPositionMapper*/ undefined,
732                        /*existingMapEqual*/ true,
733                        /*existingDocumentPositionMapperEqual*/ true
734                    );
735                    verifyScriptInfoCollectionWith(session, [mainTs]);
736                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts not present", session);
737                });
738                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
739                    let fileContents: string;
740                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
741                        fileContents = host.readFile(dtsLocation)!;
742                        host.deleteFile(dtsLocation);
743                    });
744
745                    host.writeFile(dtsLocation, fileContents!);
746                    verifyAllFnAction(
747                        session,
748                        goToDefFromMainTs,
749                        dependencyMap,
750                        documentPositionMapper,
751                        /*existingMapEqual*/ true,
752                        /*existingDocumentPositionMapperEqual*/ true
753                    );
754                    verifyScriptInfoCollectionWith(session, [mainTs]);
755                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts created", session);
756                });
757                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
758                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
759
760                    // The dependency file is deleted when orphan files are collected
761                    host.deleteFile(dtsLocation);
762                    verifyAllFnAction(
763                        session,
764                        goToDefFromMainTs,
765                        dependencyMap,
766                        documentPositionMapper,
767                        /*existingMapEqual*/ true,
768                        /*existingDocumentPositionMapperEqual*/ true
769                    );
770                    verifyScriptInfoCollectionWith(session, [mainTs]);
771                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency dts deleted", session);
772                });
773                it(`when defining project source changes, when timeout occurs before request`, () => {
774                    // Create DocumentPositionMapper
775                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
776
777                    // change
778                    // Make change, without rebuild of solution
779                    host.writeFile(dependencyTs.path, `function fooBar() { }
780${dependencyTs.content}`);
781                    host.runQueuedTimeoutCallbacks();
782                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
783
784                    // action
785                    verifyAllFnAction(
786                        session,
787                        goToDefFromMainTs,
788                        /*existingDependencyMap*/ undefined,
789                        /*existingDocumentPositionMapper*/ undefined,
790                        /*existingMapEqual*/ true,
791                        /*existingDocumentPositionMapperEqual*/ true
792                    );
793                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency source changes with timeout before request", session);
794                });
795                it(`when defining project source changes, when timeout does not occur before request`, () => {
796                    // Create DocumentPositionMapper
797                    const { host, session } = setupWithAction();
798
799                    // change
800                    // Make change, without rebuild of solution
801                    host.writeFile(dependencyTs.path, `function fooBar() { }
802${dependencyTs.content}`);
803
804                    // action
805                    verifyAllFnAction(
806                        session,
807                        goToDefFromMainTs,
808                        /*existingDependencyMap*/ undefined,
809                        /*existingDocumentPositionMapper*/ undefined,
810                        /*existingMapEqual*/ true,
811                        /*existingDocumentPositionMapperEqual*/ true
812                    );
813                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/dependency source changes", session);
814                });
815
816                it("when projects are not built", () => {
817                    const host = createServerHost(files);
818                    const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host) });
819                    openFilesForSession([mainTs, randomFile], session);
820                    verifyAllFnAction(
821                        session,
822                        goToDefFromMainTs,
823                        /*existingDependencyMap*/ undefined,
824                        /*existingDocumentPositionMapper*/ undefined,
825                        /*existingMapEqual*/ true,
826                        /*existingDocumentPositionMapperEqual*/ true
827                    );
828                    verifyScriptInfoCollectionWith(session, [mainTs]);
829                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/configWithReference/when projects are not built", session);
830                });
831            });
832            describe("when main tsconfig has disableSourceOfProjectReferenceRedirect along with project reference", () => {
833                function setup(onHostCreate?: OnHostCreate) {
834                    return setupWithMainTs(createSessionWithDisabledProjectReferences, onHostCreate);
835                }
836
837                function setupWithAction(onHostCreate?: OnHostCreate) {
838                    return setupWithActionWith(setup, onHostCreate);
839                }
840
841                it("can go to definition correctly", () => {
842                    const { session } = setup();
843                    verifyAllFnAction(
844                        session,
845                        goToDefFromMainTs,
846                        /*existingDependencyMap*/ undefined,
847                        /*existingDocumentPositionMapper*/ undefined,
848                        /*existingMapEqual*/ false,
849                        /*existingDocumentPositionMapperEqual*/ false
850                    );
851                    verifyScriptInfoCollectionWith(session, [mainTs]);
852                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/can go to definition correctly", session);
853                });
854
855                // Edit
856                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
857                    // Create DocumentPositionMapper
858                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
859
860                    // change
861                    makeChangeToMainTs(session);
862                    host.runQueuedTimeoutCallbacks();
863                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
864
865                    // action
866                    verifyAllFnAction(
867                        session,
868                        goToDefFromMainTs,
869                        dependencyMap,
870                        documentPositionMapper,
871                        /*existingMapEqual*/ true,
872                        /*existingDocumentPositionMapperEqual*/ true
873                    );
874                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/usage file changes with timeout before request", session);
875                });
876                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
877                    // Create DocumentPositionMapper
878                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
879
880                    // change
881                    makeChangeToMainTs(session);
882
883                    // action
884                    verifyAllFnAction(
885                        session,
886                        goToDefFromMainTs,
887                        dependencyMap,
888                        documentPositionMapper,
889                       /*existingMapEqual*/ true,
890                       /*existingDocumentPositionMapperEqual*/ true
891                    );
892                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/usage file changes", session);
893                });
894
895                // Edit dts to add new fn
896                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
897                    // Create DocumentPositionMapper
898                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
899
900                    // change
901                    changeDtsFile(host);
902                    host.runQueuedTimeoutCallbacks();
903                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
904
905                    // action
906                    verifyAllFnAction(
907                        session,
908                        goToDefFromMainTs,
909                        dependencyMap,
910                        documentPositionMapper,
911                        /*existingMapEqual*/ true,
912                        /*existingDocumentPositionMapperEqual*/ true
913                    );
914                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts changes with timeout before request", session);
915                });
916                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
917                    // Create DocumentPositionMapper
918                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
919
920                    // change
921                    changeDtsFile(host);
922
923                    // action
924                    verifyAllFnAction(
925                        session,
926                        goToDefFromMainTs,
927                        dependencyMap,
928                        documentPositionMapper,
929                       /*existingMapEqual*/ true,
930                       /*existingDocumentPositionMapperEqual*/ true
931                    );
932                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts changes", session);
933                });
934
935                // Edit map file to represent added new line
936                it(`when dependency file's map changes, when timeout occurs before request`, () => {
937                    // Create DocumentPositionMapper
938                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
939
940                    // change
941                    changeDtsMapFile(host);
942                    host.runQueuedTimeoutCallbacks();
943                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
944
945                    // action
946                    verifyAllFnAction(
947                        session,
948                        goToDefFromMainTs,
949                        dependencyMap,
950                        documentPositionMapper,
951                        /*existingMapEqual*/ true,
952                        /*existingDocumentPositionMapperEqual*/ false
953                    );
954                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap changes with timeout before request", session);
955                });
956                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
957                    // Create DocumentPositionMapper
958                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
959
960                    // change
961                    changeDtsMapFile(host);
962
963                    // action
964                    verifyAllFnAction(
965                        session,
966                        goToDefFromMainTs,
967                        dependencyMap,
968                        documentPositionMapper,
969                        /*existingMapEqual*/ true,
970                        /*existingDocumentPositionMapperEqual*/ false
971                    );
972                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap changes", session);
973                });
974
975                it(`with depedency files map file, when file is not present`, () => {
976                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
977
978                    verifyAllFnAction(
979                        session,
980                        goToDefFromMainTs,
981                        /*existingDependencyMap*/ undefined,
982                        /*existingDocumentPositionMapper*/ undefined,
983                        /*existingMapEqual*/ true,
984                        /*existingDocumentPositionMapperEqual*/ true
985                    );
986                    verifyScriptInfoCollectionWith(session, [mainTs]);
987                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap not present", session);
988                });
989                it(`with depedency files map file, when file is created after actions on projects`, () => {
990                    let fileContents: string;
991                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
992                        fileContents = host.readFile(dtsMapLocation)!;
993                        host.deleteFile(dtsMapLocation);
994                    });
995
996                    host.writeFile(dtsMapLocation, fileContents!);
997                    verifyAllFnAction(
998                        session,
999                        goToDefFromMainTs,
1000                        dependencyMap,
1001                        documentPositionMapper,
1002                        /*existingMapEqual*/ false,
1003                        /*existingDocumentPositionMapperEqual*/ false
1004                    );
1005                    verifyScriptInfoCollectionWith(session, [mainTs]);
1006                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap created", session);
1007                });
1008                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
1009                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1010
1011                    // The dependency file is deleted when orphan files are collected
1012                    host.deleteFile(dtsMapLocation);
1013                    verifyAllFnAction(
1014                        session,
1015                        goToDefFromMainTs,
1016                        dependencyMap,
1017                        documentPositionMapper,
1018                        /*existingMapEqual*/ false,
1019                        /*existingDocumentPositionMapperEqual*/ false
1020                    );
1021                    verifyScriptInfoCollectionWith(session, [mainTs]);
1022                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dtsMap deleted", session);
1023                });
1024
1025                it(`with depedency .d.ts file, when file is not present`, () => {
1026                    const { session } = setup(host => host.deleteFile(dtsLocation));
1027
1028                    verifyAllFnAction(
1029                        session,
1030                        goToDefFromMainTs,
1031                        /*existingDependencyMap*/ undefined,
1032                        /*existingDocumentPositionMapper*/ undefined,
1033                        /*existingMapEqual*/ true,
1034                        /*existingDocumentPositionMapperEqual*/ true
1035                    );
1036                    verifyScriptInfoCollectionWith(session, [mainTs]);
1037                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts not present", session);
1038                });
1039                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
1040                    let fileContents: string;
1041                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
1042                        fileContents = host.readFile(dtsLocation)!;
1043                        host.deleteFile(dtsLocation);
1044                    });
1045
1046                    host.writeFile(dtsLocation, fileContents!);
1047                    verifyAllFnAction(
1048                        session,
1049                        goToDefFromMainTs,
1050                        dependencyMap,
1051                        documentPositionMapper,
1052                        /*existingMapEqual*/ false,
1053                        /*existingDocumentPositionMapperEqual*/ false
1054                    );
1055                    verifyScriptInfoCollectionWith(session, [mainTs]);
1056                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts created", session);
1057                });
1058                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
1059                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1060
1061                    // The dependency file is deleted when orphan files are collected
1062                    host.deleteFile(dtsLocation);
1063                    verifyAllFnAction(
1064                        session,
1065                        goToDefFromMainTs,
1066                        dependencyMap,
1067                        documentPositionMapper,
1068                        /*existingMapEqual*/ true,
1069                        /*existingDocumentPositionMapperEqual*/ true
1070                    );
1071                    verifyScriptInfoCollectionWith(session, [mainTs]);
1072                    baselineTsserverLogs("projectReferencesSourcemap", "usageProject/disabledSourceRef/dependency dts deleted", session);
1073                });
1074            });
1075        });
1076
1077        describe("from defining project: rename", () => {
1078            function setupWithActionWith(setup: (onHostCreate?: OnHostCreate) => ReturnType<CreateSessionFn>, onHostCreate: OnHostCreate | undefined) {
1079                const result = setup(onHostCreate);
1080                result.session.executeCommandSeq(renameFromDependencyTs(1));
1081                return { ...result, ...getDocumentPositionMapper(result.session) };
1082            }
1083
1084            describe("when main tsconfig doesnt have project reference", () => {
1085                function setup(onHostCreate?: OnHostCreate) {
1086                    return setupWithDependencyTs(createSessionWithoutProjectReferences, onHostCreate);
1087                }
1088
1089                function setupWithAction(onHostCreate?: OnHostCreate) {
1090                    return setupWithActionWith(setup, onHostCreate);
1091                }
1092
1093                it("rename locations from dependency", () => {
1094                    const { session } = setup();
1095                    verifyAllFnAction(
1096                        session,
1097                        renameFromDependencyTs,
1098                        /*existingDependencyMap*/ undefined,
1099                        /*existingDocumentPositionMapper*/ undefined,
1100                        /*existingMapEqual*/ false,
1101                        /*existingDocumentPositionMapperEqual*/ false
1102                    );
1103                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1104                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/rename locations", session);
1105                });
1106
1107                // Edit
1108                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
1109                    // Create DocumentPositionMapper
1110                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1111
1112                    // change
1113                    makeChangeToDependencyTs(session);
1114                    host.runQueuedTimeoutCallbacks();
1115                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1116
1117                    // action
1118                    verifyAllFnAction(
1119                        session,
1120                        renameFromDependencyTs,
1121                        dependencyMap,
1122                        documentPositionMapper,
1123                        /*existingMapEqual*/ true,
1124                        /*existingDocumentPositionMapperEqual*/ true
1125                    );
1126                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/usage file changes with timeout before request", session);
1127                });
1128                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
1129                    // Create DocumentPositionMapper
1130                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
1131
1132                    // change
1133                    makeChangeToDependencyTs(session);
1134
1135                    // action
1136                    verifyAllFnAction(
1137                        session,
1138                        renameFromDependencyTs,
1139                        dependencyMap,
1140                        documentPositionMapper,
1141                        /*existingMapEqual*/ true,
1142                        /*existingDocumentPositionMapperEqual*/ true
1143                    );
1144                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/usage file changes", session);
1145                });
1146
1147                // Edit dts to add new fn
1148                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
1149                    // Create DocumentPositionMapper
1150                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1151
1152                    // change
1153                    changeDtsFile(host);
1154                    host.runQueuedTimeoutCallbacks();
1155                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1156
1157                    // action
1158                    verifyAllFnAction(
1159                        session,
1160                        renameFromDependencyTs,
1161                        dependencyMap,
1162                        documentPositionMapper,
1163                       /*existingMapEqual*/ true,
1164                       /*existingDocumentPositionMapperEqual*/ true
1165                    );
1166                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts changes with timeout before request", session);
1167                });
1168                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
1169                    // Create DocumentPositionMapper
1170                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1171
1172                    // change
1173                    changeDtsFile(host);
1174
1175                    // action
1176                    verifyAllFnAction(
1177                        session,
1178                        renameFromDependencyTs,
1179                        dependencyMap,
1180                        documentPositionMapper,
1181                        /*existingMapEqual*/ true,
1182                        /*existingDocumentPositionMapperEqual*/ true
1183                    );
1184                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts changes", session);
1185                });
1186
1187                // Edit map file to represent added new line
1188                it(`when dependency file's map changes, when timeout occurs before request`, () => {
1189                    // Create DocumentPositionMapper
1190                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1191
1192                    // change
1193                    changeDtsMapFile(host);
1194                    host.runQueuedTimeoutCallbacks();
1195                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1196
1197                    // action
1198                    verifyAllFnAction(
1199                        session,
1200                        renameFromDependencyTs,
1201                        dependencyMap,
1202                        documentPositionMapper,
1203                         /*existingMapEqual*/ true,
1204                         /*existingDocumentPositionMapperEqual*/ false
1205                    );
1206                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap changes with timeout before request", session);
1207                });
1208                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
1209                    // Create DocumentPositionMapper
1210                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1211
1212                    // change
1213                    changeDtsMapFile(host);
1214
1215                    // action
1216                    verifyAllFnAction(
1217                        session,
1218                        renameFromDependencyTs,
1219                        dependencyMap,
1220                        documentPositionMapper,
1221                        /*existingMapEqual*/ true,
1222                        /*existingDocumentPositionMapperEqual*/ false
1223                    );
1224                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap changes", session);
1225                });
1226
1227                it(`with depedency files map file, when file is not present`, () => {
1228                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
1229
1230                    verifyAllFnAction(
1231                        session,
1232                        renameFromDependencyTs,
1233                        /*existingDependencyMap*/ undefined,
1234                        /*existingDocumentPositionMapper*/ undefined,
1235                        /*existingMapEqual*/ true,
1236                        /*existingDocumentPositionMapperEqual*/ true
1237                    );
1238                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1239                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap not present", session);
1240                });
1241                it(`with depedency files map file, when file is created after actions on projects`, () => {
1242                    let fileContents: string;
1243                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
1244                        fileContents = host.readFile(dtsMapLocation)!;
1245                        host.deleteFile(dtsMapLocation);
1246                    });
1247
1248                    host.writeFile(dtsMapLocation, fileContents!);
1249                    verifyAllFnAction(
1250                        session,
1251                        renameFromDependencyTs,
1252                        dependencyMap,
1253                        documentPositionMapper,
1254                        /*existingMapEqual*/ false,
1255                        /*existingDocumentPositionMapperEqual*/ false
1256                    );
1257                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1258                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap created", session);
1259                });
1260                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
1261                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1262
1263                    // The dependency file is deleted when orphan files are collected
1264                    host.deleteFile(dtsMapLocation);
1265                    verifyAllFnAction(
1266                        session,
1267                        renameFromDependencyTs,
1268                        dependencyMap,
1269                        documentPositionMapper,
1270                        /*existingMapEqual*/ false,
1271                        /*existingDocumentPositionMapperEqual*/ false
1272                    );
1273                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1274                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dtsMap deleted", session);
1275                });
1276
1277                it(`with depedency .d.ts file, when file is not present`, () => {
1278                    const { session } = setup(host => host.deleteFile(dtsLocation));
1279
1280                    verifyAllFnAction(
1281                        session,
1282                        renameFromDependencyTs,
1283                        /*existingDependencyMap*/ undefined,
1284                        /*existingDocumentPositionMapper*/ undefined,
1285                        /*existingMapEqual*/ true,
1286                        /*existingDocumentPositionMapperEqual*/ true
1287                    );
1288                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1289                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts not present", session);
1290                });
1291                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
1292                    let fileContents: string;
1293                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
1294                        fileContents = host.readFile(dtsLocation)!;
1295                        host.deleteFile(dtsLocation);
1296                    });
1297
1298                    host.writeFile(dtsLocation, fileContents!);
1299                    verifyAllFnAction(
1300                        session,
1301                        renameFromDependencyTs,
1302                        dependencyMap,
1303                        documentPositionMapper,
1304                        /*existingMapEqual*/ false,
1305                        /*existingDocumentPositionMapperEqual*/ false
1306                    );
1307                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1308                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts created", session);
1309                });
1310                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
1311                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1312
1313                    // The dependency file is deleted when orphan files are collected
1314                    host.deleteFile(dtsLocation);
1315                    verifyAllFnAction(
1316                        session,
1317                        renameFromDependencyTs,
1318                        dependencyMap,
1319                        documentPositionMapper,
1320                        /*existingMapEqual*/ true,
1321                        /*existingDocumentPositionMapperEqual*/ true
1322                    );
1323                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1324                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configHasNoReference/dependency dts deleted", session);
1325                });
1326            });
1327            describe("when main tsconfig has project reference", () => {
1328                function setup(onHostCreate?: OnHostCreate) {
1329                    return setupWithDependencyTs(createSessionWithProjectReferences, onHostCreate);
1330                }
1331
1332                function setupWithAction(onHostCreate?: OnHostCreate) {
1333                    return setupWithActionWith(setup, onHostCreate);
1334                }
1335
1336                it("rename locations from dependency", () => {
1337                    const { session } = setup();
1338                    verifyAllFnAction(
1339                        session,
1340                        renameFromDependencyTs,
1341                        /*existingDependencyMap*/ undefined,
1342                        /*existingDocumentPositionMapper*/ undefined,
1343                        /*existingMapEqual*/ false,
1344                        /*existingDocumentPositionMapperEqual*/ false
1345                    );
1346                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1347                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/rename locations", session);
1348                });
1349
1350                // Edit
1351                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
1352                    // Create DocumentPositionMapper
1353                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1354
1355                    // change
1356                    makeChangeToDependencyTs(session);
1357                    host.runQueuedTimeoutCallbacks();
1358                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1359
1360                    // action
1361                    verifyAllFnAction(
1362                        session,
1363                        renameFromDependencyTs,
1364                        dependencyMap,
1365                        documentPositionMapper,
1366                        /*existingMapEqual*/ true,
1367                        /*existingDocumentPositionMapperEqual*/ true
1368                    );
1369                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/usage file changes with timeout before request", session);
1370                });
1371                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
1372                    // Create DocumentPositionMapper
1373                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
1374
1375                    // change
1376                    makeChangeToDependencyTs(session);
1377
1378                    // action
1379                    verifyAllFnAction(
1380                        session,
1381                        renameFromDependencyTs,
1382                        dependencyMap,
1383                        documentPositionMapper,
1384                       /*existingMapEqual*/ true,
1385                       /*existingDocumentPositionMapperEqual*/ true
1386                    );
1387                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/usage file changes", session);
1388                });
1389
1390                // Edit dts to add new fn
1391                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
1392                    // Create DocumentPositionMapper
1393                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1394
1395                    // change
1396                    changeDtsFile(host);
1397                    host.runQueuedTimeoutCallbacks();
1398                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1399
1400                    // action
1401                    verifyAllFnAction(
1402                        session,
1403                        renameFromDependencyTs,
1404                        dependencyMap,
1405                        documentPositionMapper,
1406                        /*existingMapEqual*/ true,
1407                        /*existingDocumentPositionMapperEqual*/ true
1408                    );
1409                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts changes with timeout before request", session);
1410                });
1411                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
1412                    // Create DocumentPositionMapper
1413                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1414
1415                    // change
1416                    changeDtsFile(host);
1417
1418                    // action
1419                    verifyAllFnAction(
1420                        session,
1421                        renameFromDependencyTs,
1422                        dependencyMap,
1423                        documentPositionMapper,
1424                        /*existingMapEqual*/ true,
1425                        /*existingDocumentPositionMapperEqual*/ true
1426                    );
1427                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts changes", session);
1428                });
1429
1430                // Edit map file to represent added new line
1431                it(`when dependency file's map changes, when timeout occurs before request`, () => {
1432                    // Create DocumentPositionMapper
1433                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1434
1435                    // change
1436                    changeDtsMapFile(host);
1437                    host.runQueuedTimeoutCallbacks();
1438                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1439
1440                    // action
1441                    verifyAllFnAction(
1442                        session,
1443                        renameFromDependencyTs,
1444                        dependencyMap,
1445                        documentPositionMapper,
1446                        /*existingMapEqual*/ true,
1447                        /*existingDocumentPositionMapperEqual*/ false
1448                    );
1449                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap changes with timeout before request", session);
1450                });
1451                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
1452                    // Create DocumentPositionMapper
1453                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1454
1455                    // change
1456                    changeDtsMapFile(host);
1457
1458                    // action
1459                    verifyAllFnAction(
1460                        session,
1461                        renameFromDependencyTs,
1462                        dependencyMap,
1463                        documentPositionMapper,
1464                        /*existingMapEqual*/ true,
1465                        /*existingDocumentPositionMapperEqual*/ false
1466                    );
1467                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap changes", session);
1468                });
1469
1470                it(`with depedency files map file, when file is not present`, () => {
1471                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
1472
1473                    verifyAllFnAction(
1474                        session,
1475                        renameFromDependencyTs,
1476                        /*existingDependencyMap*/ undefined,
1477                        /*existingDocumentPositionMapper*/ undefined,
1478                        /*existingMapEqual*/ true,
1479                        /*existingDocumentPositionMapperEqual*/ true
1480                    );
1481                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1482                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap not present", session);
1483                });
1484                it(`with depedency files map file, when file is created after actions on projects`, () => {
1485                    let fileContents: string;
1486                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
1487                        fileContents = host.readFile(dtsMapLocation)!;
1488                        host.deleteFile(dtsMapLocation);
1489                    });
1490
1491                    host.writeFile(dtsMapLocation, fileContents!);
1492                    verifyAllFnAction(
1493                        session,
1494                        renameFromDependencyTs,
1495                        dependencyMap,
1496                        documentPositionMapper,
1497                        /*existingMapEqual*/ false,
1498                        /*existingDocumentPositionMapperEqual*/ false
1499                    );
1500                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1501                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap created", session);
1502                });
1503                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
1504                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1505
1506                    // The dependency file is deleted when orphan files are collected
1507                    host.deleteFile(dtsMapLocation);
1508                    verifyAllFnAction(
1509                        session,
1510                        renameFromDependencyTs,
1511                        dependencyMap,
1512                        documentPositionMapper,
1513                        /*existingMapEqual*/ false,
1514                        /*existingDocumentPositionMapperEqual*/ false
1515                    );
1516                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1517                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dtsMap deleted", session);
1518                });
1519
1520                it(`with depedency .d.ts file, when file is not present`, () => {
1521                    const { session } = setup(host => host.deleteFile(dtsLocation));
1522
1523                    verifyAllFnAction(
1524                        session,
1525                        renameFromDependencyTs,
1526                        /*existingDependencyMap*/ undefined,
1527                        /*existingDocumentPositionMapper*/ undefined,
1528                        /*existingMapEqual*/ true,
1529                        /*existingDocumentPositionMapperEqual*/ true
1530                    );
1531                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1532                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts not present", session);
1533                });
1534                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
1535                    let fileContents: string;
1536                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
1537                        fileContents = host.readFile(dtsLocation)!;
1538                        host.deleteFile(dtsLocation);
1539                    });
1540
1541                    host.writeFile(dtsLocation, fileContents!);
1542                    verifyAllFnAction(
1543                        session,
1544                        renameFromDependencyTs,
1545                        dependencyMap,
1546                        documentPositionMapper,
1547                        /*existingMapEqual*/ false,
1548                        /*existingDocumentPositionMapperEqual*/ false
1549                    );
1550                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1551                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts created", session);
1552                });
1553                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
1554                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1555
1556                    // The dependency file is deleted when orphan files are collected
1557                    host.deleteFile(dtsLocation);
1558                    verifyAllFnAction(
1559                        session,
1560                        renameFromDependencyTs,
1561                        dependencyMap,
1562                        documentPositionMapper,
1563                        /*existingMapEqual*/ true,
1564                        /*existingDocumentPositionMapperEqual*/ true
1565                    );
1566                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1567                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency dts deleted", session);
1568                });
1569                it(`when defining project source changes, when timeout occurs before request`, () => {
1570                    // Create DocumentPositionMapper
1571                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1572
1573                    // change
1574                    // Make change, without rebuild of solution
1575                    session.executeCommandSeq<protocol.ChangeRequest>({
1576                        command: protocol.CommandTypes.Change,
1577                        arguments: {
1578                            file: dependencyTs.path, line: 1, offset: 1, endLine: 1, endOffset: 1, insertString: `function fooBar() { }
1579`}
1580                    });
1581                    host.runQueuedTimeoutCallbacks();
1582                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1583
1584                    // action
1585                    verifyAllFnAction(
1586                        session,
1587                        renameFromDependencyTsWithDependencyChange,
1588                        /*existingDependencyMap*/ undefined,
1589                        /*existingDocumentPositionMapper*/ undefined,
1590                        /*existingMapEqual*/ false,
1591                        /*existingDocumentPositionMapperEqual*/ false
1592                    );
1593                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency source changes with timeout before request", session);
1594                });
1595                it(`when defining project source changes, when timeout does not occur before request`, () => {
1596                    // Create DocumentPositionMapper
1597                    const { session } = setupWithAction();
1598
1599                    // change
1600                    // Make change, without rebuild of solution
1601                    session.executeCommandSeq<protocol.ChangeRequest>({
1602                        command: protocol.CommandTypes.Change,
1603                        arguments: {
1604                            file: dependencyTs.path, line: 1, offset: 1, endLine: 1, endOffset: 1, insertString: `function fooBar() { }
1605`}
1606                    });
1607
1608                    // action
1609                    verifyAllFnAction(
1610                        session,
1611                        renameFromDependencyTsWithDependencyChange,
1612                       /*existingDependencyMap*/ undefined,
1613                       /*existingDocumentPositionMapper*/ undefined,
1614                       /*existingMapEqual*/ false,
1615                       /*existingDocumentPositionMapperEqual*/ false
1616                    );
1617                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/dependency source changes", session);
1618                });
1619
1620                it("when projects are not built", () => {
1621                    const host = createServerHost(files);
1622                    const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host) });
1623                    openFilesForSession([dependencyTs, randomFile], session);
1624                    verifyAllFnAction(
1625                        session,
1626                        renameFromDependencyTs,
1627                        /*existingDependencyMap*/ undefined,
1628                        /*existingDocumentPositionMapper*/ undefined,
1629                        /*existingMapEqual*/ true,
1630                        /*existingDocumentPositionMapperEqual*/ true
1631                    );
1632                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1633                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/configWithReference/when projects are not built", session);
1634                });
1635            });
1636            describe("when main tsconfig has disableSourceOfProjectReferenceRedirect along with project reference", () => {
1637                function setup(onHostCreate?: OnHostCreate) {
1638                    return setupWithDependencyTs(createSessionWithDisabledProjectReferences, onHostCreate);
1639                }
1640
1641                function setupWithAction(onHostCreate?: OnHostCreate) {
1642                    return setupWithActionWith(setup, onHostCreate);
1643                }
1644
1645                it("rename locations from dependency", () => {
1646                    const { session } = setup();
1647                    verifyAllFnAction(
1648                        session,
1649                        renameFromDependencyTs,
1650                        /*existingDependencyMap*/ undefined,
1651                        /*existingDocumentPositionMapper*/ undefined,
1652                        /*existingMapEqual*/ false,
1653                        /*existingDocumentPositionMapperEqual*/ false
1654                    );
1655                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1656                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/rename locations", session);
1657                });
1658
1659                // Edit
1660                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
1661                    // Create DocumentPositionMapper
1662                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1663
1664                    // change
1665                    makeChangeToDependencyTs(session);
1666                    host.runQueuedTimeoutCallbacks();
1667                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1668
1669                    // action
1670                    verifyAllFnAction(
1671                        session,
1672                        renameFromDependencyTs,
1673                        dependencyMap,
1674                        documentPositionMapper,
1675                        /*existingMapEqual*/ true,
1676                        /*existingDocumentPositionMapperEqual*/ true
1677                    );
1678                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/usage file changes with timeout before request", session);
1679                });
1680                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
1681                    // Create DocumentPositionMapper
1682                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
1683
1684                    // change
1685                    makeChangeToDependencyTs(session);
1686
1687                    // action
1688                    verifyAllFnAction(
1689                        session,
1690                        renameFromDependencyTs,
1691                        dependencyMap,
1692                        documentPositionMapper,
1693                        /*existingMapEqual*/ true,
1694                        /*existingDocumentPositionMapperEqual*/ true
1695                    );
1696                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/usage file changes", session);
1697                });
1698
1699                // Edit dts to add new fn
1700                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
1701                    // Create DocumentPositionMapper
1702                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1703
1704                    // change
1705                    changeDtsFile(host);
1706                    host.runQueuedTimeoutCallbacks();
1707                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1708
1709                    // action
1710                    verifyAllFnAction(
1711                        session,
1712                        renameFromDependencyTs,
1713                        dependencyMap,
1714                        documentPositionMapper,
1715                        /*existingMapEqual*/ true,
1716                        /*existingDocumentPositionMapperEqual*/ true
1717                    );
1718                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts changes with timeout before request", session);
1719                });
1720                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
1721                    // Create DocumentPositionMapper
1722                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1723
1724                    // change
1725                    changeDtsFile(host);
1726
1727                    // action
1728                    verifyAllFnAction(
1729                        session,
1730                        renameFromDependencyTs,
1731                        dependencyMap,
1732                        documentPositionMapper,
1733                        /*existingMapEqual*/ true,
1734                        /*existingDocumentPositionMapperEqual*/ true
1735                    );
1736                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts changes", session);
1737                });
1738
1739                // Edit map file to represent added new line
1740                it(`when dependency file's map changes, when timeout occurs before request`, () => {
1741                    // Create DocumentPositionMapper
1742                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1743
1744                    // change
1745                    changeDtsMapFile(host);
1746                    host.runQueuedTimeoutCallbacks();
1747                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1748
1749                    // action
1750                    verifyAllFnAction(
1751                        session,
1752                        renameFromDependencyTs,
1753                        dependencyMap,
1754                        documentPositionMapper,
1755                        /*existingMapEqual*/ true,
1756                        /*existingDocumentPositionMapperEqual*/ false
1757                    );
1758                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap changes with timeout before request", session);
1759                });
1760                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
1761                    // Create DocumentPositionMapper
1762                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1763
1764                    // change
1765                    changeDtsMapFile(host);
1766
1767                    // action
1768                    verifyAllFnAction(
1769                        session,
1770                        renameFromDependencyTs,
1771                        dependencyMap,
1772                        documentPositionMapper,
1773                        /*existingMapEqual*/ true,
1774                        /*existingDocumentPositionMapperEqual*/ false
1775                    );
1776                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap changes", session);
1777                });
1778
1779                it(`with depedency files map file, when file is not present`, () => {
1780                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
1781
1782                    verifyAllFnAction(
1783                        session,
1784                        renameFromDependencyTs,
1785                        /*existingDependencyMap*/ undefined,
1786                        /*existingDocumentPositionMapper*/ undefined,
1787                        /*existingMapEqual*/ true,
1788                        /*existingDocumentPositionMapperEqual*/ true
1789                    );
1790                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1791                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap not present", session);
1792                });
1793                it(`with depedency files map file, when file is created after actions on projects`, () => {
1794                    let fileContents: string;
1795                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
1796                        fileContents = host.readFile(dtsMapLocation)!;
1797                        host.deleteFile(dtsMapLocation);
1798                    });
1799
1800                    host.writeFile(dtsMapLocation, fileContents!);
1801                    verifyAllFnAction(
1802                        session,
1803                        renameFromDependencyTs,
1804                        dependencyMap,
1805                        documentPositionMapper,
1806                        /*existingMapEqual*/ false,
1807                        /*existingDocumentPositionMapperEqual*/ false
1808                    );
1809                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1810                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap created", session);
1811                });
1812                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
1813                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1814
1815                    // The dependency file is deleted when orphan files are collected
1816                    host.deleteFile(dtsMapLocation);
1817                    verifyAllFnAction(
1818                        session,
1819                        renameFromDependencyTs,
1820                        dependencyMap,
1821                        documentPositionMapper,
1822                        /*existingMapEqual*/ false,
1823                        /*existingDocumentPositionMapperEqual*/ false
1824                    );
1825                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1826                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dtsMap deleted", session);
1827                });
1828
1829                it(`with depedency .d.ts file, when file is not present`, () => {
1830                    const { session } = setup(host => host.deleteFile(dtsLocation));
1831
1832                    verifyAllFnAction(
1833                        session,
1834                        renameFromDependencyTs,
1835                        /*existingDependencyMap*/ undefined,
1836                        /*existingDocumentPositionMapper*/ undefined,
1837                        /*existingMapEqual*/ true,
1838                        /*existingDocumentPositionMapperEqual*/ true
1839                    );
1840                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1841                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts not present", session);
1842                });
1843                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
1844                    let fileContents: string;
1845                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
1846                        fileContents = host.readFile(dtsLocation)!;
1847                        host.deleteFile(dtsLocation);
1848                    });
1849
1850                    host.writeFile(dtsLocation, fileContents!);
1851                    verifyAllFnAction(
1852                        session,
1853                        renameFromDependencyTs,
1854                        dependencyMap,
1855                        documentPositionMapper,
1856                        /*existingMapEqual*/ false,
1857                        /*existingDocumentPositionMapperEqual*/ false
1858                    );
1859                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1860                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts created", session);
1861                });
1862                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
1863                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1864
1865                    // The dependency file is deleted when orphan files are collected
1866                    host.deleteFile(dtsLocation);
1867                    verifyAllFnAction(
1868                        session,
1869                        renameFromDependencyTs,
1870                        dependencyMap,
1871                        documentPositionMapper,
1872                        /*existingMapEqual*/ true,
1873                        /*existingDocumentPositionMapperEqual*/ true
1874                    );
1875                    verifyScriptInfoCollectionWith(session, [dependencyTs]);
1876                    baselineTsserverLogs("projectReferencesSourcemap", "dependency/disabledSourceRef/dependency dts deleted", session);
1877                });
1878            });
1879        });
1880
1881        describe("when opening depedency and usage project: goToDef and rename", () => {
1882            function setupWithActionWith(setup: (onHostCreate?: OnHostCreate) => ReturnType<CreateSessionFn>, onHostCreate: OnHostCreate | undefined) {
1883                const result = setup(onHostCreate);
1884                result.session.executeCommandSeq(goToDefFromMainTs(1));
1885                result.session.executeCommandSeq(renameFromDependencyTs(1));
1886                return { ...result, ...getDocumentPositionMapper(result.session) };
1887            }
1888
1889            describe("when main tsconfig doesnt have project reference", () => {
1890                function setup(onHostCreate?: OnHostCreate) {
1891                    return setupWithMainTsAndDependencyTs(createSessionWithoutProjectReferences, onHostCreate);
1892                }
1893
1894                function setupWithAction(onHostCreate?: OnHostCreate) {
1895                    return setupWithActionWith(setup, onHostCreate);
1896                }
1897
1898                it("goto Definition in usage and rename locations from defining project", () => {
1899                    const { session } = setup();
1900                    verifyAllFnAction(
1901                        session,
1902                        goToDefFromMainTs,
1903                        /*existingDependencyMap*/ undefined,
1904                        /*existingDocumentPositionMapper*/ undefined,
1905                        /*existingMapEqual*/ false,
1906                        /*existingDocumentPositionMapperEqual*/ false
1907                    );
1908                    const { dependencyMap, documentPositionMapper } = getDocumentPositionMapper(session);
1909                    verifyAllFnAction(
1910                        session,
1911                        renameFromDependencyTs,
1912                        dependencyMap,
1913                        documentPositionMapper,
1914                        /*existingMapEqual*/ true,
1915                        /*existingDocumentPositionMapperEqual*/ true
1916                    );
1917                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
1918                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/goToDef and rename locations", session);
1919                });
1920
1921                // Edit
1922                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
1923                    // Create DocumentPositionMapper
1924                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1925
1926                    // change
1927                    makeChangeToMainTs(session);
1928                    makeChangeToDependencyTs(session);
1929                    host.runQueuedTimeoutCallbacks();
1930                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1931
1932                    // action
1933                    verifyAllFnAction(
1934                        session,
1935                        goToDefFromMainTs,
1936                        dependencyMap,
1937                        documentPositionMapper,
1938                        /*existingMapEqual*/ true,
1939                        /*existingDocumentPositionMapperEqual*/ true
1940                    );
1941                    verifyAllFnAction(
1942                        session,
1943                        renameFromDependencyTs,
1944                        dependencyMap,
1945                        documentPositionMapper,
1946                        /*existingMapEqual*/ true,
1947                        /*existingDocumentPositionMapperEqual*/ true
1948                    );
1949                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/usage file changes with timeout before request", session);
1950                });
1951                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
1952                    // Create DocumentPositionMapper
1953                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
1954
1955                    // change
1956                    makeChangeToMainTs(session);
1957                    makeChangeToDependencyTs(session);
1958
1959                    // action
1960                    verifyAllFnAction(
1961                        session,
1962                        goToDefFromMainTs,
1963                        dependencyMap,
1964                        documentPositionMapper,
1965                        /*existingMapEqual*/ true,
1966                        /*existingDocumentPositionMapperEqual*/ true
1967                    );
1968                    verifyAllFnAction(
1969                        session,
1970                        renameFromDependencyTs,
1971                        dependencyMap,
1972                        documentPositionMapper,
1973                        /*existingMapEqual*/ true,
1974                        /*existingDocumentPositionMapperEqual*/ true
1975                    );
1976                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/usage file changes", session);
1977                });
1978
1979                // Edit dts to add new fn
1980                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
1981                    // Create DocumentPositionMapper
1982                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
1983
1984                    // change
1985                    changeDtsFile(host);
1986                    host.runQueuedTimeoutCallbacks();
1987                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
1988
1989                    // action
1990                    verifyAllFnAction(
1991                        session,
1992                        goToDefFromMainTs,
1993                        dependencyMap,
1994                        documentPositionMapper,
1995                        /*existingMapEqual*/ true,
1996                        /*existingDocumentPositionMapperEqual*/ true
1997                    );
1998                    verifyAllFnAction(
1999                        session,
2000                        renameFromDependencyTs,
2001                        dependencyMap,
2002                        documentPositionMapper,
2003                        /*existingMapEqual*/ true,
2004                        /*existingDocumentPositionMapperEqual*/ true
2005                    );
2006                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts changes with timeout before request", session);
2007                });
2008                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
2009                    // Create DocumentPositionMapper
2010                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2011
2012                    // change
2013                    changeDtsFile(host);
2014
2015                    // action
2016                    verifyAllFnAction(
2017                        session,
2018                        goToDefFromMainTs,
2019                        dependencyMap,
2020                        documentPositionMapper,
2021                        /*existingMapEqual*/ true,
2022                        /*existingDocumentPositionMapperEqual*/ true
2023                    );
2024                    verifyAllFnAction(
2025                        session,
2026                        renameFromDependencyTs,
2027                        dependencyMap,
2028                        documentPositionMapper,
2029                        /*existingMapEqual*/ true,
2030                        /*existingDocumentPositionMapperEqual*/ true
2031                    );
2032                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts changes", session);
2033                });
2034
2035                // Edit map file to represent added new line
2036                it(`when dependency file's map changes, when timeout occurs before request`, () => {
2037                    // Create DocumentPositionMapper
2038                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2039
2040                    // change
2041                    changeDtsMapFile(host);
2042                    host.runQueuedTimeoutCallbacks();
2043                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
2044
2045                    // action
2046                    verifyAllFnAction(
2047                        session,
2048                        goToDefFromMainTs,
2049                        dependencyMap,
2050                        documentPositionMapper,
2051                        /*existingMapEqual*/ true,
2052                        /*existingDocumentPositionMapperEqual*/ false
2053                    );
2054                    const { documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2055                    verifyAllFnAction(
2056                        session,
2057                        renameFromDependencyTs,
2058                        dependencyMap,
2059                        newDocumentPositionMapper,
2060                        /*existingMapEqual*/ true,
2061                        /*existingDocumentPositionMapperEqual*/ true
2062                    );
2063                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap changes with timeout before request", session);
2064                });
2065                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
2066                    // Create DocumentPositionMapper
2067                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2068
2069                    // change
2070                    changeDtsMapFile(host);
2071
2072                    // action
2073                    verifyAllFnAction(
2074                        session,
2075                        goToDefFromMainTs,
2076                        dependencyMap,
2077                        documentPositionMapper,
2078                        /*existingMapEqual*/ true,
2079                        /*existingDocumentPositionMapperEqual*/ false
2080                    );
2081                    const { documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2082                    verifyAllFnAction(
2083                        session,
2084                        renameFromDependencyTs,
2085                        dependencyMap,
2086                        newDocumentPositionMapper,
2087                        /*existingMapEqual*/ true,
2088                        /*existingDocumentPositionMapperEqual*/ true
2089                    );
2090                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap changes", session);
2091                });
2092
2093                it(`with depedency files map file, when file is not present`, () => {
2094                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
2095
2096                    verifyAllFnAction(
2097                        session,
2098                        goToDefFromMainTs,
2099                        /*existingDependencyMap*/ undefined,
2100                        /*existingDocumentPositionMapper*/ undefined,
2101                        /*existingMapEqual*/ true,
2102                        /*existingDocumentPositionMapperEqual*/ true
2103                    );
2104                    verifyAllFnAction(
2105                        session,
2106                        renameFromDependencyTs,
2107                        /*existingDependencyMap*/ undefined,
2108                        /*existingDocumentPositionMapper*/ undefined,
2109                        /*existingMapEqual*/ true,
2110                        /*existingDocumentPositionMapperEqual*/ true
2111                    );
2112                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2113                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap not present", session);
2114                });
2115                it(`with depedency files map file, when file is created after actions on projects`, () => {
2116                    let fileContents: string;
2117                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
2118                        fileContents = host.readFile(dtsMapLocation)!;
2119                        host.deleteFile(dtsMapLocation);
2120                    });
2121
2122                    host.writeFile(dtsMapLocation, fileContents!);
2123                    verifyAllFnAction(
2124                        session,
2125                        goToDefFromMainTs,
2126                        dependencyMap,
2127                        documentPositionMapper,
2128                        /*existingMapEqual*/ false,
2129                        /*existingDocumentPositionMapperEqual*/ false
2130                    );
2131                    const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2132                    verifyAllFnAction(
2133                        session,
2134                        renameFromDependencyTs,
2135                        newDependencyMap,
2136                        newDocumentPositionMapper,
2137                        /*existingMapEqual*/ true,
2138                        /*existingDocumentPositionMapperEqual*/ true
2139                    );
2140                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2141                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap created", session);
2142                });
2143                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
2144                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2145
2146                    // The dependency file is deleted when orphan files are collected
2147                    host.deleteFile(dtsMapLocation);
2148                    verifyAllFnAction(
2149                        session,
2150                        goToDefFromMainTs,
2151                        dependencyMap,
2152                        documentPositionMapper,
2153                        /*existingMapEqual*/ false,
2154                        /*existingDocumentPositionMapperEqual*/ false
2155                    );
2156                    const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2157                    verifyAllFnAction(
2158                        session,
2159                        renameFromDependencyTs,
2160                        newDependencyMap,
2161                        newDocumentPositionMapper,
2162                        /*existingMapEqual*/ true,
2163                        /*existingDocumentPositionMapperEqual*/ true
2164                    );
2165                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2166                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dtsMap deleted", session);
2167                });
2168
2169                it(`with depedency .d.ts file, when file is not present`, () => {
2170                    const { session } = setup(host => host.deleteFile(dtsLocation));
2171                    verifyAllFnAction(
2172                        session,
2173                        goToDefFromMainTs,
2174                        /*existingDependencyMap*/ undefined,
2175                        /*existingDocumentPositionMapper*/ undefined,
2176                        /*existingMapEqual*/ true,
2177                        /*existingDocumentPositionMapperEqual*/ true
2178                    );
2179                    verifyAllFnAction(
2180                        session,
2181                        renameFromDependencyTs,
2182                        /*existingDependencyMap*/ undefined,
2183                        /*existingDocumentPositionMapper*/ undefined,
2184                        /*existingMapEqual*/ true,
2185                        /*existingDocumentPositionMapperEqual*/ true
2186                    );
2187                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2188                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts not present", session);
2189                });
2190                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
2191                    let fileContents: string;
2192                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
2193                        fileContents = host.readFile(dtsLocation)!;
2194                        host.deleteFile(dtsLocation);
2195                    });
2196
2197                    host.writeFile(dtsLocation, fileContents!);
2198                    verifyAllFnAction(
2199                        session,
2200                        goToDefFromMainTs,
2201                        dependencyMap,
2202                        documentPositionMapper,
2203                        /*existingMapEqual*/ false,
2204                        /*existingDocumentPositionMapperEqual*/ false
2205                    );
2206                    const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2207                    verifyAllFnAction(
2208                        session,
2209                        renameFromDependencyTs,
2210                        newDependencyMap,
2211                        newDocumentPositionMapper,
2212                        /*existingMapEqual*/ true,
2213                        /*existingDocumentPositionMapperEqual*/ true
2214                    );
2215                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2216                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts created", session);
2217                });
2218                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
2219                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2220
2221                    // The dependency file is deleted when orphan files are collected
2222                    host.deleteFile(dtsLocation);
2223                    verifyAllFnAction(
2224                        session,
2225                        goToDefFromMainTs,
2226                        dependencyMap,
2227                        documentPositionMapper,
2228                        /*existingMapEqual*/ true,
2229                        /*existingDocumentPositionMapperEqual*/ true
2230                    );
2231                    verifyAllFnAction(
2232                        session,
2233                        renameFromDependencyTs,
2234                        dependencyMap,
2235                        documentPositionMapper,
2236                        /*existingMapEqual*/ true,
2237                        /*existingDocumentPositionMapperEqual*/ true
2238                    );
2239                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2240                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configHasNoReference/dependency dts deleted", session);
2241                });
2242            });
2243            describe("when main tsconfig has project reference", () => {
2244                function setup(onHostCreate?: OnHostCreate) {
2245                    return setupWithMainTsAndDependencyTs(createSessionWithProjectReferences, onHostCreate);
2246                }
2247
2248                function setupWithAction(onHostCreate?: OnHostCreate) {
2249                    return setupWithActionWith(setup, onHostCreate);
2250                }
2251
2252                it("goto Definition in usage and rename locations from defining project", () => {
2253                    const { session } = setup();
2254                    verifyAllFnAction(
2255                        session,
2256                        goToDefFromMainTs,
2257                        /*existingDependencyMap*/ undefined,
2258                        /*existingDocumentPositionMapper*/ undefined,
2259                        /*existingMapEqual*/ true,
2260                        /*existingDocumentPositionMapperEqual*/ true
2261                    );
2262                    verifyAllFnAction(
2263                        session,
2264                        renameFromDependencyTs,
2265                        /*existingDependencyMap*/ undefined,
2266                        /*existingDocumentPositionMapper*/ undefined,
2267                        /*existingMapEqual*/ false,
2268                        /*existingDocumentPositionMapperEqual*/ false
2269                    );
2270                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2271                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/gotoDef and rename locations", session);
2272                });
2273
2274                // Edit
2275                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
2276                    // Create DocumentPositionMapper
2277                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2278
2279                    // change
2280                    makeChangeToMainTs(session);
2281                    makeChangeToDependencyTs(session);
2282                    host.runQueuedTimeoutCallbacks();
2283                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
2284
2285                    // action
2286                    verifyAllFnAction(
2287                        session,
2288                        goToDefFromMainTs,
2289                        dependencyMap,
2290                        documentPositionMapper,
2291                       /*existingMapEqual*/ true,
2292                       /*existingDocumentPositionMapperEqual*/ true
2293                    );
2294                    verifyAllFnAction(
2295                        session,
2296                        renameFromDependencyTs,
2297                        dependencyMap,
2298                        documentPositionMapper,
2299                       /*existingMapEqual*/ true,
2300                       /*existingDocumentPositionMapperEqual*/ true
2301                    );
2302                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/usage file changes with timeout before request", session);
2303                });
2304                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
2305                    // Create DocumentPositionMapper
2306                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
2307
2308                    // change
2309                    makeChangeToMainTs(session);
2310                    makeChangeToDependencyTs(session);
2311
2312                    // action
2313                    verifyAllFnAction(
2314                        session,
2315                        goToDefFromMainTs,
2316                        dependencyMap,
2317                        documentPositionMapper,
2318                        /*existingMapEqual*/ true,
2319                        /*existingDocumentPositionMapperEqual*/ true
2320                    );
2321                    verifyAllFnAction(
2322                        session,
2323                        renameFromDependencyTs,
2324                        dependencyMap,
2325                        documentPositionMapper,
2326                        /*existingMapEqual*/ true,
2327                        /*existingDocumentPositionMapperEqual*/ true
2328                    );
2329                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/usage file changes", session);
2330                });
2331
2332                // Edit dts to add new fn
2333                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
2334                    // Create DocumentPositionMapper
2335                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2336
2337                    // change
2338                    changeDtsFile(host);
2339                    host.runQueuedTimeoutCallbacks();
2340                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
2341
2342                    // action
2343                    verifyAllFnAction(
2344                        session,
2345                        goToDefFromMainTs,
2346                        dependencyMap,
2347                        documentPositionMapper,
2348                         /*existingMapEqual*/ true,
2349                         /*existingDocumentPositionMapperEqual*/ true
2350                    );
2351                    verifyAllFnAction(
2352                        session,
2353                        renameFromDependencyTs,
2354                        dependencyMap,
2355                        documentPositionMapper,
2356                         /*existingMapEqual*/ true,
2357                         /*existingDocumentPositionMapperEqual*/ true
2358                    );
2359                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts changes with timeout before request", session);
2360                });
2361                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
2362                    // Create DocumentPositionMapper
2363                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2364
2365                    // change
2366                    changeDtsFile(host);
2367
2368                    // action
2369                    verifyAllFnAction(
2370                        session,
2371                        goToDefFromMainTs,
2372                        dependencyMap,
2373                        documentPositionMapper,
2374                        /*existingMapEqual*/ true,
2375                        /*existingDocumentPositionMapperEqual*/ true
2376                    );
2377                    verifyAllFnAction(
2378                        session,
2379                        renameFromDependencyTs,
2380                        dependencyMap,
2381                        documentPositionMapper,
2382                        /*existingMapEqual*/ true,
2383                        /*existingDocumentPositionMapperEqual*/ true
2384                    );
2385                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts changes", session);
2386                });
2387
2388                // Edit map file to represent added new line
2389                it(`when dependency file's map changes, when timeout occurs before request`, () => {
2390                    // Create DocumentPositionMapper
2391                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2392
2393                    // change
2394                    changeDtsMapFile(host);
2395                    host.runQueuedTimeoutCallbacks();
2396                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
2397
2398                    // action
2399                    verifyAllFnAction(
2400                        session,
2401                        goToDefFromMainTs,
2402                        dependencyMap,
2403                        documentPositionMapper,
2404                        /*existingMapEqual*/ true,
2405                        /*existingDocumentPositionMapperEqual*/ true
2406                    );
2407                    verifyAllFnAction(
2408                        session,
2409                        renameFromDependencyTs,
2410                        dependencyMap,
2411                        documentPositionMapper,
2412                        /*existingMapEqual*/ true,
2413                        /*existingDocumentPositionMapperEqual*/ false
2414                    );
2415                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap changes with timeout before request", session);
2416                });
2417                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
2418                    // Create DocumentPositionMapper
2419                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2420
2421                    // change
2422                    changeDtsMapFile(host);
2423
2424                    // action
2425                    verifyAllFnAction(
2426                        session,
2427                        goToDefFromMainTs,
2428                        dependencyMap,
2429                        documentPositionMapper,
2430                         /*existingMapEqual*/ true,
2431                         /*existingDocumentPositionMapperEqual*/ true
2432                    );
2433                    verifyAllFnAction(
2434                        session,
2435                        renameFromDependencyTs,
2436                        dependencyMap,
2437                        documentPositionMapper,
2438                         /*existingMapEqual*/ true,
2439                         /*existingDocumentPositionMapperEqual*/ false
2440                    );
2441                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap changes", session);
2442                });
2443
2444                it(`with depedency files map file, when file is not present`, () => {
2445                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
2446
2447                    verifyAllFnAction(
2448                        session,
2449                        goToDefFromMainTs,
2450                        /*existingDependencyMap*/ undefined,
2451                        /*existingDocumentPositionMapper*/ undefined,
2452                        /*existingMapEqual*/ true,
2453                        /*existingDocumentPositionMapperEqual*/ true
2454                    );
2455                    verifyAllFnAction(
2456                        session,
2457                        renameFromDependencyTs,
2458                        /*existingDependencyMap*/ undefined,
2459                        /*existingDocumentPositionMapper*/ undefined,
2460                        /*existingMapEqual*/ true,
2461                        /*existingDocumentPositionMapperEqual*/ true
2462                    );
2463                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2464                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap not present", session);
2465                });
2466                it(`with depedency files map file, when file is created after actions on projects`, () => {
2467                    let fileContents: string;
2468                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
2469                        fileContents = host.readFile(dtsMapLocation)!;
2470                        host.deleteFile(dtsMapLocation);
2471                    });
2472
2473                    host.writeFile(dtsMapLocation, fileContents!);
2474                    verifyAllFnAction(
2475                        session,
2476                        goToDefFromMainTs,
2477                        dependencyMap,
2478                        documentPositionMapper,
2479                        /*existingMapEqual*/ true,
2480                        /*existingDocumentPositionMapperEqual*/ true,
2481                        /*skipMapPathInDtsInfo*/ true
2482                    );
2483                    verifyAllFnAction(
2484                        session,
2485                        renameFromDependencyTs,
2486                        dependencyMap,
2487                        documentPositionMapper,
2488                        /*existingMapEqual*/ false,
2489                        /*existingDocumentPositionMapperEqual*/ false
2490                    );
2491                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2492                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap created", session);
2493                });
2494                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
2495                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2496
2497                    // The dependency file is deleted when orphan files are collected
2498                    host.deleteFile(dtsMapLocation);
2499                    verifyAllFnAction(
2500                        session,
2501                        goToDefFromMainTs,
2502                        dependencyMap,
2503                        documentPositionMapper,
2504                        /*existingMapEqual*/ false,
2505                        /*existingDocumentPositionMapperEqual*/ false,
2506                        /*skipMapPathInDtsInfo*/ true
2507                    );
2508                    verifyAllFnAction(
2509                        session,
2510                        renameFromDependencyTs,
2511                        dependencyMap,
2512                        documentPositionMapper,
2513                        /*existingMapEqual*/ false,
2514                        /*existingDocumentPositionMapperEqual*/ false
2515                    );
2516                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2517                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dtsMap deleted", session);
2518                });
2519
2520                it(`with depedency .d.ts file, when file is not present`, () => {
2521                    const { session } = setup(host => host.deleteFile(dtsLocation));
2522
2523                    verifyAllFnAction(
2524                        session,
2525                        goToDefFromMainTs,
2526                        /*existingDependencyMap*/ undefined,
2527                        /*existingDocumentPositionMapper*/ undefined,
2528                        /*existingMapEqual*/ true,
2529                        /*existingDocumentPositionMapperEqual*/ true
2530                    );
2531                    verifyAllFnAction(
2532                        session,
2533                        renameFromDependencyTs,
2534                        /*existingDependencyMap*/ undefined,
2535                        /*existingDocumentPositionMapper*/ undefined,
2536                        /*existingMapEqual*/ true,
2537                        /*existingDocumentPositionMapperEqual*/ true
2538                    );
2539                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2540                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts not present", session);
2541                });
2542                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
2543                    let fileContents: string;
2544                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
2545                        fileContents = host.readFile(dtsLocation)!;
2546                        host.deleteFile(dtsLocation);
2547                    });
2548
2549                    host.writeFile(dtsLocation, fileContents!);
2550                    verifyAllFnAction(
2551                        session,
2552                        goToDefFromMainTs,
2553                        dependencyMap,
2554                        documentPositionMapper,
2555                        /*existingMapEqual*/ true,
2556                        /*existingDocumentPositionMapperEqual*/ true
2557                    );
2558                    verifyAllFnAction(
2559                        session,
2560                        renameFromDependencyTs,
2561                        dependencyMap,
2562                        documentPositionMapper,
2563                        /*existingMapEqual*/ false,
2564                        /*existingDocumentPositionMapperEqual*/ false
2565                    );
2566                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2567                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts created", session);
2568                });
2569                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
2570                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2571
2572                    // The dependency file is deleted when orphan files are collected
2573                    host.deleteFile(dtsLocation);
2574                    verifyAllFnAction(
2575                        session,
2576                        goToDefFromMainTs,
2577                        dependencyMap,
2578                        documentPositionMapper,
2579                        /*existingMapEqual*/ true,
2580                        /*existingDocumentPositionMapperEqual*/ true
2581                    );
2582                    verifyAllFnAction(
2583                        session,
2584                        renameFromDependencyTs,
2585                        dependencyMap,
2586                        documentPositionMapper,
2587                        /*existingMapEqual*/ true,
2588                        /*existingDocumentPositionMapperEqual*/ true
2589                    );
2590                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2591                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency dts deleted", session);
2592                });
2593                it(`when defining project source changes, when timeout occurs before request`, () => {
2594                    // Create DocumentPositionMapper
2595                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2596
2597                    // change
2598                    // Make change, without rebuild of solution
2599                    session.executeCommandSeq<protocol.ChangeRequest>({
2600                        command: protocol.CommandTypes.Change,
2601                        arguments: {
2602                            file: dependencyTs.path, line: 1, offset: 1, endLine: 1, endOffset: 1, insertString: `function fooBar() { }
2603`}
2604                    });
2605                    host.runQueuedTimeoutCallbacks();
2606                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
2607
2608                    // action
2609                    verifyAllFnAction(
2610                        session,
2611                        goToDefFromMainTs,
2612                        dependencyMap,
2613                        documentPositionMapper,
2614                        /*existingMapEqual*/ true,
2615                        /*existingDocumentPositionMapperEqual*/ true
2616                    );
2617                    verifyAllFnAction(
2618                        session,
2619                        renameFromDependencyTsWithDependencyChange,
2620                        dependencyMap,
2621                        documentPositionMapper,
2622                        /*existingMapEqual*/ true,
2623                        /*existingDocumentPositionMapperEqual*/ true
2624                    );
2625                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency source changes with timeout before request", session);
2626                });
2627                it(`when defining project source changes, when timeout does not occur before request`, () => {
2628                    // Create DocumentPositionMapper
2629                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
2630
2631                    // change
2632                    // Make change, without rebuild of solution
2633                    session.executeCommandSeq<protocol.ChangeRequest>({
2634                        command: protocol.CommandTypes.Change,
2635                        arguments: {
2636                            file: dependencyTs.path, line: 1, offset: 1, endLine: 1, endOffset: 1, insertString: `function fooBar() { }
2637 `}
2638                    });
2639
2640                    // action
2641                    verifyAllFnAction(
2642                        session,
2643                        goToDefFromMainTs,
2644                        dependencyMap,
2645                        documentPositionMapper,
2646                         /*existingMapEqual*/ true,
2647                         /*existingDocumentPositionMapperEqual*/ true
2648                    );
2649                    verifyAllFnAction(
2650                        session,
2651                        renameFromDependencyTsWithDependencyChange,
2652                        dependencyMap,
2653                        documentPositionMapper,
2654                         /*existingMapEqual*/ true,
2655                         /*existingDocumentPositionMapperEqual*/ true
2656                    );
2657                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/dependency source changes", session);
2658                });
2659
2660                it("when projects are not built", () => {
2661                    const host = createServerHost(files);
2662                    const session = createSession(host, { logger: createLoggerWithInMemoryLogs(host) });
2663                    openFilesForSession([mainTs, dependencyTs, randomFile], session);
2664                    verifyAllFnAction(
2665                        session,
2666                        goToDefFromMainTs,
2667                        /*existingDependencyMap*/ undefined,
2668                        /*existingDocumentPositionMapper*/ undefined,
2669                        /*existingMapEqual*/ true,
2670                        /*existingDocumentPositionMapperEqual*/ true
2671                    );
2672                    verifyAllFnAction(
2673                        session,
2674                        renameFromDependencyTs,
2675                        /*existingDependencyMap*/ undefined,
2676                        /*existingDocumentPositionMapper*/ undefined,
2677                        /*existingMapEqual*/ true,
2678                        /*existingDocumentPositionMapperEqual*/ true
2679                    );
2680                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2681                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/configWithReference/when projects are not built", session);
2682                });
2683            });
2684            describe("when main tsconfig has disableSourceOfProjectReferenceRedirect along with project reference", () => {
2685                function setup(onHostCreate?: OnHostCreate) {
2686                    return setupWithMainTsAndDependencyTs(createSessionWithDisabledProjectReferences, onHostCreate);
2687                }
2688
2689                function setupWithAction(onHostCreate?: OnHostCreate) {
2690                    return setupWithActionWith(setup, onHostCreate);
2691                }
2692
2693                it("goto Definition in usage and rename locations from defining project", () => {
2694                    const { session } = setup();
2695                    verifyAllFnAction(
2696                        session,
2697                        goToDefFromMainTs,
2698                        /*existingDependencyMap*/ undefined,
2699                        /*existingDocumentPositionMapper*/ undefined,
2700                        /*existingMapEqual*/ false,
2701                        /*existingDocumentPositionMapperEqual*/ false
2702                    );
2703                    const { dependencyMap, documentPositionMapper } = getDocumentPositionMapper(session);
2704                    verifyAllFnAction(
2705                        session,
2706                        renameFromDependencyTs,
2707                        dependencyMap,
2708                        documentPositionMapper,
2709                        /*existingMapEqual*/ true,
2710                        /*existingDocumentPositionMapperEqual*/ true
2711                    );
2712                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2713                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/gotoDef and rename locations", session);
2714                });
2715
2716                // Edit
2717                it(`when usage file changes, document position mapper doesnt change, when timeout occurs before request`, () => {
2718                    // Create DocumentPositionMapper
2719                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2720
2721                    // change
2722                    makeChangeToMainTs(session);
2723                    makeChangeToDependencyTs(session);
2724                    host.runQueuedTimeoutCallbacks();
2725                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
2726
2727                    // action
2728                    verifyAllFnAction(
2729                        session,
2730                        goToDefFromMainTs,
2731                        dependencyMap,
2732                        documentPositionMapper,
2733                         /*existingMapEqual*/ true,
2734                         /*existingDocumentPositionMapperEqual*/ true
2735                    );
2736                    verifyAllFnAction(
2737                        session,
2738                        renameFromDependencyTs,
2739                        dependencyMap,
2740                        documentPositionMapper,
2741                         /*existingMapEqual*/ true,
2742                         /*existingDocumentPositionMapperEqual*/ true
2743                    );
2744                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/usage file changes with timeout before request", session);
2745                });
2746                it(`when usage file changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
2747                    // Create DocumentPositionMapper
2748                    const { session, dependencyMap, documentPositionMapper } = setupWithAction();
2749
2750                    // change
2751                    makeChangeToMainTs(session);
2752                    makeChangeToDependencyTs(session);
2753
2754                    // action
2755                    verifyAllFnAction(
2756                        session,
2757                        goToDefFromMainTs,
2758                        dependencyMap,
2759                        documentPositionMapper,
2760                       /*existingMapEqual*/ true,
2761                       /*existingDocumentPositionMapperEqual*/ true
2762                    );
2763                    verifyAllFnAction(
2764                        session,
2765                        renameFromDependencyTs,
2766                        dependencyMap,
2767                        documentPositionMapper,
2768                       /*existingMapEqual*/ true,
2769                       /*existingDocumentPositionMapperEqual*/ true
2770                    );
2771                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/usage file changes", session);
2772                });
2773
2774                // Edit dts to add new fn
2775                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout occurs before request`, () => {
2776                    // Create DocumentPositionMapper
2777                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2778
2779                    // change
2780                    changeDtsFile(host);
2781                    host.runQueuedTimeoutCallbacks();
2782                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
2783
2784                    // action
2785                    verifyAllFnAction(
2786                        session,
2787                        goToDefFromMainTs,
2788                        dependencyMap,
2789                        documentPositionMapper,
2790                        /*existingMapEqual*/ true,
2791                        /*existingDocumentPositionMapperEqual*/ true
2792                    );
2793                    verifyAllFnAction(
2794                        session,
2795                        renameFromDependencyTs,
2796                        dependencyMap,
2797                        documentPositionMapper,
2798                        /*existingMapEqual*/ true,
2799                        /*existingDocumentPositionMapperEqual*/ true
2800                    );
2801                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts changes with timeout before request", session);
2802                });
2803                it(`when dependency .d.ts changes, document position mapper doesnt change, when timeout does not occur before request`, () => {
2804                    // Create DocumentPositionMapper
2805                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2806
2807                    // change
2808                    changeDtsFile(host);
2809
2810                    // action
2811                    verifyAllFnAction(
2812                        session,
2813                        goToDefFromMainTs,
2814                        dependencyMap,
2815                        documentPositionMapper,
2816                        /*existingMapEqual*/ true,
2817                        /*existingDocumentPositionMapperEqual*/ true
2818                    );
2819                    verifyAllFnAction(
2820                        session,
2821                        renameFromDependencyTs,
2822                        dependencyMap,
2823                        documentPositionMapper,
2824                        /*existingMapEqual*/ true,
2825                        /*existingDocumentPositionMapperEqual*/ true
2826                    );
2827                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts changes", session);
2828                });
2829
2830                // Edit map file to represent added new line
2831                it(`when dependency file's map changes, when timeout occurs before request`, () => {
2832                    // Create DocumentPositionMapper
2833                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2834
2835                    // change
2836                    changeDtsMapFile(host);
2837                    host.runQueuedTimeoutCallbacks();
2838                    verifyDocumentPositionMapperEqual(session, dependencyMap, documentPositionMapper);
2839
2840                    // action
2841                    verifyAllFnAction(
2842                        session,
2843                        goToDefFromMainTs,
2844                        dependencyMap,
2845                        documentPositionMapper,
2846                       /*existingMapEqual*/ true,
2847                       /*existingDocumentPositionMapperEqual*/ false
2848                    );
2849                    const { documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2850                    verifyAllFnAction(
2851                        session,
2852                        renameFromDependencyTs,
2853                        dependencyMap,
2854                        newDocumentPositionMapper,
2855                       /*existingMapEqual*/ true,
2856                       /*existingDocumentPositionMapperEqual*/ true
2857                    );
2858                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap changes with timeout before request", session);
2859                });
2860                it(`when dependency file's map changes, when timeout does not occur before request`, () => {
2861                    // Create DocumentPositionMapper
2862                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2863
2864                    // change
2865                    changeDtsMapFile(host);
2866
2867                    // action
2868                    verifyAllFnAction(
2869                        session,
2870                        goToDefFromMainTs,
2871                        dependencyMap,
2872                        documentPositionMapper,
2873                        /*existingMapEqual*/ true,
2874                        /*existingDocumentPositionMapperEqual*/ false
2875                    );
2876                    const { documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2877                    verifyAllFnAction(
2878                        session,
2879                        renameFromDependencyTs,
2880                        dependencyMap,
2881                        newDocumentPositionMapper,
2882                        /*existingMapEqual*/ true,
2883                        /*existingDocumentPositionMapperEqual*/ true
2884                    );
2885                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap changes", session);
2886                });
2887
2888                it(`with depedency files map file, when file is not present`, () => {
2889                    const { session } = setup(host => host.deleteFile(dtsMapLocation));
2890
2891                    verifyAllFnAction(
2892                        session,
2893                        goToDefFromMainTs,
2894                        /*existingDependencyMap*/ undefined,
2895                        /*existingDocumentPositionMapper*/ undefined,
2896                        /*existingMapEqual*/ true,
2897                        /*existingDocumentPositionMapperEqual*/ true
2898                    );
2899                    verifyAllFnAction(
2900                        session,
2901                        renameFromDependencyTs,
2902                        /*existingDependencyMap*/ undefined,
2903                        /*existingDocumentPositionMapper*/ undefined,
2904                        /*existingMapEqual*/ true,
2905                        /*existingDocumentPositionMapperEqual*/ true
2906                    );
2907                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2908                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap not present", session);
2909                });
2910                it(`with depedency files map file, when file is created after actions on projects`, () => {
2911                    let fileContents: string;
2912                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
2913                        fileContents = host.readFile(dtsMapLocation)!;
2914                        host.deleteFile(dtsMapLocation);
2915                    });
2916
2917                    host.writeFile(dtsMapLocation, fileContents!);
2918                    verifyAllFnAction(
2919                        session,
2920                        goToDefFromMainTs,
2921                        dependencyMap,
2922                        documentPositionMapper,
2923                        /*existingMapEqual*/ false,
2924                        /*existingDocumentPositionMapperEqual*/ false
2925                    );
2926                    const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2927                    verifyAllFnAction(
2928                        session,
2929                        renameFromDependencyTs,
2930                        newDependencyMap,
2931                        newDocumentPositionMapper,
2932                        /*existingMapEqual*/ true,
2933                        /*existingDocumentPositionMapperEqual*/ true
2934                    );
2935                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2936                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap created", session);
2937                });
2938                it(`with depedency files map file, when file is deleted after actions on the projects`, () => {
2939                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
2940
2941                    // The dependency file is deleted when orphan files are collected
2942                    host.deleteFile(dtsMapLocation);
2943                    verifyAllFnAction(
2944                        session,
2945                        goToDefFromMainTs,
2946                        dependencyMap,
2947                        documentPositionMapper,
2948                        /*existingMapEqual*/ false,
2949                        /*existingDocumentPositionMapperEqual*/ false
2950                    );
2951                    const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
2952                    verifyAllFnAction(
2953                        session,
2954                        renameFromDependencyTs,
2955                        newDependencyMap,
2956                        newDocumentPositionMapper,
2957                        /*existingMapEqual*/ true,
2958                        /*existingDocumentPositionMapperEqual*/ true
2959                    );
2960                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2961                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dtsMap deleted", session);
2962                });
2963
2964                it(`with depedency .d.ts file, when file is not present`, () => {
2965                    const { session } = setup(host => host.deleteFile(dtsLocation));
2966
2967                    verifyAllFnAction(
2968                        session,
2969                        goToDefFromMainTs,
2970                        /*existingDependencyMap*/ undefined,
2971                        /*existingDocumentPositionMapper*/ undefined,
2972                        /*existingMapEqual*/ true,
2973                        /*existingDocumentPositionMapperEqual*/ true
2974                    );
2975                    verifyAllFnAction(
2976                        session,
2977                        renameFromDependencyTs,
2978                        /*existingDependencyMap*/ undefined,
2979                        /*existingDocumentPositionMapper*/ undefined,
2980                        /*existingMapEqual*/ true,
2981                        /*existingDocumentPositionMapperEqual*/ true
2982                    );
2983                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
2984                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts not present", session);
2985                });
2986                it(`with depedency .d.ts file, when file is created after actions on projects`, () => {
2987                    let fileContents: string;
2988                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction(host => {
2989                        fileContents = host.readFile(dtsLocation)!;
2990                        host.deleteFile(dtsLocation);
2991                    });
2992
2993                    host.writeFile(dtsLocation, fileContents!);
2994                    verifyAllFnAction(
2995                        session,
2996                        goToDefFromMainTs,
2997                        dependencyMap,
2998                        documentPositionMapper,
2999                        /*existingMapEqual*/ false,
3000                        /*existingDocumentPositionMapperEqual*/ false
3001                    );
3002                    const { dependencyMap: newDependencyMap, documentPositionMapper: newDocumentPositionMapper } = getDocumentPositionMapper(session);
3003                    verifyAllFnAction(
3004                        session,
3005                        renameFromDependencyTs,
3006                        newDependencyMap,
3007                        newDocumentPositionMapper,
3008                        /*existingMapEqual*/ true,
3009                        /*existingDocumentPositionMapperEqual*/ true
3010                    );
3011                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
3012                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts created", session);
3013                });
3014                it(`with depedency .d.ts file, when file is deleted after actions on the projects`, () => {
3015                    const { host, session, dependencyMap, documentPositionMapper } = setupWithAction();
3016
3017                    // The dependency file is deleted when orphan files are collected
3018                    host.deleteFile(dtsLocation);
3019                    verifyAllFnAction(
3020                        session,
3021                        goToDefFromMainTs,
3022                        dependencyMap,
3023                        documentPositionMapper,
3024                        /*existingMapEqual*/ true,
3025                        /*existingDocumentPositionMapperEqual*/ true
3026                    );
3027                    verifyAllFnAction(
3028                        session,
3029                        renameFromDependencyTs,
3030                        dependencyMap,
3031                        documentPositionMapper,
3032                        /*existingMapEqual*/ true,
3033                        /*existingDocumentPositionMapperEqual*/ true
3034                    );
3035                    verifyScriptInfoCollectionWith(session, [mainTs, dependencyTs]);
3036                    baselineTsserverLogs("projectReferencesSourcemap", "dependencyAndUsage/disabledSourceRef/dependency dts deleted", session);
3037                });
3038            });
3039        });
3040    });
3041}