@@ -1051,7 +1051,7 @@ namespace ts.server {
1051
1051
if ( simplifiedResult ) {
1052
1052
return {
1053
1053
definitions : this . mapDefinitionInfo ( definitions , project ) ,
1054
- textSpan : toProcolTextSpan ( textSpan , scriptInfo )
1054
+ textSpan : toProtocolTextSpan ( textSpan , scriptInfo )
1055
1055
} ;
1056
1056
}
1057
1057
@@ -1306,7 +1306,7 @@ namespace ts.server {
1306
1306
if ( info . canRename ) {
1307
1307
const { canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan } = info ;
1308
1308
return identity < protocol . RenameInfoSuccess > (
1309
- { canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan : toProcolTextSpan ( triggerSpan , scriptInfo ) } ) ;
1309
+ { canRename, fileToRename, displayName, fullDisplayName, kind, kindModifiers, triggerSpan : toProtocolTextSpan ( triggerSpan , scriptInfo ) } ) ;
1310
1310
}
1311
1311
else {
1312
1312
return info ;
@@ -1406,8 +1406,8 @@ namespace ts.server {
1406
1406
if ( simplifiedResult ) {
1407
1407
const scriptInfo = this . projectService . getScriptInfoForNormalizedPath ( file ) ! ;
1408
1408
return spans . map ( s => ( {
1409
- textSpan : toProcolTextSpan ( s . textSpan , scriptInfo ) ,
1410
- hintSpan : toProcolTextSpan ( s . hintSpan , scriptInfo ) ,
1409
+ textSpan : toProtocolTextSpan ( s . textSpan , scriptInfo ) ,
1410
+ hintSpan : toProtocolTextSpan ( s . hintSpan , scriptInfo ) ,
1411
1411
bannerText : s . bannerText ,
1412
1412
autoCollapse : s . autoCollapse ,
1413
1413
kind : s . kind
@@ -1596,7 +1596,7 @@ namespace ts.server {
1596
1596
const entries = mapDefined < CompletionEntry , protocol . CompletionEntry > ( completions . entries , entry => {
1597
1597
if ( completions . isMemberCompletion || startsWith ( entry . name . toLowerCase ( ) , prefix . toLowerCase ( ) ) ) {
1598
1598
const { name, kind, kindModifiers, sortText, insertText, replacementSpan, hasAction, source, isRecommended } = entry ;
1599
- const convertedSpan = replacementSpan ? toProcolTextSpan ( replacementSpan , scriptInfo ) : undefined ;
1599
+ const convertedSpan = replacementSpan ? toProtocolTextSpan ( replacementSpan , scriptInfo ) : undefined ;
1600
1600
// Use `hasAction || undefined` to avoid serializing `false`.
1601
1601
return { name, kind, kindModifiers, sortText, insertText, replacementSpan : convertedSpan , hasAction : hasAction || undefined , source, isRecommended } ;
1602
1602
}
@@ -1766,7 +1766,7 @@ namespace ts.server {
1766
1766
text : item . text ,
1767
1767
kind : item . kind ,
1768
1768
kindModifiers : item . kindModifiers ,
1769
- spans : item . spans . map ( span => toProcolTextSpan ( span , scriptInfo ) ) ,
1769
+ spans : item . spans . map ( span => toProtocolTextSpan ( span , scriptInfo ) ) ,
1770
1770
childItems : this . mapLocationNavigationBarItems ( item . childItems , scriptInfo ) ,
1771
1771
indent : item . indent
1772
1772
} ) ) ;
@@ -1787,8 +1787,8 @@ namespace ts.server {
1787
1787
text : tree . text ,
1788
1788
kind : tree . kind ,
1789
1789
kindModifiers : tree . kindModifiers ,
1790
- spans : tree . spans . map ( span => toProcolTextSpan ( span , scriptInfo ) ) ,
1791
- nameSpan : tree . nameSpan && toProcolTextSpan ( tree . nameSpan , scriptInfo ) ,
1790
+ spans : tree . spans . map ( span => toProtocolTextSpan ( span , scriptInfo ) ) ,
1791
+ nameSpan : tree . nameSpan && toProtocolTextSpan ( tree . nameSpan , scriptInfo ) ,
1792
1792
childItems : map ( tree . childItems , item => this . toLocationNavigationTree ( item , scriptInfo ) )
1793
1793
} ;
1794
1794
}
@@ -2050,7 +2050,7 @@ namespace ts.server {
2050
2050
return ! spans
2051
2051
? undefined
2052
2052
: simplifiedResult
2053
- ? spans . map ( span => toProcolTextSpan ( span , scriptInfo ) )
2053
+ ? spans . map ( span => toProtocolTextSpan ( span , scriptInfo ) )
2054
2054
: spans ;
2055
2055
}
2056
2056
@@ -2122,14 +2122,81 @@ namespace ts.server {
2122
2122
2123
2123
private mapSelectionRange ( selectionRange : SelectionRange , scriptInfo : ScriptInfo ) : protocol . SelectionRange {
2124
2124
const result : protocol . SelectionRange = {
2125
- textSpan : toProcolTextSpan ( selectionRange . textSpan , scriptInfo ) ,
2125
+ textSpan : toProtocolTextSpan ( selectionRange . textSpan , scriptInfo ) ,
2126
2126
} ;
2127
2127
if ( selectionRange . parent ) {
2128
2128
result . parent = this . mapSelectionRange ( selectionRange . parent , scriptInfo ) ;
2129
2129
}
2130
2130
return result ;
2131
2131
}
2132
2132
2133
+ private toProtocolCallHierarchyItem ( item : CallHierarchyItem , scriptInfo ?: ScriptInfo ) : protocol . CallHierarchyItem {
2134
+ if ( ! scriptInfo ) {
2135
+ const file = toNormalizedPath ( item . file ) ;
2136
+ scriptInfo = this . projectService . getScriptInfoForNormalizedPath ( file ) ;
2137
+ if ( ! scriptInfo ) {
2138
+ this . projectService . logErrorForScriptInfoNotFound ( file ) ;
2139
+ return Errors . ThrowNoProject ( ) ;
2140
+ }
2141
+ }
2142
+ return {
2143
+ name : item . name ,
2144
+ kind : item . kind ,
2145
+ file : item . file ,
2146
+ span : toProtocolTextSpan ( item . span , scriptInfo ) ,
2147
+ selectionSpan : toProtocolTextSpan ( item . selectionSpan , scriptInfo )
2148
+ } ;
2149
+ }
2150
+
2151
+ private toProtocolCallHierarchyIncomingCall ( incomingCall : CallHierarchyIncomingCall , scriptInfo : ScriptInfo ) : protocol . CallHierarchyIncomingCall {
2152
+ return {
2153
+ from : this . toProtocolCallHierarchyItem ( incomingCall . from ) ,
2154
+ fromSpans : incomingCall . fromSpans . map ( fromSpan => toProtocolTextSpan ( fromSpan , scriptInfo ) )
2155
+ } ;
2156
+ }
2157
+
2158
+ private toProtocolCallHierarchyOutgoingCall ( outgoingCall : CallHierarchyOutgoingCall , scriptInfo : ScriptInfo ) : protocol . CallHierarchyOutgoingCall {
2159
+ return {
2160
+ to : this . toProtocolCallHierarchyItem ( outgoingCall . to ) ,
2161
+ fromSpans : outgoingCall . fromSpans . map ( fromSpan => toProtocolTextSpan ( fromSpan , scriptInfo ) )
2162
+ } ;
2163
+ }
2164
+
2165
+ private prepareCallHierarchy ( args : protocol . FileLocationRequestArgs ) : protocol . CallHierarchyItem | undefined {
2166
+ const { file, languageService } = this . getFileAndLanguageServiceForSyntacticOperation ( args ) ;
2167
+ const scriptInfo = this . projectService . getScriptInfoForNormalizedPath ( file ) ;
2168
+ if ( scriptInfo ) {
2169
+ const position = this . getPosition ( args , scriptInfo ) ;
2170
+ const item = languageService . prepareCallHierarchy ( file , position ) ;
2171
+ return ! item
2172
+ ? undefined
2173
+ : this . toProtocolCallHierarchyItem ( item , scriptInfo ) ;
2174
+ }
2175
+ return undefined ;
2176
+ }
2177
+
2178
+ private provideCallHierarchyIncomingCalls ( args : protocol . FileLocationRequestArgs ) : protocol . CallHierarchyIncomingCall [ ] {
2179
+ const { file, languageService } = this . getFileAndLanguageServiceForSyntacticOperation ( args ) ;
2180
+ const scriptInfo = this . projectService . getScriptInfoForNormalizedPath ( file ) ;
2181
+ if ( ! scriptInfo ) {
2182
+ this . projectService . logErrorForScriptInfoNotFound ( file ) ;
2183
+ return Errors . ThrowNoProject ( ) ;
2184
+ }
2185
+ const incomingCalls = languageService . provideCallHierarchyIncomingCalls ( file , this . getPosition ( args , scriptInfo ) ) ;
2186
+ return incomingCalls . map ( call => this . toProtocolCallHierarchyIncomingCall ( call , scriptInfo ) ) ;
2187
+ }
2188
+
2189
+ private provideCallHierarchyOutgoingCalls ( args : protocol . FileLocationRequestArgs ) : protocol . CallHierarchyOutgoingCall [ ] {
2190
+ const { file, languageService } = this . getFileAndLanguageServiceForSyntacticOperation ( args ) ;
2191
+ const scriptInfo = this . projectService . getScriptInfoForNormalizedPath ( file ) ;
2192
+ if ( ! scriptInfo ) {
2193
+ this . projectService . logErrorForScriptInfoNotFound ( file ) ;
2194
+ return Errors . ThrowNoProject ( ) ;
2195
+ }
2196
+ const outgoingCalls = languageService . provideCallHierarchyOutgoingCalls ( file , this . getPosition ( args , scriptInfo ) ) ;
2197
+ return outgoingCalls . map ( call => this . toProtocolCallHierarchyOutgoingCall ( call , scriptInfo ) ) ;
2198
+ }
2199
+
2133
2200
getCanonicalFileName ( fileName : string ) {
2134
2201
const name = this . host . useCaseSensitiveFileNames ? fileName : fileName . toLowerCase ( ) ;
2135
2202
return normalizePath ( name ) ;
@@ -2495,6 +2562,15 @@ namespace ts.server {
2495
2562
[ CommandNames . SelectionRangeFull ] : ( request : protocol . SelectionRangeRequest ) => {
2496
2563
return this . requiredResponse ( this . getSmartSelectionRange ( request . arguments , /*simplifiedResult*/ false ) ) ;
2497
2564
} ,
2565
+ [ CommandNames . PrepareCallHierarchy ] : ( request : protocol . PrepareCallHierarchyRequest ) => {
2566
+ return this . requiredResponse ( this . prepareCallHierarchy ( request . arguments ) ) ;
2567
+ } ,
2568
+ [ CommandNames . ProvideCallHierarchyIncomingCalls ] : ( request : protocol . ProvideCallHierarchyIncomingCallsRequest ) => {
2569
+ return this . requiredResponse ( this . provideCallHierarchyIncomingCalls ( request . arguments ) ) ;
2570
+ } ,
2571
+ [ CommandNames . ProvideCallHierarchyOutgoingCalls ] : ( request : protocol . ProvideCallHierarchyOutgoingCallsRequest ) => {
2572
+ return this . requiredResponse ( this . provideCallHierarchyOutgoingCalls ( request . arguments ) ) ;
2573
+ } ,
2498
2574
} ) ;
2499
2575
2500
2576
public addProtocolHandler ( command : string , handler : ( request : protocol . Request ) => HandlerResponse ) {
@@ -2618,16 +2694,22 @@ namespace ts.server {
2618
2694
readonly project : Project ;
2619
2695
}
2620
2696
2621
- function toProcolTextSpan ( textSpan : TextSpan , scriptInfo : ScriptInfo ) : protocol . TextSpan {
2697
+ // function toLanguageServiceTextSpan(textSpan: protocol.TextSpan, scriptInfo: ScriptInfo): TextSpan {
2698
+ // const start = scriptInfo.lineOffsetToPosition(textSpan.start.line, textSpan.start.offset);
2699
+ // const end = scriptInfo.lineOffsetToPosition(textSpan.end.line, textSpan.end.offset);
2700
+ // return { start, length: end - start };
2701
+ // }
2702
+
2703
+ function toProtocolTextSpan ( textSpan : TextSpan , scriptInfo : ScriptInfo ) : protocol . TextSpan {
2622
2704
return {
2623
2705
start : scriptInfo . positionToLineOffset ( textSpan . start ) ,
2624
2706
end : scriptInfo . positionToLineOffset ( textSpanEnd ( textSpan ) )
2625
2707
} ;
2626
2708
}
2627
2709
2628
2710
function toProtocolTextSpanWithContext ( span : TextSpan , contextSpan : TextSpan | undefined , scriptInfo : ScriptInfo ) : protocol . TextSpanWithContext {
2629
- const textSpan = toProcolTextSpan ( span , scriptInfo ) ;
2630
- const contextTextSpan = contextSpan && toProcolTextSpan ( contextSpan , scriptInfo ) ;
2711
+ const textSpan = toProtocolTextSpan ( span , scriptInfo ) ;
2712
+ const contextTextSpan = contextSpan && toProtocolTextSpan ( contextSpan , scriptInfo ) ;
2631
2713
return contextTextSpan ?
2632
2714
{ ...textSpan , contextStart : contextTextSpan . start , contextEnd : contextTextSpan . end } :
2633
2715
textSpan ;
0 commit comments