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