package jetbrains.mps.idea.java.tests;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.indexing.FileBasedIndex;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.idea.core.facet.MPSFacetConfiguration;
import jetbrains.mps.idea.core.tests.DataMPSFixtureTestCase;
import jetbrains.mps.idea.java.index.ForeignIdReferenceIndex;
import jetbrains.mps.idea.java.psi.ForeignIdReferenceCache;
import jetbrains.mps.persistence.DefaultModelRoot;
import jetbrains.mps.smodel.ModelAccessHelper;
import jetbrains.mps.util.Computable;
import jetbrains.mps.util.Pair;
import jetbrains.mps.vfs.IFile;
import jetbrains.mps.workbench.goTo.index.SNodeDescriptor;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SReference;
import org.jetbrains.mps.openapi.module.SRepository;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* User: fyodor
* Date: 4/9/13
*/
public class ForeignIdReferenceCacheTest extends DataMPSFixtureTestCase {
private Module myModule;
@Override
protected void prepareTestData(MPSFacetConfiguration configuration) throws Exception {
myModule = configuration.getFacet().getModule();
VirtualFile[] sourceRoots = ModuleRootManager.getInstance(myModule).getSourceRoots();
assertEquals(sourceRoots.length, 1);
VirtualFile sourceRoot = sourceRoots[0];
final IFile psiTestModel = copyResource(sourceRoot.getPath() + "/psiTest.mps", "psiTest.mps", "/tests/psiProject/models/jetbrains/mps/psiTest.mps");
DefaultModelRoot root = new DefaultModelRoot();
root.setContentRoot(psiTestModel.getParent().getPath());
root.addFile(DefaultModelRoot.SOURCE_ROOTS, psiTestModel.getParent().getPath());
configuration.getBean().setModelRoots(Arrays.<org.jetbrains.mps.openapi.persistence.ModelRoot>asList(root));
}
@Override
protected void setUp() throws Exception {
super.setUp();
FileBasedIndex.getInstance().requestRebuild(ForeignIdReferenceIndex.ID);
}
public void testIndex() {
final Project project = myModule.getProject();
ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
public void run() {
List<Collection<Pair<SNodeDescriptor, String>>> values =
FileBasedIndex.getInstance().getValues(ForeignIdReferenceIndex.ID, "Marker.f", GlobalSearchScope.allScope(project));
List<Collection<Pair<SNodeDescriptor, String>>> values2 =
FileBasedIndex.getInstance().getValues(ForeignIdReferenceIndex.ID, "Marker.", GlobalSearchScope.allScope(project));
assertEquals(values, values2);
assertEquals(values.size(), 1);
Collection<Pair<SNodeDescriptor, String>> pairs = values.get(0);
assertEquals(pairs.size(), 1);
final Pair<SNodeDescriptor, String> p = pairs.iterator().next();
String role = p.o2;
assertEquals("variableDeclaration", role);
final SRepository repository = ProjectHelper.getProjectRepository(project);
repository.getModelAccess().runReadAction(new Runnable() {
@Override
public void run() {
SNode snode = p.o1.getNodeReference().resolve(repository);
assertEquals("jetbrains.mps.baseLanguage.structure.StaticFieldReference", snode.getConcept().getQualifiedName());
}
});
}
});
}
public void testReferences() {
ApplicationManager.getApplication().runReadAction(new Runnable() {
@Override
public void run() {
Project project = myModule.getProject();
Iterable<SReference> refs = ForeignIdReferenceCache.getInstance(project).getReferencesMatchingPrefix("Marker.f", GlobalSearchScope.allScope(project));
Iterator<SReference> it = refs.iterator();
final SReference ref = it.next();
assertFalse(it.hasNext());
RuntimeException throwable = new ModelAccessHelper(ProjectHelper.getModelAccess(project)).runReadAction(new Computable<RuntimeException>() {
@Override
public RuntimeException compute() {
try {
SNode snode = ref.getSourceNode();
assertEquals("jetbrains.mps.baseLanguage.structure.StaticFieldReference", snode.getConcept().getQualifiedName());
} catch (RuntimeException t) {
return t;
}
return null;
}
});
if (throwable != null) throw throwable;
}
});
}
}