Skip to content

Commit def57fe

Browse files
committed
Merge pull request #745 from Microsoft/singatureInfo
Shim getSignatureAtPosition using the new signature help interfaces
2 parents 652431d + 6c8c529 commit def57fe

File tree

3 files changed

+111
-1
lines changed

3 files changed

+111
-1
lines changed

src/services/getScriptLexicalStructureWalker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ module TypeScript.Services {
151151
}
152152
}
153153

154-
private getNavigationBarItem(text: string, kind: string, kindModifiers: string, spans: TypeScript.TextSpan[], childItems?: ts.NavigationBarItem[], indent: number = 0): ts.NavigationBarItem {
154+
private getNavigationBarItem(text: string, kind: string, kindModifiers: string, spans: TypeScript.TextSpan[], childItems: ts.NavigationBarItem[]= [], indent: number = 0): ts.NavigationBarItem {
155155
return {
156156
text: text,
157157
kind: kind,

src/services/services.ts

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,8 @@ module ts {
661661
getSignatureHelpItems(fileName: string, position: number): SignatureHelpItems;
662662
getSignatureHelpCurrentArgumentState(fileName: string, position: number, applicableSpanStart: number): SignatureHelpState;
663663

664+
getSignatureAtPosition(fileName: string, position: number): SignatureInfo;
665+
664666
getRenameInfo(fileName: string, position: number): RenameInfo;
665667
getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[];
666668
getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[];
@@ -686,6 +688,41 @@ module ts {
686688
dispose(): void;
687689
}
688690

691+
export interface SignatureInfo {
692+
actual: ActualSignatureInfo;
693+
formal: FormalSignatureItemInfo[]; // Formal signatures
694+
activeFormal: number; // Index of the "best match" formal signature
695+
}
696+
697+
export interface FormalSignatureItemInfo {
698+
signatureInfo: string;
699+
typeParameters: FormalTypeParameterInfo[];
700+
parameters: FormalParameterInfo[]; // Array of parameters
701+
docComment: string; // Help for the signature
702+
}
703+
704+
export interface FormalTypeParameterInfo {
705+
name: string; // Type parameter name
706+
docComment: string; // Comments that contain help for the parameter
707+
minChar: number; // minChar for parameter info in the formal signature info string
708+
limChar: number; // lim char for parameter info in the formal signature info string
709+
}
710+
711+
export interface FormalParameterInfo {
712+
name: string; // Parameter name
713+
isVariable: boolean; // true if parameter is var args
714+
docComment: string; // Comments that contain help for the parameter
715+
minChar: number; // minChar for parameter info in the formal signature info string
716+
limChar: number; // lim char for parameter info in the formal signature info string
717+
}
718+
719+
export interface ActualSignatureInfo {
720+
parameterMinChar: number;
721+
parameterLimChar: number;
722+
currentParameterIsTypeParameter: boolean; // current parameter is a type argument or a normal argument
723+
currentParameter: number; // Index of active parameter in "parameters" or "typeParamters" array
724+
}
725+
689726
export interface ClassifiedSpan {
690727
textSpan: TypeScript.TextSpan;
691728
classificationType: string; // ClassificationTypeNames
@@ -3734,6 +3771,69 @@ module ts {
37343771
return SignatureHelp.getSignatureHelpCurrentArgumentState(sourceFile, position, applicableSpanStart);
37353772
}
37363773

3774+
function getSignatureAtPosition(filename: string, position: number): SignatureInfo {
3775+
var signatureHelpItems = getSignatureHelpItems(filename, position);
3776+
3777+
if (!signatureHelpItems) {
3778+
return undefined;
3779+
}
3780+
3781+
var currentArguemntState = getSignatureHelpCurrentArgumentState(filename, position, signatureHelpItems.applicableSpan.start());
3782+
3783+
var formalSignatures: FormalSignatureItemInfo[] = [];
3784+
forEach(signatureHelpItems.items, signature => {
3785+
var signatureInfoString = signature.prefix;
3786+
3787+
var parameters: FormalParameterInfo[] = [];
3788+
if (signature.parameters) {
3789+
for (var i = 0, n = signature.parameters.length; i < n; i++) {
3790+
var parameter = signature.parameters[i];
3791+
3792+
// add the parameter to the string
3793+
if (i) {
3794+
signatureInfoString += signature.separator;
3795+
}
3796+
3797+
var start = signatureInfoString.length;
3798+
signatureInfoString += parameter.display;
3799+
var end = signatureInfoString.length - 1;
3800+
3801+
// add the parameter to the list
3802+
parameters.push({
3803+
name: parameter.name,
3804+
isVariable: i == n - 1 && signature.isVariadic,
3805+
docComment: parameter.documentation,
3806+
minChar: start,
3807+
limChar: end
3808+
});
3809+
}
3810+
}
3811+
3812+
signatureInfoString += signature.suffix;
3813+
3814+
formalSignatures.push({
3815+
signatureInfo: signatureInfoString,
3816+
docComment: signature.documentation,
3817+
parameters: parameters,
3818+
typeParameters: [],
3819+
docComments: signature.documentation
3820+
});
3821+
});
3822+
3823+
var actualSignature: ActualSignatureInfo = {
3824+
parameterMinChar: signatureHelpItems.applicableSpan.start(),
3825+
parameterLimChar: signatureHelpItems.applicableSpan.end(),
3826+
currentParameterIsTypeParameter: false,
3827+
currentParameter: currentArguemntState.argumentIndex
3828+
};
3829+
3830+
return {
3831+
actual: actualSignature,
3832+
formal: formalSignatures,
3833+
activeFormal: 0
3834+
};
3835+
}
3836+
37373837
/// Syntactic features
37383838
function getSyntaxTree(filename: string): TypeScript.SyntaxTree {
37393839
filename = TypeScript.switchToForwardSlashes(filename);
@@ -4381,6 +4481,7 @@ module ts {
43814481
getFormattingEditsForDocument: getFormattingEditsForDocument,
43824482
getFormattingEditsAfterKeystroke: getFormattingEditsAfterKeystroke,
43834483
getEmitOutput: getEmitOutput,
4484+
getSignatureAtPosition: getSignatureAtPosition,
43844485
};
43854486
}
43864487

src/services/shims.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ module ts {
9292
getSignatureHelpItems(fileName: string, position: number): string;
9393
getSignatureHelpCurrentArgumentState(fileName: string, position: number, applicableSpanStart: number): string;
9494

95+
getSignatureAtPosition(fileName: string, position: number): string;
96+
9597
/**
9698
* Returns a JSON-encoded value of the type:
9799
* { canRename: boolean, localizedErrorMessage: string, displayName: string, fullDisplayName: string, kind: string, kindModifiers: string, triggerSpan: { start; length } }
@@ -630,6 +632,13 @@ module ts {
630632
});
631633
}
632634

635+
public getSignatureAtPosition(fileName: string, position: number): string {
636+
return this.forwardJSONCall(
637+
"getSignatureAtPosition('" + fileName + "', " + position + ")",
638+
() => {
639+
return this.languageService.getSignatureAtPosition(fileName, position);
640+
});
641+
}
633642

634643
/// GOTO DEFINITION
635644

0 commit comments

Comments
 (0)