public override AstNode ShallowClone() { var res = new AstCase(Source, Start, End, Expression); res.Body.AddRange(Body.AsReadOnlySpan()); return(res); }
AstCase ProcessSwitchCaseNode(AstCase astCase) { var safeLastCaseExpression = _lastCaseExpression; var safeIsAfterLoopControl = IsAfterJump; _lastCaseExpression = astCase.Expression; Descend(); _lastCaseExpression = safeLastCaseExpression; IsAfterJump = safeIsAfterLoopControl; return(astCase); }
AstSwitch ParseSwitchStatement(Position nodeStart) { Next(); var discriminant = ParseParenExpression(); var cases = new StructList <AstNode>(); Expect(TokenType.BraceL); EnterLexicalScope(); var startLoc = Start; AstSwitchBranch consequent = null; var backupAllowBreak = _allowBreak; for (var sawDefault = false; Type != TokenType.BraceR;) { if (Type == TokenType.Case || Type == TokenType.Default) { var isCase = Type == TokenType.Case; if (consequent != null) { consequent.End = _lastTokEnd; } startLoc = Start; Next(); _allowBreak = true; if (isCase) { var test = ParseExpression(); consequent = new AstCase(this, startLoc, startLoc, test); } else { if (sawDefault) { RaiseRecoverable(_lastTokStart, "Multiple default clauses"); } sawDefault = true; consequent = new AstDefault(this, startLoc, startLoc); } cases.Add(consequent); Expect(TokenType.Colon); } else { if (consequent == null) { Raise(Start, "Unexpected token"); } consequent.Body.Add(ParseStatement(true)); } } ExitLexicalScope(); if (consequent != null) { consequent.End = _lastTokEnd; } Next(); // Closing brace _allowBreak = backupAllowBreak; return(new AstSwitch(this, nodeStart, _lastTokEnd, discriminant, ref cases)); }