package jetbrains.mps.lang.migration.runtime.base;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNodeReference;
import org.jetbrains.mps.openapi.module.SearchScope;
import org.jetbrains.mps.openapi.module.SRepository;
import org.jetbrains.mps.openapi.model.SReference;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.query.runtime.CommandUtil;
import jetbrains.mps.lang.smodel.query.runtime.QueryExecutionContext;
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.internal.collections.runtime.ISelector;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.ide.findusages.model.scopes.ModulesScope;
import jetbrains.mps.internal.collections.runtime.ITranslator2;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.internal.collections.runtime.IVisitor;
public class MoveNodePart {
private SNodeReference myFrom;
private SNodeReference myTo;
public MoveNodePart(SNodeReference from, SNodeReference to) {
myFrom = from;
myTo = to;
}
public MoveNodePart(SNodeReference from) {
myFrom = from;
}
public void setTo(SNodeReference to) {
myTo = to;
}
public Iterable<SNodeReference> getAffectedNodes(final SearchScope searchScope, SRepository repository) {
Iterable<SReference> references;
SNode targetFromNode = myFrom.resolve(repository);
{
final SearchScope scope = CommandUtil.createScope(searchScope);
QueryExecutionContext context = new QueryExecutionContext() {
public SearchScope getDefaultSearchScope() {
return scope;
}
};
if (targetFromNode != null) {
references = CommandUtil.usages(CommandUtil.createConsoleScope(null, false, context), targetFromNode);
} else {
references = CommandUtil.references(CommandUtil.createConsoleScope(null, false, context));
}
}
return Sequence.fromIterable(references).where(new IWhereFilter<SReference>() {
public boolean accept(SReference it) {
return eq_8rsufn_a0a0a0a0a0a0d0h(myFrom, it.getTargetNodeReference());
}
}).select(new ISelector<SReference, SNodeReference>() {
public SNodeReference select(SReference it) {
return it.getSourceNode().getReference();
}
}).toListSequence();
}
public void execute(final SModule module) {
execute(Sequence.fromIterable(getAffectedNodes(new ModulesScope(module), module.getRepository())).select(new ISelector<SNodeReference, SNode>() {
public SNode select(SNodeReference it) {
return it.resolve(module.getRepository());
}
}));
}
public void execute(Iterable<SNode> nodes) {
Sequence.fromIterable(nodes).translate(new ITranslator2<SNode, SReference>() {
public Iterable<SReference> translate(SNode it) {
return SNodeOperations.getReferences(it);
}
}).where(new IWhereFilter<SReference>() {
public boolean accept(SReference it) {
return eq_8rsufn_a0a0a0a0a0a0a9(myFrom, it.getTargetNodeReference());
}
}).visitAll(new IVisitor<SReference>() {
public void visit(SReference it) {
updateUsage(it, myTo);
}
});
}
public void updateUsage(SReference usage, SNodeReference newReference) {
usage.getSourceNode().setReference(usage.getLink(), jetbrains.mps.smodel.SReference.create(usage.getLink(), usage.getSourceNode(), newReference.getModelReference(), newReference.getNodeId()));
}
public SNodeReference getFrom() {
return myFrom;
}
public SNodeReference getTo() {
return myTo;
}
private static boolean eq_8rsufn_a0a0a0a0a0a0d0h(Object a, Object b) {
return (a != null ? a.equals(b) : a == b);
}
private static boolean eq_8rsufn_a0a0a0a0a0a0a9(Object a, Object b) {
return (a != null ? a.equals(b) : a == b);
}
}