implements PLN-0079
This commit is contained in:
parent
4e00584af7
commit
eab763fd21
@ -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())));
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user