package jetbrains.mps.ide.migration.check;
/*Generated by MPS */
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import com.intellij.openapi.project.Project;
import jetbrains.mps.lang.migration.runtime.base.Problem;
import jetbrains.mps.ide.findusages.model.SearchResult;
import jetbrains.mps.ide.modelchecker.platform.actions.ModelCheckerIssue;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.ide.modelchecker.platform.actions.ModelCheckerViewer;
import jetbrains.mps.ide.modelchecker.platform.actions.ModelCheckerTool;
import jetbrains.mps.ide.findusages.model.SearchResults;
import jetbrains.mps.internal.collections.runtime.IVisitor;
import com.intellij.icons.AllIcons;
import jetbrains.mps.baseLanguage.tuples.runtime.Tuples;
import java.util.Set;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import jetbrains.mps.ide.findusages.view.UsagesViewTool;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.module.SModule;
import org.apache.log4j.Level;
public class MigrationOutputUtil {
private static final Logger LOG = LogManager.getLogger(MigrationOutputUtil.class);
public static void showProblems(final Project project, Iterable<Problem> problems) {
Iterable<SearchResult<ModelCheckerIssue>> items = Sequence.fromIterable(problems).select(new ISelector<Problem, SearchResult<ModelCheckerIssue>>() {
public SearchResult<ModelCheckerIssue> select(Problem p) {
return new SearchResult<ModelCheckerIssue>(issueByProblem(p), p.getReason(), p.getCategory());
}
}).where(new IWhereFilter<SearchResult<ModelCheckerIssue>>() {
public boolean accept(SearchResult<ModelCheckerIssue> it) {
return it != null;
}
});
if (Sequence.fromIterable(items).isEmpty()) {
return;
}
ModelCheckerViewer v = new ModelCheckerViewer(project, false) {
@Override
protected void close() {
ModelCheckerTool.getInstance(project).closeTab(this);
super.close();
}
};
final SearchResults<ModelCheckerIssue> result = new SearchResults<ModelCheckerIssue>();
Sequence.fromIterable(items).visitAll(new IVisitor<SearchResult<ModelCheckerIssue>>() {
public void visit(SearchResult<ModelCheckerIssue> it) {
result.add(it);
}
});
v.setSearchResults(result);
ModelCheckerTool.getInstance(project).showTabWithResults(v, "Migration issues", AllIcons.Nodes.ModuleGroup);
}
public static void showNodes(final Project project, Tuples._2<String, Set<SNode>>... toShow) {
final SearchResults sr = new SearchResults<SNode>();
Sequence.fromIterable(Sequence.fromArray(toShow)).translate(new ITranslator2<Tuples._2<String, Set<SNode>>, SearchResult<SNode>>() {
public Iterable<SearchResult<SNode>> translate(final Tuples._2<String, Set<SNode>> cat) {
return SetSequence.fromSet(cat._1()).select(new ISelector<SNode, SearchResult<SNode>>() {
public SearchResult<SNode> select(SNode node) {
return new SearchResult<SNode>(node, node, cat._0());
}
});
}
}).visitAll(new IVisitor<SearchResult<SNode>>() {
public void visit(SearchResult<SNode> it) {
sr.add(it);
}
});
project.getComponent(UsagesViewTool.class).show(sr, "No results to show");
}
private static ModelCheckerIssue issueByProblem(Problem p) {
Object r = p.getReason();
if (r instanceof SNode) {
return new ModelCheckerIssue.NodeIssue(((SNode) r), p.getMessage(), null);
}
if (r instanceof SModel) {
return new ModelCheckerIssue.ModelIssue(((SModel) r), p.getMessage(), null);
}
if (r instanceof SModule) {
return new ModelCheckerIssue.ModuleIssue(p.getMessage(), null);
}
if (LOG.isEnabledFor(Level.ERROR)) {
LOG.error("Unknown issue type: " + r.getClass().getName());
}
return null;
}
}