8000 Merge pull request #236 from lgrignon/master · angelozerr/typescript.java@9873f2c · GitHub
[go: up one dir, main page]

Skip to content

Commit 9873f2c

Browse files
authored
Merge pull request #236 from lgrignon/master
open external project & reload file without content & tss env vars
2 parents a97b599 + 252acf5 commit 9873f2c

10 files changed

+169
-7
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public enum CommandNames implements ISupportable {
3737
ProjectInfo("projectInfo"),
3838
Rename("rename"),
3939
NavTo("navto"),
40-
40+
4141
// 2.0.0
4242
SemanticDiagnosticsSync("semanticDiagnosticsSync", "2.0.0"),
4343
SyntacticDiagnosticsSync("syntacticDiagnosticsSync", "2.0.0"),
@@ -57,7 +57,9 @@ public enum CommandNames implements ISupportable {
5757

5858
// 2.4.0
5959
GetApplicableRefactors("getApplicableRefactors", "2.4.0"),
60-
GetEditsForRefactor("getEditsForRefactor", "2.4.0");
60+
GetEditsForRefactor("getEditsForRefactor", "2.4.0"),
61+
62+
OpenExternalProject("openExternalProject");
6163

6264
private final String name;
6365
private final String sinceVersion;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import ts.client.references.ReferencesResponseBody;
3535
import ts.client.rename.RenameResponseBody;
3636
import ts.client.signaturehelp.SignatureHelpItems;
37+
import ts.cmd.tsc.CompilerOptions;
38+
import ts.internal.client.protocol.OpenExternalProjectRequestArgs.ExternalFile;
3739

3840
/**
3941
* TypeScript client API which communicates with tsserver.
@@ -62,6 +64,9 @@ public interface ITypeScriptServiceClient {
6264
*/
6365
void openFile(String fileName, String content, ScriptKindName scriptKindName) throws TypeScriptException;
6466

67+
void openExternalProject(String projectFileName, List<ExternalFile> rootFiles,
68+
CompilerOptions options) throws TypeScriptException;
69+
6570
/**
6671
* Close the given file name.
6772
*

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

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.io.File;
1414
import java.io.IOException;
1515
import java.util.ArrayList;
16+
import java.util.HashMap;
1617
import java.util.LinkedHashMap;
1718
import java.util.List;
1819
import java.util.Map;
@@ -50,6 +51,7 @@
5051
import ts.client.references.ReferencesResponseBody;
5152
import ts.client.rename.RenameResponseBody;
5253
import ts.client.signaturehelp.SignatureHelpItems;
54+
import ts.cmd.tsc.CompilerOptions;
5355
import ts.internal.FileTempHelper;
5456
import ts.internal.SequenceHelper;
5557
import ts.internal.client.protocol.ChangeRequest;
@@ -76,6 +78,7 @@
7678
import ts.internal.client.protocol.NavToRequest;
7779
import ts.internal.client.protocol.NavTreeRequest;
7880
import ts.internal.client.protocol.OccurrencesRequest;
81+
import ts.internal.client.protocol.OpenExternalProjectRequest;
7982
import ts.internal.client.protocol.OpenRequest;
8083
import ts.internal.client.protocol.ProjectInfoRequest;
8184
import ts.internal.client.protocol.QuickInfoRequest;
@@ -87,6 +90,7 @@
8790
import ts.internal.client.protocol.SemanticDiagnosticsSyncRequest;
8891
import ts.internal.client.protocol.SignatureHelpRequest;
8992
import ts.internal.client.protocol.SyntacticDiagnosticsSyncRequest;
93+
import ts.internal.client.protocol.OpenExternalProjectRequestArgs.ExternalFile;
9094
import ts.nodejs.INodejsLaunchConfiguration;
9195
import ts.nodejs.INodejsProcess;
9296
import ts.nodejs.INodejsProcessListener;
@@ -164,12 +168,12 @@ private static class PendingRequestEventInfo {
164168
}
165169

166170
public TypeScriptServiceClient(final File projectDir, File tsserverFile, File nodeFile) throws TypeScriptException {
167-
this(projectDir, tsserverFile, nodeFile, false, false, null, null);
171+
this(projectDir, tsserverFile, nodeFile, false, false, null, null, null);
168172
}
169173

170174
public TypeScriptServiceClient(final File projectDir, File typescriptDir, File nodeFile, boolean enableTelemetry,
171-
boolean disableAutomaticTypingAcquisition, String cancellationPipeName, File tsserverPluginsFile)
172-
throws TypeScriptException {
175+
boolean disableAutomaticTypingAcquisition, String cancellationPipeName, File tsserverPluginsFile,
176+
TypeScriptServiceLogConfiguration logConfiguration) throws TypeScriptException {
173177
this(NodejsProcessManager.getInstance().create(projectDir,
174178
tsserverPluginsFile != null ? tsserverPluginsFile
175179
: TypeScriptRepositoryManager.getTsserverFile(typescriptDir),
@@ -197,6 +201,16 @@ public List<String> createNodeArgs() {
197201
// args.add("--useSingleInferredProject");
198202
return args;
199203
}
204+
205+
@Override
206+
public Map<String, String> createNodeEnvironmentVariables() {
207+
Map<String, String> environmentVariables = new HashMap<>();
208+
if (logConfiguration != null) {
209+
environmentVariables.put("TSS_LOG",
210+
"-level " + logConfiguration.level.name() + " -file " + logConfiguration.file);
211+
}
212+
return environmentVariables;
213+
}
200214
}, TSSERVER_FILE_TYPE), cancellationPipeName);
201215
}
202216

@@ -213,6 +227,20 @@ public TypeScriptServiceClient(INodejsProcess process, String cancellationPipeNa
213227
this.cancellationPipeName = cancellationPipeName;
214228
}
215229

230+
public static enum TypeScriptServiceLogLevel {
231+
verbose, normal, terse, requestTime
232+
}
233+
234+
public static class TypeScriptServiceLogConfiguration {
235+
String file;
236+
TypeScriptServiceLogLevel level;
237+
238+
public TypeScriptServiceLogConfiguration(String file, TypeScriptServiceLogLevel level) {
239+
this.file = file;
240+
this.level = level;
241+
}
242+
}
243+
216244
private void dispatchMessage(String message) {
217245
JsonObject json = GsonHelper.parse(message).getAsJsonObject();
218246
JsonElement typeElement = json.get("type");
@@ -293,6 +321,12 @@ public void openFile(String fileName, String content, ScriptKindName scriptKindN
293321
execute(new OpenRequest(fileName, null, content, scriptKindName), false);
294322
}
295323

324+
@Override
325+
public void openExternalProject(String projectFileName, List<ExternalFile> rootFiles, CompilerOptions options)
326+ 10BC0
throws TypeScriptException {
327+
execute(new OpenExternalProjectRequest(projectFileName, rootFiles, options), false);
328+
}
329+
296330
@Override
297331
public void closeFile(String fileName) throws TypeScriptException {
298332
execute(new CloseRequest(fileName), false);
@@ -314,7 +348,10 @@ public void changeFile(String fileName, int line, int offset, int endLine, int e
314348
@Override
315349
public void updateFile(String fileName, String newText) throws TypeScriptException {
316350
int seq = SequenceHelper.getRequestSeq();
317-
String tempFileName = FileTempHelper.updateTempFile(newText, seq);
351+
String tempFileName = null;
352+
if (newText != null) {
353+
tempFileName = FileTempHelper.updateTempFile(newText, seq);
354+
}
318355
try {
319356
execute(new ReloadRequest(fileName, tempFileName, seq), true).get(5000, TimeUnit.MILLISECONDS);
320357
} catch (Exception e) {

core/ts.core/src/ts/cmd/AbstractCmd.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.File;
44
import java.util.ArrayList;
55
import java.util.List;
6+
import java.util.Map;
67

78
import ts.TypeScriptException;
89
import ts.nodejs.INodejsLaunchConfiguration;
@@ -40,6 +41,11 @@ public List<String> createNodeArgs() {
4041
fillOptions(options, filenames, args);
4142
return args;
4243
}
44+
45+
@Override
46+
public Map<String, String> createNodeEnvironmentVariables() {
47+
return null;
48+
}
4349
}, binFileType);
4450

4551
if (listener != null) {
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package ts.internal.client.protocol;
2+
3+
import java.util.List;
4+
5+
import com.google.gson.JsonObject;
6+
7+
import ts.client.CommandNames;
8+
import ts.cmd.tsc.CompilerOptions;
9+
import ts.internal.client.protocol.OpenExternalProjectRequestArgs.ExternalFile;
10+
11+
/**
12+
* Request to open or update external project.
13+
*
14+
* @see https://github.com/Microsoft/TypeScript/blob/master/src/server/protocol.ts
15+
*
16+
*/
17+
public class OpenExternalProjectRequest extends Request<OpenExternalProjectRequestArgs> {
18+
19+
public OpenExternalProjectRequest(String projectFileName, List<ExternalFile> rootFiles, CompilerOptions options) {
20+
super(CommandNames.OpenExternalProject.getName(),
21+
new OpenExternalProjectRequestArgs(projectFileName, rootFiles, options));
22+
}
23+
24+
@Override
25+
public Response<?> parseResponse(JsonObject json) {
26+
// This request doesn't return response.
27+
return null;
28+
}
29+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package ts.internal.client.protocol;
2+
3+
import java.util.List;
4+
5+
import ts.client.ScriptKindName;
6+
import ts.cmd.tsc.CompilerOptions;
7+
8+
/**
9+
* @see https://github.com/Microsoft/TypeScript/blob/master/src/server/protocol.ts
10+
*/
11+
public class OpenExternalProjectRequestArgs {
12+
13+
public static class ExternalFile {
14+
/**
15+
* Name of file file
16+
*/
17+
String fileName;
18+
/**
19+
* Script kind of the file
20+
*/
21+
ScriptKindName scriptKind;
22+
/**
23+
* Whether file has mixed content (i.e. .cshtml file that combines html markup
24+
* with C#/JavaScript)
25+
*/
26+
Boolean hasMixedContent;
27+
/**
28+
* Content of the file
29+
*/
30+
String content;
31+
32+
public ExternalFile(String fileName, ScriptKindName scriptKind, Boolean hasMixedContent, String content) {
33+
this.fileName = fileName;
34+
this.scriptKind = scriptKind;
35+
this.hasMixedContent = hasMixedContent;
36+
this.content = content;
37+
}
38+
39+
}
40+
41+
/**
42+
* Project name
43+
*/
44+
String projectFileName;
45+
/**
46+
* List of root files in project
47+
*/
48+
List<ExternalFile> rootFiles;
49+
/**
50+
* Compiler options for the project
51+
*/
52+
CompilerOptions options;
53+
// /**
54+
// * Explicitly specified type acquisition for the project
55+
// */
56+
// typeAcquisition?: TypeAcquisition;
57+
public OpenExternalProjectRequestArgs(String projectFileName, List<ExternalFile> rootFiles,
58+
CompilerOptions options) {
59+
this.projectFileName = projectFileName;
60+
this.rootFiles = rootFiles;
61+
this.options = options;
62+
}
63+
}

core/ts.core/src/ts/nodejs/AbstractNodejsProcess.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.io.File;
1414
import java.util.ArrayList;
1515
import java.util.List;
16+
import java.util.Map;
1617

1718
import ts.TypeScriptException;
1819
import ts.utils.FileUtils;
@@ -89,6 +90,13 @@ protected List<String> createNodeArgs() {
8990
}
9091
return launchConfiguration.createNodeArgs();
9192
}
93+
94+
protected Map<String, String> createNodeEnvironmentVariables() {
95+
if (launchConfiguration == null) {
96+
return null;
97+
}
98+
return launchConfiguration.createNodeEnvironmentVariables();
99+
}
92100

93101
/**
94102
* return the project dir where tsconfig.json is hosted.

core/ts.core/src/ts/nodejs/INodejsLaunchConfiguration.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ts.nodejs;
22

33
import java.util.List;
4+
import java.util.Map;
45

56
public interface INodejsLaunchConfiguration {
67

@@ -10,4 +11,6 @@ public interface INodejsLaunchConfiguration {
1011
* @return a list of arguments for the node command.
1112
*/
1213
List<String> createNodeArgs();
14+
15+
Map<String, String> createNodeEnvironmentVariables();
1316
}

core/ts.core/src/ts/nodejs/NodejsProcess.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.nio.charset.StandardCharsets;
2020
import java.util.LinkedList;
2121
import java.util.List;
22+
import java.util.Map;
2223

2324
import ts.TypeScriptException;
2425
import ts.utils.FileUtils;
@@ -136,6 +137,14 @@ public void start() {
136137
try {
137138
List<String> commands = createCommands();
138139
ProcessBuilder builder = new ProcessBuilder(commands);
140+
141+
Map<String, String> environmentVariables = this.createNodeEnvironmentVariables();
142+
if (environmentVariables != null) {
143+
for (Map.Entry<String, String> environmentVariableEntry : environmentVariables.entrySet()) {
144+
builder.environment().put(environmentVariableEntry.getKey(), environmentVariableEntry.getValue());
145+
}
146+
}
147+
139148
builder.directory(getProjectDir());
140149

141150
this.process = builder.start();

core/ts.core/src/ts/resources/TypeScriptProject.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ protected ITypeScriptServiceClient createServiceClient(File projectDir) throws T
187187
File typescriptDir = getProjectSettings().getTypesScriptDir();
188188
TypeScriptServiceClient client = new TypeScriptServiceClient(getProjectDir(), typescriptDir, nodeFile,
189189
getProjectSettings().isEnableTelemetry(), getProjectSettings().isDisableAutomaticTypingAcquisition(),
190-
getCancellationPipeName(), getProjectSettings().getTsserverPluginsFile());
190+
getCancellationPipeName(), getProjectSettings().getTsserverPluginsFile(), null);
191191
client.setCompletionEntryMatcherProvider(this);
192192
return client;
193193
}

0 commit comments

Comments
 (0)
0