package jetbrains.mps.baseLanguage.util.plugin.refactorings;
/*Generated by MPS */
import java.util.List;
import org.jetbrains.mps.openapi.model.SNode;
import java.util.Map;
import java.util.Set;
import jetbrains.mps.internal.collections.runtime.MapSequence;
import java.util.HashMap;
import java.util.ArrayList;
import jetbrains.mps.internal.collections.runtime.SetSequence;
import java.util.HashSet;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.lang.pattern.util.MatchingUtil;
import jetbrains.mps.typesystem.inference.TypeChecker;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.smodel.SModelUtil_new;
public class MethodMatch {
private List<SNode> myNodes;
private List<SNode> myParametersOrder;
private Map<SNode, List<SNode>> myParamsToNodes;
private ExtractMethodRefactoring myRefactoring = null;
private Set<SNode> myOutputRefs;
public MethodMatch(List<SNode> parametersOrder) {
this.myParamsToNodes = MapSequence.fromMap(new HashMap<SNode, List<SNode>>());
this.myNodes = new ArrayList<SNode>();
myOutputRefs = SetSequence.fromSet(new HashSet<SNode>());
this.myParametersOrder = parametersOrder;
}
public void putMapping(SNode node, SNode parameter) {
if (!(MapSequence.fromMap(this.myParamsToNodes).containsKey(parameter))) {
MapSequence.fromMap(this.myParamsToNodes).put(parameter, new ArrayList<SNode>());
}
ListSequence.fromList(MapSequence.fromMap(this.myParamsToNodes).get(parameter)).addElement(node);
}
public void putNode(SNode node) {
ListSequence.fromList(this.myNodes).addElement(node);
}
public void putOutputReference(SNode node) {
SetSequence.fromSet(myOutputRefs).addElement(node);
}
public List<SNode> getNodes() {
return this.myNodes;
}
public Map<SNode, List<SNode>> getParamsMapping() {
return this.myParamsToNodes;
}
public ExtractMethodRefactoring getRefactoring() {
return this.myRefactoring;
}
public void createRefactoring() {
this.myRefactoring = ExtractMethodFactory.createRefactoring(ExtractMethodFactory.createParameters(this.myNodes));
}
public boolean checkMatch() {
boolean good = checkMapping();
good &= checkOutputReferencies();
return good;
}
private boolean checkMapping() {
for (SNode parameter : SetSequence.fromSet(MapSequence.fromMap(this.myParamsToNodes).keySet())) {
if (!(this.checkParameter(parameter))) {
return false;
}
}
return true;
}
private boolean checkParameter(SNode parameter) {
List<SNode> nodes = MapSequence.fromMap(this.myParamsToNodes).get(parameter);
if (ListSequence.fromList(nodes).isEmpty()) {
return true;
}
for (int i = 0; i < ListSequence.fromList(nodes).count() - 1; i++) {
if (!(MatchingUtil.matchNodes(ListSequence.fromList(nodes).getElement(i), ListSequence.fromList(nodes).getElement(i + 1)))) {
return false;
}
}
if (!(TypeChecker.getInstance().getSubtypingManager().isSubtype(TypeChecker.getInstance().getTypeOf(ListSequence.fromList(nodes).getElement(0)), SLinkOperations.getTarget(parameter, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x450368d90ce15bc3L, 0x4ed4d318133c80ceL, "type"))))) {
return false;
}
return true;
}
private boolean checkOutputReferencies() {
Set<SNode> computedOutputRefs = myRefactoring.getOutputReferences();
for (SNode computedRef : SetSequence.fromSet(computedOutputRefs)) {
if (!(SetSequence.fromSet(myOutputRefs).contains(computedRef))) {
return false;
}
}
return true;
}
public List<SNode> getCallParameters() {
List<SNode> callActualParams = new ArrayList<SNode>();
for (SNode parameter : ListSequence.fromList(this.myParametersOrder)) {
if (ListSequence.fromList(MapSequence.fromMap(this.myParamsToNodes).get(parameter)).isEmpty()) {
ListSequence.fromList(callActualParams).addElement(_quotation_createNode_5zfyci_a0a0a0a1a71());
} else {
ListSequence.fromList(callActualParams).addElement(SNodeOperations.cast(SNodeOperations.copyNode(ListSequence.fromList(MapSequence.fromMap(this.myParamsToNodes).get(parameter)).getElement(0)), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c37f506fL, "jetbrains.mps.baseLanguage.structure.Expression")));
}
}
return callActualParams;
}
private static SNode _quotation_createNode_5zfyci_a0a0a0a1a71() {
PersistenceFacade facade = PersistenceFacade.getInstance();
SNode quotedNode_1 = null;
quotedNode_1 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0xf940cd6167L, "NullLiteral"), null, null, false);
return quotedNode_1;
}
}