1
1
/// <reference path="session.ts" />
2
-
2
+
3
3
namespace ts . server {
4
4
5
5
export interface SessionClientHost extends LanguageServiceHost {
@@ -25,23 +25,23 @@ namespace ts.server {
25
25
private lineMaps : ts . Map < number [ ] > = { } ;
26
26
private messages : string [ ] = [ ] ;
27
27
private lastRenameEntry : RenameEntry ;
28
-
28
+
29
29
constructor ( private host : SessionClientHost ) {
30
30
}
31
31
32
- public onMessage ( message : string ) : void {
32
+ public onMessage ( message : string ) : void {
33
33
this . messages . push ( message ) ;
34
34
}
35
35
36
- private writeMessage ( message : string ) : void {
36
+ private writeMessage ( message : string ) : void {
37
37
this . host . writeMessage ( message ) ;
38
38
}
39
39
40
- private getLineMap ( fileName : string ) : number [ ] {
40
+ private getLineMap ( fileName : string ) : number [ ] {
41
41
var lineMap = ts . lookUp ( this . lineMaps , fileName ) ;
42
42
if ( ! lineMap ) {
43
43
var scriptSnapshot = this . host . getScriptSnapshot ( fileName ) ;
44
- lineMap = this . lineMaps [ fileName ] = ts . computeLineStarts ( scriptSnapshot . getText ( 0 , scriptSnapshot . getLength ( ) ) ) ;
44
+ lineMap = this . lineMaps [ fileName ] = ts . computeLineStarts ( scriptSnapshot . getText ( 0 , scriptSnapshot . getLength ( ) ) ) ;
45
45
}
46
46
return lineMap ;
47
47
}
@@ -82,34 +82,29 @@ namespace ts.server {
82
82
}
83
83
84
84
private processResponse < T extends protocol . Response > ( request : protocol . Request ) : T {
85
- var lastMessage = this . messages . shift ( ) ;
86
- Debug . assert ( ! ! lastMessage , "Did not receive any responses." ) ;
87
-
88
- // Read the content length
89
- var contentLengthPrefix = "Content-Length: " ;
90
- var lines = lastMessage . split ( "\r\n" ) ;
91
- Debug . assert ( lines . length >= 2 , "Malformed response: Expected 3 lines in the response." ) ;
92
-
93
- var contentLengthText = lines [ 0 ] ;
94
- Debug . assert ( contentLengthText . indexOf ( contentLengthPrefix ) === 0 , "Malformed response: Response text did not contain content-length header." ) ;
95
- var contentLength = parseInt ( contentLengthText . substring ( contentLengthPrefix . length ) ) ;
96
-
97
- // Read the body
98
- var responseBody = lines [ 2 ] ;
99
-
100
- // Verify content length
101
- Debug . assert ( responseBody . length + 1 === contentLength , "Malformed response: Content length did not match the response's body length." ) ;
102
-
103
- try {
104
- var response : T = JSON . parse ( responseBody ) ;
105
- }
106
- catch ( e ) {
107
- throw new Error ( "Malformed response: Failed to parse server response: " + lastMessage + ". \r\n Error details: " + e . message ) ;
85
+ let foundResponseMessage = false ;
86
+ let lastMessage : string ;
87
+ let response : T ;
88
+ while ( ! foundResponseMessage ) {
89
+ lastMessage = this . messages . shift ( ) ;
90
+ Debug . assert ( ! ! lastMessage , "Did not receive any responses." ) ;
91
+ const responseBody = processMessage ( lastMessage ) ;
92
+ try {
93
+ response = JSON . parse ( responseBody ) ;
94
+ // the server may emit events before emitting the response. We
95
+ // want to ignore these events for testing purpose.
96
+ if ( response . type === "response" ) {
97
+ foundResponseMessage = true ;
98
+ }
99
+ }
100
+ catch ( e ) {
101
+ throw new Error ( "Malformed response: Failed to parse server response: " + lastMessage + ". \r\n Error details: " + e . message ) ;
102
+ }
108
103
}
109
104
110
105
// verify the sequence numbers
111
106
Debug . assert ( response . request_seq === request . seq , "Malformed response: response sequence number did not match request sequence number." ) ;
112
-
107
+
113
108
// unmarshal errors
114
109
if ( ! response . success ) {
115
110
throw new Error ( "Error " + response . message ) ;
@@ -118,9 +113,27 @@ namespace ts.server {
118
113
Debug . assert ( ! ! response . body , "Malformed response: Unexpected empty response body." ) ;
119
114
120
115
return response ;
116
+
117
+ function processMessage ( message : string ) {
118
+ // Read the content length
119
+ const contentLengthPrefix = "Content-Length: " ;
120
+ const lines = message . split ( "\r\n" ) ;
121
+ Debug . assert ( lines . length >= 2 , "Malformed response: Expected 3 lines in the response." ) ;
122
+
123
+ const contentLengthText = lines [ 0 ] ;
124
+ Debug . assert ( contentLengthText . indexOf ( contentLengthPrefix ) === 0 , "Malformed response: Response text did not contain content-length header." ) ;
125
+ const contentLength = parseInt ( contentLengthText . substring ( contentLengthPrefix . length ) ) ;
126
+
127
+ // Read the body
128
+ const responseBody = lines [ 2 ] ;
129
+
130
+ // Verify content length
131
+ Debug . assert ( responseBody . length + 1 === contentLength , "Malformed response: Content length did not match the response's body length." ) ;
132
+ return responseBody ;
133
+ }
121
134
}
122
135
123
- openFile ( fileName : string , content ?: string , scriptKindName ?: "TS" | "JS" | "TSX" | "JSX" ) : void {
136
+ openFile ( fileName : string , content ?: string , scriptKindName ?: "TS" | "JS" | "TSX" | "JSX" ) : void {
124
137
var args : protocol . OpenRequestArgs = { file : fileName , fileContent : content , scriptKindName } ;
125
138
this . processRequest ( CommandNames . Open , args ) ;
126
139
}
@@ -186,7 +199,7 @@ namespace ts.server {
186
199
fileNames : response . body . fileNames
187
200
} ;
188
201
}
189
-
202
+
190
203
getCompletionsAtPosition ( fileName : string , position : number ) : CompletionInfo {
191
204
var lineOffset = this . positionToOneBasedLineOffset ( fileName , position ) ;
192
205
var args : protocol . CompletionsRequestArgs = {
@@ -199,13 +212,13 @@ namespace ts.server {
199
212
var request = this . processRequest < protocol . CompletionsRequest > ( CommandNames . Completions , args ) ;
200
213
var response = this . processResponse < protocol . CompletionsResponse > ( request ) ;
201
214
202
- return {
215
+ return {
203
216
isMemberCompletion : false ,
204
217
isNewIdentifierLocation : false ,
205
218
entries : response . body
206
219
} ;
207
220
}
208
-
221
+
209
222
getCompletionEntryDetails ( fileName : string , position : number , entryName : string ) : CompletionEntryDetails {
210
223
var lineOffset = this . positionToOneBasedLineOffset ( fileName , position ) ;
211
224
var args : protocol . CompletionDetailsRequestArgs = {
@@ -234,7 +247,7 @@ namespace ts.server {
234
247
var fileName = entry . file ;
235
248
var start = this . lineOffsetToPosition ( fileName , entry . start ) ;
236
249
var end = this . lineOffsetToPosition ( fileName , entry . end ) ;
237
-
250
+
238
251
return {
239
252
name : entry . name ,
240
253
containerName : entry . containerName || "" ,
@@ -264,7 +277,7 @@ namespace ts.server {
264
277
var request = this . processRequest < protocol . FormatRequest > ( CommandNames . Format , args ) ;
265
278
var response = this . processResponse < protocol . FormatResponse > ( request ) ;
266
279
267
- return response . body . map ( entry => this . convertCodeEditsToTextChange ( fileName , entry ) ) ;
280
+ return response . body . map ( entry => this . convertCodeEditsToTextChange ( fileName , entry ) ) ;
268
281
}
269
282
270
283
getFormattingEditsForDocument ( fileName : string , options : ts . FormatCodeOptions ) : ts . TextChange [ ] {
@@ -284,7 +297,7 @@ namespace ts.server {
284
297
var request = this . processRequest < protocol . FormatOnKeyRequest > ( CommandNames . Formatonkey , args ) ;
285
298
var response = this . processResponse < protocol . FormatResponse > ( request ) ;
286
299
287
- return response . body . map ( entry => this . convertCodeEditsToTextChange ( fileName , entry ) ) ;
300
+ return response . body . map ( entry => this . convertCodeEditsToTextChange ( fileName , entry ) ) ;
288
301
}
289
302
290
303
getDefinitionAtPosition ( fileName : string , position : number ) : DefinitionInfo [ ] {
@@ -339,7 +352,7 @@ namespace ts.server {
339
352
} ) ;
340
353
}
341
354
342
- findReferences ( fileName : string , position : number ) : ReferencedSymbol [ ] {
355
+ findReferences ( fileName : string , position : number ) : ReferencedSymbol [ ] {
343
356
// Not yet implemented.
344
357
return [ ] ;
345
358
}
@@ -444,7 +457,7 @@ namespace ts.server {
444
457
text : item . text ,
445
458
kind : item . kind ,
446
459
kindModifiers : item . kindModifiers || "" ,
447
- spans : item . spans . map ( span => createTextSpanFromBounds ( this . lineOffsetToPosition ( fileName , span . start ) , this . lineOffsetToPosition ( fileName , span . end ) ) ) ,
460
+ spans : item . spans . map ( span => createTextSpanFromBounds ( this . lineOffsetToPosition ( fileName , span . start ) , this . lineOffsetToPosition ( fileName , span . end ) ) ) ,
448
461
childItems : this . decodeNavigationBarItems ( item . childItems , fileName ) ,
449
462
indent : 0 ,
450
463
bolded : false ,
@@ -478,10 +491,10 @@ namespace ts.server {
478
491
line : lineOffset . line ,
479
492
offset : lineOffset . offset
480
493
} ;
481
-
494
+
482
495
var request = this . processRequest < protocol . SignatureHelpRequest > ( CommandNames . SignatureHelp , args ) ;
483
496
var response = this . processResponse < protocol . SignatureHelpResponse > ( request ) ;
484
-
497
+
485
498
if ( ! response . body ) {
486
499
return undefined ;
487
500
}
@@ -490,7 +503,7 @@ namespace ts.server {
490
503
var span = helpItems . applicableSpan ;
491
504
var start = this . lineOffsetToPosition ( fileName , span . start ) ;
492
505
var end = this . lineOffsetToPosition ( fileName , span . end ) ;
493
-
506
+
494
507
var result : SignatureHelpItems = {
495
508
items : helpItems . items ,
496
509
applicableSpan : {
@@ -499,7 +512,7 @@ namespace ts.server {
499
512
} ,
500
513
selectedItemIndex : helpItems . selectedItemIndex ,
501
514
argumentIndex : helpItems . argumentIndex ,
502
- argumentCount : helpItems . argumentCount ,
515
+ argumentCount : helpItems . argumentCount ,
503
516
}
504
517
return result ;
505
518
}
@@ -561,15 +574,15 @@ namespace ts.server {
561
574
}
562
575
563
576
getTodoComments ( fileName : string , descriptors : TodoCommentDescriptor [ ] ) : TodoComment [ ] {
564
- throw new Error ( "Not Implemented Yet." ) ;
577
+ throw new Error ( "Not Implemented Yet." ) ;
565
578
}
566
-
579
+
567
580
getDocCommentTemplateAtPosition ( fileName : string , position : number ) : TextInsertion {
568
- throw new Error ( "Not Implemented Yet." ) ;
581
+ throw new Error ( "Not Implemented Yet." ) ;
569
582
}
570
583
571
584
isValidBraceCompletionAtPostion ( fileName : string , position : number , openingBrace : number ) : boolean {
572
- throw new Error ( "Not Implemented Yet." ) ;
585
+ throw new Error ( "Not Implemented Yet." ) ;
573
586
}
574
587
575
588
getBraceMatchingAtPosition ( fileName : string , position : number ) : TextSpan [ ] {
0 commit comments