package jetbrains.mps.migration.component.plugin;
/*Generated by MPS */
import jetbrains.mps.workbench.action.BaseAction;
import javax.swing.Icon;
import com.intellij.openapi.actionSystem.AnActionEvent;
import java.util.Map;
import jetbrains.mps.project.MPSProject;
import jetbrains.mps.ide.actions.MPSCommonDataKeys;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.migration.component.util.MigrationsUtil;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.progress.Task;
import com.intellij.openapi.progress.ProgressIndicator;
import jetbrains.mps.progress.ProgressMonitorAdapter;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import com.intellij.util.WaitForProgressToShow;
import java.util.Set;
import org.jetbrains.mps.openapi.language.SLanguage;
import jetbrains.mps.smodel.SLanguageHierarchy;
import jetbrains.mps.smodel.language.LanguageRegistry;
import jetbrains.mps.lang.migration.runtime.base.MigrationScript;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
import java.util.Iterator;
import jetbrains.mps.baseLanguage.closures.runtime.YieldingIterator;
import jetbrains.mps.lang.migration.runtime.base.MigrationScriptReference;
import jetbrains.mps.internal.collections.runtime.IVisitor;
public class ExecuteRerunnableMigrations_Action extends BaseAction {
private static final Icon ICON = null;
public ExecuteRerunnableMigrations_Action() {
super("Execute Re-Runnable Migrations", "", ICON);
this.setIsAlwaysVisible(false);
this.setExecuteOutsideCommand(true);
}
@Override
public boolean isDumbAware() {
return false;
}
@Override
protected boolean collectActionData(AnActionEvent event, final Map<String, Object> _params) {
if (!(super.collectActionData(event, _params))) {
return false;
}
{
MPSProject p = event.getData(MPSCommonDataKeys.MPS_PROJECT);
if (p == null) {
return false;
}
}
{
Project p = event.getData(CommonDataKeys.PROJECT);
if (p == null) {
return false;
}
}
return true;
}
@Override
public void doExecute(@NotNull final AnActionEvent event, final Map<String, Object> _params) {
final List<SModule>[] modules = new List[1];
event.getData(MPSCommonDataKeys.MPS_PROJECT).getRepository().getModelAccess().runReadAction(new Runnable() {
public void run() {
modules[0] = Sequence.fromIterable(MigrationsUtil.getMigrateableModulesFromProject(event.getData(MPSCommonDataKeys.MPS_PROJECT))).toListSequence();
}
});
ProgressManager.getInstance().run(new Task.Modal(event.getData(CommonDataKeys.PROJECT), "Run Migrations", true) {
public void run(@NotNull ProgressIndicator progressIndicator) {
ProgressMonitorAdapter progressMonitor = new ProgressMonitorAdapter(progressIndicator);
int steps = modules[0].size();
progressMonitor.start("Running...", steps);
for (final SModule module : ListSequence.fromList(modules[0])) {
progressMonitor.step(module.getModuleName());
WaitForProgressToShow.runOrInvokeAndWaitAboveProgress(new Runnable() {
public void run() {
event.getData(MPSCommonDataKeys.MPS_PROJECT).getRepository().getModelAccess().executeCommand(new Runnable() {
public void run() {
Set<SLanguage> languages = new SLanguageHierarchy(LanguageRegistry.getInstance(event.getData(MPSCommonDataKeys.MPS_PROJECT).getRepository()), module.getUsedLanguages()).getExtended();
Iterable<MigrationScript> scripts = SetSequence.fromSet(languages).translate(new ITranslator2<SLanguage, MigrationScript>() {
public Iterable<MigrationScript> translate(final SLanguage it) {
return new Iterable<MigrationScript>() {
public Iterator<MigrationScript> iterator() {
return new YieldingIterator<MigrationScript>() {
private int __CP__ = 0;
protected boolean moveToNext() {
__loop__:
do {
__switch__:
switch (this.__CP__) {
case -1:
assert false : "Internal error";
return false;
case 2:
this._2_ver = 0;
case 3:
if (!(_2_ver < it.getLanguageVersion())) {
this.__CP__ = 1;
break;
}
this.__CP__ = 4;
break;
case 5:
_2_ver++;
this.__CP__ = 3;
break;
case 8:
if (_7_script != null && Sequence.fromIterable(_7_script.requiresData()).isEmpty() && _7_script.isRerunnable()) {
this.__CP__ = 9;
break;
}
this.__CP__ = 5;
break;
case 10:
this.__CP__ = 5;
this.yield(_7_script);
return true;
case 0:
this.__CP__ = 2;
break;
case 4:
this._7_script = new MigrationScriptReference(it, _2_ver).resolve(true);
this.__CP__ = 8;
break;
case 9:
this.__CP__ = 10;
break;
default:
break __loop__;
}
} while (true);
return false;
}
private int _2_ver;
private MigrationScript _7_script;
};
}
};
}
});
Sequence.fromIterable(scripts).visitAll(new IVisitor<MigrationScript>() {
public void visit(MigrationScript it) {
it.execute(module);
}
});
}
});
}
});
progressMonitor.advance(1);
if (progressMonitor.isCanceled()) {
break;
}
}
}
});
}
}