package org.xtest.ui.interpreter; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IStorage; import org.eclipse.emf.common.util.URI; import org.eclipse.xtext.ui.resource.IStorage2UriMapper; import org.eclipse.xtext.util.Pair; import org.eclipse.xtext.xbase.XExpression; import org.xtest.interpreter.XTestInterpreter; import org.xtest.runner.external.DependencyAcceptor; import org.xtest.ui.resource.XtestDependencyAcceptingResource; import org.xtest.xTest.XMethodDef; import com.google.common.base.Optional; import com.google.inject.Inject; /** * Custom Xtest IDE interpreter that records xtest files as dependencies when this file invokes a * method defined in another other file. * * @author Michael Barry */ @SuppressWarnings("restriction") public class XtestDependencyAcceptingInterpreter extends XTestInterpreter { @Inject private IStorage2UriMapper mapper; @Override protected Object invokeXtestMethod(XMethodDef method, List<Object> argumentValues) { URI eResource = method.eResource().getURI(); XExpression firstElement = getCallStack().firstElement(); XtestDependencyAcceptingResource eResource2 = (XtestDependencyAcceptingResource) firstElement .eResource(); Optional<DependencyAcceptor> acceptor = eResource2.getAcceptor(); if (acceptor.isPresent()) { DependencyAcceptor dependencyAcceptor = acceptor.get(); Iterable<Pair<IStorage, IProject>> storages = mapper.getStorages(eResource); for (Pair<IStorage, IProject> storage : storages) { IStorage first = storage.getFirst(); if (first instanceof IFile) { IFile file = (IFile) first; java.net.URI uriForFile = org.xtest.runner.util.URIUtil.getURIForFile(file); dependencyAcceptor.accept(uriForFile); } } } return super.invokeXtestMethod(method, argumentValues); } }