package jetbrains.mps.ide.editor.util;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.ide.findusages.findalgorithm.finders.IInterfacedFinder;
import com.intellij.ui.awt.RelativePoint;
import jetbrains.mps.baseLanguage.closures.runtime.Wrappers;
import java.util.Set;
import org.jetbrains.mps.openapi.model.SNodeReference;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import org.jetbrains.annotations.NotNull;
import com.intellij.openapi.progress.ProgressIndicator;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import jetbrains.mps.ide.findusages.view.FindUtils;
import jetbrains.mps.progress.ProgressMonitorAdapter;
import jetbrains.mps.ide.findusages.model.SearchQuery;
import jetbrains.mps.project.GlobalScope;
import jetbrains.mps.ide.findusages.findalgorithm.finders.IFinder;
import jetbrains.mps.ide.editor.util.renderer.DefaultMethodRenderer;
public class GoToHelper {
public GoToHelper() {
}
public static void executeFinders(final SNode node, final MPSProject mpsProject, final IInterfacedFinder finder, RelativePoint relativePoint) {
final Wrappers._T<String> caption = new Wrappers._T<String>();
final Set<SNodeReference> nodes = SetSequence.fromSet(new HashSet<SNodeReference>());
ProgressManager.getInstance().run(new Task.Modal(mpsProject.getProject(), "Searching...", true) {
@Override
public void run(@NotNull final ProgressIndicator p) {
mpsProject.getRepository().getModelAccess().runReadAction(new Runnable() {
public void run() {
if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept"))) {
caption.value = SPropertyOperations.getString(SNodeOperations.cast(node, MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept")), MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"));
} else {
caption.value = ((String) BHReflection.invoke(node, SMethodTrimmedId.create("getPresentation", null, "hEwIMiw")));
}
// XXX I know cast to IFinder is stupid here, but it's the way to deal with checkTypeSystem test failures.
// We desperately need a mechanism to match stub classes with their MPS origins.
for (Object sr : FindUtils.getSearchResults(new ProgressMonitorAdapter(p), new SearchQuery(node, GlobalScope.getInstance()), (IFinder) finder).getResultObjects()) {
if (sr instanceof SNode) {
SetSequence.fromSet(nodes).addElement(SNodeOperations.getPointer(((SNode) sr)));
}
}
}
});
}
});
String title = "Choose overriding method of " + caption.value + "() to navigate to";
GoToContextMenuUtil.showMenu(mpsProject, title, SetSequence.fromSet(nodes).toListSequence(), new DefaultMethodRenderer(mpsProject.getRepository()), relativePoint);
}
}