implements PLN-0079

This commit is contained in:
bQUARKz 2026-05-14 07:41:43 +01:00
parent 4e00584af7
commit eab763fd21
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
3 changed files with 78 additions and 7 deletions

View File

@ -741,9 +741,13 @@ public final class PbsEditorialSupportService {
}
final ArrayList<PbsEditorialSignature> signatures = new ArrayList<>(callables.size());
for (final var callable : callables) {
final ArrayList<String> parameterLabels = new ArrayList<>(callable.inputTypes().size());
for (int index = 0; index < callable.inputTypes().size(); index += 1) {
parameterLabels.add("arg" + index + ": " + formatType(callable.inputTypes().get(index)));
final ArrayList<String> parameterLabels = new ArrayList<>(callable.parameters().size());
for (final var parameter : callable.parameters()) {
if (parameter.name() == null || parameter.name().isBlank()) {
parameterLabels.add(formatType(parameter.type()));
} else {
parameterLabels.add(parameter.name() + ": " + formatType(parameter.type()));
}
}
final String label = callable.name() + "(" + String.join(", ", parameterLabels) + ") -> " + formatType(callable.outputType());
signatures.add(new PbsEditorialSignature(callable.name(), label, parameterLabels, formatType(callable.outputType())));

View File

@ -143,10 +143,18 @@ final class PbsFlowSemanticSupport {
record CallableSymbol(
String name,
List<CallableParameter> parameters,
List<TypeView> inputTypes,
TypeView outputType,
Span span) {
}
record CallableParameter(
String name,
int order,
TypeView type,
Span span) {
}
record CallbackSignature(
List<TypeView> inputTypes,
@ -469,10 +477,18 @@ final class PbsFlowSemanticSupport {
final PbsAst.TypeRef resultErrorType,
final Span span) {
final var input = new ArrayList<TypeView>(parameters.size());
for (final var parameter : parameters) {
input.add(typeFrom(parameter.typeRef()));
final var semanticParameters = new ArrayList<CallableParameter>(parameters.size());
for (int index = 0; index < parameters.size(); index += 1) {
final var parameter = parameters.get(index);
final var type = typeFrom(parameter.typeRef());
input.add(type);
semanticParameters.add(new CallableParameter(
parameter.name(),
index,
type,
parameter.span()));
}
return new CallableSymbol(name, input, callableReturn(returnKind, returnType, resultErrorType), span);
return new CallableSymbol(name, semanticParameters, input, callableReturn(returnKind, returnType, resultErrorType), span);
}
private TypeView callableReturn(

View File

@ -155,7 +155,7 @@ final class PbsEditorialSupportServiceTest {
ReadOnlyList.empty(),
source.lastIndexOf("2);"));
assertTrue(methodHelp.isPresent());
assertEquals("blend(arg0: int, arg1: int) -> int", methodHelp.orElseThrow().signatures().getFirst().label());
assertEquals("blend(dx: int, dy: int) -> int", methodHelp.orElseThrow().signatures().getFirst().label());
assertEquals(1, methodHelp.orElseThrow().activeParameter());
final var constructorHelp = service.signatureHelp(
@ -171,6 +171,57 @@ final class PbsEditorialSupportServiceTest {
assertEquals("Vec()", constructorHover.signatures().getFirst().label());
}
@Test
void shouldPreserveSemanticParameterNamesForHostAndBuiltinCallables() {
final var source = """
import { Gfx, Sprite } from @sdk:gfx;
fn main(sprite: Sprite) -> void {
Gfx.draw_pixel(1, 2, 3);
sprite.blit(4, 5);
}
""";
final var ast = parseOrdinary(source);
final var supplementalTopDecls = supplementalTopDecls("""
declare host Gfx {
fn draw_pixel(x: int, y: int, color: int) -> void;
}
declare builtin type Sprite(
pub id: int
) {
fn blit(x: int, y: int) -> void;
}
""");
final var hostHelp = service.signatureHelp(
source,
ast,
supplementalTopDecls,
source.indexOf("2, 3"));
assertTrue(hostHelp.isPresent());
assertEquals("draw_pixel(x: int, y: int, color: int) -> void", hostHelp.orElseThrow().signatures().getFirst().label());
assertFalse(hostHelp.orElseThrow().signatures().getFirst().label().contains("arg"));
final var builtinHelp = service.signatureHelp(
source,
ast,
supplementalTopDecls,
source.indexOf("5);"));
assertTrue(builtinHelp.isPresent());
assertEquals("blit(x: int, y: int) -> void", builtinHelp.orElseThrow().signatures().getFirst().label());
assertFalse(builtinHelp.orElseThrow().signatures().getFirst().label().contains("arg"));
final var hostCompletion = service.completion(
source,
ast,
supplementalTopDecls,
source.indexOf("draw_pixel"));
assertTrue(hostCompletion.stream().anyMatch(candidate ->
candidate.label().equals("draw_pixel")
&& candidate.detail().equals("draw_pixel(x: int, y: int, color: int) -> void")));
}
private PbsEditorialResolvedSymbol requireHover(
final String source,
final PbsAst.File ast,