feat(lsp_server): add call snippets to completion resolve

This commit is contained in:
csh
2025-12-24 15:13:10 +08:00
parent baaf2ee688
commit b2a1bb6685
3 changed files with 575 additions and 71 deletions
@@ -51,6 +51,10 @@ export namespace lsp::test::provider
static TestResult TestCompletionResolveCreateObjectSnippet();
static TestResult TestCompletionResolveCreateObjectUnquotedSnippet();
static TestResult TestCompletionResolveCreateObjectSingleQuoteSnippet();
static TestResult TestCompletionResolveFunctionSnippet();
static TestResult TestCompletionResolveUnitMemberFunctionSnippet();
static TestResult TestCompletionResolveInstanceMethodSnippet();
static TestResult TestCompletionResolveStaticMethodSnippet();
};
}
@@ -191,6 +195,10 @@ namespace lsp::test::provider
runner.addTest("completion resolve createobject snippet", TestCompletionResolveCreateObjectSnippet);
runner.addTest("completion resolve createobject unquoted snippet", TestCompletionResolveCreateObjectUnquotedSnippet);
runner.addTest("completion resolve createobject single quote snippet", TestCompletionResolveCreateObjectSingleQuoteSnippet);
runner.addTest("completion resolve function snippet", TestCompletionResolveFunctionSnippet);
runner.addTest("completion resolve unit member function snippet", TestCompletionResolveUnitMemberFunctionSnippet);
runner.addTest("completion resolve instance method snippet", TestCompletionResolveInstanceMethodSnippet);
runner.addTest("completion resolve static method snippet", TestCompletionResolveStaticMethodSnippet);
}
TestResult CompletionTests::TestClassMethodCompletion()
@@ -681,4 +689,124 @@ namespace lsp::test::provider
assertTrue(snippet.contains("${1:a}"), "Resolved createobject snippet should include param placeholders");
return result;
}
TestResult CompletionTests::TestCompletionResolveFunctionSnippet()
{
TestResult result{ "", true, "ok" };
ProviderEnv env;
auto path = FixturePath("main_unit.tsf");
auto content = ReadTextFile(path);
auto uri = ToUri(path);
OpenDocument(env.hub, uri, content, 1);
auto items = RequestCompletion(env, uri, content, "UnitF");
auto item = FindItem(items, "UnitFunc");
assertTrue(item.has_value(), "Expected UnitFunc completion");
protocol::RequestMessage request;
request.id = "r5";
request.method = "completionItem/resolve";
request.params = codec::ToLSPAny(*item);
::lsp::provider::completion_item::Resolve resolver;
auto json = resolver.ProvideResponse(request, env.context);
auto response = ParseResponse(json);
auto resolved = codec::FromLSPAny.template operator()<protocol::CompletionItem>(response.result.value());
assertTrue(resolved.insertText.has_value(), "Resolved function item should have insertText");
auto snippet = resolved.insertText.value();
assertTrue(snippet.starts_with("UnitFunc("), "Resolved function snippet should start with UnitFunc(");
assertTrue(snippet.contains("${1:a}"), "Resolved function snippet should include param placeholders");
return result;
}
TestResult CompletionTests::TestCompletionResolveUnitMemberFunctionSnippet()
{
TestResult result{ "", true, "ok" };
ProviderEnv env;
auto path = FixturePath("main_unit.tsf");
auto content = ReadTextFile(path);
auto uri = ToUri(path);
OpenDocument(env.hub, uri, content, 1);
auto items = RequestCompletion(env, uri, content, "MainUnit.Uni");
auto item = FindItem(items, "UnitFunc");
assertTrue(item.has_value(), "Expected UnitFunc completion from unit member context");
protocol::RequestMessage request;
request.id = "r6";
request.method = "completionItem/resolve";
request.params = codec::ToLSPAny(*item);
::lsp::provider::completion_item::Resolve resolver;
auto json = resolver.ProvideResponse(request, env.context);
auto response = ParseResponse(json);
auto resolved = codec::FromLSPAny.template operator()<protocol::CompletionItem>(response.result.value());
assertTrue(resolved.insertText.has_value(), "Resolved unit member function should have insertText");
auto snippet = resolved.insertText.value();
assertTrue(snippet.starts_with("UnitFunc("), "Resolved unit member function snippet should start with UnitFunc(");
assertTrue(snippet.contains("${1:a}"), "Resolved unit member function snippet should include param placeholders");
return result;
}
TestResult CompletionTests::TestCompletionResolveInstanceMethodSnippet()
{
TestResult result{ "", true, "ok" };
ProviderEnv env;
auto path = FixturePath("main_unit.tsf");
auto content = ReadTextFile(path);
auto uri = ToUri(path);
OpenDocument(env.hub, uri, content, 1);
auto items = RequestCompletion(env, uri, content, "obj.Fo");
auto item = FindItem(items, "Foo");
assertTrue(item.has_value(), "Expected Foo completion from object member context");
protocol::RequestMessage request;
request.id = "r7";
request.method = "completionItem/resolve";
request.params = codec::ToLSPAny(*item);
::lsp::provider::completion_item::Resolve resolver;
auto json = resolver.ProvideResponse(request, env.context);
auto response = ParseResponse(json);
auto resolved = codec::FromLSPAny.template operator()<protocol::CompletionItem>(response.result.value());
assertTrue(resolved.insertText.has_value(), "Resolved method item should have insertText");
auto snippet = resolved.insertText.value();
assertTrue(snippet.starts_with("Foo("), "Resolved method snippet should start with Foo(");
assertTrue(snippet.contains("${1:x}"), "Resolved method snippet should include param placeholders");
return result;
}
TestResult CompletionTests::TestCompletionResolveStaticMethodSnippet()
{
TestResult result{ "", true, "ok" };
ProviderEnv env;
auto path = FixturePath("main_unit.tsf");
auto content = ReadTextFile(path);
auto uri = ToUri(path);
OpenDocument(env.hub, uri, content, 1);
auto items = RequestCompletion(env, uri, content, "class(Widget).Sta");
auto item = FindItem(items, "StaticFoo");
assertTrue(item.has_value(), "Expected StaticFoo completion from class method context");
protocol::RequestMessage request;
request.id = "r8";
request.method = "completionItem/resolve";
request.params = codec::ToLSPAny(*item);
::lsp::provider::completion_item::Resolve resolver;
auto json = resolver.ProvideResponse(request, env.context);
auto response = ParseResponse(json);
auto resolved = codec::FromLSPAny.template operator()<protocol::CompletionItem>(response.result.value());
assertTrue(resolved.insertText.has_value(), "Resolved static method should have insertText");
auto snippet = resolved.insertText.value();
assertTrue(snippet.starts_with("StaticFoo("), "Resolved static method snippet should start with StaticFoo(");
assertTrue(snippet.contains("${1:y}"), "Resolved static method snippet should include param placeholders");
return result;
}
}