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());
|
final ArrayList<PbsEditorialSignature> signatures = new ArrayList<>(callables.size());
|
||||||
for (final var callable : callables) {
|
for (final var callable : callables) {
|
||||||
final ArrayList<String> parameterLabels = new ArrayList<>(callable.inputTypes().size());
|
final ArrayList<String> parameterLabels = new ArrayList<>(callable.parameters().size());
|
||||||
for (int index = 0; index < callable.inputTypes().size(); index += 1) {
|
for (final var parameter : callable.parameters()) {
|
||||||
parameterLabels.add("arg" + index + ": " + formatType(callable.inputTypes().get(index)));
|
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());
|
final String label = callable.name() + "(" + String.join(", ", parameterLabels) + ") -> " + formatType(callable.outputType());
|
||||||
signatures.add(new PbsEditorialSignature(callable.name(), label, parameterLabels, formatType(callable.outputType())));
|
signatures.add(new PbsEditorialSignature(callable.name(), label, parameterLabels, formatType(callable.outputType())));
|
||||||
|
|||||||
@ -143,11 +143,19 @@ final class PbsFlowSemanticSupport {
|
|||||||
|
|
||||||
record CallableSymbol(
|
record CallableSymbol(
|
||||||
String name,
|
String name,
|
||||||
|
List<CallableParameter> parameters,
|
||||||
List<TypeView> inputTypes,
|
List<TypeView> inputTypes,
|
||||||
TypeView outputType,
|
TypeView outputType,
|
||||||
Span span) {
|
Span span) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
record CallableParameter(
|
||||||
|
String name,
|
||||||
|
int order,
|
||||||
|
TypeView type,
|
||||||
|
Span span) {
|
||||||
|
}
|
||||||
|
|
||||||
record CallbackSignature(
|
record CallbackSignature(
|
||||||
List<TypeView> inputTypes,
|
List<TypeView> inputTypes,
|
||||||
TypeView outputType) {
|
TypeView outputType) {
|
||||||
@ -469,10 +477,18 @@ final class PbsFlowSemanticSupport {
|
|||||||
final PbsAst.TypeRef resultErrorType,
|
final PbsAst.TypeRef resultErrorType,
|
||||||
final Span span) {
|
final Span span) {
|
||||||
final var input = new ArrayList<TypeView>(parameters.size());
|
final var input = new ArrayList<TypeView>(parameters.size());
|
||||||
for (final var parameter : parameters) {
|
final var semanticParameters = new ArrayList<CallableParameter>(parameters.size());
|
||||||
input.add(typeFrom(parameter.typeRef()));
|
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(
|
private TypeView callableReturn(
|
||||||
|
|||||||
@ -155,7 +155,7 @@ final class PbsEditorialSupportServiceTest {
|
|||||||
ReadOnlyList.empty(),
|
ReadOnlyList.empty(),
|
||||||
source.lastIndexOf("2);"));
|
source.lastIndexOf("2);"));
|
||||||
assertTrue(methodHelp.isPresent());
|
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());
|
assertEquals(1, methodHelp.orElseThrow().activeParameter());
|
||||||
|
|
||||||
final var constructorHelp = service.signatureHelp(
|
final var constructorHelp = service.signatureHelp(
|
||||||
@ -171,6 +171,57 @@ final class PbsEditorialSupportServiceTest {
|
|||||||
assertEquals("Vec()", constructorHover.signatures().getFirst().label());
|
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(
|
private PbsEditorialResolvedSymbol requireHover(
|
||||||
final String source,
|
final String source,
|
||||||
final PbsAst.File ast,
|
final PbsAst.File ast,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user