下面列出了怎么用org.eclipse.lsp4j.ReferenceContext的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public void findReference(DOMDocument document, Position position, ReferenceContext context,
List<Location> locations, CancelChecker cancelChecker) {
if (!match(document)) {
return;
}
try {
int offset = document.offsetAt(position);
DOMNode node = document.findNodeAt(offset);
if (node != null) {
findReferences(node, position, offset, context, locations, cancelChecker);
}
} catch (BadLocationException e) {
}
}
public static void testReferencesFor(String value, String fileURI, Location... expected)
throws BadLocationException {
int offset = value.indexOf('|');
value = value.substring(0, offset) + value.substring(offset + 1);
TextDocument document = new TextDocument(value, fileURI != null ? fileURI : "test://test/test.xml");
Position position = document.positionAt(offset);
XMLLanguageService xmlLanguageService = new XMLLanguageService();
ContentModelSettings settings = new ContentModelSettings();
settings.setUseCache(false);
xmlLanguageService.doSave(new SettingsSaveContext(settings));
DOMDocument xmlDocument = DOMParser.getInstance().parse(document,
xmlLanguageService.getResolverExtensionManager());
xmlLanguageService.setDocumentProvider((uri) -> xmlDocument);
List<? extends Location> actual = xmlLanguageService.findReferences(xmlDocument, position,
new ReferenceContext(), () -> {
});
assertLocation(actual, expected);
}
@Test
public void testReference(){
URI uri = project.getFile("src/java/Foo2.java").getRawLocationURI();
String fileURI = ResourceUtils.fixURI(uri);
ReferenceParams param = new ReferenceParams();
param.setPosition(new Position(5,16));
param.setContext(new ReferenceContext(true));
param.setTextDocument( new TextDocumentIdentifier(fileURI));
List<Location> references = handler.findReferences(param, monitor);
assertNotNull("findReferences should not return null",references);
assertEquals(1, references.size());
Location l = references.get(0);
String refereeUri = ResourceUtils.fixURI(project.getFile("src/java/Foo3.java").getRawLocationURI());
assertEquals(refereeUri, l.getUri());
}
public List<? extends Location> findReferences(DOMDocument document, Position position, ReferenceContext context,
CancelChecker cancelChecker) {
List<Location> locations = new ArrayList<>();
for (IReferenceParticipant participant : extensionsRegistry.getReferenceParticipants()) {
participant.findReference(document, position, context, locations, cancelChecker);
}
return locations;
}
@Override
protected void findReferences(DOMNode node, Position position, int offset, ReferenceContext context,
List<Location> locations, CancelChecker cancelChecker) {
// DTD reference works only when references is done on an <!ELEMENT name
if (!node.isDTDElementDecl()) {
return;
}
DTDElementDecl elementDecl = (DTDElementDecl) node;
if (!elementDecl.isInNameParameter(offset)) {
return;
}
DTDUtils.searchDTDOriginElementDecls(elementDecl,
(origin, target) -> locations.add(XMLPositionUtility.createLocation(origin)), cancelChecker);
}
@Override
protected void findReferences(DOMNode node, Position position, int offset, ReferenceContext context,
List<Location> locations, CancelChecker cancelChecker) {
DOMAttr attr = node.findAttrAt(offset);
if (attr != null) {
node = attr;
}
XSDUtils.searchXSOriginAttributes(node,
(origin, target) -> locations.add(XMLPositionUtility.createLocation(origin.getNodeAttrValue())),
cancelChecker);
}
@Override public IStatus run(IProgressMonitor monitor) {
startTime = System.currentTimeMillis();
// Cancel last references future if needed.
if (references != null) {
references.cancel(true);
}
AbstractTextSearchResult textResult = (AbstractTextSearchResult) getSearchResult();
textResult.removeAll();
try {
// Execute LSP "references" service
ReferenceParams params = new ReferenceParams();
params.setContext(new ReferenceContext(true));
params.setTextDocument(new TextDocumentIdentifier(info.getFileUri().toString()));
params.setPosition(position);
info.getInitializedLanguageClient().thenCompose(languageServer -> ((RLSServerInterface) languageServer).implementations(params)).thenAccept(locs -> {
// Loop for each LSP Location and convert it to Match search.
for (Location loc : locs) {
Match match = toMatch(loc);
result.addMatch(match);
}
});
return Status.OK_STATUS;
} catch (Exception ex) {
return new Status(IStatus.ERROR, LanguageServerPlugin.getDefault().getBundle().getSymbolicName(), ex.getMessage(), ex);
}
}
@Test
public void testEmpty(){
ReferenceParams param = new ReferenceParams();
param.setPosition(new Position(1, 1));
param.setContext(new ReferenceContext(false));
param.setTextDocument( new TextDocumentIdentifier("/foo/bar"));
List<Location> references = handler.findReferences(param, monitor);
assertNotNull(references);
assertTrue("references are not empty", references.isEmpty());
}
public List<? extends Location> findReferences(DOMDocument xmlDocument, Position position, ReferenceContext context,
CancelChecker cancelChecker) {
return reference.findReferences(xmlDocument, position, context, cancelChecker);
}
public ReferenceParams(@NonNull final TextDocumentIdentifier textDocument, @NonNull final Position position, @NonNull final ReferenceContext context) {
super(textDocument, position);
this.context = Preconditions.<ReferenceContext>checkNotNull(context, "context");
}
@Deprecated
public ReferenceParams(@NonNull final ReferenceContext context) {
this.context = Preconditions.<ReferenceContext>checkNotNull(context, "context");
}
@Pure
@NonNull
public ReferenceContext getContext() {
return this.context;
}
public void setContext(@NonNull final ReferenceContext context) {
this.context = Preconditions.checkNotNull(context, "context");
}
/**
* Find the references
*
* @param node
* @param position
* @param offset
* @param locations
* @param cancelChecker
*/
protected abstract void findReferences(DOMNode node, Position position, int offset, ReferenceContext context,
List<Location> locations, CancelChecker cancelChecker);
void findReference(DOMDocument document, Position position, ReferenceContext context, List<Location> locations, CancelChecker cancelChecker);