下面列出了怎么用org.eclipse.jface.text.hyperlink.IHyperlink的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Method copied from super class with only a minor change: call to "readOnly" changed to "tryReadOnly".
*/
@Override
public IHyperlink[] detectHyperlinks(final ITextViewer textViewer, final IRegion region,
final boolean canShowMultipleHyperlinks) {
final IDocument xtextDocument = textViewer.getDocument();
if (!(xtextDocument instanceof N4JSDocument)) {
return super.detectHyperlinks(textViewer, region, canShowMultipleHyperlinks);
}
final IHyperlinkHelper helper = getHelper();
return ((N4JSDocument) xtextDocument).tryReadOnly(new IUnitOfWork<IHyperlink[], XtextResource>() {
@Override
public IHyperlink[] exec(XtextResource resource) throws Exception {
resource = tryConvertToFileResource(resource);
if (resource == null) {
return null;
}
if (helper instanceof ISourceViewerAware && textViewer instanceof ISourceViewer) {
((ISourceViewerAware) helper).setSourceViewer((ISourceViewer) textViewer);
}
return helper.createHyperlinksByOffset(resource, region.getOffset(), canShowMultipleHyperlinks);
}
}, (IHyperlink[]) null);
}
@Override
public IHyperlink[] getHyperlinks(XtextResource resource, int offset) {
EObject eObject = eObjectAtOffsetHelper.resolveElementAt(resource, offset);
Pair<SafeURI<?>, Region> linkedProjectWithRegion = getUriRegionPair(eObject);
if (linkedProjectWithRegion != null) {
URI uri = linkedProjectWithRegion.getFirst().toURI();
IRegion region = linkedProjectWithRegion.getSecond();
IN4JSProject uriProject = model.findProject(uri).orNull();
String lnkName = uriProject == null ? ProjectDescriptionUtils.deriveN4JSProjectNameFromURI(uri)
: uriProject.getProjectName().getRawName();
XtextHyperlink hyperlink = hyperlinkProvider.get();
hyperlink.setHyperlinkRegion(region);
hyperlink.setURI(uri);
hyperlink.setHyperlinkText(lnkName);
return new IHyperlink[] { hyperlink };
}
return null;
}
@Override
public IHyperlink[] createHyperlinksByOffset(XtextResource resource, int offset, boolean createMultipleHyperlinks) {
List<IHyperlink> links = new LinkedList<>();
Collection<IJSONHyperlinkHelperExtension> hyperlinkHelperExtensions = registry.getHyperlinkHelperExtensions();
for (IJSONHyperlinkHelperExtension hhExt : hyperlinkHelperExtensions) {
IHyperlink[] hyperlinks = null;
if (hhExt.isResponsible(resource)) {
hyperlinks = hhExt.getHyperlinks(resource, offset);
}
if (hyperlinks == null) {
continue;
}
List<IHyperlink> hyperlinkList = Arrays.asList(hyperlinks);
links.addAll(hyperlinkList);
}
if (links.isEmpty()) {
return null;
}
return links.toArray(new IHyperlink[links.size()]);
}
@Test public void testCreateHyperlinksByOffset_06() {
assertNull(helper.createHyperlinksByOffset(resource, model.indexOf(":EObject]"), true));
int idx = model.indexOf("EObject]");
int length = "EObject".length();
for(int i = idx; i <= length; i++) {
IHyperlink[] hyperlinks = helper.createHyperlinksByOffset(resource, i, true);
assertNotNull(hyperlinks);
assertEquals(1, hyperlinks.length);
assertTrue(hyperlinks[0] instanceof XtextHyperlink);
XtextHyperlink hyperLink = (XtextHyperlink) hyperlinks[0];
assertEquals("EObject".length(), hyperLink.getHyperlinkRegion().getLength());
assertEquals(
grammar.eResource().getResourceSet().getURIConverter().normalize(
EcoreUtil.getURI(EcorePackage.eINSTANCE.getEObject())), hyperLink.getURI());
}
}
/**
* detectHyperlinks
*
* @param editor
* @param region
* @param canShowMultipleHyperlinks
* @return
*/
public IHyperlink[] detectHyperlinks(AbstractThemeableEditor editor, IRegion region,
boolean canShowMultipleHyperlinks)
{
IHyperlink[] result = null;
if (editor != null && region != null)
{
// grab AST
IParseNode ast = editor.getAST();
if (ast instanceof JSParseRootNode)
{
// gather links
result = processAST(editor, (JSParseRootNode) ast, region.getOffset());
}
}
if (!canShowMultipleHyperlinks && !ArrayUtil.isEmpty(result))
{
result = new IHyperlink[] { result[0] };
}
return result;
}
protected IHyperlink[] makeNullsafe(IHyperlink[] hyperlinks) {
if (Arrays.stream(hyperlinks).anyMatch(hyperLink -> (hyperLink == null || hyperLink.getHyperlinkRegion() == null))) {
List<IHyperlink> nullSafeList = new ArrayList<>();
Arrays.stream(hyperlinks).forEach(hyperLink -> {
if (hyperLink != null && hyperLink.getHyperlinkRegion() != null) {
nullSafeList.add(hyperLink);
} else {
Class<? extends IHyperlink> clazz = null;
if (hyperLink != null) {
clazz = hyperLink.getClass();
}
String name = null;
if (clazz != null) {
name = clazz.getName();
}
log.warn("Filtered invalid hyperlink: " + name);
}
});
return nullSafeList.toArray(new IHyperlink[nullSafeList.size()]);
}
return hyperlinks;
}
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
XtextEditor xtextEditor = EditorUtils.getActiveXtextEditor(event);
if (xtextEditor != null) {
ITextSelection selection = (ITextSelection) xtextEditor.getSelectionProvider().getSelection();
IRegion region = new Region(selection.getOffset(), selection.getLength());
ISourceViewer internalSourceViewer = xtextEditor.getInternalSourceViewer();
IHyperlink[] hyperlinks = getDetector().detectHyperlinks(internalSourceViewer, region, false);
if (hyperlinks != null && hyperlinks.length > 0) {
IHyperlink hyperlink = hyperlinks[0];
hyperlink.open();
}
}
return null;
}
/**
* If multiple links are requested, all ambiguous candidates are provided for feature and constructor calls.
*/
@Override
public IHyperlink[] createHyperlinksByOffset(XtextResource resource, int offset, boolean createMultipleHyperlinks) {
List<IHyperlink> links = Lists.newArrayList();
IHyperlinkAcceptor acceptor = new XbaseHyperlinkAcceptor(links, createMultipleHyperlinks);
super.createHyperlinksByOffset(resource, offset, acceptor);
INode crossRefNode = getEObjectAtOffsetHelper().getCrossReferenceNode(resource, new TextRegion(offset, 0));
if (crossRefNode == null) {
this.createHyperlinksByOffset(resource, offset, acceptor);
} else {
this.createHyperlinksForCrossRef(resource, crossRefNode, acceptor);
}
if (!links.isEmpty())
return Iterables.toArray(links, IHyperlink.class);
return null;
}
protected void addOpenInferredTypeHyperlink(final XtextResource resource, JvmIdentifiableElement typedElement,
ILeafNode node, final IHyperlinkAcceptor acceptor) {
IResolvedTypes resolveTypes = typeResolver.resolveTypes(resource);
final LightweightTypeReference type = resolveTypes.getActualType(typedElement);
if (type != null && !type.isUnknown() && type.getType() != null) {
createHyperlinksTo(resource, new Region(node.getOffset(), node.getLength()), type.getType(), new IHyperlinkAcceptor() {
@Override
public void accept(IHyperlink hyperlink) {
if (hyperlink instanceof AbstractHyperlink) {
AbstractHyperlink abstractHyperlink = (AbstractHyperlink) hyperlink;
abstractHyperlink.setHyperlinkText("Open Inferred Type - " + type.getSimpleName());
abstractHyperlink.setTypeLabel(SingleHoverShowingHyperlinkPresenter.SHOW_ALWAYS);
}
acceptor.accept(hyperlink);
}
});
}
}
@Test public void testComputeHyperlink_1() throws Exception {
String content = "package foo class Foo { def b|ar(String a) {} }";
XtextEditor xtextEditor = openEditor(content.replace("|", ""));
int offset = content.indexOf("|");
IHyperlink[] detectHyperlinks = hyperlinkDetector.detectHyperlinks(xtextEditor.getInternalSourceViewer(), new Region(offset,1), true);
assertEquals(2, detectHyperlinks.length);
IHyperlink hyperlink = detectHyperlinks[0];
assertTrue(hyperlink instanceof JdtHyperlink);
JdtHyperlink casted = (JdtHyperlink) hyperlink;
assertEquals(offset -1, casted.getHyperlinkRegion().getOffset());
assertEquals(3, casted.getHyperlinkRegion().getLength());
IJavaElement element = ((JdtHyperlink) hyperlink).getJavaElement();
assertTrue(element instanceof IType);
assertEquals("Object", element.getElementName());
assertEquals("Open Inferred Type - Object", casted.getHyperlinkText());
}
@Test public void testComputeHyperlink_1() throws Exception {
String content = "package foo class Foo implements IBar { override bar(String a) { b|ar('foo') } } interface IBar { def String bar(String a) }";
XtextEditor xtextEditor = openEditor(content.replace("|", ""));
int offset = content.indexOf("|");
IHyperlink[] detectHyperlinks = hyperlinkDetector.detectHyperlinks(xtextEditor.getInternalSourceViewer(), new Region(offset,1), true);
XbaseImplementatorsHyperlink casted = null;
for (IHyperlink iHyperlink : detectHyperlinks) {
if (iHyperlink instanceof XbaseImplementatorsHyperlink) {
casted = (XbaseImplementatorsHyperlink) iHyperlink;
}
}
@SuppressWarnings("null")
Field field = casted.getClass().getDeclaredField("opener");
field.setAccessible(true);
TestJvmImplementationOpener testOpener = new TestJvmImplementationOpener();
field.set(casted, testOpener);
casted.open();
assertTrue(testOpener.isOpenInEditor);
assertFalse(testOpener.isOpenQuickHierarchy);
}
@Test public void testComputeHyperlink_2() throws Exception {
String content = "package foo interface IBar {def void bar(String a)} class Foo implements IBar { override bar(String a){ val IBar x = null; x.b|ar('foo'} } class Foo2 implements IBar { override bar(String a) {} }";
XtextEditor xtextEditor = openEditor(content.replace("|", ""));
int offset = content.indexOf("|");
IHyperlink[] detectHyperlinks = hyperlinkDetector.detectHyperlinks(xtextEditor.getInternalSourceViewer(), new Region(offset,1), true);
XbaseImplementatorsHyperlink casted = null;
for (IHyperlink iHyperlink : detectHyperlinks) {
if (iHyperlink instanceof XbaseImplementatorsHyperlink) {
casted = (XbaseImplementatorsHyperlink) iHyperlink;
}
}
@SuppressWarnings("null")
Field field = casted.getClass().getDeclaredField("opener");
field.setAccessible(true);
TestJvmImplementationOpener testOpener = new TestJvmImplementationOpener();
field.set(casted, testOpener);
casted.open();
assertFalse(testOpener.isOpenInEditor);
assertTrue(testOpener.isOpenQuickHierarchy);
}
@Override
protected void addHyperlinks(List<IHyperlink> hyperlinksCollector, IRegion wordRegion, SelectionDispatchAction openAction, IJavaElement element, boolean qualify, JavaEditor editor) {
try {
if (element.getElementType() == IJavaElement.FIELD || element.getElementType() == IJavaElement.LOCAL_VARIABLE) {
String typeSignature= getTypeSignature(element);
if (!JavaModelUtil.isPrimitive(typeSignature) && SelectionConverter.canOperateOn(editor)) {
if (Signature.getTypeSignatureKind(typeSignature) == Signature.INTERSECTION_TYPE_SIGNATURE) {
String[] bounds= Signature.getIntersectionTypeBounds(typeSignature);
qualify|= bounds.length >= 2;
for (int i= 0; i < bounds.length; i++) {
hyperlinksCollector.add(new JavaElementDeclaredTypeHyperlink(wordRegion, openAction, element, bounds[i], qualify));
}
} else {
hyperlinksCollector.add(new JavaElementDeclaredTypeHyperlink(wordRegion, openAction, element, qualify));
}
}
}
} catch (JavaModelException e) {
JavaPlugin.log(e);
}
}
@Override
public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
JsonDocument document = (JsonDocument) textViewer.getDocument();
JsonPointer basePath = document.getPath(region);
if (!canDetect(basePath)) {
return null;
}
HyperlinkInfo info = getHyperlinkInfo(textViewer, region);
if (info == null) {
return null;
}
return doDetect(document, textViewer, info, basePath);
}
@Override
protected IHyperlink[] doDetect(JsonDocument doc, ITextViewer viewer, HyperlinkInfo info, JsonPointer pointer) {
Model model = doc.getModel();
AbstractNode node = model.find(pointer);
List<AbstractNode> nodes = model.findByType(JsonPointer.compile("/definitions/operation"));
Iterator<AbstractNode> it = nodes.iterator();
AbstractNode found = null;
while (it.hasNext() && found == null) {
AbstractNode current = it.next();
AbstractNode value = current.get("operationId");
if (value != null && Objects.equals(node.asValue().getValue(), value.asValue().getValue())) {
found = value;
}
}
if (found != null) {
IRegion target = doc.getRegion(found.getPointer());
if (target != null) {
return new IHyperlink[] { new SwaggerHyperlink(info.text, viewer, info.region, target) };
}
}
return null;
}
@Override
protected IHyperlink[] doDetect(JsonDocument doc, ITextViewer viewer, HyperlinkInfo info, JsonPointer pointer) {
Matcher matcher = PATTERN.matcher(pointer.toString());
String link = matcher.find() ? matcher.group(1) : null;
if (link != null) {
Model model = doc.getModel();
AbstractNode securityScheme = model.find("/components/securitySchemes/" + link);
if (securityScheme != null) {
IRegion target = doc.getRegion(securityScheme.getPointer());
if (target != null) {
return new IHyperlink[] { new SwaggerHyperlink(info.text, viewer, info.region, target) };
}
}
}
return null;
}
private EObject getTarget(XtextResource resource, IHyperlink hyperlink) {
final ResourceSet resourceSet = resource != null ? resource.getResourceSet() : null;
final URI uri = getURI(hyperlink);
final EObject target = resourceSet != null && uri != null && uri.fragment() != null
? resourceSet.getEObject(uri, true)
: null;
if (target instanceof SyntaxRelatedTElement)
return ((SyntaxRelatedTElement) target).getAstElement();
return target;
}
public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
ITextEditor textEditor= (ITextEditor)getAdapter(ITextEditor.class);
if (region == null || textEditor == null)
return null;
IEditorSite site= textEditor.getEditorSite();
if (site == null)
return null;
ITypeRoot javaElement= getInputJavaElement(textEditor);
if (javaElement == null)
return null;
CompilationUnit ast= SharedASTProvider.getAST(javaElement, SharedASTProvider.WAIT_NO, null);
if (ast == null)
return null;
ASTNode node= NodeFinder.perform(ast, region.getOffset(), 1);
if (!(node instanceof StringLiteral) && !(node instanceof SimpleName))
return null;
if (node.getLocationInParent() == QualifiedName.QUALIFIER_PROPERTY)
return null;
IRegion nlsKeyRegion= new Region(node.getStartPosition(), node.getLength());
AccessorClassReference ref= NLSHintHelper.getAccessorClassReference(ast, nlsKeyRegion);
if (ref == null)
return null;
String keyName= null;
if (node instanceof StringLiteral) {
keyName= ((StringLiteral)node).getLiteralValue();
} else {
keyName= ((SimpleName)node).getIdentifier();
}
if (keyName != null)
return new IHyperlink[] {new NLSKeyHyperlink(nlsKeyRegion, keyName, ref, textEditor)};
return null;
}
@Test public void testCreateHyperlinksByOffset_01() {
IHyperlink[] links = helper.createHyperlinksByOffset(resource, model.indexOf("common.Terminals"), true);
assertNotNull(links);
assertEquals(1, links.length);
assertTrue(links[0] instanceof XtextHyperlink);
assertEquals(model.indexOf("org.eclipse.xtext.common.Terminals"), links[0].getHyperlinkRegion().getOffset());
assertEquals("org.eclipse.xtext.common.Terminals".length(), links[0].getHyperlinkRegion().getLength());
checkHyperlink((XtextHyperlink) links[0]);
}
@Test public void testCreateHyperlinksByOffset_04() {
IHyperlink[] links = helper.createHyperlinksByOffset(resource, model.indexOf("TRING r"), true);
assertNotNull(links);
assertEquals(1, links.length);
assertTrue(links[0] instanceof XtextHyperlink);
XtextHyperlink hyperLink = (XtextHyperlink) links[0];
assertEquals(model.indexOf("STRING r"), hyperLink.getHyperlinkRegion().getOffset());
assertEquals("STRING".length(), hyperLink.getHyperlinkRegion().getLength());
assertEquals(
grammar.eResource().getResourceSet().getURIConverter().normalize(
EcoreUtil.getURI(GrammarUtil.findRuleForName(grammar.getUsedGrammars().get(0), "STRING"))), hyperLink.getURI());
}
@Test public void testCreateHyperlinksByOffset_07() {
assertNull(helper.createHyperlinksByOffset(resource, model.indexOf("Element*") - 1, true));
IHyperlink[] hyperlinks = helper.createHyperlinksByOffset(resource, model.indexOf("lement*"), true);
assertNotNull(hyperlinks);
assertEquals(1, hyperlinks.length);
assertTrue(hyperlinks[0] instanceof XtextHyperlink);
XtextHyperlink hyperLink = (XtextHyperlink) hyperlinks[0];
assertEquals(model.indexOf("Element*"), hyperLink.getHyperlinkRegion().getOffset());
assertEquals("Element".length(), hyperLink.getHyperlinkRegion().getLength());
assertEquals(
grammar.eResource().getResourceSet().getURIConverter().normalize(
EcoreUtil.getURI(GrammarUtil.findRuleForName(grammar, "Element"))), hyperLink.getURI());
}
@Override
public IHyperlinkDetector[] getHyperlinkDetectors(ISourceViewer sourceViewer) {
List<IHyperlinkDetector> detectors = new LinkedList<IHyperlinkDetector>();
IHyperlinkDetector[] inheritedDetectors = super.getHyperlinkDetectors(sourceViewer);
if (inheritedDetectors != null) {
for (final IHyperlinkDetector detector : inheritedDetectors) {
detectors.add(new IHyperlinkDetector() {
@Override
public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region,
boolean canShowMultipleHyperlinks) {
try {
IHyperlink[] result = detector.detectHyperlinks(textViewer, region, canShowMultipleHyperlinks);
// fail safe detector: don't return an empty array
// but null (see org.eclipse.jface.text.hyperlink.HyperlinkManager.findHyperlinks(IRegion))
if (result != null && result.length == 0) {
return null;
}
return result;
}
catch (Throwable e) {
// fail safe hyperlink detector - prevent others
// from failing
}
return null;
}
});
}
}
detectors.add(detector);
return detectors.toArray(new IHyperlinkDetector[detectors.size()]);
}
@Override
public IHyperlink[] createHyperlinksByOffset(XtextResource resource, int offset, boolean createMultipleHyperlinks) {
List<IHyperlink> links = Lists.newArrayList();
IHyperlinkAcceptor acceptor = new HyperlinkAcceptor(links);
try {
createHyperlinksByOffset(resource, offset, acceptor);
} catch (RuntimeException e) {
LOG.error(e.getMessage(), e);
}
if (!links.isEmpty())
return Iterables.toArray(links, IHyperlink.class);
return null;
}
protected void hyperlinkIsOffered(IHyperlink[] hyperlinks, IRegion expectedRegion, String expectedHyperlinkTarget) {
assertNotNull("No hyperlinks found!", hyperlinks);
assertEquals(1, hyperlinks.length);
IHyperlink hyperlink = hyperlinks[0];
assertEquals(expectedRegion, hyperlink.getHyperlinkRegion());
assertEquals(expectedHyperlinkTarget, target(hyperlink));
}
protected String target(IHyperlink hyperlink) {
if (hyperlink instanceof JdtHyperlink) {
return _target((JdtHyperlink) hyperlink);
} else if (hyperlink instanceof XtextHyperlink) {
return _target((XtextHyperlink) hyperlink);
} else {
return _target(hyperlink);
}
}
@Override
public IHyperlink[] detectHyperlinks(final ITextViewer textViewer, final IRegion region,
final boolean canShowMultipleHyperlinks) {
final IXtextDocument document = (IXtextDocument) textViewer.getDocument();
final IHyperlink[] importHyperlinks = importHyperlinks(document, region);
if (importHyperlinks != NO_HYPERLINKS) { return importHyperlinks; }
return document.readOnly(new CancelableUnitOfWork<IHyperlink[], XtextResource>() {
@Override
public IHyperlink[] exec(final XtextResource resource, final CancelIndicator c) {
return getHelper().createHyperlinksByOffset(resource, region.getOffset(), canShowMultipleHyperlinks);
}
});
}
@Override
public void run() {
ISelection selection = modulaEditor.getSelectionProvider().getSelection();
if (selection instanceof ITextSelection) {
ITextSelection textSelection = (ITextSelection)selection;
ModulaDeclarationHyperlinkDetector hld = new ModulaDeclarationHyperlinkDetector();
hld.setContext(modulaEditor);
ISourceViewer viewer = (ISourceViewer)modulaEditor.getAdapter(ISourceViewer.class);
IHyperlink[] links = hld.detectHyperlinks(viewer, new Region(textSelection.getOffset(), 0), false);
if (links != null && links.length > 0) {
links[0].open();
}
}
super.run();
}
@Test public void testComputeHyperlink_3() throws Exception {
String content = "package foo class Foo { def bar(S|tring a) { foo() } def foo(){}}";
XtextEditor xtextEditor = openEditor(content.replace("|", ""));
int offset = content.indexOf("|");
IHyperlink[] detectHyperlinks = hyperlinkDetector.detectHyperlinks(xtextEditor.getInternalSourceViewer(), new Region(offset,1), true);
assertEquals(1, detectHyperlinks.length);
List<XbaseImplementatorsHyperlink> list = Lists.newArrayList(Iterables.filter(Lists.newArrayList(detectHyperlinks),XbaseImplementatorsHyperlink.class));
assertEquals(0, list.size());
}
/**
* processAST
*
* @param editor
* @param ast
* @param offset
* @return
*/
private IHyperlink[] processAST(AbstractThemeableEditor editor, JSParseRootNode ast, int offset)
{
// walk AST to grab potential hyperlinks
JSHyperlinkCollector collector = new JSHyperlinkCollector(editor, ast, offset);
ast.accept(collector);
Collection<? extends IHyperlink> result = collector.getHyperlinks();
return (CollectionsUtil.isEmpty(result)) ? null : result.toArray(new IHyperlink[result.size()]);
}
@Test public void testPlainMethod() throws Exception {
String modelAsString = "class Foo {\n"
+ " def bar() { foo() }\n"
+ " def foo() { null }\n"
+ "}";
XtextResource resource = (XtextResource) testHelper.xtendFile("Foo", modelAsString).eResource();
IHyperlink[] hyperlinks = hyperlinkHelper.createHyperlinksByOffset(resource, modelAsString.indexOf("foo"), true);
assertEquals(2, hyperlinks.length);
assertEquals("Open Declaration - foo() : Object", hyperlinks[0].getHyperlinkText());
assertTrue(((XtextHyperlink) hyperlinks[0]).getURI().isPlatformResource());
assertEquals("Open Return Type - Object", hyperlinks[1].getHyperlinkText());
assertEquals("Object", ((JdtHyperlink) hyperlinks[1]).getJavaElement().getElementName());
}