Skip to content

Commit 121f51e

Browse files
committed
Merge pull request microsoft#11694 from Microsoft/vladima/reload-tmp
allow reload from temp files
1 parent 68c485d commit 121f51e

File tree

4 files changed

+66
-7
lines changed

4 files changed

+66
-7
lines changed

src/harness/unittests/tsserverProjectSystem.ts

+60-2
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,18 @@ namespace ts.projectSystem {
170170
return host;
171171
}
172172

173+
class TestSession extends server.Session {
174+
getProjectService() {
175+
return this.projectService;
176+
}
177+
};
178+
173179
export function createSession(host: server.ServerHost, typingsInstaller?: server.ITypingsInstaller, projectServiceEventHandler?: server.ProjectServiceEventHandler) {
174180
if (typingsInstaller === undefined) {
175181
typingsInstaller = new TestTypingsInstaller("/a/data/", /*throttleLimit*/5, host);
176182
}
177-
return new server.Session(host, nullCancellationToken, /*useSingleInferredProject*/ false, typingsInstaller, Utils.byteLength, process.hrtime, nullLogger, /*canUseEvents*/ projectServiceEventHandler !== undefined, projectServiceEventHandler);
183+
184+
return new TestSession(host, nullCancellationToken, /*useSingleInferredProject*/ false, typingsInstaller, Utils.byteLength, process.hrtime, nullLogger, /*canUseEvents*/ projectServiceEventHandler !== undefined, projectServiceEventHandler);
178185
}
179186

180187
export interface CreateProjectServiceParameters {
@@ -515,11 +522,13 @@ namespace ts.projectSystem {
515522
this.reloadFS(filesOrFolders);
516523
}
517524

525+
write(s: string) {
526+
}
527+
518528
readonly readFile = (s: string) => (<File>this.fs.get(this.toPath(s))).content;
519529
readonly resolvePath = (s: string) => s;
520530
readonly getExecutingFilePath = () => this.executingFilePath;
521531
readonly getCurrentDirectory = () => this.currentDirectory;
522-
readonly write = (s: string) => notImplemented();
523532
readonly exit = () => notImplemented();
524533
readonly getEnvironmentVariable = (v: string) => notImplemented();
525534
}
@@ -2420,4 +2429,53 @@ namespace ts.projectSystem {
24202429
assert.isTrue(inferredProject.containsFile(<server.NormalizedPath>file1.path));
24212430
});
24222431
});
2432+
2433+
describe("reload", () => {
2434+
it("should work with temp file", () => {
2435+
const f1 = {
2436+
path: "/a/b/app.ts",
2437+
content: "let x = 1"
2438+
};
2439+
const tmp = {
2440+
path: "/a/b/app.tmp",
2441+
content: "const y = 42"
2442+
};
2443+
const host = createServerHost([f1, tmp]);
2444+
const session = createSession(host);
2445+
2446+
// send open request
2447+
session.executeCommand(<server.protocol.OpenRequest>{
2448+
type: "request",
2449+
command: "open",
2450+
seq: 1,
2451+
arguments: { file: f1.path }
2452+
});
2453+
2454+
// reload from tmp file
2455+
session.executeCommand(<server.protocol.ReloadRequest>{
2456+
type: "request",
2457+
command: "reload",
2458+
seq: 2,
2459+
arguments: { file: f1.path, tmpfile: tmp.path }
2460+
});
2461+
2462+
// verify content
2463+
const projectServiice = session.getProjectService();
2464+
const snap1 = projectServiice.getScriptInfo(f1.path).snap();
2465+
assert.equal(snap1.getText(0, snap1.getLength()), tmp.content, "content should be equal to the content of temp file");
2466+
2467+
// reload from original file file
2468+
session.executeCommand(<server.protocol.ReloadRequest>{
2469+
type: "request",
2470+
command: "reload",
2471+
seq: 2,
2472+
arguments: { file: f1.path }
2473+
});
2474+
2475+
// verify content
2476+
const snap2 = projectServiice.getScriptInfo(f1.path).snap();
2477+
assert.equal(snap2.getText(0, snap2.getLength()), f1.content, "content should be equal to the content of original file");
2478+
2479+
});
2480+
});
24232481
}

src/server/project.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -437,11 +437,11 @@ namespace ts.server {
437437
}
438438
}
439439

440-
reloadScript(filename: NormalizedPath): boolean {
440+
reloadScript(filename: NormalizedPath, tempFileName?: NormalizedPath): boolean {
441441
const script = this.projectService.getScriptInfoForNormalizedPath(filename);
442442
if (script) {
443443
Debug.assert(script.isAttached(this));
444-
script.reloadFromFile();
444+
script.reloadFromFile(tempFileName);
445445
return true;
446446
}
447447
return false;

src/server/scriptInfo.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,12 @@ namespace ts.server {
125125
this.host.writeFile(fileName, snap.getText(0, snap.getLength()));
126126
}
127127

128-
reloadFromFile() {
128+
reloadFromFile(tempFileName?: NormalizedPath) {
129129
if (this.hasMixedContent) {
130130
this.reload("");
131131
}
132132
else {
133-
this.svc.reloadFromFile(this.fileName);
133+
this.svc.reloadFromFile(tempFileName || this.fileName);
134134
this.markContainingProjectsAsDirty();
135135
}
136136
}

src/server/session.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1076,11 +1076,12 @@ namespace ts.server {
10761076

10771077
private reload(args: protocol.ReloadRequestArgs, reqSeq: number) {
10781078
const file = toNormalizedPath(args.file);
1079+
const tempFileName = args.tmpfile && toNormalizedPath(args.tmpfile);
10791080
const project = this.projectService.getDefaultProjectForFile(file, /*refreshInferredProjects*/ true);
10801081
if (project) {
10811082
this.changeSeq++;
10821083
// make sure no changes happen before this one is finished
1083-
if (project.reloadScript(file)) {
1084+
if (project.reloadScript(file, tempFileName)) {
10841085
this.output(undefined, CommandNames.Reload, reqSeq);
10851086
}
10861087
}

0 commit comments

Comments
 (0)