public BoundElsePart(ElsePartSyntax syntax, BoundStatementBlock body) { Debug.Assert(!syntax.IsDefault(), "'syntax' must not be null."); Debug.Assert(!body.IsDefault(), "'body' must not be null."); this.Syntax = syntax; this.Body = body; }
private IfStatementSyntax ParseIfStatement() { var ifToken = this.Eat(TokenKind.If); var expression = this.ParseBaseExpression(); var thenToken = this.Eat(TokenKind.Then); this.RunToEndOfLine(); var statements = this.ParseStatementsExcept(TokenKind.ElseIf, TokenKind.Else, TokenKind.EndIf); var ifPart = new IfPartSyntax(ifToken, expression, thenToken, statements); var elseIfParts = new List <ElseIfPartSyntax>(); while (this.index < this.tokens.Count && this.Peek() == TokenKind.ElseIf) { var elseIfToken = this.Eat(TokenKind.ElseIf); expression = this.ParseBaseExpression(); thenToken = this.Eat(TokenKind.Then); this.RunToEndOfLine(); statements = this.ParseStatementsExcept(TokenKind.ElseIf, TokenKind.Else, TokenKind.EndIf); elseIfParts.Add(new ElseIfPartSyntax(elseIfToken, expression, thenToken, statements)); } ElsePartSyntax elsePartOpt = null; if (this.index < this.tokens.Count && this.Peek() == TokenKind.Else) { var elseToken = this.Eat(TokenKind.Else); this.RunToEndOfLine(); statements = this.ParseStatementsExcept(TokenKind.ElseIf, TokenKind.Else, TokenKind.EndIf); elsePartOpt = new ElsePartSyntax(elseToken, statements); } var endIfToken = this.Eat(TokenKind.EndIf); this.RunToEndOfLine(); return(new IfStatementSyntax(ifPart, elseIfParts, elsePartOpt, endIfToken)); }
private ElseStatement TraverseElseStatement(ElsePartSyntax eps, ref int returnCnt, bool nested = false) { ElseStatement elseStm = new ElseStatement(); elseStm.IsNested = nested; foreach (StatementSyntax ss in eps.Statements) { if (ss is AssignmentStatementSyntax) { //TODO: need to look at more than just then name! Method tempMethod = TraverseAccessVars(ss as AssignmentStatementSyntax); elseStm.AccessedVars.AddRange(tempMethod.AccessedVariables); elseStm.InvokedMethods.AddRange(tempMethod.InvokedMethods); } else if (ss is LocalDeclarationStatementSyntax) { Method tempMethod = TraverseVarDecls(ss as LocalDeclarationStatementSyntax); elseStm.AccessedVars.AddRange(tempMethod.AccessedVariables); elseStm.InvokedMethods.AddRange(tempMethod.InvokedMethods); } else if (ss is SingleLineIfStatementSyntax) { Decisions decision = TraverseIfStatement(ss as SingleLineIfStatementSyntax, ref returnCnt, true); elseStm.Nested.AddRange(decision.IfStatements); elseStm.Nested.AddRange(decision.ElseStatements); } else if (ss is MultiLineIfBlockSyntax) { Decisions decisions = TraverseMultiIfStatement(ss as MultiLineIfBlockSyntax, ref returnCnt, true); elseStm.Nested.AddRange(decisions.IfStatements); elseStm.Nested.AddRange(decisions.ElseStatements); } else if (ss is ElseStatementSyntax) { elseStm.Nested.Add(TravsereElseStatement(ss as ElseStatementSyntax, ref returnCnt, true)); } else if (ss is ForBlockSyntax) { Decisions tempDecision = TraverseForStatement(ss as ForBlockSyntax, ref returnCnt, true); elseStm.Nested.AddRange(tempDecision.IfStatements); elseStm.Nested.AddRange(tempDecision.ElseStatements); elseStm.Nested.AddRange(tempDecision.ForEachStatements); elseStm.Nested.AddRange(tempDecision.ForStatements); elseStm.Nested.AddRange(tempDecision.WhileLoops); elseStm.Nested.AddRange(tempDecision.DoWhileLoops); elseStm.Nested.AddRange(tempDecision.Catches); elseStm.Nested.AddRange(tempDecision.SwitchStatements); } else if (ss is SelectBlockSyntax) { elseStm.Nested.Add(TraverseSwitchStatement(ss as SelectBlockSyntax, ref returnCnt, true)); } else if (ss is DoLoopBlockSyntax) { elseStm.Nested.Add(TraverseDoWhileLoop(ss as DoLoopBlockSyntax, ref returnCnt, true)); } else if (ss is WhileBlockSyntax) { elseStm.Nested.Add(TraverseWhileLoop(ss as WhileBlockSyntax, ref returnCnt, true)); } else if (ss is CallStatementSyntax) { elseStm.InvokedMethods.Add(TraverseInvokedMethod(ss as CallStatementSyntax)); } else if (ss is ReturnStatementSyntax) { Method tempMethod = TraverseReturnStatement(ss as ReturnStatementSyntax); elseStm.InvokedMethods.AddRange(tempMethod.InvokedMethods); elseStm.AccessedVars.AddRange(tempMethod.AccessedVariables); returnCnt++; } } return elseStm; }