Skip to content

Commit 7361d68

Browse files
committed
Merge pull request #3542 from weswigham/jake-lssl
Add build target for packaging tsserver as a library
2 parents 75e6071 + 9cc97f1 commit 7361d68

File tree

6 files changed

+61
-34
lines changed

6 files changed

+61
-34
lines changed

Jakefile.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,14 @@ var serverSources = [
105105
return path.join(serverDirectory, f);
106106
});
107107

108+
var languageServiceLibrarySources = [
109+
"editorServices.ts",
110+
"protocol.d.ts",
111+
"session.ts"
112+
].map(function (f) {
113+
return path.join(serverDirectory, f);
114+
}).concat(servicesSources);
115+
108116
var harnessSources = [
109117
"harness.ts",
110118
"sourceMapRecorder.ts",
@@ -369,6 +377,20 @@ compileFile(servicesFile, servicesSources,[builtLocalDirectory, copyright].conca
369377
var serverFile = path.join(builtLocalDirectory, "tsserver.js");
370378
compileFile(serverFile, serverSources,[builtLocalDirectory, copyright].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true);
371379

380+
var lsslFile = path.join(builtLocalDirectory, "tslssl.js");
381+
compileFile(
382+
lsslFile,
383+
languageServiceLibrarySources,
384+
[builtLocalDirectory, copyright].concat(languageServiceLibrarySources),
385+
/*prefixes*/ [copyright],
386+
/*useBuiltCompiler*/ true,
387+
/*noOutFile*/ false,
388+
/*generateDeclarations*/ true);
389+
390+
// Local target to build the language service server library
391+
desc("Builds language service server library");
392+
task("lssl", [lsslFile]);
393+
372394
// Local target to build the compiler and services
373395
desc("Builds the full compiler and services");
374396
task("local", ["generate-diagnostics", "lib", tscFile, servicesFile, nodeDefinitionsFile, serverFile]);

src/harness/harnessLanguageService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ module Harness.LanguageService {
583583
// This host is just a proxy for the clientHost, it uses the client
584584
// host to answer server queries about files on disk
585585
var serverHost = new SessionServerHost(clientHost);
586-
var server = new ts.server.Session(serverHost, serverHost);
586+
var server = new ts.server.Session(serverHost, Buffer.byteLength, process.hrtime, serverHost);
587587

588588
// Fake the connection between the client and the server
589589
serverHost.writeMessage = client.onMessage.bind(client);

src/server/editorServices.ts

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
/// <reference path="..\services\services.ts" />
33
/// <reference path="protocol.d.ts" />
44
/// <reference path="session.ts" />
5-
/// <reference path="node.d.ts" />
65

76
namespace ts.server {
87
export interface Logger {
@@ -28,15 +27,15 @@ namespace ts.server {
2827
});
2928
}
3029

31-
class ScriptInfo {
30+
export class ScriptInfo {
3231
svc: ScriptVersionCache;
3332
children: ScriptInfo[] = []; // files referenced by this file
3433
defaultProject: Project; // project to use by default for file
3534
fileWatcher: FileWatcher;
3635
formatCodeOptions = ts.clone(CompilerService.defaultFormatCodeOptions);
3736

3837
constructor(private host: ServerHost, public fileName: string, public content: string, public isOpen = false) {
39-
this.svc = ScriptVersionCache.fromString(content);
38+
this.svc = ScriptVersionCache.fromString(host, content);
4039
}
4140

4241
setFormatOptions(formatOptions: protocol.FormatOptions): void {
@@ -80,7 +79,7 @@ namespace ts.server {
8079
}
8180
}
8281

83-
class LSHost implements ts.LanguageServiceHost {
82+
export class LSHost implements ts.LanguageServiceHost {
8483
ls: ts.LanguageService = null;
8584
compilationSettings: ts.CompilerOptions;
8685
filenameToScript: ts.Map<ScriptInfo> = {};
@@ -273,7 +272,7 @@ namespace ts.server {
273272
}
274273
}
275274

276-
interface ProjectOptions {
275+
export interface ProjectOptions {
277276
// these fields can be present in the project file
278277
files?: string[];
279278
compilerOptions?: ts.CompilerOptions;
@@ -376,7 +375,7 @@ namespace ts.server {
376375
}
377376
}
378377

379-
interface ProjectOpenResult {
378+
export interface ProjectOpenResult {
380379
success?: boolean;
381380
errorMsg?: string;
382381
project?: Project;
@@ -392,11 +391,11 @@ namespace ts.server {
392391
return copiedList;
393392
}
394393

395-
interface ProjectServiceEventHandler {
394+
export interface ProjectServiceEventHandler {
396395
(eventName: string, project: Project, fileName: string): void;
397396
}
398397

399-
interface HostConfiguration {
398+
export interface HostConfiguration {
400399
formatCodeOptions: ts.FormatCodeOptions;
401400
hostInfo: string;
402401
}
@@ -916,7 +915,7 @@ namespace ts.server {
916915
return rawConfig.error;
917916
}
918917
else {
919-
var parsedCommandLine = ts.parseConfigFile(rawConfig.config, ts.sys, dirPath);
918+
var parsedCommandLine = ts.parseConfigFile(rawConfig.config, this.host, dirPath);
920919
if (parsedCommandLine.errors && (parsedCommandLine.errors.length > 0)) {
921920
return { errorMsg: "tsconfig option errors" };
922921
}
@@ -953,7 +952,7 @@ namespace ts.server {
953952

954953
}
955954

956-
class CompilerService {
955+
export class CompilerService {
957956
host: LSHost;
958957
languageService: ts.LanguageService;
959958
classifier: ts.Classifier;
@@ -985,7 +984,7 @@ namespace ts.server {
985984
static defaultFormatCodeOptions: ts.FormatCodeOptions = {
986985
IndentSize: 4,
987986
TabSize: 4,
988-
NewLineCharacter: ts.sys.newLine,
987+
NewLineCharacter: ts.sys ? ts.sys.newLine : '\n',
989988
ConvertTabsToSpaces: true,
990989
InsertSpaceAfterCommaDelimiter: true,
991990
InsertSpaceAfterSemicolonInForStatements: true,
@@ -999,7 +998,7 @@ namespace ts.server {
999998

1000999
}
10011000

1002-
interface LineCollection {
1001+
export interface LineCollection {
10031002
charCount(): number;
10041003
lineCount(): number;
10051004
isLeaf(): boolean;
@@ -1013,7 +1012,7 @@ namespace ts.server {
10131012
leaf?: LineLeaf;
10141013
}
10151014

1016-
enum CharRangeSection {
1015+
export enum CharRangeSection {
10171016
PreStart,
10181017
Start,
10191018
Entire,
@@ -1022,7 +1021,7 @@ namespace ts.server {
10221021
PostEnd
10231022
}
10241023

1025-
interface ILineIndexWalker {
1024+
export interface ILineIndexWalker {
10261025
goSubtree: boolean;
10271026
done: boolean;
10281027
leaf(relativeStart: number, relativeLength: number, lineCollection: LineLeaf): void;
@@ -1248,7 +1247,7 @@ namespace ts.server {
12481247
}
12491248

12501249
// text change information
1251-
class TextChange {
1250+
export class TextChange {
12521251
constructor(public pos: number, public deleteLen: number, public insertedText?: string) {
12531252
}
12541253

@@ -1263,6 +1262,7 @@ namespace ts.server {
12631262
versions: LineIndexSnapshot[] = [];
12641263
minVersion = 0; // no versions earlier than min version will maintain change history
12651264
private currentVersion = 0;
1265+
private host: ServerHost;
12661266

12671267
static changeNumberThreshold = 8;
12681268
static changeLengthThreshold = 256;
@@ -1290,7 +1290,7 @@ namespace ts.server {
12901290
}
12911291

12921292
reloadFromFile(filename: string, cb?: () => any) {
1293-
var content = ts.sys.readFile(filename);
1293+
var content = this.host.readFile(filename);
12941294
this.reload(content);
12951295
if (cb)
12961296
cb();
@@ -1360,18 +1360,19 @@ namespace ts.server {
13601360
}
13611361
}
13621362

1363-
static fromString(script: string) {
1363+
static fromString(host: ServerHost, script: string) {
13641364
var svc = new ScriptVersionCache();
13651365
var snap = new LineIndexSnapshot(0, svc);
13661366
svc.versions[svc.currentVersion] = snap;
1367+
svc.host = host;
13671368
snap.index = new LineIndex();
13681369
var lm = LineIndex.linesFromText(script);
13691370
snap.index.load(lm.lines);
13701371
return svc;
13711372
}
13721373
}
13731374

1374-
class LineIndexSnapshot implements ts.IScriptSnapshot {
1375+
export class LineIndexSnapshot implements ts.IScriptSnapshot {
13751376
index: LineIndex;
13761377
changesSincePreviousVersion: TextChange[] = [];
13771378

@@ -1605,7 +1606,7 @@ namespace ts.server {
16051606
}
16061607
}
16071608

1608-
class LineNode implements LineCollection {
1609+
export class LineNode implements LineCollection {
16091610
totalChars = 0;
16101611
totalLines = 0;
16111612
children: LineCollection[] = [];
@@ -1891,7 +1892,7 @@ namespace ts.server {
18911892
}
18921893
}
18931894

1894-
class LineLeaf implements LineCollection {
1895+
export class LineLeaf implements LineCollection {
18951896
udata: any;
18961897

18971898
constructor(public text: string) {

src/server/server.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace ts.server {
1111
input: process.stdin,
1212
output: process.stdout,
1313
terminal: false,
14-
});
14+
});
1515

1616
class Logger implements ts.server.Logger {
1717
fd = -1;
@@ -170,11 +170,11 @@ namespace ts.server {
170170
removeFile(file: WatchedFile) {
171171
this.watchedFiles = WatchedFileSet.copyListRemovingItem(file, this.watchedFiles);
172172
}
173-
}
173+
}
174174

175175
class IOSession extends Session {
176176
constructor(host: ServerHost, logger: ts.server.Logger) {
177-
super(host, logger);
177+
super(host, Buffer.byteLength, process.hrtime, logger);
178178
}
179179

180180
exit() {

src/server/session.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
/// <reference path="..\compiler\commandLineParser.ts" />
22
/// <reference path="..\services\services.ts" />
3-
/// <reference path="node.d.ts" />
43
/// <reference path="protocol.d.ts" />
54
/// <reference path="editorServices.ts" />
65

@@ -61,7 +60,7 @@ namespace ts.server {
6160
};
6261
}
6362

64-
interface PendingErrorCheck {
63+
export interface PendingErrorCheck {
6564
fileName: string;
6665
project: Project;
6766
}
@@ -114,11 +113,16 @@ namespace ts.server {
114113
pendingOperation = false;
115114
fileHash: ts.Map<number> = {};
116115
nextFileId = 1;
117-
errorTimer: NodeJS.Timer;
116+
errorTimer: any; /*NodeJS.Timer | number*/
118117
immediateId: any;
119118
changeSeq = 0;
120119

121-
constructor(private host: ServerHost, private logger: Logger) {
120+
constructor(
121+
private host: ServerHost,
122+
private byteLength: (buf: string, encoding?: string) => number,
123+
private hrtime: (start?: number[]) => number[],
124+
private logger: Logger
125+
) {
122126
this.projectService =
123127
new ProjectService(host, logger, (eventName,project,fileName) => {
124128
this.handleEvent(eventName, project, fileName);
@@ -149,17 +153,17 @@ namespace ts.server {
149153
this.host.write(line + this.host.newLine);
150154
}
151155

152-
send(msg: NodeJS._debugger.Message) {
156+
send(msg: protocol.Message) {
153157
var json = JSON.stringify(msg);
154158
if (this.logger.isVerbose()) {
155159
this.logger.info(msg.type + ": " + json);
156160
}
157-
this.sendLineToClient('Content-Length: ' + (1 + Buffer.byteLength(json, 'utf8')) +
161+
this.sendLineToClient('Content-Length: ' + (1 + this.byteLength(json, 'utf8')) +
158162
'\r\n\r\n' + json);
159163
}
160164

161165
event(info: any, eventName: string) {
162-
var ev: NodeJS._debugger.Event = {
166+
var ev: protocol.Event = {
163167
seq: 0,
164168
type: "event",
165169
event: eventName,
@@ -838,7 +842,7 @@ namespace ts.server {
838842
onMessage(message: string) {
839843
if (this.logger.isVerbose()) {
840844
this.logger.info("request: " + message);
841-
var start = process.hrtime();
845+
var start = this.hrtime();
842846
}
843847
try {
844848
var request = <protocol.Request>JSON.parse(message);
@@ -980,7 +984,7 @@ namespace ts.server {
980984
}
981985

982986
if (this.logger.isVerbose()) {
983-
var elapsed = process.hrtime(start);
987+
var elapsed = this.hrtime(start);
984988
var seconds = elapsed[0]
985989
var nanoseconds = elapsed[1];
986990
var elapsedMs = ((1e9 * seconds) + nanoseconds)/1000000.0;

tests/cases/unittests/versionCache.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ and grew 1cm per day`;
231231
});
232232

233233
it("Edit ScriptVersionCache ", () => {
234-
let svc = server.ScriptVersionCache.fromString(testContent);
234+
let svc = server.ScriptVersionCache.fromString(ts.sys, testContent);
235235
let checkText = testContent;
236236

237237
for (let i = 0; i < iterationCount; i++) {

0 commit comments

Comments
 (0)