implements PLN-0077

This commit is contained in:
bQUARKz 2026-05-08 10:15:17 +01:00
parent 7cbe61f5eb
commit 54339a95b8
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8

View File

@ -0,0 +1,212 @@
package p.studio.lsp.services.protocol;
import org.eclipse.lsp4j.CompletionItem;
import org.eclipse.lsp4j.CompletionList;
import org.eclipse.lsp4j.CompletionParams;
import org.eclipse.lsp4j.DidOpenTextDocumentParams;
import org.eclipse.lsp4j.Hover;
import org.eclipse.lsp4j.HoverParams;
import org.eclipse.lsp4j.MarkupContent;
import org.eclipse.lsp4j.Position;
import org.eclipse.lsp4j.SignatureHelp;
import org.eclipse.lsp4j.SignatureHelpParams;
import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.eclipse.lsp4j.TextDocumentItem;
import org.junit.jupiter.api.Test;
import p.studio.lsp.messages.BaselineCompletion;
import p.studio.lsp.messages.BaselineCompletionItem;
import p.studio.lsp.messages.BaselineCompletionItemKind;
import p.studio.lsp.messages.BaselineDocumentAnalysis;
import p.studio.lsp.messages.BaselineHover;
import p.studio.lsp.messages.BaselineSemanticTokens;
import p.studio.lsp.messages.BaselineServerDescription;
import p.studio.lsp.messages.BaselineSignature;
import p.studio.lsp.messages.BaselineSignatureHelp;
import p.studio.lsp.messages.LspProjectContext;
import p.studio.lsp.services.LanguageServiceBridge;
import p.studio.lsp.services.protocol.mapping.ProtocolMessageMapper;
import java.nio.file.Path;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
final class PrometeuTextDocumentServiceTest {
@Test
void shouldPassOpenDocumentOverlayToCompletionHoverAndSignatureHelp() {
final var bridge = new RecordingBridge();
final var mapper = new RecordingMapper();
final var service = new PrometeuTextDocumentService(
new LspProjectContext("main", "pbs", Path.of(".")),
bridge,
mapper);
final String uri = Path.of("demo.pbs").toUri().toString();
final String text = """
fn frame() -> void {
demo();
}
""";
final var openParams = new DidOpenTextDocumentParams(new TextDocumentItem(uri, "pbs", 1, text));
service.didOpen(openParams);
final var completion = service.completion(new CompletionParams(
new TextDocumentIdentifier(uri),
new Position(1, 2))).join();
final var completionList = completion.getRight();
assertSame(mapper.completionList, completionList);
assertEquals(text, bridge.lastCompletionText);
assertEquals(1, bridge.lastCompletionLine);
assertEquals(2, bridge.lastCompletionCharacter);
final Hover hover = service.hover(new HoverParams(
new TextDocumentIdentifier(uri),
new Position(1, 4))).join();
final var hoverContent = (MarkupContent) hover.getContents().getRight();
assertEquals("hover", hoverContent.getValue());
assertEquals(text, bridge.lastHoverText);
final SignatureHelp signatureHelp = service.signatureHelp(new SignatureHelpParams(
new TextDocumentIdentifier(uri),
new Position(1, 6))).join();
assertSame(mapper.signatureHelp, signatureHelp);
assertEquals(text, bridge.lastSignatureHelpText);
assertEquals(1, bridge.lastSignatureHelpLine);
assertEquals(6, bridge.lastSignatureHelpCharacter);
assertTrue(mapper.mappedSignatureHelp.signatures().getFirst().label().contains("demo"));
}
private static final class RecordingBridge implements LanguageServiceBridge {
private String lastCompletionText;
private int lastCompletionLine;
private int lastCompletionCharacter;
private String lastHoverText;
private String lastSignatureHelpText;
private int lastSignatureHelpLine;
private int lastSignatureHelpCharacter;
@Override
public BaselineServerDescription describeServer(final LspProjectContext context) {
throw new UnsupportedOperationException();
}
@Override
public BaselineDocumentAnalysis analyzeDocument(final LspProjectContext context, final String documentUri, final String text) {
return new BaselineDocumentAnalysis(List.of());
}
@Override
public BaselineCompletion completion(
final LspProjectContext context,
final String documentUri,
final String text,
final int line,
final int character) {
lastCompletionText = text;
lastCompletionLine = line;
lastCompletionCharacter = character;
return new BaselineCompletion(false, List.of(
new BaselineCompletionItem("demo", BaselineCompletionItemKind.FUNCTION, "", "")));
}
@Override
public BaselineHover hover(
final LspProjectContext context,
final String documentUri,
final String text,
final int line,
final int character) {
lastHoverText = text;
return new BaselineHover("hover");
}
@Override
public BaselineSignatureHelp signatureHelp(
final LspProjectContext context,
final String documentUri,
final String text,
final int line,
final int character) {
lastSignatureHelpText = text;
lastSignatureHelpLine = line;
lastSignatureHelpCharacter = character;
return new BaselineSignatureHelp(List.of(
new BaselineSignature("demo()", List.of(), "")), 0, 0);
}
@Override
public BaselineSemanticTokens semanticTokens(final LspProjectContext context, final String documentUri, final String text) {
return new BaselineSemanticTokens(List.of(), List.of());
}
@Override
public String onSave(final LspProjectContext context, final String documentUri) {
return "saved";
}
}
private static final class RecordingMapper implements ProtocolMessageMapper {
private final CompletionList completionList = new CompletionList(false, List.of(new CompletionItem("demo")));
private final SignatureHelp signatureHelp = new SignatureHelp();
private BaselineSignatureHelp mappedSignatureHelp;
@Override
public org.eclipse.lsp4j.InitializeResult mapInitializeResult(final BaselineServerDescription description) {
throw new UnsupportedOperationException();
}
@Override
public org.eclipse.lsp4j.PublishDiagnosticsParams mapDiagnostics(
final String uri,
final BaselineDocumentAnalysis analysis) {
throw new UnsupportedOperationException();
}
@Override
public org.eclipse.lsp4j.PublishDiagnosticsParams emptyDiagnostics(final String uri) {
throw new UnsupportedOperationException();
}
@Override
public Hover mapHover(final BaselineHover hover) {
final var content = new MarkupContent();
content.setKind("markdown");
content.setValue(hover.markdown());
return new Hover(content);
}
@Override
public CompletionList mapCompletion(final BaselineCompletion completion) {
return completionList;
}
@Override
public SignatureHelp mapSignatureHelp(final BaselineSignatureHelp signatureHelp) {
this.mappedSignatureHelp = signatureHelp;
return this.signatureHelp;
}
@Override
public org.eclipse.lsp4j.SemanticTokens mapSemanticTokens(final BaselineSemanticTokens semanticTokens) {
throw new UnsupportedOperationException();
}
@Override
public org.eclipse.lsp4j.MessageParams mapInfoMessage(final String message) {
throw new UnsupportedOperationException();
}
@Override
public org.eclipse.lsp4j.MessageParams mapErrorMessage(final String message) {
throw new UnsupportedOperationException();
}
@Override
public org.eclipse.lsp4j.MessageParams mapWarningMessage(final String message) {
throw new UnsupportedOperationException();
}
}
}