package jetbrains.mps.console.ideCommands.runtime.util; /*Generated by MPS */ import jetbrains.mps.project.Project; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import java.util.List; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import jetbrains.mps.ide.findusages.model.scopes.ProjectScope; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ITranslator2; import org.jetbrains.mps.openapi.model.SModelReference; import jetbrains.mps.smodel.SModelOperations; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.generator.GenerationFacade; import jetbrains.mps.generator.ModelGenerationStatusManager; import javax.swing.SwingUtilities; import jetbrains.mps.ide.make.actions.MakeActionImpl; import jetbrains.mps.ide.make.actions.MakeActionParameters; import jetbrains.mps.internal.collections.runtime.IVisitor; import jetbrains.mps.generator.impl.dependencies.GenerationDependenciesCache; import java.util.function.Consumer; import jetbrains.mps.vfs.IFile; import org.jetbrains.mps.openapi.module.SModuleFacet; import jetbrains.mps.project.facets.GenerationTargetFacet; import jetbrains.mps.project.facets.JavaModuleFacet; import jetbrains.mps.project.facets.TestsFacet; import java.util.Map; import jetbrains.mps.baseLanguage.tuples.runtime.Tuples; import jetbrains.mps.internal.collections.runtime.MapSequence; import java.util.HashMap; import org.jetbrains.mps.openapi.model.SNode; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.ActionManager; import jetbrains.mps.lang.plugin.behavior.ActionDeclaration__BehaviorDescriptor; import jetbrains.mps.workbench.action.ActionUtils; import com.intellij.openapi.actionSystem.ActionPlaces; import com.intellij.openapi.actionSystem.DataContext; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.NonNls; public class IdeCommandUtil { public static void make(final Project project, final Iterable<? extends SModel> models, final Iterable<? extends SModule> modules, final boolean wholeProject, final boolean dirtyOnly, final boolean depClosure) { final Wrappers._T<List<SModel>> modelsToGenerate = new Wrappers._T<List<SModel>>(); project.getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { if (wholeProject) { modelsToGenerate.value = ListSequence.fromListWithValues(new ArrayList<SModel>(), new ProjectScope(project).getModels()); } else { modelsToGenerate.value = ListSequence.fromListWithValues(new ArrayList<SModel>(), ListSequence.fromList(ListSequence.fromListWithValues(new ArrayList<SModel>(), models)).concat(Sequence.fromIterable(modules).translate(new ITranslator2<SModule, SModel>() { public Iterable<SModel> translate(SModule it) { return it.getModels(); } }))); } if (depClosure) { Iterable<SModel> dependencies = modelsToGenerate.value; int oldSize; do { dependencies = Sequence.fromIterable(dependencies).translate(new ITranslator2<SModel, SModel>() { public Iterable<SModel> translate(SModel it) { return Sequence.fromIterable(((Iterable<SModelReference>) SModelOperations.getImportedModelUIDs(it))).select(new ISelector<SModelReference, SModel>() { public SModel select(SModelReference it) { return it.resolve(project.getRepository()); } }); } }).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return GenerationFacade.canGenerate(it); } }).distinct().subtract(ListSequence.fromList(modelsToGenerate.value)).toListSequence(); oldSize = ListSequence.fromList(modelsToGenerate.value).count(); ListSequence.fromList(modelsToGenerate.value).addSequence(Sequence.fromIterable(dependencies)); } while (ListSequence.fromList(modelsToGenerate.value).count() > oldSize); } if (dirtyOnly) { final ModelGenerationStatusManager mgsm = ModelGenerationStatusManager.getInstance(); modelsToGenerate.value = ListSequence.fromList(modelsToGenerate.value).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return mgsm.generationRequired(it); } }).toListSequence(); } else { modelsToGenerate.value = ListSequence.fromList(modelsToGenerate.value).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return GenerationFacade.canGenerate(it); } }).toListSequence(); } } }); SwingUtilities.invokeLater(new Runnable() { public void run() { new MakeActionImpl(new MakeActionParameters(project).models(modelsToGenerate.value).cleanMake(false)).executeAction(); } }); } public static void cleanCaches(final Project project, final Iterable<? extends SModel> models, final Iterable<? extends SModule> modules, final boolean wholeProject) { final Wrappers._T<List<SModel>> modelsToClean = new Wrappers._T<List<SModel>>(); project.getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { if (wholeProject) { modelsToClean.value = ListSequence.fromListWithValues(new ArrayList<SModel>(), new ProjectScope(project).getModels()); } else { modelsToClean.value = ListSequence.fromListWithValues(new ArrayList<SModel>(), ListSequence.fromList(ListSequence.fromListWithValues(new ArrayList<SModel>(), models)).concat(Sequence.fromIterable(modules).translate(new ITranslator2<SModule, SModel>() { public Iterable<SModel> translate(SModule it) { return it.getModels(); } }))); } } }); ListSequence.fromList(modelsToClean.value).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return GenerationFacade.canGenerate(it); } }).visitAll(new IVisitor<SModel>() { public void visit(SModel it) { GenerationDependenciesCache.getInstance().discard(it); } }); } public static void removeGenSources(final Project project, final Iterable<? extends SModel> models, Iterable<? extends SModule> modules, final boolean wholeProject) { final Wrappers._T<Iterable<? extends SModule>> _modules = new Wrappers._T<Iterable<? extends SModule>>(modules); project.getRepository().getModelAccess().runReadAction(new Runnable() { public void run() { if (wholeProject) { _modules.value = (Iterable<? extends SModule>) (Iterable<SModule>) project.getProjectModulesWithGenerators(); } final Consumer<IFile> deleteIfFile = new Consumer<IFile>() { public void accept(IFile file) { if (!(file.isDirectory())) { file.delete(); } } }; Sequence.fromIterable(models).where(new IWhereFilter<SModel>() { public boolean accept(SModel it) { return !(it.getModule().isPackaged()) && GenerationFacade.canGenerate(it); } }).visitAll(new IVisitor<SModel>() { public void visit(SModel model) { for (SModuleFacet mf : model.getModule().getFacets()) { if (mf instanceof GenerationTargetFacet) { GenerationTargetFacet genFacet = ((GenerationTargetFacet) mf); genFacet.getOutputLocation(model).getChildren().forEach(deleteIfFile); genFacet.getOutputCacheLocation(model).getChildren().forEach(deleteIfFile); } if (mf instanceof JavaModuleFacet) { ((JavaModuleFacet) mf).getClassesLocation(model).getChildren().forEach(deleteIfFile); } } } }); } }); Sequence.fromIterable(_modules.value).visitAll(new IVisitor<SModule>() { public void visit(SModule module) { // would be nice to handle all GenerationTargetFacet here, but for transition, rely on only facets we are aware at the moment (and those with single-root output) // FWIF, DeleteModuleHelper.deleteModuleFiles is pretty much about the same. ArrayList<IFile> roots = new ArrayList<IFile>(5); JavaModuleFacet jmf = module.getFacet(JavaModuleFacet.class); if (jmf != null) { roots.add(jmf.getOutputRoot()); roots.add(jmf.getOutputCacheRoot()); roots.add(jmf.getClassesGen()); } TestsFacet testsFacet = module.getFacet(TestsFacet.class); if (testsFacet != null) { roots.add(testsFacet.getTestsOutputPath()); roots.add(testsFacet.getOutputCacheRoot()); } for (IFile f : roots) { if (f != null) { f.delete(); } } } }); } public static Map<String, Object> prepareParameters(Iterable<Tuples._2<String, Object>> parameters) { Map<String, Object> result = MapSequence.fromMap(new HashMap<String, Object>()); for (Tuples._2<String, Object> parameter : Sequence.fromIterable(parameters)) { MapSequence.fromMap(result).put(parameter._0(), parameter._1()); } return result; } public static void callAction(final SNode actionDeclaration, final Map<String, Object> parameters) { AnAction action = ActionManager.getInstance().getAction(ActionDeclaration__BehaviorDescriptor.getGeneratedClassFQName_idhEwIGgK.invoke(actionDeclaration)); ActionUtils.updateAndPerformAction(action, ActionUtils.createEvent(ActionPlaces.UNKNOWN, new DataContext() { @Nullable public Object getData(@NonNls String key) { return MapSequence.fromMap(parameters).get(key); } })); } }