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) {
}
}
}
}