From 908d6196cb909716d9dd4cb47afc8e66a7da1ba0 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 24 Sep 2014 21:47:57 -0700 Subject: [PATCH 1/5] shim getSignatureAtPosition using the new signature help interfaces --- src/services/services.ts | 100 +++++++++++++++++++++++++++++++++++++++ src/services/shims.ts | 9 ++++ 2 files changed, 109 insertions(+) diff --git a/src/services/services.ts b/src/services/services.ts index 449fab183ca..a5e5e62b21a 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -661,6 +661,8 @@ module ts { getSignatureHelpItems(fileName: string, position: number): SignatureHelpItems; getSignatureHelpCurrentArgumentState(fileName: string, position: number, applicableSpanStart: number): SignatureHelpState; + getSignatureAtPosition(fileName: string, position: number): SignatureInfo; + getRenameInfo(fileName: string, position: number): RenameInfo; getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[]; getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[]; @@ -686,6 +688,42 @@ module ts { dispose(): void; } + export interface SignatureInfo { + actual: ActualSignatureInfo; + formal: FormalSignatureItemInfo[]; // Formal signatures + activeFormal: number; // Index of the "best match" formal signature + } + + export interface FormalSignatureItemInfo { + signatureInfo: string; + typeParameters: FormalTypeParameterInfo[]; + parameters: FormalParameterInfo[]; // Array of parameters + docComment: string; // Help for the signature + } + + export interface FormalTypeParameterInfo { + name: string; // Type parameter name + docComment: string; // Comments that contain help for the parameter + minChar: number; // minChar for parameter info in the formal signature info string + limChar: number; // lim char for parameter info in the formal signature info string + } + + export interface FormalParameterInfo { + name: string; // Parameter name + isVariable: boolean; // true if parameter is var args + docComment: string; // Comments that contain help for the parameter + minChar: number; // minChar for parameter info in the formal signature info string + limChar: number; // lim char for parameter info in the formal signature info string + } + + export interface ActualSignatureInfo { + parameterMinChar: number; + parameterLimChar: number; + currentParameterIsTypeParameter: boolean; // current parameter is a type argument or a normal argument + currentParameter: number; // Index of active parameter in "parameters" or "typeParamters" array + } + + export class ClassificationTypeNames { public static comment = "comment"; public static identifier = "identifier"; @@ -3748,6 +3786,67 @@ module ts { return SignatureHelp.getSignatureHelpCurrentArgumentState(sourceFile, position, applicableSpanStart); } + function getSignatureAtPosition(filename: string, position: number): SignatureInfo { + var signatureHelpItems = getSignatureHelpItems(filename, position); + + if (!signatureHelpItems) { + return undefined; + } + + var currentArguemntState = getSignatureHelpCurrentArgumentState(filename, position, signatureHelpItems.applicableSpan.start()); + + var formalSignatures: FormalSignatureItemInfo[] = []; + forEach(signatureHelpItems.items, signature=> { + var signatureInfoString = signature.prefix; + + var paramters: FormalParameterInfo[] = []; + for (var i = 0, n = signature.parameters.length; i < n; i++) { + var paramter = signature.parameters[i]; + + // add the parameter to the string + if (i) { + signatureInfoString += signature.separator; + } + var start = signatureInfoString.length; + signatureInfoString += paramter.display; + var end = signatureInfoString.length - 1; + + // add the parameter to the list + paramters.push({ + name: paramter.name, + isVariable: i == n -1 && signature.isVariadic, + docComment: paramter.documentation, + minChar: start, + limChar: end + }); + + } + + signatureInfoString += signature.suffix; + + formalSignatures.push({ + signatureInfo: signatureInfoString, + docComment: signature.documentation, + parameters: paramters, + typeParameters: [], + docComments: signature.documentation + }); + }); + + var actualSignature: ActualSignatureInfo = { + parameterMinChar: 0, + parameterLimChar: 0, + currentParameterIsTypeParameter: false, + currentParameter: currentArguemntState.argumentIndex + }; + + return { + actual: actualSignature, + formal: formalSignatures, + activeFormal: 0 + }; + } + /// Syntactic features function getSyntaxTree(filename: string): TypeScript.SyntaxTree { filename = TypeScript.switchToForwardSlashes(filename); @@ -4364,6 +4463,7 @@ module ts { getFormattingEditsForDocument: getFormattingEditsForDocument, getFormattingEditsAfterKeystroke: getFormattingEditsAfterKeystroke, getEmitOutput: getEmitOutput, + getSignatureAtPosition: getSignatureAtPosition, }; } diff --git a/src/services/shims.ts b/src/services/shims.ts index 0418a6da6cc..23d46a18545 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -96,6 +96,8 @@ module ts { getSignatureHelpItems(fileName: string, position: number): string; getSignatureHelpCurrentArgumentState(fileName: string, position: number, applicableSpanStart: number): string; + getSignatureAtPosition(fileName: string, position: number): string; + // Returns a JSON encoded value of the type: // { canRename: boolean, localizedErrorMessage: string, displayName: string, fullDisplayName: string, kind: string, kindModifiers: string, triggerSpan: { start; length } } getRenameInfo(fileName: string, position: number): string; @@ -604,6 +606,13 @@ module ts { }); } + public getSignatureAtPosition(fileName: string, position: number): string { + return this.forwardJSONCall( + "getSignatureAtPosition('" + fileName + "', " + position + ")", + () => { + return this.languageService.getSignatureAtPosition(fileName, position); + }); + } /// GOTO DEFINITION /// Computes the definition location and file for the symbol From be2a41c57249500c788e1a8ff26ee44c80d19f0a Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Wed, 24 Sep 2014 21:53:36 -0700 Subject: [PATCH 2/5] remove empty lines --- src/services/services.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index a5e5e62b21a..d2d3e56a1d0 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3760,9 +3760,9 @@ module ts { // Reset writer back to undefined to make sure that we produce an error message if CompilerHost.writeFile method is called when we are not in getEmitOutput writer = undefined; - return emitOutput; - } - + return emitOutput; + } + // Signature help /** * This is a semantic operation. @@ -3796,7 +3796,7 @@ module ts { var currentArguemntState = getSignatureHelpCurrentArgumentState(filename, position, signatureHelpItems.applicableSpan.start()); var formalSignatures: FormalSignatureItemInfo[] = []; - forEach(signatureHelpItems.items, signature=> { + forEach(signatureHelpItems.items, signature => { var signatureInfoString = signature.prefix; var paramters: FormalParameterInfo[] = []; @@ -3807,6 +3807,7 @@ module ts { if (i) { signatureInfoString += signature.separator; } + var start = signatureInfoString.length; signatureInfoString += paramter.display; var end = signatureInfoString.length - 1; @@ -3819,7 +3820,6 @@ module ts { minChar: start, limChar: end }); - } signatureInfoString += signature.suffix; From 9885e59e426be4b928d2e6bbd678f6d1648e9aa1 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 25 Sep 2014 12:45:35 -0700 Subject: [PATCH 3/5] respond to code review comments --- src/services/services.ts | 42 +++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index d2d3e56a1d0..e701be161a5 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3799,27 +3799,29 @@ module ts { forEach(signatureHelpItems.items, signature => { var signatureInfoString = signature.prefix; - var paramters: FormalParameterInfo[] = []; - for (var i = 0, n = signature.parameters.length; i < n; i++) { - var paramter = signature.parameters[i]; + var parameters: FormalParameterInfo[] = []; + if (signature.parameters) { + for (var i = 0, n = signature.parameters.length; i < n; i++) { + var parameter = signature.parameters[i]; - // add the parameter to the string - if (i) { - signatureInfoString += signature.separator; + // add the parameter to the string + if (i) { + signatureInfoString += signature.separator; + } + + var start = signatureInfoString.length; + signatureInfoString += parameter.display; + var end = signatureInfoString.length - 1; + + // add the parameter to the list + parameters.push({ + name: parameter.name, + isVariable: i == n - 1 && signature.isVariadic, + docComment: parameter.documentation, + minChar: start, + limChar: end + }); } - - var start = signatureInfoString.length; - signatureInfoString += paramter.display; - var end = signatureInfoString.length - 1; - - // add the parameter to the list - paramters.push({ - name: paramter.name, - isVariable: i == n -1 && signature.isVariadic, - docComment: paramter.documentation, - minChar: start, - limChar: end - }); } signatureInfoString += signature.suffix; @@ -3827,7 +3829,7 @@ module ts { formalSignatures.push({ signatureInfo: signatureInfoString, docComment: signature.documentation, - parameters: paramters, + parameters: parameters, typeParameters: [], docComments: signature.documentation }); From 3f315c09a0a643e623cc11c48d29a9b9dc820b0a Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 25 Sep 2014 13:40:11 -0700 Subject: [PATCH 4/5] set applicaple span correctelly --- src/services/services.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index ab8e7073472..2d70a1a1254 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -3821,8 +3821,8 @@ module ts { }); var actualSignature: ActualSignatureInfo = { - parameterMinChar: 0, - parameterLimChar: 0, + parameterMinChar: signatureHelpItems.applicableSpan.start(), + parameterLimChar: signatureHelpItems.applicableSpan.end(), currentParameterIsTypeParameter: false, currentParameter: currentArguemntState.argumentIndex }; From 6c8c5290d4abaf8a08264c2f33f615b9edfa2ef3 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Thu, 25 Sep 2014 13:46:03 -0700 Subject: [PATCH 5/5] enusre that child items is always set --- src/services/getScriptLexicalStructureWalker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/getScriptLexicalStructureWalker.ts b/src/services/getScriptLexicalStructureWalker.ts index 1de84435cbf..94ed8a6de87 100644 --- a/src/services/getScriptLexicalStructureWalker.ts +++ b/src/services/getScriptLexicalStructureWalker.ts @@ -151,7 +151,7 @@ module TypeScript.Services { } } - private getNavigationBarItem(text: string, kind: string, kindModifiers: string, spans: TypeScript.TextSpan[], childItems?: ts.NavigationBarItem[], indent: number = 0): ts.NavigationBarItem { + private getNavigationBarItem(text: string, kind: string, kindModifiers: string, spans: TypeScript.TextSpan[], childItems: ts.NavigationBarItem[]= [], indent: number = 0): ts.NavigationBarItem { return { text: text, kind: kind,