-
Notifications
You must be signed in to change notification settings - Fork 3
/
server.ts
124 lines (102 loc) · 4.44 KB
/
server.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/env node
"use strict";
import * as ts from "typescript/lib/tsserverlibrary";
import {
createConnection, IConnection, StreamMessageReader, StreamMessageWriter,
} from "vscode-languageserver";
import { LSPLogger } from "./logger";
import { createSession, LSPSessionOptions } from "./session";
declare module "typescript/lib/tsserverlibrary" {
function resolveJavaScriptModule(moduleName: string, initialDir: string, sys: ModuleResolutionHost): string;
}
// Create a connection for the server. The connection uses stdin/stdout as a transport
const connection: IConnection = createConnection(new StreamMessageReader(process.stdin), new StreamMessageWriter(process.stdout));
connection.onDidChangeWatchedFiles((_change) => {
// Monitored files have change in VSCode
connection.console.log("We received an file change event");
});
const sys = ts.sys as ts.server.ServerHost;
sys.setTimeout = setTimeout;
sys.clearTimeout = clearTimeout;
sys.setImmediate = setImmediate;
sys.clearImmediate = clearImmediate;
if (typeof global !== "undefined" && global.gc) {
sys.gc = () => global.gc();
}
sys.require = (initialDir: string, moduleName: string): ts.server.RequireResult => {
try {
return { module: require(ts.resolveJavaScriptModule(moduleName, initialDir, sys)), error: undefined };
} catch (error) {
return { module: undefined, error };
}
};
const cancellationToken = ts.server.nullCancellationToken;
const localeStr = ts.server.findArgument("--locale");
if (localeStr) {
ts.validateLocaleAndSetLanguage(localeStr, sys);
}
// TODO: what is this?
// setStackTraceLimit();
// const typingSafeListLocation = ts.server.findArgument(ts.server.Arguments.TypingSafeListLocation);
// const typesMapLocation = ts.server.findArgument(ts.server.Arguments.TypesMapLocation)
// || combinePaths(sys.getExecutingFilePath(), "../typesMap.json");
// const npmLocation = ts.server.findArgument(ts.server.Arguments.NpmLocation);
function getLogLevel(level: string): ts.server.LogLevel {
if (level) {
const l = level.toLowerCase();
if (l === "terse") {
return ts.server.LogLevel.terse;
} else if (l === "requesttime") {
return ts.server.LogLevel.requestTime;
} else if (l === "verbose") {
return ts.server.LogLevel.verbose;
} else if (l === "normal") {
return ts.server.LogLevel.normal;
}
}
return ts.server.LogLevel.terse;
}
function parseStringArray(argName: string): ReadonlyArray<string> {
const arg = ts.server.findArgument(argName);
if (arg === undefined) {
return ts.server.emptyArray;
}
return arg.split(",").filter(name => name !== "");
}
const typingsInstaller = ts.server.nullTypingsInstaller;
const globalPlugins = parseStringArray("--globalPlugins");
const pluginProbeLocations = parseStringArray("--pluginProbeLocations");
const allowLocalPluginLoads = ts.server.hasArgument("--allowLocalPluginLoads");
const useSingleInferredProject = ts.server.hasArgument("--useSingleInferredProject");
const useInferredProjectPerProjectRoot = ts.server.hasArgument("--useInferredProjectPerProjectRoot");
// const logFileName = ts.server.findArgument("--logFile");
const logVerbosity = getLogLevel(ts.server.findArgument("--logVerbosity"));
// normally as -traceToConsole in TSS_LOG
const traceToConsoleValue = ts.server.findArgument("--traceToConsole");
const traceToConsole = traceToConsoleValue && traceToConsoleValue.toLowerCase() === "true";
const logger = new LSPLogger(connection, traceToConsole, logVerbosity);
// const disableAutomaticTypingAcquisition = ts.server.hasArgument("--disableAutomaticTypingAcquisition");
const options: LSPSessionOptions = {
host: sys,
cancellationToken,
// installerEventPort: eventPort,
// canUseEvents: eventPort === undefined,
useSingleInferredProject,
useInferredProjectPerProjectRoot,
typingsInstaller,
// disableAutomaticTypingAcquisition,
// globalTypingsCacheLocation: getGlobalTypingsCacheLocation(),
// typingSafeListLocation,
// typesMapLocation,
// npmLocation,
// telemetryEnabled,
logger,
globalPlugins,
pluginProbeLocations,
allowLocalPluginLoads
};
// diagnostics code from session.ts
createSession(connection, options);
// TODO: shutdown session on exit?
// Listen on the connection
connection.listen();