package jetbrains.mps.ide.script.plugin;
/*Generated by MPS */
import jetbrains.mps.util.annotation.ToRemove;
import java.util.List;
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.module.SearchScope;
import jetbrains.mps.project.MPSProject;
import java.util.ArrayList;
import jetbrains.mps.lang.script.runtime.RefactoringScript;
import jetbrains.mps.ide.script.plugin.migrationtool.MigrationScriptsTool;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.Language;
import jetbrains.mps.smodel.language.LanguageRuntime;
import jetbrains.mps.smodel.language.LanguageRegistry;
import jetbrains.mps.lang.script.runtime.ScriptAspectDescriptor;
import org.jetbrains.mps.openapi.model.SNodeReference;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.project.Project;
import java.util.Collections;
import java.util.Set;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
import jetbrains.mps.ide.findusages.model.scopes.ModelsScope;
import org.jetbrains.mps.openapi.model.EditableSModel;
import jetbrains.mps.smodel.SModelStereotype;
/**
*
* @deprecated AbstractHelper no one sub-classes, ORLY? Mostly legacy code for migration scripts executed as nodes. Scope manipulation, if vital, could move closer to uses.
*/
@Deprecated
@ToRemove(version = 3.3)
public abstract class AbstractMigrationScriptHelper {
public static void doRunScripts(List<SNode> scriptNodes, SearchScope scope, MPSProject context) {
ArrayList<RefactoringScript> scripts = new ArrayList<RefactoringScript>();
for (SNode n : scriptNodes) {
RefactoringScript ms = toExecutable(n, context);
if (ms != null) {
scripts.add(ms);
}
}
context.getComponent(MigrationScriptsTool.class).startMigration(scripts, scope);
}
public static RefactoringScript toExecutable(SNode scriptNode, MPSProject contextProject) {
SModule module = SNodeOperations.getModel(scriptNode).getModule();
if (!(module instanceof Language)) {
return null;
}
LanguageRuntime lr = LanguageRegistry.getInstance(contextProject.getRepository()).getLanguage((Language) module);
ScriptAspectDescriptor scriptAspect = (lr == null ? null : lr.getAspect(ScriptAspectDescriptor.class));
if (scriptAspect == null) {
return null;
}
final SNodeReference scriptNodeRef = scriptNode.getReference();
for (RefactoringScript rs : scriptAspect.getRefactoringScripts()) {
if (scriptNodeRef.equals(rs.getScriptNode())) {
return rs;
}
}
// try name match if none matched by node reference
for (RefactoringScript rs : scriptAspect.getRefactoringScripts()) {
if (rs.getName().equals(SPropertyOperations.getString(scriptNode, MetaAdapterFactory.getProperty(0xeddeefac2d64437L, 0xbc2cde50fd4ce470L, 0x11225e9072dL, 0x11225f2354aL, "title")))) {
return rs;
}
}
return null;
}
public static SearchScope createMigrationScope(Iterable<SModule> selectedModules, Iterable<SModel> selectedModels) {
return createMigrationScopeInternal(selectedModules, selectedModels);
}
public static SearchScope createMigrationScope(Project project) {
return createMigrationScopeInternal(project.getModulesWithGenerators(), (Iterable<SModel>) Collections.<SModel>emptySet());
}
private static SearchScope createMigrationScopeInternal(Iterable<? extends SModule> modules, Iterable<? extends SModel> models) {
Set<SModel> result = SetSequence.fromSet(new HashSet<SModel>());
SetSequence.fromSet(result).addSequence(Sequence.fromIterable(models).where(new IWhereFilter<SModel>() {
public boolean accept(SModel it) {
return includeModel(it);
}
}));
SetSequence.fromSet(result).addSequence(Sequence.fromIterable(modules).where(new IWhereFilter<SModule>() {
public boolean accept(SModule it) {
return !(it.isReadOnly());
}
}).translate(new ITranslator2<SModule, SModel>() {
public Iterable<SModel> translate(SModule it) {
return it.getModels();
}
}).where(new IWhereFilter<SModel>() {
public boolean accept(SModel it) {
return includeModel(it);
}
}));
return new ModelsScope(result);
}
private static boolean includeModel(SModel model) {
if (!(((model instanceof EditableSModel)))) {
return false;
}
if (model.isReadOnly()) {
return false;
}
String modelStereotype = SModelStereotype.getStereotype(model);
if (modelStereotype != null) {
if (SModelStereotype.isStubModelStereotype(modelStereotype)) {
return false;
}
}
return true;
}
}