package jetbrains.mps.build.workflow.constraints;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.generator.template.TemplateQueryContext;
import java.util.Set;
import java.util.LinkedHashSet;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import java.util.List;
import java.util.ArrayList;
import org.jetbrains.mps.openapi.model.SNodeUtil;
import org.jetbrains.mps.openapi.model.SReference;
import jetbrains.mps.util.SNodeOperations;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
import jetbrains.mps.internal.collections.runtime.Sequence;
import java.util.Map;
import java.util.HashMap;
import jetbrains.mps.smodel.CopyUtil;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import org.jetbrains.mps.openapi.model.SNodeAccessUtil;
import java.util.Queue;
import jetbrains.mps.internal.collections.runtime.QueueSequence;
import java.util.LinkedList;
import jetbrains.mps.internal.collections.runtime.SetSequence;
public class TaskLibrariesHelper {
private SNode project;
private TemplateQueryContext genContext;
public TaskLibrariesHelper(SNode project, TemplateQueryContext genContext) {
this.project = project;
this.genContext = genContext;
}
public void importLibs() {
Set<SNode> libsSet = new LinkedHashSet<SNode>();
for (SNode tldep : SLinkOperations.getChildren(project, MetaAdapterFactory.getContainmentLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x2670d5989d5a6271L, 0x6565da114725c6b7L, "imports"))) {
libsSet.add(SLinkOperations.getTarget(tldep, MetaAdapterFactory.getReferenceLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x6565da1147260537L, 0x6565da1147260538L, "target")));
}
closure(libsSet);
List<SNode> libs = new ArrayList<SNode>(libsSet);
for (SNode lib : libs) {
for (SNode n : SNodeUtil.getDescendants(lib)) {
for (SReference ref : SNodeOperations.getReferences(n)) {
SNode targetNode = SNodeOperations.getTargetNodeSilently(ref);
if (targetNode == null) {
genContext.showErrorMessage(n, "cannot import library `" + SPropertyOperations.getString(lib, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + "': unresolved reference");
} else if (!(libsSet.contains(targetNode.getContainingRoot()))) {
genContext.showErrorMessage(n, "cannot import library `" + SPropertyOperations.getString(lib, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name")) + "': broken reference, target is not imported");
}
}
}
}
List<SNode> parts = Sequence.fromIterable(SLinkOperations.collectMany(libs, MetaAdapterFactory.getContainmentLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x6565da114724ce92L, 0x6565da114724ce94L, "parts"))).toListSequence();
Map<SNode, SNode> map = new HashMap<SNode, SNode>();
parts = (List<SNode>) CopyUtil.copy((List<SNode>) parts, map);
ListSequence.fromList(SLinkOperations.getChildren(project, MetaAdapterFactory.getContainmentLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x2670d5989d5a6271L, 0x6565da114725c6b7L, "imports"))).clear();
for (SNode n : SNodeUtil.getDescendants(project)) {
for (SReference ref : n.getReferences()) {
SNode targetNode = SNodeOperations.getTargetNodeSilently(ref);
if (map.containsKey(targetNode)) {
SNodeAccessUtil.setReferenceTarget(n, ref.getRole(), map.get(targetNode));
} else {
SNode containingRoot = targetNode.getContainingRoot();
if (jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations.isInstanceOf(containingRoot, MetaAdapterFactory.getConcept(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x6565da114724ce92L, "jetbrains.mps.build.workflow.structure.BwfTaskLibrary"))) {
genContext.showErrorMessage(n, "task library is not imported");
}
}
}
}
// we add everything in the beginning
for (int i = parts.size() - 1; i >= 0; i--) {
ListSequence.fromList(SLinkOperations.getChildren(project, MetaAdapterFactory.getContainmentLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x2670d5989d5a6271L, 0x2670d5989d5ace60L, "parts"))).insertElement(0, parts.get(i));
}
}
public static void closure(Set<SNode> libs) {
Queue<SNode> queue = QueueSequence.fromQueue(new LinkedList<SNode>());
QueueSequence.fromQueue(queue).addSequence(SetSequence.fromSet(libs));
while (!(QueueSequence.fromQueue(queue).isEmpty())) {
SNode lib = QueueSequence.fromQueue(queue).removeFirstElement();
for (SNode dep : SLinkOperations.getChildren(lib, MetaAdapterFactory.getContainmentLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x6565da114724ce92L, 0x6565da114725c6b6L, "imports"))) {
if (!(libs.contains(SLinkOperations.getTarget(dep, MetaAdapterFactory.getReferenceLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x6565da1147260537L, 0x6565da1147260538L, "target"))))) {
libs.add(SLinkOperations.getTarget(dep, MetaAdapterFactory.getReferenceLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x6565da1147260537L, 0x6565da1147260538L, "target")));
QueueSequence.fromQueue(queue).addLastElement(SLinkOperations.getTarget(dep, MetaAdapterFactory.getReferenceLink(0x698a8d22a10447a0L, 0xba8d10e3ec237f13L, 0x6565da1147260537L, 0x6565da1147260538L, "target")));
}
}
}
}
}