From eab763fd21cee892d4f18b49daee8c62ef498010 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Thu, 14 May 2026 07:41:43 +0100 Subject: [PATCH] implements PLN-0079 --- .../semantics/PbsEditorialSupportService.java | 10 ++-- .../pbs/semantics/PbsFlowSemanticSupport.java | 22 ++++++-- .../PbsEditorialSupportServiceTest.java | 53 ++++++++++++++++++- 3 files changed, 78 insertions(+), 7 deletions(-) diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsEditorialSupportService.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsEditorialSupportService.java index dc4c839c..f87572f7 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsEditorialSupportService.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsEditorialSupportService.java @@ -741,9 +741,13 @@ public final class PbsEditorialSupportService { } final ArrayList signatures = new ArrayList<>(callables.size()); for (final var callable : callables) { - final ArrayList 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 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()))); diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsFlowSemanticSupport.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsFlowSemanticSupport.java index 70aeefae..1110664a 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsFlowSemanticSupport.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsFlowSemanticSupport.java @@ -143,10 +143,18 @@ final class PbsFlowSemanticSupport { record CallableSymbol( String name, + List parameters, List inputTypes, TypeView outputType, Span span) { } + + record CallableParameter( + String name, + int order, + TypeView type, + Span span) { + } record CallbackSignature( List inputTypes, @@ -469,10 +477,18 @@ final class PbsFlowSemanticSupport { final PbsAst.TypeRef resultErrorType, final Span span) { final var input = new ArrayList(parameters.size()); - for (final var parameter : parameters) { - input.add(typeFrom(parameter.typeRef())); + final var semanticParameters = new ArrayList(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( diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/semantics/PbsEditorialSupportServiceTest.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/semantics/PbsEditorialSupportServiceTest.java index b9458adb..3821b9b9 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/semantics/PbsEditorialSupportServiceTest.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/semantics/PbsEditorialSupportServiceTest.java @@ -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,