diff --git a/src/haxeLanguageServer/features/haxe/SignatureHelpFeature.hx b/src/haxeLanguageServer/features/haxe/SignatureHelpFeature.hx index 02d36968..453a03cf 100644 --- a/src/haxeLanguageServer/features/haxe/SignatureHelpFeature.hx +++ b/src/haxeLanguageServer/features/haxe/SignatureHelpFeature.hx @@ -6,6 +6,7 @@ import haxe.display.Display.SignatureInformation as HaxeSignatureInformation; import haxe.display.Display.SignatureItem as HaxeSignatureItem; import haxe.display.JsonModuleTypes.JsonFunctionArgument; import haxe.extern.EitherType; +import haxeLanguageServer.features.haxe.codeAction.TokenTreeUtils; import haxeLanguageServer.helper.DocHelper; import haxeLanguageServer.helper.IdentifierHelper.addNamesToSignatureType; import haxeLanguageServer.helper.SemVer; @@ -39,8 +40,8 @@ class SignatureHelpFeature { handle(params, token, resolve, reject, doc); } - function handleJsonRpc(params:SignatureHelpParams, token:CancellationToken, resolve:Null->Void, reject:ResponseError->Void, - doc:HaxeDocument) { + function handleJsonRpc(params:SignatureHelpParams, cancellationToken:CancellationToken, resolve:Null->Void, + reject:ResponseError->Void, doc:HaxeDocument) { var wasAutoTriggered = true; if (context.haxeServer.haxeVersion >= new SemVer(4, 1, 0)) { final triggerKind = params?.context?.triggerKind; @@ -50,13 +51,33 @@ class SignatureHelpFeature { case ContentChange | Invoked: false; } } + + /** + close signature hint inside of callback argument scope: + ```haxe + foo(0, |(name, age) -> {}|); + ``` + **/ + var token = doc.tokens?.getTokenAtOffset(doc.offsetAt(params.position)); + while (token != null) { + final isCall = TokenTreeUtils.isCallPOpen(token); + if (isCall) { + break; + } + final isInFuction = TokenTreeUtils.isFunctionBrOpen(token); + if (isInFuction) { + resolve(null); + return; + } + token = token.parent; + } final params = { file: doc.uri.toFsPath(), contents: doc.content, offset: context.displayOffsetConverter.characterOffsetToByteOffset(doc.content, doc.offsetAt(params.position)), wasAutoTriggered: wasAutoTriggered } - context.callHaxeMethod(DisplayMethods.SignatureHelp, params, token, function(result) { + context.callHaxeMethod(DisplayMethods.SignatureHelp, params, cancellationToken, function(result) { if (result == null) { resolve(null); } else { diff --git a/src/haxeLanguageServer/features/haxe/codeAction/TokenTreeUtils.hx b/src/haxeLanguageServer/features/haxe/codeAction/TokenTreeUtils.hx index 9990d339..4f8b8756 100644 --- a/src/haxeLanguageServer/features/haxe/codeAction/TokenTreeUtils.hx +++ b/src/haxeLanguageServer/features/haxe/codeAction/TokenTreeUtils.hx @@ -4,7 +4,11 @@ import tokentree.TokenTree; class TokenTreeUtils { public static function isInFunctionScope(token:TokenTree):Bool { - final brOpen = token.parent ?? return false; + final token = token.parent ?? return false; + return isFunctionBrOpen(token); + } + + public static function isFunctionBrOpen(brOpen:TokenTree):Bool { if (brOpen.tok != BrOpen) return false; final name = brOpen.parent ?? return false; @@ -16,6 +20,13 @@ class TokenTreeUtils { return fun.tok.match(Kwd(KwdFunction)); } + public static function isCallPOpen(pOpen:TokenTree):Bool { + if (pOpen.tok != POpen) + return false; + final name = pOpen.parent ?? return false; + return name.tok.match(Const(CIdent(_))); + } + public static function isFunctionArg(token:TokenTree):Bool { final pOpen = token.parent ?? return false; if (pOpen.tok != POpen)