package jetbrains.mps.baseLanguage.util.plugin.refactorings;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNode;
import java.util.List;
import java.util.ArrayList;
import javax.swing.JComponent;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.smodel.behaviour.BHReflection;
import jetbrains.mps.core.aspects.behaviour.SMethodTrimmedId;
import jetbrains.mps.util.NameUtil;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import jetbrains.mps.typesystem.inference.TypeChecker;
import jetbrains.mps.lang.typesystem.runtime.HUtil;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import org.jetbrains.mps.openapi.persistence.PersistenceFacade;
import jetbrains.mps.smodel.SModelUtil_new;
import org.jetbrains.mps.openapi.model.SNodeAccessUtil;
import jetbrains.mps.smodel.SReference;
public abstract class IntroduceVariableRefactoring {
private String myName;
private SNode myExpression;
private SNode myExpressionType;
private List<String> myExpectedNames;
protected SNode myContainer;
protected boolean myIsReplacingAll;
protected boolean myIsFinal = false;
protected VisibilityLevel myVisibilityLevel;
protected List<SNode> myDuplicates = new ArrayList<SNode>();
public IntroduceVariableRefactoring() {
}
public String init(SNode node, JComponent editorComponent) {
this.myExpression = node;
this.myContainer = findContainer(node);
findDuplicates();
SNode expressionType = this.getExpressionType(node);
if (!(SNodeOperations.isInstanceOf(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c37f506dL, "jetbrains.mps.baseLanguage.structure.Type")))) {
return "Couldn't compute type of expression: " + expressionType;
} else
if (this.isVoidType(expressionType)) {
return "Expression has no type";
} else {
this.myExpressionType = SNodeOperations.cast(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c37f506dL, "jetbrains.mps.baseLanguage.structure.Type"));
List<String> expectedNames = ListSequence.fromList(new ArrayList<String>());
String expectedVariableName = null;
if (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c37f506fL, "jetbrains.mps.baseLanguage.structure.Expression"))) {
expectedVariableName = ((String) BHReflection.invoke(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c37f506fL, "jetbrains.mps.baseLanguage.structure.Expression")), SMethodTrimmedId.create("getVariableExpectedName", null, "hEwJgm_")));
}
if (expectedVariableName != null) {
ListSequence.fromList(expectedNames).addElement(NameUtil.decapitalize(expectedVariableName));
}
List<String> variableSuffixes = ((List<String>) BHReflection.invoke(myExpressionType, SMethodTrimmedId.create("getVariableSuffixes", null, "hEwIzNo")));
if (variableSuffixes != null) {
ListSequence.fromList(expectedNames).addSequence(ListSequence.fromList(variableSuffixes));
}
this.myExpectedNames = ListSequence.fromList(expectedNames).where(new IWhereFilter<String>() {
public boolean accept(String it) {
return it.matches("[a-zA-Z0-9_]*");
}
}).toListSequence();
if (ListSequence.fromList(this.myExpectedNames).isEmpty()) {
ListSequence.fromList(this.myExpectedNames).addElement("");
}
return null;
}
}
private SNode getExpressionType(SNode node) {
SNode expressionType = TypeChecker.getInstance().getRuntimeSupport().coerce_(TypeChecker.getInstance().getTypeOf(node), HUtil.createMatchingPatternByConcept(MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c37f506dL, "jetbrains.mps.baseLanguage.structure.Type")), true);
if (SNodeOperations.isInstanceOf(expressionType, MetaAdapterFactory.getInterfaceConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x118cd59904dL, "jetbrains.mps.baseLanguage.structure.IInternalType"))) {
expressionType = ((SNode) BHReflection.invoke(SNodeOperations.cast(expressionType, MetaAdapterFactory.getInterfaceConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x118cd59904dL, "jetbrains.mps.baseLanguage.structure.IInternalType")), SMethodTrimmedId.create("getPublicType", null, "hEwIXGa")));
}
if (SNodeOperations.isInstanceOf(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, "jetbrains.mps.baseLanguage.structure.ClassifierType"))) {
SNode exprClassifier = SLinkOperations.getTarget(SNodeOperations.cast(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, "jetbrains.mps.baseLanguage.structure.ClassifierType")), MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier"));
if (SNodeOperations.isInstanceOf(exprClassifier, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x1107e0cb103L, "jetbrains.mps.baseLanguage.structure.AnonymousClass"))) {
List<SNode> params = SLinkOperations.getChildren(SNodeOperations.cast(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, "jetbrains.mps.baseLanguage.structure.ClassifierType")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x102419671abL, "parameter"));
expressionType = _quotation_createNode_x65dk2_a0b0b0c0l(SLinkOperations.getTarget(SNodeOperations.cast(exprClassifier, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x1107e0cb103L, "jetbrains.mps.baseLanguage.structure.AnonymousClass")), MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x1107e0cb103L, 0x1107e0fd2a0L, "classifier")));
ListSequence.fromList(SLinkOperations.getChildren(SNodeOperations.cast(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, "jetbrains.mps.baseLanguage.structure.ClassifierType")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x102419671abL, "parameter"))).addSequence(ListSequence.fromList(params));
}
}
if (SNodeOperations.isInstanceOf(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x110dae5f4a3L, "jetbrains.mps.baseLanguage.structure.WildCardType"))) {
expressionType = _quotation_createNode_x65dk2_a0a0d0l();
}
if (SNodeOperations.isInstanceOf(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x110daeaa84aL, "jetbrains.mps.baseLanguage.structure.UpperBoundType"))) {
expressionType = SLinkOperations.getTarget(SNodeOperations.cast(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x110daeaa84aL, "jetbrains.mps.baseLanguage.structure.UpperBoundType")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x110daeaa84aL, 0x110daeaa84bL, "bound"));
}
if (SNodeOperations.isInstanceOf(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x110dae9d53dL, "jetbrains.mps.baseLanguage.structure.LowerBoundType"))) {
expressionType = SLinkOperations.getTarget(SNodeOperations.cast(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x110dae9d53dL, "jetbrains.mps.baseLanguage.structure.LowerBoundType")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x110dae9d53dL, 0x110dae9f25bL, "bound"));
}
return expressionType;
}
public void setName(String name) {
this.myName = name;
}
public void setVisibilityLevel(VisibilityLevel level) {
this.myVisibilityLevel = level;
}
public void setReplacingAll(boolean b) {
this.myIsReplacingAll = b;
}
public void setIsFinal(boolean b) {
myIsFinal = b;
}
public boolean hasDuplicates() {
return ListSequence.fromList(myDuplicates).isNotEmpty();
}
public String getName() {
return this.myName;
}
public SNode getExpression() {
return this.myExpression;
}
public SNode getExpressionType() {
return this.myExpressionType;
}
public List<String> getExpectedNames() {
return this.myExpectedNames;
}
public SNode getContainer() {
return this.myContainer;
}
public abstract void replaceNode(SNode node, SNode declaration);
public List<SNode> getDuplicates() {
return this.myDuplicates;
}
protected void findDuplicates() {
this.myDuplicates = new SimpleDuplicatesFinder(this.getExpression()).findDuplicates(this.getRootToFindDuplicates(this.getExpression()));
this.myDuplicates = ListSequence.fromList(this.myDuplicates).where(new IWhereFilter<SNode>() {
public boolean accept(SNode it) {
return !(SNodeOperations.isInstanceOf(SNodeOperations.getParent(it), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b213L, "jetbrains.mps.baseLanguage.structure.ExpressionStatement")));
}
}).toListSequence();
}
protected SNode findContainer(SNode node) {
return SNodeOperations.getNodeAncestor(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8c108ca66L, "jetbrains.mps.baseLanguage.structure.ClassConcept"), false, false);
}
protected SNode getRootToFindDuplicates(SNode node) {
return SNodeOperations.getContainingRoot(node);
}
public abstract SNode doRefactoring();
protected boolean isVoidType(SNode expressionType) {
return SNodeOperations.isInstanceOf(expressionType, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc6bf96dL, "jetbrains.mps.baseLanguage.structure.VoidType"));
}
private static SNode _quotation_createNode_x65dk2_a0b0b0c0l(Object parameter_1) {
PersistenceFacade facade = PersistenceFacade.getInstance();
SNode quotedNode_2 = null;
quotedNode_2 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0x101de48bf9eL, "ClassifierType"), null, null, false);
SNodeAccessUtil.setReferenceTarget(quotedNode_2, MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier"), (SNode) parameter_1);
return quotedNode_2;
}
private static SNode _quotation_createNode_x65dk2_a0a0d0l() {
PersistenceFacade facade = PersistenceFacade.getInstance();
SNode quotedNode_1 = null;
quotedNode_1 = SModelUtil_new.instantiateConceptDeclaration(MetaAdapterFactory.getConcept(MetaAdapterFactory.getLanguage(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, "jetbrains.mps.baseLanguage"), 0x101de48bf9eL, "ClassifierType"), null, null, false);
quotedNode_1.setReference(MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier"), SReference.create(MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x101de48bf9eL, 0x101de490babL, "classifier"), quotedNode_1, facade.createModelReference("6354ebe7-c22a-4a0f-ac54-50b52ab9b065/java:java.lang(JDK/)"), facade.createNodeId("~Object")));
return quotedNode_1;
}
}