Java tutorial
/******************************************************************************* * Copyright (c) 2011, 2017 itemis AG (http://www.itemis.eu) and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.eclipse.xtend.ide.tests.navigation; import static org.eclipse.xtext.ui.testing.util.IResourcesSetupUtil.*; import static org.eclipse.xtext.util.Strings.*; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.text.hyperlink.IHyperlinkDetector; import org.eclipse.xtend.ide.internal.XtendActivator; import org.eclipse.xtend.ide.tests.WorkbenchTestHelper; import org.eclipse.xtext.common.types.xtext.ui.JdtHyperlink; import org.eclipse.xtext.ui.testing.AbstractEditorTest; import org.eclipse.xtext.ui.editor.XtextEditor; import org.eclipse.xtext.xbase.ui.navigation.XbaseImplementatorsHyperlink; import org.junit.Test; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.inject.Inject; import com.google.inject.Injector; /** * @author Holger Schill - Initial contribution and API */ public class DetectImplHyperlinksTest extends AbstractEditorTest { private static final String LANGUAGE_NAME = "org.eclipse.xtend.core.Xtend"; private static Injector injector = XtendActivator.getInstance().getInjector(LANGUAGE_NAME); @Inject private IWorkspace workspace; @Inject private WorkbenchTestHelper testHelper; @Inject private IHyperlinkDetector hyperlinkDetector; @Override public void setUp() throws Exception { getInjector().injectMembers(this); closeWelcomePage(); closeEditors(); } @Override public void tearDown() throws Exception { testHelper.tearDown(); } @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_2() throws Exception { String content = "package foo class Foo { def bar(String a) { fo|o() } def foo(){}}"; XtextEditor xtextEditor = openEditor(content.replace("|", "")); int offset = content.indexOf("|"); IHyperlink[] detectHyperlinks = hyperlinkDetector.detectHyperlinks(xtextEditor.getInternalSourceViewer(), new Region(offset, 1), true); assertEquals(3, detectHyperlinks.length); XbaseImplementatorsHyperlink hyperlink = Iterables .filter(Lists.newArrayList(detectHyperlinks), XbaseImplementatorsHyperlink.class).iterator().next(); assertEquals(offset - 2, hyperlink.getHyperlinkRegion().getOffset()); assertEquals(3, hyperlink.getHyperlinkRegion().getLength()); IJavaElement element = hyperlink.getElement(); assertTrue(element instanceof IMethod); assertEquals("foo", element.getElementName()); } @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()); } @Override protected String getEditorId() { return LANGUAGE_NAME; } protected XtextEditor openEditor(String content) throws Exception { IFile sourceFile = testHelper.createFile("foo/Foo", content); sourceFile.getProject().setDefaultCharset(getNonDefaultEncoding(), null); assertTrue(sourceFile.exists()); waitForBuild(); XtextEditor editor = openEditor(sourceFile); return editor; } public Injector getInjector() { return injector; } public <T> T get(Class<T> clazz) { return getInjector().getInstance(clazz); } protected String getNonDefaultEncoding() throws CoreException { String defaultCharset = workspace.getRoot().getDefaultCharset(); if (equal(defaultCharset, "UTF-8")) return "ISO-8859-1"; else return "UTF-8"; } }