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