package jetbrains.mps.lang.generator.pluginSolution.plugin;
/*Generated by MPS */
import org.jetbrains.mps.openapi.module.SRepository;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.Set;
import org.jetbrains.mps.openapi.module.SModuleReference;
import java.util.HashSet;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SModelOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.lang.smodel.behavior.ModuleIdentity__BehaviorDescriptor;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.smodel.Generator;
import jetbrains.mps.lang.smodel.behavior.LanguageIdentity__BehaviorDescriptor;
/*package*/ class GenPlanFunnel {
private final SRepository myGeneratorLookupRepo;
private final SModel myTargetModel;
private final SNode myTarget;
private final Set<SModuleReference> mySeenGenerators = new HashSet<SModuleReference>();
private boolean myDistinctSteps = false;
private boolean myUseGenerators = true;
private SNode mySharedGeneratorsStep;
private SNode mySharedLanguagesStep;
/*package*/ GenPlanFunnel(@NotNull SRepository generatorLookupRepo, @NotNull SNode target) {
myTarget = target;
myTargetModel = SNodeOperations.getModel(target);
myGeneratorLookupRepo = generatorLookupRepo;
}
public GenPlanFunnel distinctSteps(boolean distinctSteps) {
myDistinctSteps = distinctSteps;
return this;
}
public GenPlanFunnel applyGenerators() {
myUseGenerators = true;
return this;
}
public GenPlanFunnel transformLanguages() {
myUseGenerators = false;
return this;
}
public void next(SModuleReference generatorIdentity) {
if (!(mySeenGenerators.add(generatorIdentity))) {
return;
}
if (myUseGenerators) {
SNode gmp = SModelOperations.createNewNode(myTargetModel, null, MetaAdapterFactory.getConcept(0x7866978ea0f04cc7L, 0x81bc4d213d9375e1L, 0x73246de9adecb80dL, "jetbrains.mps.lang.smodel.structure.GeneratorModulePointer"));
SLinkOperations.setNewChild(gmp, MetaAdapterFactory.getContainmentLink(0x7866978ea0f04cc7L, 0x81bc4d213d9375e1L, 0x73246de9adecb80dL, 0x73246de9adecb874L, "module"), MetaAdapterFactory.getConcept(0x7866978ea0f04cc7L, 0x81bc4d213d9375e1L, 0x5ef5a1e853388b3L, "jetbrains.mps.lang.smodel.structure.ModulePointer"));
ModuleIdentity__BehaviorDescriptor.setModuleReference_idnJmxU5cSTj.invoke(SLinkOperations.getTarget(gmp, MetaAdapterFactory.getContainmentLink(0x7866978ea0f04cc7L, 0x81bc4d213d9375e1L, 0x73246de9adecb80dL, 0x73246de9adecb874L, "module")), generatorIdentity);
SNode generatorStep;
if (myDistinctSteps || mySharedGeneratorsStep == null) {
generatorStep = SModelOperations.createNewNode(myTargetModel, null, MetaAdapterFactory.getConcept(0x7ab1a6fa0a114b95L, 0x9e4875f363d6cb00L, 0x73246de9adeca171L, "jetbrains.mps.lang.generator.plan.structure.ApplyGenerators"));
ListSequence.fromList(SLinkOperations.getChildren(myTarget, MetaAdapterFactory.getContainmentLink(0x7ab1a6fa0a114b95L, 0x9e4875f363d6cb00L, 0x19443180a20717fbL, 0x19443180a2071807L, "steps"))).addElement(generatorStep);
} else {
generatorStep = mySharedGeneratorsStep;
}
if (!(myDistinctSteps) && mySharedGeneratorsStep == null) {
mySharedGeneratorsStep = generatorStep;
}
ListSequence.fromList(SLinkOperations.getChildren(generatorStep, MetaAdapterFactory.getContainmentLink(0x7ab1a6fa0a114b95L, 0x9e4875f363d6cb00L, 0x73246de9adeca171L, 0x73246de9adf5a45cL, "generator"))).addElement(gmp);
} else {
SModuleReference languageModuleRef = as_mld0p3_a0a0a0a0c0r(generatorIdentity.resolve(myGeneratorLookupRepo), Generator.class).getSourceLanguage().getModuleReference();
SNode langId = SModelOperations.createNewNode(myTargetModel, null, MetaAdapterFactory.getConcept(0x7866978ea0f04cc7L, 0x81bc4d213d9375e1L, 0x312abca18ab8c8c0L, "jetbrains.mps.lang.smodel.structure.LanguageId"));
LanguageIdentity__BehaviorDescriptor.setLanguage_id34EJa6aIcyw.invoke(langId, MetaAdapterFactory.getLanguage(languageModuleRef));
SNode transform;
if (myDistinctSteps || mySharedLanguagesStep == null) {
transform = SModelOperations.createNewNode(myTargetModel, null, MetaAdapterFactory.getConcept(0x7ab1a6fa0a114b95L, 0x9e4875f363d6cb00L, 0x19443180a2071802L, "jetbrains.mps.lang.generator.plan.structure.Transform"));
ListSequence.fromList(SLinkOperations.getChildren(myTarget, MetaAdapterFactory.getContainmentLink(0x7ab1a6fa0a114b95L, 0x9e4875f363d6cb00L, 0x19443180a20717fbL, 0x19443180a2071807L, "steps"))).addElement(transform);
} else {
transform = mySharedLanguagesStep;
}
if (!(myDistinctSteps) && mySharedLanguagesStep == null) {
mySharedLanguagesStep = transform;
}
ListSequence.fromList(SLinkOperations.getChildren(transform, MetaAdapterFactory.getContainmentLink(0x7ab1a6fa0a114b95L, 0x9e4875f363d6cb00L, 0x19443180a2071802L, 0x28dd6d5a7549fa8dL, "languages"))).addElement(langId);
}
}
private static <T> T as_mld0p3_a0a0a0a0c0r(Object o, Class<T> type) {
return (type.isInstance(o) ? (T) o : null);
}
}