Skip to content

Commit e91e66e

Browse files
committed
Consume compileOnSaveEmitFile tsserver command. See
#109
1 parent 7c284f8 commit e91e66e

File tree

7 files changed

+193
-34
lines changed

7 files changed

+193
-34
lines changed

core/ts.core/src/ts/client/CommandNames.java

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,36 @@
1818
*/
1919
public enum CommandNames {
2020

21-
Open("open"), Close("close"), Change("change"), NavBar("navbar"), Completions(
22-
"completions"), CompletionEntryDetails("completionEntryDetails"), Reload("reload"), Definition(
23-
"definition"), SignatureHelp("signatureHelp"), QuickInfo("quickinfo"), Geterr("geterr"), Format(
24-
"format"), References("references"), Occurrences("occurrences"), Configure(
25-
"configure"), SemanticDiagnosticsSync("semanticDiagnosticsSync",
26-
"2.0.3"), SyntacticDiagnosticsSync("syntacticDiagnosticsSync",
27-
"2.0.3"), Implementation("implementation", "2.0.6"), NavTree(
28-
"navtree", "2.0.6"), GetCodeFixes("getCodeFixes", "2.1.0");
21+
Open("open"),
22+
Close("close"),
23+
Change("change"),
24+
NavBar("navbar"),
25+
Completions("completions"),
26+
CompletionEntryDetails("completionEntryDetails"),
27+
Reload("reload"),
28+
Definition("definition"),
29+
SignatureHelp("signatureHelp"),
30+
QuickInfo("quickinfo"),
31+
Geterr("geterr"),
32+
Format("format"),
33+
References("references"),
34+
Occurrences("occurrences"),
35+
Configure("configure"),
36+
37+
// 2.0.3
38+
SemanticDiagnosticsSync("semanticDiagnosticsSync", "2.0.3"),
39+
SyntacticDiagnosticsSync("syntacticDiagnosticsSync", "2.0.3"),
40+
41+
// 2.0.5
42+
compileOnSaveAffectedFileList("CompileOnSaveAffectedFileList", "2.0.5"),
43+
compileOnSaveEmitFile("compileOnSaveEmitFile", "2.0.5"),
44+
45+
// 2.0.6
46+
NavTree("navtree", "2.0.6"),
47+
48+
// 2.1.0
49+
Implementation("implementation", "2.1.0"),
50+
GetCodeFixes("getCodeFixes", "2.1.0");
2951

3052
private final String name;
3153
private final String sinceVersion;

core/ts.core/src/ts/client/ITypeScriptServiceClient.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,21 @@ void semanticDiagnosticsSync(String file, Boolean includeLinePosition, ITypeScri
9494
void syntacticDiagnosticsSync(String file, Boolean includeLinePosition, ITypeScriptDiagnosticsCollector collector)
9595
throws TypeScriptException;
9696

97+
// Since 2.0.5
98+
99+
void compileOnSaveEmitFile(String fileName, Boolean forced) throws TypeScriptException;
100+
97101
// Since 2.0.6
98102

99-
void implementation(String fileName, int line, int offset, ITypeScriptDefinitionCollector collector)
100-
throws TypeScriptException;
101-
102103
void navtree(String fileName, IPositionProvider positionProvider, ITypeScriptNavBarCollector collector)
103104
throws TypeScriptException;
104105

105106
// Since 2.1.0
107+
106108
void getCodeFixes(String fileName, IPositionProvider positionProvider, int startLine, int startOffset, int endLine,
107109
int endOffset, ITypeScriptGetCodeFixesCollector collector) throws TypeScriptException;
110+
111+
void implementation(String fileName, int line, int offset, ITypeScriptDefinitionCollector collector)
112+
throws TypeScriptException;
113+
108114
}

core/ts.core/src/ts/client/TypeScriptServiceClient.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import ts.internal.client.protocol.ChangeRequest;
4646
import ts.internal.client.protocol.CloseRequest;
4747
import ts.internal.client.protocol.CodeFixRequest;
48+
import ts.internal.client.protocol.CompileOnSaveEmitFileRequest;
4849
import ts.internal.client.protocol.CompletionDetailsRequest;
4950
import ts.internal.client.protocol.CompletionsRequest;
5051
import ts.internal.client.protocol.ConfigureRequest;
@@ -324,15 +325,16 @@ public void syntacticDiagnosticsSync(String fileName, Boolean includeLinePositio
324325
execute(request);
325326
}
326327

327-
// ---------------- Since 2.0.6
328+
// ---------------- Since 2.0.5
328329

329330
@Override
330-
public void implementation(String fileName, int line, int offset, ITypeScriptDefinitionCollector collector)
331-
throws TypeScriptException {
332-
ImplementationRequest request = new ImplementationRequest(fileName, line, offset, collector);
333-
execute(request);
331+
public void compileOnSaveEmitFile(String fileName, Boolean forced) throws TypeScriptException {
332+
CompileOnSaveEmitFileRequest request = new CompileOnSaveEmitFileRequest(fileName, forced);
333+
execute(request, false, null);
334334
}
335335

336+
// ---------------- Since 2.0.6
337+
336338
@Override
337339
public void navtree(String fileName, IPositionProvider positionProvider, ITypeScriptNavBarCollector collector)
338340
throws TypeScriptException {
@@ -350,6 +352,13 @@ public void getCodeFixes(String fileName, IPositionProvider positionProvider, in
350352
execute(request);
351353
}
352354

355+
@Override
356+
public void implementation(String fileName, int line, int offset, ITypeScriptDefinitionCollector collector)
357+
throws TypeScriptException {
358+
ImplementationRequest request = new ImplementationRequest(fileName, line, offset, collector);
359+
execute(request);
360+
}
361+
353362
private void execute(Request request) throws TypeScriptException {
354363
if (!request.isAsynch()) {
355364
try {
Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1+
/**
2+
* Copyright (c) 2015-2016 Angelo ZERR.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* http://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* Angelo Zerr <[email protected]> - initial API and implementation
10+
*/
111
package ts.internal.client.protocol;
212

3-
import com.eclipsesource.json.JsonArray;
4-
513
public class CodeFixRequestArgs extends FileRequestArgs {
614

715
public CodeFixRequestArgs(String file, int startLine, int startOffset, int endLine, int endOffset) {
@@ -10,10 +18,10 @@ public CodeFixRequestArgs(String file, int startLine, int startOffset, int endLi
1018
super.add("startOffset", startOffset);
1119
super.add("endLine", endLine);
1220
super.add("endOffset", endOffset);
13-
14-
// JsonArray errorCodes = new JsonArray();
15-
// errorCodes.add(2377);
16-
// super.add("errorCodes", errorCodes);
21+
22+
// JsonArray errorCodes = new JsonArray();
23+
// errorCodes.add(2377);
24+
// super.add("errorCodes", errorCodes);
1725
}
1826

1927
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Copyright (c) 2015-2016 Angelo ZERR.
3+
* All rights reserved. This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v1.0
5+
* which accompanies this distribution, and is available at
6+
* http://www.eclipse.org/legal/epl-v10.html
7+
*
8+
* Contributors:
9+
* Angelo Zerr <[email protected]> - initial API and implementation
10+
*/
11+
package ts.internal.client.protocol;
12+
13+
import com.eclipsesource.json.JsonObject;
14+
15+
import ts.TypeScriptException;
16+
import ts.client.CommandNames;
17+
18+
/**
19+
* Request to recompile the file. All generated outputs (.js, .d.ts or .js.map
20+
* files) is written on disk.
21+
*/
22+
public class CompileOnSaveEmitFileRequest extends FileRequest {
23+
24+
public CompileOnSaveEmitFileRequest(String fileName, Boolean forced) {
25+
super(CommandNames.compileOnSaveEmitFile, new CompileOnSaveEmitFileRequestArgs(fileName, forced), null);
26+
}
27+
28+
@Override
29+
public void collect(JsonObject response) throws TypeScriptException {
30+
31+
}
32+
33+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package ts.internal.client.protocol;
2+
3+
/**
4+
* Arguments for CompileOnSaveEmitFileRequest
5+
*/
6+
public class CompileOnSaveEmitFileRequestArgs extends FileRequestArgs {
7+
8+
/**
9+
*
10+
* @param file
11+
* @param forced
12+
* if true - then file should be recompiled even if it does not
13+
* have any changes.
14+
*/
15+
public CompileOnSaveEmitFileRequestArgs(String file, Boolean forced) {
16+
super(file);
17+
if (forced != null) {
18+
super.add("forced", forced);
19+
}
20+
}
21+
22+
}

eclipse/ts.eclipse.ide.core/src/ts/eclipse/ide/core/builder/TypeScriptBuilder.java

Lines changed: 71 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
import org.eclipse.core.runtime.IProgressMonitor;
1717

1818
import ts.TypeScriptException;
19+
import ts.client.CommandNames;
1920
import ts.eclipse.ide.core.resources.IIDETypeScriptProject;
20-
import ts.eclipse.ide.core.resources.buildpath.ITypeScriptBuildPath;
2121
import ts.eclipse.ide.core.resources.buildpath.ITsconfigBuildPath;
22+
import ts.eclipse.ide.core.resources.buildpath.ITypeScriptBuildPath;
2223
import ts.eclipse.ide.core.resources.jsconfig.IDETsconfigJson;
2324
import ts.eclipse.ide.core.utils.TypeScriptResourceUtil;
25+
import ts.eclipse.ide.core.utils.WorkbenchResourceUtil;
2426
import ts.eclipse.ide.internal.core.Trace;
2527

2628
/**
@@ -128,6 +130,74 @@ private void addTsFile(final ITypeScriptBuildPath buildPath,
128130
});
129131

130132
// Compile ts files *.ts
133+
if (tsProject.canSupport(CommandNames.compileOnSaveEmitFile)) {
134+
// TypeScript >=2.0.5: compile is done with tsserver
135+
compileWithTsserver(tsProject, tsFilesToCompile);
136+
} else {
137+
// TypeScript < 2.0.5: compile is done with tsc which is not very
138+
// performant.
139+
compileWithTsc(tsProject, tsFilesToCompile);
140+
}
141+
142+
// Delete emitted files *.js, *.js.map
143+
for (Entry<ITsconfigBuildPath, List<IFile>> entries : tsFilesToDelete.entrySet()) {
144+
ITsconfigBuildPath tsContainer = entries.getKey();
145+
List<IFile> tsFiles = entries.getValue();
146+
IDETsconfigJson tsconfig = tsContainer.getTsconfig();
147+
for (IFile tsFile : tsFiles) {
148+
TypeScriptResourceUtil.deleteEmittedFiles(tsFile, tsconfig);
149+
}
150+
151+
}
152+
}
153+
154+
/**
155+
* Compile the given ts files with tsserver by consumming
156+
* "compileOnSaveEmitFile" command.
157+
*
158+
* @param tsProject
159+
* @param tsFilesToCompile
160+
* @throws CoreException
161+
*/
162+
private void compileWithTsserver(IIDETypeScriptProject tsProject,
163+
final Map<ITsconfigBuildPath, List<IFile>> tsFilesToCompile) {
164+
for (Entry<ITsconfigBuildPath, List<IFile>> entries : tsFilesToCompile.entrySet()) {
165+
try {
166+
ITsconfigBuildPath tsContainer = entries.getKey();
167+
List<IFile> tsFiles = entries.getValue();
168+
IDETsconfigJson tsconfig = tsContainer.getTsconfig();
169+
if (tsconfig.isCompileOnSave()) {
170+
// tsconfig.json defines compileOnSave
171+
// loop for each ts files to compile
172+
for (IFile tsFile : tsFiles) {
173+
try {
174+
// compile the current ts file with
175+
// "compileOnSaveEmitFile"
176+
tsProject.getClient().compileOnSaveEmitFile(WorkbenchResourceUtil.getFileName(tsFile),
177+
null);
178+
// TODO: Refresh UI
179+
TypeScriptResourceUtil.refreshAndCollectEmittedFiles(tsFile, tsconfig, true, null);
180+
//tsconfig.getTsconfigFile().getParent().refreshLocal(IResource.DEPTH_INFINITE, null);
181+
} catch (TypeScriptException e) {
182+
Trace.trace(Trace.SEVERE, "Error while tsserver compilation", e);
183+
}
184+
}
185+
}
186+
} catch (Exception e) {
187+
Trace.trace(Trace.SEVERE, "Error while tsserver compilation", e);
188+
}
189+
}
190+
}
191+
192+
/**
193+
* Compile the given ts files with tsc.
194+
*
195+
* @param tsProject
196+
* @param tsFilesToCompile
197+
* @throws CoreException
198+
*/
199+
private void compileWithTsc(IIDETypeScriptProject tsProject,
200+
final Map<ITsconfigBuildPath, List<IFile>> tsFilesToCompile) throws CoreException {
131201
for (Entry<ITsconfigBuildPath, List<IFile>> entries : tsFilesToCompile.entrySet()) {
132202
ITsconfigBuildPath tsContainer = entries.getKey();
133203
List<IFile> tsFiles = entries.getValue();
@@ -141,16 +211,5 @@ private void addTsFile(final ITypeScriptBuildPath buildPath,
141211
Trace.trace(Trace.SEVERE, "Error while tsc compilation", e);
142212
}
143213
}
144-
// Delete emitted files *.js, *.js.map
145-
for (Entry<ITsconfigBuildPath, List<IFile>> entries : tsFilesToDelete.entrySet()) {
146-
ITsconfigBuildPath tsContainer = entries.getKey();
147-
List<IFile> tsFiles = entries.getValue();
148-
IDETsconfigJson tsconfig = tsContainer.getTsconfig();
149-
for (IFile tsFile : tsFiles) {
150-
TypeScriptResourceUtil.deleteEmittedFiles(tsFile, tsconfig);
151-
}
152-
153-
}
154214
}
155-
156215
}

0 commit comments

Comments
 (0)