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; } }