package jetbrains.mps.baseLanguage.closures.helper;
/*Generated by MPS */
import jetbrains.mps.generator.template.ITemplateGenerator;
import jetbrains.mps.generator.template.TemplateQueryContext;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.List;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SPropertyOperations;
public class PrepStatementUtil {
private PrepStatementUtil.Context ctx;
private ITemplateGenerator generator;
private PrepStatementUtil(ITemplateGenerator generator) {
this.ctx = new PrepStatementUtil.Context();
this.generator = generator;
}
private void prepTopStatementList(TemplateQueryContext genContext, SNode slist) {
int beginLabel = this.ctx.label;
int endLabel = this.ctx.incrementLabel();
Object data = new Integer[]{beginLabel, endLabel};
Values.CLOSURE_DATA.set(genContext, slist, data);
this.prepStatementList(genContext, slist);
}
private int prepStatementList(TemplateQueryContext genContext, SNode slist) {
boolean labelAutoIncremented = true;
int label = this.ctx.incrementLabel();
for (SNode stmt : SLinkOperations.getChildren(slist, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, 0xf8cc6bf961L, "statement"))) {
if (!(labelAutoIncremented) && StatementListUtil.isControlStatement(stmt)) {
label = this.ctx.incrementLabel();
}
labelAutoIncremented = StatementListUtil.isControlStatement(stmt);
label = this.prepStatement(genContext, stmt, label);
}
return label;
}
private int prepStatement(TemplateQueryContext genContext, SNode stmt, int label) {
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfaa4bf0f2fL, "jetbrains.mps.baseLanguage.structure.WhileStatement"))) {
return this.prepWhileStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfaa4bf0f2fL, "jetbrains.mps.baseLanguage.structure.WhileStatement")), label);
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x11232674988L, "jetbrains.mps.baseLanguage.structure.DoWhileStatement"))) {
return this.prepDoWhileStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x11232674988L, "jetbrains.mps.baseLanguage.structure.DoWhileStatement")), label);
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10a698082feL, "jetbrains.mps.baseLanguage.structure.ForStatement"))) {
return this.prepForStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10a698082feL, "jetbrains.mps.baseLanguage.structure.ForStatement")), label);
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10a6933ce33L, "jetbrains.mps.baseLanguage.structure.ForeachStatement"))) {
return this.prepForeachStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10a6933ce33L, "jetbrains.mps.baseLanguage.structure.ForeachStatement")), label);
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, "jetbrains.mps.baseLanguage.structure.IfStatement"))) {
return this.prepIfStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, "jetbrains.mps.baseLanguage.structure.IfStatement")), label);
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, "jetbrains.mps.baseLanguage.structure.SwitchStatement"))) {
return this.prepSwitchStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, "jetbrains.mps.baseLanguage.structure.SwitchStatement")), label);
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc67c7f0L, "jetbrains.mps.baseLanguage.structure.LocalVariableDeclarationStatement"))) {
return this.prepLocalvariableDeclarationStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc67c7f0L, "jetbrains.mps.baseLanguage.structure.LocalVariableDeclarationStatement")), label);
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xfd3920347849419dL, 0x907112563d152375L, 0x11797183e82L, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement"))) {
return this.prepYieldStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xfd3920347849419dL, 0x907112563d152375L, 0x11797183e82L, "jetbrains.mps.baseLanguage.closures.structure.YieldStatement")), label);
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbe39a867fL, "jetbrains.mps.baseLanguage.structure.BreakStatement"))) {
this.prepBreakStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbe39a867fL, "jetbrains.mps.baseLanguage.structure.BreakStatement")));
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbf3043726L, "jetbrains.mps.baseLanguage.structure.ContinueStatement"))) {
this.prepContinueStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbf3043726L, "jetbrains.mps.baseLanguage.structure.ContinueStatement")));
} else
if (SNodeOperations.isInstanceOf(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, "jetbrains.mps.baseLanguage.structure.BlockStatement"))) {
return this.prepBlockStatement(genContext, SNodeOperations.cast(stmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, "jetbrains.mps.baseLanguage.structure.BlockStatement")), label);
}
return label;
}
private int prepWhileStatement(TemplateQueryContext genContext, SNode wstmt, int label) {
int beginLabel = label;
int blockLabel = this.ctx.incrementLabel();
SNode sn = SLinkOperations.getTarget(wstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x10cb1ada6e8L, "body"));
Object data1 = new Integer[]{blockLabel, beginLabel};
Values.CLOSURE_DATA.set(genContext, sn, data1);
int nextLabel = this.calcNextLabel(genContext, wstmt);
Object data = new Integer[]{beginLabel, beginLabel, blockLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, wstmt, data);
this.prepStatementList(genContext, SLinkOperations.getTarget(wstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x10cb1ada6e8L, "body")));
return nextLabel;
}
private int prepDoWhileStatement(TemplateQueryContext genContext, SNode dwstmt, int label) {
int beginLabel = label;
int condLabel = this.ctx.incrementLabel();
SNode sn = SLinkOperations.getTarget(dwstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x10cb1ada6e8L, "body"));
Object data = new Integer[]{beginLabel, condLabel};
Values.CLOSURE_DATA.set(genContext, sn, data);
int nextLabel = this.calcNextLabel(genContext, dwstmt);
Object data1 = new Integer[]{beginLabel, condLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, dwstmt, data1);
this.prepStatementList(genContext, SLinkOperations.getTarget(dwstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x10cb1ada6e8L, "body")));
return nextLabel;
}
private int prepForStatement(TemplateQueryContext genContext, SNode fstmt, int label) {
int beginLabel = label;
this.prepLocalVariableDeclaration(genContext, SLinkOperations.getTarget(fstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10a697996feL, 0x10a6979f36bL, "variable")));
int condLabel = this.ctx.incrementLabel();
int blockLabel = this.ctx.incrementLabel();
int postLabel = this.ctx.incrementLabel();
SNode sn = SLinkOperations.getTarget(fstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x10cb1ada6e8L, "body"));
Object data = new Integer[]{blockLabel, postLabel};
Values.CLOSURE_DATA.set(genContext, sn, data);
int nextLabel = this.calcNextLabel(genContext, fstmt);
Object data1 = new Integer[]{beginLabel, postLabel, blockLabel, condLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, fstmt, data1);
this.prepStatementList(genContext, SLinkOperations.getTarget(fstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x10cb1ada6e8L, "body")));
return nextLabel;
}
private int prepForeachStatement(TemplateQueryContext genContext, SNode fstmt, int label) {
int beginLabel = label;
this.prepLocalVariableDeclaration(genContext, SLinkOperations.getTarget(fstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10a697996feL, 0x10a6979f36bL, "variable")));
int condLabel = this.ctx.incrementLabel();
int blockLabel = this.ctx.incrementLabel();
SNode sn = SLinkOperations.getTarget(fstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x10cb1ada6e8L, "body"));
Object data1 = new Integer[]{blockLabel, condLabel};
Values.CLOSURE_DATA.set(genContext, sn, data1);
int nextLabel = this.calcNextLabel(genContext, fstmt);
Object data = new Integer[]{beginLabel, condLabel, blockLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, fstmt, data);
this.prepStatementList(genContext, SLinkOperations.getTarget(fstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x10cb1ada6e8L, "body")));
return nextLabel;
}
private int prepIfStatement(TemplateQueryContext genContext, SNode ifstmt, int label) {
int beginLabel = label;
int ifTrueLabel = this.ctx.incrementLabel();
int ifFalseLabel = -1;
int nextLabel = this.calcNextLabel(genContext, ifstmt);
SNode sn = SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xf8cc56b219L, "ifTrue"));
Object data = new Integer[]{ifTrueLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, sn, data);
this.prepStatementList(genContext, SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xf8cc56b219L, "ifTrue")));
if (ListSequence.fromList(SLinkOperations.getChildren(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0x118cecf1287L, "elsifClauses"))).isNotEmpty()) {
for (SNode eicls : SLinkOperations.getChildren(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0x118cecf1287L, "elsifClauses"))) {
int tmp = this.ctx.incrementLabel();
SNode sn1 = SLinkOperations.getTarget(eicls, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x118ceceb41aL, 0x118ced0f8fdL, "statementList"));
Object data1 = new Integer[]{tmp, nextLabel};
Values.CLOSURE_DATA.set(genContext, sn1, data1);
this.prepStatementList(genContext, SLinkOperations.getTarget(eicls, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x118ceceb41aL, 0x118ced0f8fdL, "statementList")));
Object data2 = new Integer[]{tmp};
Values.CLOSURE_DATA.set(genContext, eicls, data2);
}
}
if ((SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xfc092b6b76L, "ifFalseStatement")) != null)) {
if (StatementListUtil.isControlStatement(SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xfc092b6b76L, "ifFalseStatement"))) || SNodeOperations.isInstanceOf(SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xfc092b6b76L, "ifFalseStatement")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, "jetbrains.mps.baseLanguage.structure.BlockStatement"))) {
ifFalseLabel = this.ctx.incrementLabel();
}
}
Object data2 = new Integer[]{beginLabel, ifTrueLabel, ifFalseLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, ifstmt, data2);
if (SNodeOperations.isInstanceOf(SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xfc092b6b76L, "ifFalseStatement")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, "jetbrains.mps.baseLanguage.structure.BlockStatement"))) {
SNode sn1 = SLinkOperations.getTarget(SNodeOperations.cast(SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xfc092b6b76L, "ifFalseStatement")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, "jetbrains.mps.baseLanguage.structure.BlockStatement")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, 0xfc092b6b78L, "statements"));
Object data1 = new Integer[]{ifFalseLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, sn1, data1);
this.prepStatementList(genContext, SLinkOperations.getTarget(SNodeOperations.cast(SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xfc092b6b76L, "ifFalseStatement")), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, "jetbrains.mps.baseLanguage.structure.BlockStatement")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, 0xfc092b6b78L, "statements")));
} else
if ((SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xfc092b6b76L, "ifFalseStatement")) != null)) {
this.prepStatement(genContext, SLinkOperations.getTarget(ifstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, 0xfc092b6b76L, "ifFalseStatement")), ifFalseLabel);
}
return nextLabel;
}
private int prepSwitchStatement(TemplateQueryContext genContext, SNode sstmt, int label) {
int beginLabel = label;
int nextLabel = this.calcNextLabel(genContext, sstmt);
Object data1 = new Integer[]{beginLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, sstmt, data1);
int nextCaseLabel = this.ctx.incrementLabel();
for (SNode scase : SLinkOperations.getChildren(sstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, 0x10ef02edcafL, "case"))) {
int caseLabel = nextCaseLabel;
nextCaseLabel = this.ctx.incrementLabel();
if ((SLinkOperations.getTarget(scase, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02cdd1bL, 0x10ef02d8048L, "body")) != null)) {
List<SNode> stmts = SLinkOperations.getChildren(SLinkOperations.getTarget(scase, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02cdd1bL, 0x10ef02d8048L, "body")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, 0xf8cc6bf961L, "statement"));
int endCaseLabel = nextCaseLabel;
if (ListSequence.fromList(stmts).isNotEmpty() && SNodeOperations.isInstanceOf(ListSequence.fromList(stmts).getElement(ListSequence.fromList(stmts).count() - 1), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbe39a867fL, "jetbrains.mps.baseLanguage.structure.BreakStatement"))) {
endCaseLabel = nextLabel;
}
SNode sn = SLinkOperations.getTarget(scase, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02cdd1bL, 0x10ef02d8048L, "body"));
Object data = new Integer[]{caseLabel, endCaseLabel};
Values.CLOSURE_DATA.set(genContext, sn, data);
this.prepStatementList(genContext, SLinkOperations.getTarget(scase, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02cdd1bL, 0x10ef02d8048L, "body")));
}
}
if ((SLinkOperations.getTarget(sstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, 0x10ef02c1b6eL, "defaultBlock")) != null)) {
int defLabel = this.ctx.incrementLabel();
SNode sn = SLinkOperations.getTarget(sstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, 0x10ef02c1b6eL, "defaultBlock"));
Object data = new Integer[]{defLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, sn, data);
this.prepStatementList(genContext, SLinkOperations.getTarget(sstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, 0x10ef02c1b6eL, "defaultBlock")));
}
return nextLabel;
}
private int prepYieldStatement(TemplateQueryContext genContext, SNode ystmt, int label) {
int beginLabel = label;
int nextLabel = this.calcNextLabel(genContext, ystmt);
Object data = new Integer[]{beginLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, ystmt, data);
return nextLabel;
}
private void prepBreakStatement(TemplateQueryContext genContext, SNode bstmt) {
int brLabel = -1;
SNode node = bstmt;
while (((node = SNodeOperations.getNodeAncestorWhereConceptInList(node, new SAbstractConcept[]{MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, "jetbrains.mps.baseLanguage.structure.AbstractLoopStatement"), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, "jetbrains.mps.baseLanguage.structure.SwitchStatement")}, false, false)) != null)) {
SNode loopLabel = (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, "jetbrains.mps.baseLanguage.structure.AbstractLoopStatement")) ? SLinkOperations.getTarget(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, "jetbrains.mps.baseLanguage.structure.AbstractLoopStatement")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x50c493bf9555131L, "loopLabel")) : SLinkOperations.getTarget(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, "jetbrains.mps.baseLanguage.structure.SwitchStatement")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, 0x4091554b655a230eL, "switchLabel")));
String depLabel = (SNodeOperations.isInstanceOf(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, "jetbrains.mps.baseLanguage.structure.AbstractLoopStatement")) ? SPropertyOperations.getString(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, "jetbrains.mps.baseLanguage.structure.AbstractLoopStatement")), MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x11745b5371dL, "label")) : SPropertyOperations.getString(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, "jetbrains.mps.baseLanguage.structure.SwitchStatement")), MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10ef02a8c6aL, 0x117b7e94b9bL, "label")));
if ((SLinkOperations.getTarget(bstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbe39a867fL, 0x7dae85d6eb42f8c4L, "loopLabelReference")) != null) && SLinkOperations.getTarget(SLinkOperations.getTarget(bstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbe39a867fL, 0x7dae85d6eb42f8c4L, "loopLabelReference")), MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x50c493bf9555129L, 0x50c493bf955512aL, "loopLabel")) == loopLabel || SPropertyOperations.getString(bstmt, MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbe39a867fL, 0x11745bfb2d8L, "label")) == depLabel || (SPropertyOperations.getString(bstmt, MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbe39a867fL, 0x11745bfb2d8L, "label")) != null && SPropertyOperations.getString(bstmt, MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbe39a867fL, 0x11745bfb2d8L, "label")).equals(depLabel))) {
Integer[] labels = (Integer[]) Values.CLOSURE_DATA.get(genContext, node);
brLabel = labels[labels.length - 1];
break;
}
}
Object data = new Integer[]{brLabel};
Values.CLOSURE_DATA.set(genContext, bstmt, data);
}
private void prepContinueStatement(TemplateQueryContext genContext, SNode cstmt) {
int conLabel = -1;
SNode node = cstmt;
while (((node = SNodeOperations.getNodeAncestorWhereConceptInList(node, new SAbstractConcept[]{MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, "jetbrains.mps.baseLanguage.structure.AbstractLoopStatement")}, false, false)) != null)) {
String depLabel = SPropertyOperations.getString(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, "jetbrains.mps.baseLanguage.structure.AbstractLoopStatement")), MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x11745b5371dL, "label"));
SNode loopLabel = SLinkOperations.getTarget(SNodeOperations.cast(node, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, "jetbrains.mps.baseLanguage.structure.AbstractLoopStatement")), MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x10cb1ac5adeL, 0x50c493bf9555131L, "loopLabel"));
if (SLinkOperations.getTarget(SLinkOperations.getTarget(cstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbf3043726L, 0x7dae85d6eb43bbbdL, "loopLabelReference")), MetaAdapterFactory.getReferenceLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0x50c493bf9555129L, 0x50c493bf955512aL, "loopLabel")) == loopLabel || SPropertyOperations.getString(cstmt, MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbf3043726L, 0x11745fca58eL, "label")) == depLabel || (SPropertyOperations.getString(cstmt, MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbf3043726L, 0x11745fca58eL, "label")) != null && SPropertyOperations.getString(cstmt, MetaAdapterFactory.getProperty(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfbf3043726L, 0x11745fca58eL, "label")).equals(depLabel))) {
Integer[] labels = (Integer[]) Values.CLOSURE_DATA.get(genContext, node);
conLabel = labels[1];
break;
}
}
Object data = new Integer[]{conLabel};
Values.CLOSURE_DATA.set(genContext, cstmt, data);
}
private int prepBlockStatement(TemplateQueryContext genContext, SNode bs, int label) {
int beginLabel = label;
int nextLabel = this.calcNextLabel(genContext, bs);
SNode sn = SLinkOperations.getTarget(bs, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, 0xfc092b6b78L, "statements"));
Object data1 = new Integer[]{beginLabel, nextLabel};
Values.CLOSURE_DATA.set(genContext, sn, data1);
int tmp = this.prepStatementList(genContext, SLinkOperations.getTarget(bs, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xfc092b6b77L, 0xfc092b6b78L, "statements")));
Object data = new Integer[]{beginLabel, tmp};
Values.CLOSURE_DATA.set(genContext, bs, data);
return tmp;
}
private int prepLocalvariableDeclarationStatement(TemplateQueryContext genContext, SNode lstmt, int label) {
int nextLabel = this.ctx.incrementLabel();
Values.CLOSURE_DATA.set(genContext, lstmt, label);
this.prepLocalVariableDeclaration(genContext, SLinkOperations.getTarget(lstmt, MetaAdapterFactory.getContainmentLink(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc67c7f0L, 0xf8cc67c7f1L, "localVariableDeclaration")));
return nextLabel;
}
private void prepLocalVariableDeclaration(TemplateQueryContext genContext, SNode lvd) {
String name = "_" + this.ctx.label + "_" + SPropertyOperations.getString(lvd, MetaAdapterFactory.getProperty(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x110396eaaa4L, 0x110396ec041L, "name"));
Values.CLOSURE_DATA.set(genContext, lvd, name);
}
private int calcNextLabel(TemplateQueryContext genContext, SNode cstmt) {
if (SNodeOperations.isInstanceOf(cstmt, MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, "jetbrains.mps.baseLanguage.structure.IfStatement")) && SNodeOperations.isInstanceOf(SNodeOperations.getParent(cstmt), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, "jetbrains.mps.baseLanguage.structure.IfStatement"))) {
SNode topIfStmt = SNodeOperations.cast(SNodeOperations.getParent(cstmt), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, "jetbrains.mps.baseLanguage.structure.IfStatement"));
while (SNodeOperations.isInstanceOf(SNodeOperations.getParent(topIfStmt), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, "jetbrains.mps.baseLanguage.structure.IfStatement"))) {
topIfStmt = SNodeOperations.cast(SNodeOperations.getParent(topIfStmt), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b217L, "jetbrains.mps.baseLanguage.structure.IfStatement"));
}
Integer[] parentLabels = (Integer[]) Values.CLOSURE_DATA.get(genContext, topIfStmt);
if (parentLabels != null) {
return parentLabels[parentLabels.length - 1];
}
} else if ((SNodeOperations.getNextSibling(cstmt) == null) && SNodeOperations.isInstanceOf(SNodeOperations.getParent(cstmt), MetaAdapterFactory.getConcept(0xf3061a5392264cc5L, 0xa443f952ceaf5816L, 0xf8cc56b200L, "jetbrains.mps.baseLanguage.structure.StatementList"))) {
SNode sn = SNodeOperations.getParent(cstmt);
Integer[] parentLabels = (Integer[]) Values.CLOSURE_DATA.get(genContext, sn);
if (parentLabels != null) {
return parentLabels[parentLabels.length - 1];
}
}
return this.ctx.incrementLabel();
}
public static void prepStatementList(TemplateQueryContext genContext, SNode slist, ITemplateGenerator generator) {
PrepStatementUtil psu = new PrepStatementUtil(generator);
psu.prepTopStatementList(genContext, slist);
}
private static class Context {
public int label;
public Context() {
this.label = 0;
}
public int incrementLabel() {
this.label = this.label + 1;
return this.label;
}
}
}