下面列出了怎么用org.eclipse.lsp4j.Hover的API类实例代码及写法,或者点击链接到github查看源代码。
@Test
public void testConfigPropertyNameYaml() throws Exception {
MicroProfileAssert.saveFile(PsiMicroProfileProject.APPLICATION_YAML_FILE,
"greeting:\n" + " message: message from yaml\n" + " number: 2001", javaProject);
MicroProfileAssert.saveFile(PsiMicroProfileProject.APPLICATION_PROPERTIES_FILE,
"greeting.message = hello\r\n" + "greeting.name = quarkus\r\n" + "greeting.number = 100", javaProject);
// Position(14, 40) is the character after the | symbol:
// @ConfigProperty(name = "greeting.mes|sage")
Hover info = getActualHover(new Position(14, 40));
MicroProfileAssert.assertHover("greeting.message", "message from yaml", 14, 28, 44, info);
// Position(26, 33) is the character after the | symbol:
// @ConfigProperty(name = "greet|ing.number", defaultValue="0")
info = getActualHover(new Position(26, 33));
MicroProfileAssert.assertHover("greeting.number", "2001", 26, 28, 43, info);
MicroProfileAssert.saveFile(PsiMicroProfileProject.APPLICATION_YAML_FILE, "greeting:\n" + " message: message from yaml",
javaProject);
// fallback to application.properties
info = getActualHover(new Position(26, 33));
MicroProfileAssert.assertHover("greeting.number", "100", 26, 28, 43, info);
}
@Test
public void testConfigPropertyNameYaml() throws Exception {
MicroProfileAssert.saveFile(PsiMicroProfileProject.APPLICATION_YAML_FILE,
"greeting:\n" + " message: message from yaml\n" + " number: 2001", javaProject);
MicroProfileAssert.saveFile(PsiMicroProfileProject.APPLICATION_PROPERTIES_FILE,
"greeting.message = hello\r\n" + "greeting.name = quarkus\r\n" + "greeting.number = 100", javaProject);
// Position(14, 40) is the character after the | symbol:
// @ConfigProperty(name = "greeting.mes|sage")
Hover info = getActualHover(new Position(14, 40));
MicroProfileAssert.assertHover("greeting.message", "message from yaml", 14, 28, 44, info);
// Position(26, 33) is the character after the | symbol:
// @ConfigProperty(name = "greet|ing.number", defaultValue="0")
info = getActualHover(new Position(26, 33));
MicroProfileAssert.assertHover("greeting.number", "2001", 26, 28, 43, info);
MicroProfileAssert.saveFile(PsiMicroProfileProject.APPLICATION_YAML_FILE, "greeting:\n" + " message: message from yaml",
javaProject);
// fallback to application.properties
info = getActualHover(new Position(26, 33));
MicroProfileAssert.assertHover("greeting.number", "100", 26, 28, 43, info);
}
/**
* Create the hover from the given markup content list and range.
*
* @param values the list of documentation values
* @param defaultRange the default range.
* @return the hover from the given markup content list and range.
*/
public static Hover createHover(List<MarkupContent> values, Range defaultRange) {
if (values.isEmpty()) {
return null;
}
if (values.size() == 1) {
return new Hover(values.get(0), defaultRange);
}
// Markup kind
boolean hasMarkdown = values.stream() //
.anyMatch(contents -> MarkupKind.MARKDOWN.equals(contents.getKind()));
String markupKind = hasMarkdown ? MarkupKind.MARKDOWN : MarkupKind.PLAINTEXT;
// Contents
String content = createContent(values, markupKind);
// Range
Range range = defaultRange;
return new Hover(new MarkupContent(markupKind, content), range);
}
/**
* Returns the LSP hover from the hovered element.
*
* @param hoverRequest the hover request.
* @param tagRange the tag range
* @param open true if it's the start tag which is hovered and false if
* it's the end tag.
* @return the LSP hover from the hovered element.
*/
private Hover getTagHover(HoverRequest hoverRequest, Range tagRange, boolean open) {
hoverRequest.setHoverRange(tagRange);
hoverRequest.setOpen(open);
List<Hover> hovers = new ArrayList<>();
for (IHoverParticipant participant : extensionsRegistry.getHoverParticipants()) {
try {
Hover hover = participant.onTag(hoverRequest);
if (hover != null) {
hovers.add(hover);
}
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "While performing IHoverParticipant#onTag", e);
}
}
return mergeHover(hovers, tagRange);
}
/**
* Returns the LSP hover from the hovered attribute.
*
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @return the LSP hover from the hovered attribute.
*/
private Hover getAttrNameHover(HoverRequest hoverRequest, Range attrRange) {
hoverRequest.setHoverRange(attrRange);
List<Hover> hovers = new ArrayList<>();
for (IHoverParticipant participant : extensionsRegistry.getHoverParticipants()) {
try {
Hover hover = participant.onAttributeName(hoverRequest);
if (hover != null) {
hovers.add(hover);
}
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "While performing IHoverParticipant#onAttributeName", e);
}
}
return mergeHover(hovers, attrRange);
}
/**
* Returns the LSP hover from the hovered attribute.
*
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @return the LSP hover from the hovered attribute.
*/
private Hover getAttrValueHover(HoverRequest hoverRequest, Range attrRange) {
hoverRequest.setHoverRange(attrRange);
List<Hover> hovers = new ArrayList<>();
for (IHoverParticipant participant : extensionsRegistry.getHoverParticipants()) {
try {
Hover hover = participant.onAttributeValue(hoverRequest);
if (hover != null) {
hovers.add(hover);
}
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "While performing IHoverParticipant#onAttributeValue", e);
}
}
return mergeHover(hovers, attrRange);
}
/**
* Returns the LSP hover from the hovered text.
*
* @param hoverRequest the hover request.
* @param attrRange the attribute range
* @return the LSP hover from the hovered text.
*/
private Hover getTextHover(HoverRequest hoverRequest, Range textRange) {
hoverRequest.setHoverRange(textRange);
List<Hover> hovers = new ArrayList<>();
for (IHoverParticipant participant : extensionsRegistry.getHoverParticipants()) {
try {
Hover hover = participant.onText(hoverRequest);
if (hover != null) {
hovers.add(hover);
}
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "While performing IHoverParticipant#onText", e);
}
}
return mergeHover(hovers, textRange);
}
@Test
public void testHoverVariable() throws Exception {
//given
//Hover on args parameter
String argParam = createHoverRequest("src/java/Foo.java", 7, 37);
TextDocumentPositionParams position = getParams(argParam);
//when
Hover hover = handler.hover(position, monitor);
//then
assertNotNull(hover);
assertNotNull(hover.getContents());
MarkedString signature = hover.getContents().getLeft().get(0).getRight();
assertEquals("Unexpected hover " + signature, "java", signature.getLanguage());
assertEquals("Unexpected hover " + signature, "String[] args - java.Foo.main(String[])", signature.getValue());
}
@Override
public Hover onText(IHoverRequest request) throws Exception {
DOMNode node = request.getNode();
if (!node.isText()) {
return null;
}
// Hover is done in a text node, check if it's a entity reference
DOMDocument document = request.getXMLDocument();
int offset = request.getOffset();
EntityReferenceRange entityRange = XMLPositionUtility.selectEntityReference(offset, document);
if (entityRange == null) {
return null;
}
// The hovered text follows the entity reference syntax (ex : &)
String entityName = entityRange.getName();
Range range = entityRange.getRange();
// Try to find the entity
MarkupContent entityContents = searchInEntities(entityName, range, document, request);
if (entityContents != null) {
return new Hover(entityContents, range);
}
return null;
}
@Override
public Hover onTag(IHoverRequest hoverRequest) throws Exception {
try {
ContentModelManager contentModelManager = hoverRequest.getComponent(ContentModelManager.class);
DOMElement element = (DOMElement) hoverRequest.getNode();
Collection<CMDocument> cmDocuments = contentModelManager.findCMDocument(element);
if (cmDocuments.isEmpty()) {
// no bound grammar -> no documentation
return null;
}
// Compute element declaration documentation from bound grammars
List<MarkupContent> contentValues = new ArrayList<>();
for (CMDocument cmDocument : cmDocuments) {
CMElementDeclaration cmElement = cmDocument.findCMElement(element);
if (cmElement != null) {
MarkupContent content = XMLGenerator.createMarkupContent(cmElement, hoverRequest);
fillHoverContent(content, contentValues);
}
}
return createHover(contentValues);
} catch (CacheResourceDownloadingException e) {
return getCacheWarningHover(e, hoverRequest);
}
}
@Test
public void testInvalidJavadoc() throws Exception {
importProjects("maven/aspose");
IProject project = null;
ICompilationUnit unit = null;
try {
project = ResourcesPlugin.getWorkspace().getRoot().getProject("aspose");
IJavaProject javaProject = JavaCore.create(project);
IType type = javaProject.findType("org.sample.TestJavadoc");
unit = type.getCompilationUnit();
unit.becomeWorkingCopy(null);
String uri = JDTUtils.toURI(unit);
TextDocumentIdentifier textDocument = new TextDocumentIdentifier(uri);
TextDocumentPositionParams position = new TextDocumentPositionParams(textDocument, new Position(8, 24));
Hover hover = handler.hover(position, monitor);
assertNotNull(hover);
assertNotNull(hover.getContents());
assertEquals(1, hover.getContents().getLeft().size());
assertEquals("com.aspose.words.Document.Document(String fileName) throws Exception", hover.getContents().getLeft().get(0).getRight().getValue());
} finally {
if (unit != null) {
unit.discardWorkingCopy();
}
}
}
@Test
public void testHoverOnJavadocWithLinkToMethodInClass() throws Exception {
importProjects("maven/salut");
project = WorkspaceHelper.getProject("salut");
handler = new HoverHandler(preferenceManager);
//given
String payload = createHoverRequest("src/main/java/java/Foo2.java", 18, 25);
TextDocumentPositionParams position = getParams(payload);
// when
Hover hover = handler.hover(position, monitor);
assertNotNull("Hover is null", hover);
assertEquals("Unexpected hover contents:\n" + hover.getContents(), 2, hover.getContents().getLeft().size());
Either<String, MarkedString> javadoc = hover.getContents().getLeft().get(1);
String content = null;
assertTrue("javadoc has null content", javadoc != null && javadoc.getLeft() != null && (content = javadoc.getLeft()) != null);
assertMatches("\\[newMethodBeingLinkedToo\\]\\(file:/.*/salut/src/main/java/java/Foo2.java#23\\)", content);
}
public CompletableFuture<Hover> getHover(Position position) {
try {
ParserFileHelper parserFileHelper = new ParserFileHelperFactory().getCorrespondingParserFileHelper(textDocumentItem, position.getLine());
if (parserFileHelper != null){
String camelComponentUri = parserFileHelper.getCamelComponentUri(textDocumentItem, position);
String componentName = StringUtils.asComponentName(camelComponentUri);
if (componentName != null) {
CamelURIInstance camelURIInstance = parserFileHelper.createCamelURIInstance(textDocumentItem, position, camelComponentUri);
int positionInCamelUri = parserFileHelper.getPositionInCamelURI(textDocumentItem, position);
CamelUriElementInstance elem = camelURIInstance.getSpecificElement(positionInCamelUri);
return camelCatalog.thenApply(new HoverFuture(elem));
}
}
} catch (Exception e) {
LOGGER.error("Error searching hover", e);
}
return CompletableFuture.completedFuture(null);
}
@Test
public void testHoverPackage() throws Exception {
// given
// Hovers on the java.internal package
String payload = createHoverRequest("src/java/Baz.java", 2, 16);
TextDocumentPositionParams position = getParams(payload);
// when
Hover hover = handler.hover(position, monitor);
// then
assertNotNull(hover);
String signature = hover.getContents().getLeft().get(0).getRight().getValue();//
assertEquals("Unexpected signature ", "java.internal", signature);
String result = hover.getContents().getLeft().get(1).getLeft();//
assertEquals("Unexpected hover ", "this is a **bold** package!", result);
}
@Test
public void testEmptyHover() throws Exception {
//given
//Hovers on the System.out
URI standalone = Paths.get("projects", "maven", "salut", "src", "main", "java", "java", "Foo.java").toUri();
String payload = createHoverRequest(standalone, 1, 2);
TextDocumentPositionParams position = getParams(payload);
//when
Hover hover = handler.hover(position, monitor);
//then
assertNotNull(hover);
assertNotNull(hover.getContents());
assertEquals(1, hover.getContents().getLeft().size());
assertEquals("Should find empty hover for " + payload, "", hover.getContents().getLeft().get(0).getLeft());
}
@Override
public CompletableFuture<Hover> hover(TextDocumentPositionParams position) {
/*
* LOGGER.debug("hover: {}", position.getTextDocument()); TextDocumentItem
* textDocumentItem = openedDocuments.get(position.getTextDocument().getUri());
* String htmlContent = new
* HoverProcessor(textDocumentItem).getHover(position.getPosition()); Hover
* hover = new Hover();
* hover.setContents(Collections.singletonList((Either.forLeft(htmlContent))));
* LOGGER.debug("hover: {}", position.getTextDocument()); Hover hover = new
* Hover(); hover.setContents(Collections.singletonList((Either.
* forLeft("HELLO HOVER WORLD!!!!"))));
*/
Hover result = null;
return CompletableFuture.completedFuture(result);
}
@Test
public void testHover() throws Exception {
URI fileURI = openFile("maven/salut4", "src/main/java/java/TestJavadoc.java");
String fileUri = ResourceUtils.fixURI(fileURI);
TextDocumentIdentifier identifier = new TextDocumentIdentifier(fileUri);
HoverParams params = new HoverParams(identifier, new Position(8, 23));
Hover result = server.hover(params).join();
assertNotNull(result);
assertNotNull(result.getContents());
assertTrue(result.getContents().isLeft());
List<Either<String, MarkedString>> list = result.getContents().getLeft();
assertNotNull(list);
assertEquals(2, list.size());
assertTrue(list.get(1).isLeft());
assertEquals("Test", list.get(1).getLeft());
}
@Test
public void testHoverUnresolvedType() throws Exception {
URI fileURI = openFile("maven/salut4", "src/main/java/java/Foo.java");
String fileUri = ResourceUtils.fixURI(fileURI);
TextDocumentIdentifier identifier = new TextDocumentIdentifier(fileUri);
HoverParams params = new HoverParams(identifier, new Position(7, 30));
Hover result = server.hover(params).join();
assertNotNull(result);
assertNotNull(result.getContents());
assertTrue(result.getContents().isLeft());
List<Either<String, MarkedString>> list = result.getContents().getLeft();
assertNotNull(list);
assertEquals(2, list.size());
assertTrue(list.get(1).isLeft());
assertEquals("This is interface IFoo.", list.get(1).getLeft());
}
@Test
public void testHoverOnPackageWithJavadoc() throws Exception {
importProjects("maven/salut2");
project = WorkspaceHelper.getProject("salut2");
handler = new HoverHandler(preferenceManager);
//given
//Hovers on the org.apache.commons import
String payload = createHoverRequest("src/main/java/foo/Bar.java", 2, 22);
TextDocumentPositionParams position = getParams(payload);
//when
Hover hover = handler.hover(position, monitor);
assertNotNull(hover);
String result = hover.getContents().getLeft().get(0).getRight().getValue();//
assertEquals("Unexpected hover ", "org.apache.commons", result);
assertEquals(logListener.getErrors().toString(), 0, logListener.getErrors().size());
}
@Override
public CompletableFuture<Hover> hover(TextDocumentPositionParams params) {
URI uri = URI.create(params.getTextDocument().getUri());
recompileIfContextChanged(uri);
HoverProvider provider = new HoverProvider(astVisitor);
return provider.provideHover(params.getTextDocument(), params.getPosition());
}
/**
* Compute the hover. Executed in a read request.
* @since 2.20
*/
protected Hover hover(HoverParams params, CancelIndicator cancelIndicator) {
URI uri = getURI(params);
IHoverService hoverService = getService(uri, IHoverService.class);
if (hoverService == null) {
return IHoverService.EMPTY_HOVER;
}
return workspaceManager.<Hover>doRead(uri,
(document, resource) -> hoverService.hover(document, resource, params, cancelIndicator));
}
protected static @Nullable String getHoverString(Hover hover) {
Either<List<Either<String, MarkedString>>, MarkupContent> hoverContent = hover.getContents();
if (hoverContent.isLeft()) {
List<Either<String, MarkedString>> contents = hoverContent.getLeft();
if (contents == null || contents.isEmpty()) {
return null;
}
return contents.stream().map(content -> {
if (content.isLeft()) {
return content.getLeft();
} else if (content.isRight()) {
MarkedString markedString = content.getRight();
// TODO this won't work fully until markup parser will support syntax
// highlighting but will help display
// strings with language tags, e.g. without it things after <?php tag aren't
// displayed
if (markedString.getLanguage() != null && !markedString.getLanguage().isEmpty()) {
return String.format("```%s%n%s%n```", markedString.getLanguage(), markedString.getValue()); //$NON-NLS-1$
} else {
return markedString.getValue();
}
} else {
return ""; //$NON-NLS-1$
}
}).filter(((Predicate<String>) String::isEmpty).negate()).collect(Collectors.joining("\n\n")); //$NON-NLS-1$ )
} else {
return hoverContent.getRight().getValue();
}
}
private void collectHover(String uri, PsiFile typeRoot, PsiElement hoverElement, IPsiUtils utils,
Position hoverPosition, DocumentFormat documentFormat, List<Hover> hovers) {
try {
VirtualFile file = utils.findFile(uri);
if (file != null) {
Module module = utils.getModule(file);
if (module != null) {
// Collect all adapted hover participant
JavaHoverContext context = new JavaHoverContext(uri, typeRoot, utils, module, hoverElement, hoverPosition,
documentFormat);
List<IJavaHoverParticipant> definitions = IJavaHoverParticipant.EP_NAME.extensions()
.filter(definition -> definition.isAdaptedForHover(context)).collect(Collectors.toList());
if (definitions.isEmpty()) {
return;
}
// Begin, collect, end participants
definitions.forEach(definition -> definition.beginHover(context));
definitions.forEach(definition -> {
Hover hover = definition.collectHover(context);
if (hover != null) {
hovers.add(hover);
}
});
definitions.forEach(definition -> definition.endHover(context));
}
}
} catch (IOException e) {
LOGGER.error(e.getLocalizedMessage(), e);
}
}
private Hover getActualHover(Position hoverPosition) {
MicroProfileJavaHoverParams params = new MicroProfileJavaHoverParams();
params.setDocumentFormat(DocumentFormat.Markdown);
params.setPosition(hoverPosition);
params.setUri(javaFileUri);
return PropertiesManagerForJava.getInstance().hover(params, PsiUtilsImpl.getInstance());
}
@Test
public void testHoverUnresolvedType() throws Exception {
importProjects("eclipse/unresolvedtype");
project = WorkspaceHelper.getProject("unresolvedtype");
handler = new HoverHandler(preferenceManager);
//given
//Hovers on the IFoo
String payload = createHoverRequest("src/pckg/Foo.java", 2, 31);
TextDocumentPositionParams position = getParams(payload);
// when
Hover hover = handler.hover(position, monitor);
assertNotNull(hover);
assertTrue("Unexpected hover ", hover.getContents().getLeft().isEmpty());
}
@Test
public void testMissingUnit() throws Exception {
URI uri = Paths.get("projects", "maven", "salut", "src", "main", "java", "java", "Missing.java").toUri();
String payload = createHoverRequest(uri, 0, 0);
TextDocumentPositionParams position = getParams(payload);
//when
Hover hover = handler.hover(position, monitor);
//then
assertNotNull(hover);
assertNotNull(hover.getContents());
assertEquals(1, hover.getContents().getLeft().size());
assertEquals("Should find empty hover for " + payload, "", hover.getContents().getLeft().get(0).getLeft());
}
public static void assertHover(String expectedKey, String expectedValue, int expectedLine, int expectedStartOffset,
int expectedEndOffset, Hover actualInfo) {
Assert.assertNotNull(actualInfo);
Position expectedStart = new Position(expectedLine, expectedStartOffset);
Position expectedEnd = new Position(expectedLine, expectedEndOffset);
Range expectedRange = new Range(expectedStart, expectedEnd);
MarkupContent expectedContent = MicroProfileConfigHoverParticipant.getDocumentation(expectedKey, expectedValue,
DocumentFormat.Markdown, true);
Assert.assertEquals(expectedContent, actualInfo.getContents().getRight());
Assert.assertEquals(expectedRange, actualInfo.getRange());
}
public void write(final JsonWriter out, final Hover value) throws IOException {
if (value == null) {
out.nullValue();
return;
}
out.beginObject();
out.name("contents");
writeContents(out, value.getContents());
out.name("range");
writeRange(out, value.getRange());
out.endObject();
}
protected Hover hover(HoverContext context) {
if (context == null) {
return IHoverService.EMPTY_HOVER;
}
MarkupContent contents = getMarkupContent(context);
if (contents == null) {
return IHoverService.EMPTY_HOVER;
}
Range range = getRange(context);
if (range == null) {
return IHoverService.EMPTY_HOVER;
}
return new Hover(contents, range);
}
public static Hover computeHoverResponse(DOMAttr attribute, IHoverRequest request) {
String name = attribute.getName();
if(!name.startsWith(request.getXMLDocument().getSchemaInstancePrefix() + ":")) {
return null;
}
DOMDocument document = request.getXMLDocument();
DOMElement root = document.getDocumentElement();
String doc = null;
if(root != null) {
if(root.equals(document.findNodeAt(attribute.getStart()))) {
if(name.endsWith(":schemaLocation")) {
doc = SCHEMA_LOCATION_DOC;
}
else if(name.endsWith(":noNamespaceSchemaLocation")) {
doc = NO_NAMESPACE_SCHEMA_LOCATION_DOC;
}
}
} else {
return null;
}
if(doc == null) {
if(name.endsWith(":nil")) {
doc = NIL_DOC;
}
else if(name.endsWith(":type")) {
doc = TYPE_DOC;
}
else {
return null;
}
}
MarkupContent content = new MarkupContent();
content.setKind(MarkupKind.MARKDOWN);
content.setValue(doc);
return new Hover(content);
}