From dbb7ef1a7e704c0c4d259a0d9988168339d9e4c0 Mon Sep 17 00:00:00 2001 From: RblSb <msrblsb@gmail.com> Date: Mon, 21 Oct 2024 17:09:06 +0300 Subject: [PATCH 1/2] Hide signature help inside callbacks --- .../features/haxe/SignatureHelpFeature.hx | 27 ++++++++++++++++--- .../haxe/codeAction/TokenTreeUtils.hx | 13 ++++++++- 2 files changed, 36 insertions(+), 4 deletions(-) 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<SignatureHelp>->Void, reject:ResponseError<NoData>->Void, - doc:HaxeDocument) { + function handleJsonRpc(params:SignatureHelpParams, cancellationToken:CancellationToken, resolve:Null<SignatureHelp>->Void, + reject:ResponseError<NoData>->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) From cd82f1e888ef56e396dbb4132aecf698118f929c Mon Sep 17 00:00:00 2001 From: RblSb <msrblsb@gmail.com> Date: Tue, 29 Oct 2024 09:35:05 +0300 Subject: [PATCH 2/2] Use getPOpenType --- .../features/haxe/codeAction/TokenTreeUtils.hx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/haxeLanguageServer/features/haxe/codeAction/TokenTreeUtils.hx b/src/haxeLanguageServer/features/haxe/codeAction/TokenTreeUtils.hx index 4f8b8756..4b461091 100644 --- a/src/haxeLanguageServer/features/haxe/codeAction/TokenTreeUtils.hx +++ b/src/haxeLanguageServer/features/haxe/codeAction/TokenTreeUtils.hx @@ -1,6 +1,7 @@ package haxeLanguageServer.features.haxe.codeAction; import tokentree.TokenTree; +import tokentree.utils.TokenTreeCheckUtils; class TokenTreeUtils { public static function isInFunctionScope(token:TokenTree):Bool { @@ -23,8 +24,7 @@ class TokenTreeUtils { 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(_))); + return TokenTreeCheckUtils.getPOpenType(pOpen) == Call; } public static function isFunctionArg(token:TokenTree):Bool {