|
|
|
|
|
Re: Code coverage for Xtend (outside of maven build) [message #1841951 is a reply to message #1782627] |
Fri, 04 June 2021 06:51   |
Heinrich Weichert Messages: 1 Registered: June 2021 |
Junior Member |
|
|
I know this is very old, but there is a solution.
(Working code, but could be cleaned up).
import java.util.List;
import java.util.Optional;
import javax.inject.Inject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.eclemma.core.CoverageTools;
import org.eclipse.eclemma.internal.core.analysis.JavaElementCoverageAdapterFactory;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.xtext.ui.generator.IDerivedResourceMarkers;
import org.jacoco.core.analysis.ICoverageNode;
@SuppressWarnings("restriction")
public class JavaElementAdapterFactory implements IAdapterFactory {
@Inject
private IDerivedResourceMarkers derivedResourceMarkers;
@Inject
private IWorkspaceRoot wsRoot;
@Override
public <T> T getAdapter(final Object adaptableObject, final Class<T> adapterType) {
if (adaptableObject instanceof IFileEditorInput && adapterType == IJavaElement.class) {
final IFileEditorInput input = (IFileEditorInput) adaptableObject;
try {
final List<IFile> resources = derivedResourceMarkers.findDerivedResources(wsRoot,
URI.createPlatformResourceURI(input.getFile().getFullPath().toString(), true).toString());
if (!resources.isEmpty()) {
final String fileName = input.getAdapter(IFile.class).getFullPath().removeFileExtension()
.lastSegment()
+ ".java";
final Optional<IFile> file = resources.stream()
.filter(r -> r.getName().equals(fileName))
.findFirst();
if (file.isPresent()) {
return adapterType.cast(JavaCore.create(file.get()));
}
}
} catch (final Exception e) {
// ignore
}
}
if (adaptableObject instanceof ICompilationUnit && adapterType == ICoverageNode.class) {
final ICoverageNode coverageInfo = (ICoverageNode) new JavaElementCoverageAdapterFactory()
.getAdapter(adaptableObject, adapterType);
if (coverageInfo != null && coverageInfo.containsCode()) {
return adapterType.cast(coverageInfo);
}
final ICompilationUnit unit = (ICompilationUnit) adaptableObject;
return adapterType
.cast(CoverageTools.getCoverageInfo(unit.getType(unit.getElementName().replace(".java", ""))));
}
return null;
}
@Override
public Class<?>[] getAdapterList() {
return new Class<?>[] { IFileEditorInput.class, ICompilationUnit.class };
}
}
This must be registered via an extension point:
<extension
point="org.eclipse.core.runtime.adapters">
<factory
adaptableType="org.eclipse.ui.IFileEditorInput"
class="com.company.JavaElementAdapterFactory">
<adapter
type="org.eclipse.jdt.core.IJavaElement">
</adapter>
</factory>
<factory
adaptableType="org.eclipse.jdt.core.ICompilationUnit"
class="com.company.JavaElementAdapterFactory">
<adapter
type="org.jacoco.core.analysis.ICoverageNode">
</adapter>
</factory>
</extension>
and additionally if using custom shortcuts, mode "coverage" needs to be added to these shortcuts.
<extension
point="org.eclipse.debug.ui.launchShortcuts">
<shortcut
label="My test"
helpContextId="org.eclipse.jdt.junit.launch_shortcut"
class="com.company.TestLaunchShortcut"
modes="debug,run,coverage"
id="com.company.debugLaunchShortCutProject">
Some UI widgets don't work this way, this can perhaps be improved. But you get the idea to go forward. Highlighting works in every xtext editor.
|
|
|
|
Powered by
FUDForum. Page generated in 0.01932 seconds