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 {