package jetbrains.mps.debugger.java.evaluation.plugin; /*Generated by MPS */ import jetbrains.mps.make.facet.IFacet; import java.util.List; import jetbrains.mps.make.facet.ITarget; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.make.resources.IPropertiesPersistence; import jetbrains.mps.make.facet.ITargetEx; import jetbrains.mps.make.script.IJob; import jetbrains.mps.make.script.IResult; import jetbrains.mps.make.resources.IResource; import jetbrains.mps.make.script.IJobMonitor; import jetbrains.mps.make.resources.IPropertiesAccessor; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.util.ProgressMonitor; import jetbrains.mps.smodel.resources.GResource; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import org.jetbrains.mps.openapi.model.SNode; import jetbrains.mps.generator.TransientModelsModule; import org.jetbrains.mps.openapi.model.SModelName; import org.jetbrains.mps.openapi.persistence.PersistenceFacade; import jetbrains.mps.smodel.SModelId; import jetbrains.mps.lang.core.plugin.Generate_Facet.Target_configure; import jetbrains.mps.smodel.CopyUtil; import jetbrains.mps.generator.impl.CloneUtil; import jetbrains.mps.smodel.SModelOperations; import jetbrains.mps.debugger.java.runtime.evaluation.container.Properties; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import org.jetbrains.mps.openapi.language.SAbstractConcept; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations; import jetbrains.mps.debugger.java.api.evaluation.transform.TransformatorBuilder; import jetbrains.mps.generator.GenerationStatus; import jetbrains.mps.make.script.IFeedback; import jetbrains.mps.make.script.IConfig; import java.util.Map; import jetbrains.mps.make.script.IPropertiesPool; public class JavaDebugEvaluate_Facet extends IFacet.Stub { private List<ITarget> targets = ListSequence.fromList(new ArrayList<ITarget>()); private IFacet.Name name = new IFacet.Name("jetbrains.mps.debugger.java.evaluation.JavaDebugEvaluate"); public JavaDebugEvaluate_Facet() { ListSequence.fromList(targets).addElement(new JavaDebugEvaluate_Facet.Target_transformEvaluator()); } public Iterable<ITarget> targets() { return targets; } public Iterable<IFacet.Name> optional() { return null; } public Iterable<IFacet.Name> required() { return Sequence.fromArray(new IFacet.Name[]{new IFacet.Name("jetbrains.mps.lang.core.Generate"), new IFacet.Name("jetbrains.mps.lang.core.TextGen")}); } public Iterable<IFacet.Name> extended() { return null; } public IFacet.Name getName() { return this.name; } public IPropertiesPersistence propertiesPersistence() { return new JavaDebugEvaluate_Facet.TargetProperties(); } public static class Target_transformEvaluator implements ITargetEx { private static final ITarget.Name name = new ITarget.Name("jetbrains.mps.debugger.java.evaluation.JavaDebugEvaluate.transformEvaluator"); public Target_transformEvaluator() { } public IJob createJob() { return new IJob.Stub() { @Override public IResult execute(final Iterable<IResource> rawInput, final IJobMonitor monitor, final IPropertiesAccessor pa, @NotNull final ProgressMonitor progressMonitor) { Iterable<IResource> _output_it4uid_a0a = null; final Iterable<GResource> input = (Iterable<GResource>) (Iterable) rawInput; switch (0) { case 0: for (final GResource res : Sequence.fromIterable(input)) { final SModel outcomeModel = res.status().getOutputModel(); // The code below was copied from TransformingGenerationHandler final Wrappers._T<SNode> evaluator = new Wrappers._T<SNode>(); if (outcomeModel != null) { // XXX would be better to create new module rather than expect output model to belong to transient module, but not sure if // there's any hidden assumption regarding Evaluator location (dependencies, module name, etc.) final TransientModelsModule module = (TransientModelsModule) outcomeModel.getModule(); SModelName newModelName = res.model().getName().withStereotype("evaluate"); final SModel newModel = module.createTransientModel(PersistenceFacade.getInstance().createModelReference(module.getModuleReference(), SModelId.generate(), newModelName.getValue())); Target_configure.vars(pa.global()).transientModelsProvider().getRepository().getModelAccess().runWriteAction(new Runnable() { public void run() { // evaluator node belongs to a model already in the repository, and AttachedNodeOwner allows to change attached nodes // from within a command only. Here we are in a thread different from EDT, and have no chance to execute a command. // Nor do I want to relax ANO's requirement for the command now (I failed to figure out a reason for it). // That's why we make a copy of generator output model here, modify the copy, publish it and expose as a final outcome. CopyUtil.copyModelContent(outcomeModel, newModel); CloneUtil cu = new CloneUtil(outcomeModel, newModel); cu.cloneModelWithImports(); evaluator.value = SModelOperations.getRootByName(newModel, Properties.EVALUATOR_NAME); if (evaluator.value != null) { try { assert SNodeOperations.getModel(evaluator.value) != null; SNode evaluateMethod = ListSequence.fromList(SNodeOperations.getNodeDescendants(evaluator.value, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b21dL, "jetbrains.mps.baseLanguage.structure.InstanceMethodDeclaration"), false, new SAbstractConcept[]{})).findFirst(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return "evaluate".equals(SPropertyOperations.getString(it, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"))); } }); TransformatorBuilder.getInstance().build(evaluateMethod, true).transformEvaluator(); // TextGen would use model's repository to obtain read lock, and if model is not registered, there'd be no lock // which is fine for the transient model itself, but once there's reference outside of the model, e.g. to a java stub elsewhere, // there would be a lock violation exception module.addModelToKeep(newModel.getReference(), true); Target_configure.vars(pa.global()).transientModelsProvider().publishAll(); res.status(new GenerationStatus(res.status().getInputModel(), newModel, res.status().getDependencies(), res.status().isError(), res.status().hasWarnings(), res.status().isCanceled())); } catch (Throwable ex) { monitor.reportFeedback(new IFeedback.ERROR(String.valueOf(ex))); } } } }); } } _output_it4uid_a0a = Sequence.fromIterable(_output_it4uid_a0a).concat(Sequence.fromIterable(input)); default: progressMonitor.done(); return new IResult.SUCCESS(_output_it4uid_a0a); } } }; } public IConfig createConfig() { return null; } public Iterable<ITarget.Name> notAfter() { return null; } public Iterable<ITarget.Name> after() { return Sequence.fromArray(new ITarget.Name[]{new ITarget.Name("jetbrains.mps.lang.core.Generate.generate"), new ITarget.Name("jetbrains.mps.lang.core.Generate.configure")}); } public Iterable<ITarget.Name> notBefore() { return null; } public Iterable<ITarget.Name> before() { return Sequence.fromArray(new ITarget.Name[]{new ITarget.Name("jetbrains.mps.lang.core.TextGen.textGenToMemory"), new ITarget.Name("jetbrains.mps.lang.core.TextGen.textGen")}); } public ITarget.Name getName() { return name; } public boolean isOptional() { return false; } public boolean requiresInput() { return true; } public boolean producesOutput() { return true; } public Iterable<Class<? extends IResource>> expectedInput() { List<Class<? extends IResource>> rv = ListSequence.fromList(new ArrayList<Class<? extends IResource>>()); ListSequence.fromList(rv).addElement(GResource.class); return rv; } public Iterable<Class<? extends IResource>> expectedOutput() { return null; } public <T> T createParameters(Class<T> cls) { return null; } public <T> T createParameters(Class<T> cls, T copyFrom) { T t = createParameters(cls); return t; } } public static class TargetProperties implements IPropertiesPersistence { public TargetProperties() { } public void storeValues(Map<String, String> store, IPropertiesPool properties) { } public void loadValues(Map<String, String> store, IPropertiesPool properties) { try { } catch (RuntimeException re) { } } } }