implements PLN-0077
This commit is contained in:
parent
7cbe61f5eb
commit
54339a95b8
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user