package jetbrains.mps.debugger.java.runtime.evaluation.container;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNode;
import org.jetbrains.mps.openapi.model.SReference;
import java.util.List;
import org.jetbrains.mps.openapi.model.SNodeReference;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.CopyUtil;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.smodel.DynamicReference;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import jetbrains.mps.internal.collections.runtime.IVisitor;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.smodel.SModelUtil_new;
import jetbrains.mps.lang.typesystem.runtime.HUtil;
public abstract class BaseLanguagesImportHelper {
public abstract SNode findVariable(SReference variableReference);
public abstract SNode createVariableReference(SNode variable);
public BaseLanguagesImportHelper() {
}
public void tryToImport(SNode container, List<SNodeReference> nodesToImport) {
final SRepository repository = SNodeOperations.getModel(container).getRepository();
List<SNode> nodes = CopyUtil.copy(ListSequence.fromList(nodesToImport).select(new ISelector<SNodeReference, SNode>() {
public SNode select(SNodeReference it) {
return (SNode) it.resolve(repository);
}
}).where(new IWhereFilter<SNode>() {
public boolean accept(SNode it) {
return (it != null);
}
}).toListSequence());
for (SNode node : ListSequence.fromList(nodes)) {
if (node == null) {
continue;
}
if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c37f506fL, "jetbrains.mps.baseLanguage.structure.Expression"))) {
SNode clone = _quotation_createNode_5vd2f2_a0a0b0c0d(node);
transformNode(clone, SNodeOperations.getModel(container));
ListSequence.fromList(SLinkOperations.getChildren(container, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, 0xf8cc6bf961L, "statement"))).addElement(clone);
} else if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b215L, "jetbrains.mps.baseLanguage.structure.Statement"))) {
transformNode(node, SNodeOperations.getModel(container));
ListSequence.fromList(SLinkOperations.getChildren(container, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, 0xf8cc6bf961L, "statement"))).addElement(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b215L, "jetbrains.mps.baseLanguage.structure.Statement")));
}
}
}
private void replaceStubReferences(SNode node, SModel containerModel) {
for (SReference reference : ListSequence.fromList(SNodeOperations.getReferences(node))) {
SModel targetModel = SNodeOperations.getModel(SLinkOperations.getTargetNode(reference));
if (neq_5vd2f2_a0b0a0e(targetModel, containerModel)) {
SModel scopeModel = targetModel.getReference().resolve(containerModel.getRepository());
// XXX I don't understand this code, and not sure it ever worked (how come model != model.reference.resolve(global repo)
// just refactored it a bit, with a guess that intention is to replace references pointing outside of debugger repository
// with dynamics that would get resolved with proper debugger node later on.
if (scopeModel != null && neq_5vd2f2_a0a4a1a0a4(scopeModel, targetModel)) {
String resolveInfo = SLinkOperations.getResolveInfo(reference);
if ((resolveInfo == null || resolveInfo.length() == 0)) {
resolveInfo = jetbrains.mps.util.SNodeOperations.getResolveInfo(SLinkOperations.getTargetNode(reference));
}
node.setReference(reference.getLink(), new DynamicReference(reference.getLink(), node, scopeModel.getReference(), resolveInfo));
}
}
}
}
private void transformNodeToProperVariableReference(SNode node, SModel containerModel) {
if (ListSequence.fromList(SNodeOperations.getReferences(node)).count() == 1) {
SReference reference = ListSequence.fromList(SNodeOperations.getReferences(node)).first();
if (neq_5vd2f2_a0a1a0a5(SNodeOperations.getModel(SLinkOperations.getTargetNode(reference)), containerModel) && SNodeOperations.isInstanceOf(SLinkOperations.getTargetNode(reference), MetaAdapterFactory.getInterfaceConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, "jetbrains.mps.lang.core.structure.INamedConcept"))) {
SNode matchingVar = findVariable(reference);
if (matchingVar != null) {
SNodeOperations.replaceWithAnother(node, createVariableReference(matchingVar));
}
}
}
}
private void transformNode(SNode node, final SModel containerModel) {
// try to resolve variables
ListSequence.fromList(SNodeOperations.getNodeDescendants(node, null, false, new SAbstractConcept[]{})).where(new IWhereFilter<SNode>() {
public boolean accept(SNode it) {
return ListSequence.fromList(SNodeOperations.getChildren(it)).isEmpty();
}
}).visitAll(new IVisitor<SNode>() {
public void visit(SNode it) {
transformNodeToProperVariableReference(it, containerModel);
}
});
// all links to subs -> to debugger stubs
for (SNode d : ListSequence.fromList(SNodeOperations.getNodeDescendants(node, null, true, new SAbstractConcept[]{}))) {
replaceStubReferences(d, containerModel);
}
}
private static SNode _quotation_createNode_5vd2f2_a0a0b0c0d(Object parameter_1) {
PersistenceFacade facade = PersistenceFacade.getInstance();
SNode quotedNode_2 = null;
SNode quotedNode_3 = null;
quotedNode_2 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0xf8cc56b213L, "ExpressionStatement"), null, null, false);
quotedNode_3 = (SNode) parameter_1;
if (quotedNode_3 != null) {
quotedNode_2.addChild(MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b213L, 0xf8cc56b214L, "expression"), HUtil.copyIfNecessary(quotedNode_3));
}
return quotedNode_2;
}
private static boolean neq_5vd2f2_a0b0a0e(Object a, Object b) {
return !(((a != null ? a.equals(b) : a == b)));
}
private static boolean neq_5vd2f2_a0a4a1a0a4(Object a, Object b) {
return !(((a != null ? a.equals(b) : a == b)));
}
private static boolean neq_5vd2f2_a0a1a0a5(Object a, Object b) {
return !(((a != null ? a.equals(b) : a == b)));
}
}