Add BlockStatement

This commit is contained in:
Alexander Luzgarev 2020-07-15 09:43:48 +02:00
parent 188dca85d8
commit d613ea3f12
9 changed files with 195 additions and 82 deletions

View File

@ -70,7 +70,7 @@ namespace Parser.Binding
private BoundIfStatement BindIfStatement(IfStatementSyntaxNode node) private BoundIfStatement BindIfStatement(IfStatementSyntaxNode node)
{ {
var condition = BindExpression(node.Condition); var condition = BindExpression(node.Condition);
var body = BindStatementList(node.Body); var body = BindBlockStatement(node.Body);
var elseIfClauses = node.ElseifClauses var elseIfClauses = node.ElseifClauses
.Where(n => n.IsNode) .Where(n => n.IsNode)
.Select(n => (ElseifClause)n.AsNode()!); .Select(n => (ElseifClause)n.AsNode()!);
@ -91,10 +91,16 @@ namespace Parser.Binding
private BoundElseClause BindElseClause(ElseClause node) private BoundElseClause BindElseClause(ElseClause node)
{ {
var body = BindStatementList(node.Body); var body = BindBlockStatement(node.Body);
return new BoundElseClause(node, body); return new BoundElseClause(node, body);
} }
private BoundBlockStatement BindBlockStatement(BlockStatementSyntaxNode node)
{
var boundStatements = BindStatementList(node.Statements);
return new BoundBlockStatement(node, boundStatements);
}
private ImmutableArray<BoundStatement> BindStatementList(SyntaxNodeOrTokenList list) private ImmutableArray<BoundStatement> BindStatementList(SyntaxNodeOrTokenList list)
{ {
var builder = ImmutableArray.CreateBuilder<BoundStatement>(); var builder = ImmutableArray.CreateBuilder<BoundStatement>();
@ -124,7 +130,7 @@ namespace Parser.Binding
private BoundElseIfClause BindElseIfClause(ElseifClause node) private BoundElseIfClause BindElseIfClause(ElseifClause node)
{ {
var condition = BindExpression(node.Condition); var condition = BindExpression(node.Condition);
var body = BindStatementList(node.Body); var body = BindBlockStatement(node.Body);
return new BoundElseIfClause(node, condition, body); return new BoundElseIfClause(node, condition, body);
} }

View File

@ -13,6 +13,7 @@ namespace Parser.Binding
// Statements // Statements
AbstractMethodDeclaration, AbstractMethodDeclaration,
BlockStatement,
ClassDeclaration, ClassDeclaration,
ConcreteMethodDeclaration, ConcreteMethodDeclaration,
EmptyStatement, EmptyStatement,
@ -144,6 +145,19 @@ namespace Parser.Binding
public override BoundNodeKind Kind => BoundNodeKind.AbstractMethodDeclaration; public override BoundNodeKind Kind => BoundNodeKind.AbstractMethodDeclaration;
} }
public class BoundBlockStatement : BoundStatement
{
public BoundBlockStatement(SyntaxNode syntax, ImmutableArray<BoundStatement> statements)
: base(syntax)
{
Statements = statements;
}
public override BoundNodeKind Kind => BoundNodeKind.BlockStatement;
public ImmutableArray<BoundStatement> Statements { get; }
}
public class BoundClassDeclaration : BoundStatement public class BoundClassDeclaration : BoundStatement
{ {
public BoundClassDeclaration(SyntaxNode syntax) public BoundClassDeclaration(SyntaxNode syntax)
@ -209,7 +223,7 @@ namespace Parser.Binding
public class BoundIfStatement : BoundStatement public class BoundIfStatement : BoundStatement
{ {
public BoundIfStatement(SyntaxNode syntax, BoundExpression condition, ImmutableArray<BoundStatement> body, IEnumerable<ElseifClause> elseIfClauses, BoundElseClause? elseClause) public BoundIfStatement(SyntaxNode syntax, BoundExpression condition, BoundBlockStatement body, IEnumerable<ElseifClause> elseIfClauses, BoundElseClause? elseClause)
: base(syntax) : base(syntax)
{ {
Condition = condition; Condition = condition;
@ -219,7 +233,7 @@ namespace Parser.Binding
} }
public BoundExpression Condition { get; } public BoundExpression Condition { get; }
public ImmutableArray<BoundStatement> Body { get; } public BoundBlockStatement Body { get; }
public IEnumerable<ElseifClause> ElseIfClauses { get; } public IEnumerable<ElseifClause> ElseIfClauses { get; }
public BoundElseClause? ElseClause { get; } public BoundElseClause? ElseClause { get; }
@ -511,7 +525,7 @@ namespace Parser.Binding
public class BoundElseIfClause : BoundNode public class BoundElseIfClause : BoundNode
{ {
public BoundElseIfClause(SyntaxNode syntax, BoundExpression condition, ImmutableArray<BoundStatement> body) public BoundElseIfClause(SyntaxNode syntax, BoundExpression condition, BoundBlockStatement body)
: base(syntax) : base(syntax)
{ {
Condition = condition; Condition = condition;
@ -519,19 +533,19 @@ namespace Parser.Binding
} }
public BoundExpression Condition { get; } public BoundExpression Condition { get; }
public ImmutableArray<BoundStatement> Body { get; } public BoundBlockStatement Body { get; }
public override BoundNodeKind Kind => BoundNodeKind.ElseIfClause; public override BoundNodeKind Kind => BoundNodeKind.ElseIfClause;
} }
public class BoundElseClause : BoundNode public class BoundElseClause : BoundNode
{ {
public BoundElseClause(SyntaxNode syntax, ImmutableArray<BoundStatement> body) public BoundElseClause(SyntaxNode syntax, BoundBlockStatement body)
: base(syntax) : base(syntax)
{ {
Body = body; Body = body;
} }
public ImmutableArray<BoundStatement> Body { get; } public BoundBlockStatement Body { get; }
public override BoundNodeKind Kind => BoundNodeKind.ElseClause; public override BoundNodeKind Kind => BoundNodeKind.ElseClause;
} }

View File

@ -212,7 +212,7 @@ namespace Parser.Internal
var name = EatToken(TokenKind.IdentifierToken); var name = EatToken(TokenKind.IdentifierToken);
var inputDescription = ParseFunctionInputDescription(); var inputDescription = ParseFunctionInputDescription();
var commas = ParseOptionalCommas(); var commas = ParseOptionalCommas();
var body = ParseStatementList(); var body = ParseBlockStatement();
var endKeyword = ParseEndKeyword(); var endKeyword = ParseEndKeyword();
//var endKeyword = //var endKeyword =
return Factory.FunctionDeclarationSyntax( return Factory.FunctionDeclarationSyntax(
@ -685,8 +685,8 @@ namespace Parser.Internal
throw new Exception("Case label cannot be empty."); throw new Exception("Case label cannot be empty.");
} }
var commas = ParseOptionalCommas(); var commas = ParseOptionalCommas();
var statementList = ParseStatementList(); var body = ParseBlockStatement();
return Factory.SwitchCaseSyntax(caseKeyword, caseId, commas, statementList); return Factory.SwitchCaseSyntax(caseKeyword, caseId, commas, body);
} }
private SwitchStatementSyntaxNode ParseSwitchStatement() private SwitchStatementSyntaxNode ParseSwitchStatement()
@ -722,7 +722,7 @@ namespace Parser.Internal
} }
var commas = ParseOptionalCommas(); var commas = ParseOptionalCommas();
var body = ParseStatementList(); var body = ParseBlockStatement();
var endKeyword = EatIdentifier("end"); var endKeyword = EatIdentifier("end");
return Factory.WhileStatementSyntax( return Factory.WhileStatementSyntax(
whileKeyword, whileKeyword,
@ -741,14 +741,14 @@ namespace Parser.Internal
throw new Exception("Condition in elseif clause cannot be empty."); throw new Exception("Condition in elseif clause cannot be empty.");
} }
var commas = ParseOptionalCommas(); var commas = ParseOptionalCommas();
var body = ParseStatementList(); var body = ParseBlockStatement();
return Factory.ElseifClause(elseifKeyword, condition, commas, body); return Factory.ElseifClause(elseifKeyword, condition, commas, body);
} }
private ElseClause ParseElseClause() private ElseClause ParseElseClause()
{ {
var elseKeyword = EatIdentifier("else"); var elseKeyword = EatIdentifier("else");
var body = ParseStatementList(); var body = ParseBlockStatement();
return Factory.ElseClause(elseKeyword, body); return Factory.ElseClause(elseKeyword, body);
} }
@ -761,7 +761,7 @@ namespace Parser.Internal
throw new Exception("Condition in if statement cannot be empty."); throw new Exception("Condition in if statement cannot be empty.");
} }
var commas = ParseOptionalSemicolonsOrCommas(); var commas = ParseOptionalSemicolonsOrCommas();
var body = ParseStatementList(); var body = ParseBlockStatement();
var elseifClauses = new SyntaxListBuilder<ElseifClause>(); var elseifClauses = new SyntaxListBuilder<ElseifClause>();
ElseClause? elseClause = null; ElseClause? elseClause = null;
while (true) while (true)
@ -804,7 +804,7 @@ namespace Parser.Internal
var forAssignment = (AssignmentExpressionSyntaxNode) expression; var forAssignment = (AssignmentExpressionSyntaxNode) expression;
var commas = ParseOptionalSemicolonsOrCommas(); var commas = ParseOptionalSemicolonsOrCommas();
var body = ParseStatementList(); var body = ParseBlockStatement();
var endKeyword = EatIdentifier("end"); var endKeyword = EatIdentifier("end");
return Factory.ForStatementSyntax( return Factory.ForStatementSyntax(
forKeyword, forKeyword,
@ -831,7 +831,7 @@ namespace Parser.Internal
private TryCatchStatementSyntaxNode ParseTryCatchStatement() private TryCatchStatementSyntaxNode ParseTryCatchStatement()
{ {
var tryKeyword = EatIdentifier("try"); var tryKeyword = EatIdentifier("try");
var tryBody = ParseStatementList(); var tryBody = ParseBlockStatement();
var catchClause = ParseCatchClause(); var catchClause = ParseCatchClause();
var endKeyword = EatIdentifier("end"); var endKeyword = EatIdentifier("end");
return Factory.TryCatchStatementSyntax(tryKeyword, tryBody, catchClause, endKeyword); return Factory.TryCatchStatementSyntax(tryKeyword, tryBody, catchClause, endKeyword);
@ -927,7 +927,7 @@ namespace Parser.Internal
var name = ParseCompoundName(); var name = ParseCompoundName();
var inputDescription = ParseFunctionInputDescription(); var inputDescription = ParseFunctionInputDescription();
var commas = ParseOptionalCommas(); var commas = ParseOptionalCommas();
var body = ParseStatementList(); var body = ParseBlockStatement();
var endKeyword = ParseEndKeyword(); var endKeyword = ParseEndKeyword();
return Factory.ConcreteMethodDeclarationSyntax( return Factory.ConcreteMethodDeclarationSyntax(
functionKeyword, functionKeyword,
@ -1190,6 +1190,12 @@ namespace Parser.Internal
} }
return ParseExpressionStatement(); return ParseExpressionStatement();
} }
private BlockStatementSyntaxNode ParseBlockStatement()
{
var statements = ParseStatementList();
return Factory.BlockStatementSyntax(statements);
}
private SyntaxList ParseStatementList() private SyntaxList ParseStatementList()
{ {

View File

@ -8,7 +8,12 @@ namespace Parser.Internal
return new FileSyntaxNode(statementList, endOfFile); return new FileSyntaxNode(statementList, endOfFile);
} }
public FunctionDeclarationSyntaxNode FunctionDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword) public BlockStatementSyntaxNode BlockStatementSyntax(SyntaxList statements)
{
return new BlockStatementSyntaxNode(statements);
}
public FunctionDeclarationSyntaxNode FunctionDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword)
{ {
return new FunctionDeclarationSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword); return new FunctionDeclarationSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword);
} }
@ -28,32 +33,32 @@ namespace Parser.Internal
return new SwitchStatementSyntaxNode(switchKeyword, switchExpression, optionalCommas, cases, endKeyword); return new SwitchStatementSyntaxNode(switchKeyword, switchExpression, optionalCommas, cases, endKeyword);
} }
public SwitchCaseSyntaxNode SwitchCaseSyntax(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body) public SwitchCaseSyntaxNode SwitchCaseSyntax(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body)
{ {
return new SwitchCaseSyntaxNode(caseKeyword, caseIdentifier, optionalCommas, body); return new SwitchCaseSyntaxNode(caseKeyword, caseIdentifier, optionalCommas, body);
} }
public WhileStatementSyntaxNode WhileStatementSyntax(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword) public WhileStatementSyntaxNode WhileStatementSyntax(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword)
{ {
return new WhileStatementSyntaxNode(whileKeyword, condition, optionalCommas, body, endKeyword); return new WhileStatementSyntaxNode(whileKeyword, condition, optionalCommas, body, endKeyword);
} }
public ElseifClause ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body) public ElseifClause ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body)
{ {
return new ElseifClause(elseifKeyword, condition, optionalCommas, body); return new ElseifClause(elseifKeyword, condition, optionalCommas, body);
} }
public ElseClause ElseClause(SyntaxToken elseKeyword, SyntaxList body) public ElseClause ElseClause(SyntaxToken elseKeyword, BlockStatementSyntaxNode body)
{ {
return new ElseClause(elseKeyword, body); return new ElseClause(elseKeyword, body);
} }
public IfStatementSyntaxNode IfStatementSyntax(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword) public IfStatementSyntaxNode IfStatementSyntax(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword)
{ {
return new IfStatementSyntaxNode(ifKeyword, condition, optionalCommas, body, elseifClauses, elseClause, endKeyword); return new IfStatementSyntaxNode(ifKeyword, condition, optionalCommas, body, elseifClauses, elseClause, endKeyword);
} }
public ForStatementSyntaxNode ForStatementSyntax(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword) public ForStatementSyntaxNode ForStatementSyntax(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword)
{ {
return new ForStatementSyntaxNode(forKeyword, assignment, optionalCommas, body, endKeyword); return new ForStatementSyntaxNode(forKeyword, assignment, optionalCommas, body, endKeyword);
} }
@ -68,7 +73,7 @@ namespace Parser.Internal
return new CatchClauseSyntaxNode(catchKeyword, catchBody); return new CatchClauseSyntaxNode(catchKeyword, catchBody);
} }
public TryCatchStatementSyntaxNode TryCatchStatementSyntax(SyntaxToken tryKeyword, SyntaxList tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword) public TryCatchStatementSyntaxNode TryCatchStatementSyntax(SyntaxToken tryKeyword, BlockStatementSyntaxNode tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword)
{ {
return new TryCatchStatementSyntaxNode(tryKeyword, tryBody, catchClause, endKeyword); return new TryCatchStatementSyntaxNode(tryKeyword, tryBody, catchClause, endKeyword);
} }
@ -203,7 +208,7 @@ namespace Parser.Internal
return new AttributeListSyntaxNode(openingBracket, nodes, closingBracket); return new AttributeListSyntaxNode(openingBracket, nodes, closingBracket);
} }
public ConcreteMethodDeclarationSyntaxNode ConcreteMethodDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword) public ConcreteMethodDeclarationSyntaxNode ConcreteMethodDeclarationSyntax(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword)
{ {
return new ConcreteMethodDeclarationSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword); return new ConcreteMethodDeclarationSyntaxNode(functionKeyword, outputDescription, name, inputDescription, commas, body, endKeyword);
} }

View File

@ -44,6 +44,44 @@ namespace Parser.Internal
} }
} }
internal class BlockStatementSyntaxNode : StatementSyntaxNode
{
internal readonly SyntaxList _statements;
internal BlockStatementSyntaxNode(SyntaxList statements): base(TokenKind.BlockStatement)
{
Slots = 1;
this.AdjustWidth(statements);
_statements = statements;
}
internal BlockStatementSyntaxNode(SyntaxList statements, TokenDiagnostic[] diagnostics): base(TokenKind.BlockStatement, diagnostics)
{
Slots = 1;
this.AdjustWidth(statements);
_statements = statements;
}
internal override Parser.SyntaxNode CreateRed(Parser.SyntaxNode parent, int position)
{
return new Parser.BlockStatementSyntaxNode(parent, this, position);
}
public override GreenNode SetDiagnostics(TokenDiagnostic[] diagnostics)
{
return new BlockStatementSyntaxNode(_statements, diagnostics);
}
public override GreenNode? GetSlot(int i)
{
return i switch
{
0 => _statements, _ => null
}
;
}
}
internal class FunctionDeclarationSyntaxNode : StatementSyntaxNode internal class FunctionDeclarationSyntaxNode : StatementSyntaxNode
{ {
internal readonly SyntaxToken _functionKeyword; internal readonly SyntaxToken _functionKeyword;
@ -51,9 +89,9 @@ namespace Parser.Internal
internal readonly SyntaxToken _name; internal readonly SyntaxToken _name;
internal readonly FunctionInputDescriptionSyntaxNode? _inputDescription; internal readonly FunctionInputDescriptionSyntaxNode? _inputDescription;
internal readonly SyntaxList<SyntaxToken> _commas; internal readonly SyntaxList<SyntaxToken> _commas;
internal readonly SyntaxList _body; internal readonly BlockStatementSyntaxNode _body;
internal readonly EndKeywordSyntaxNode? _endKeyword; internal readonly EndKeywordSyntaxNode? _endKeyword;
internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.FunctionDeclaration) internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.FunctionDeclaration)
{ {
Slots = 7; Slots = 7;
this.AdjustWidth(functionKeyword); this.AdjustWidth(functionKeyword);
@ -72,7 +110,7 @@ namespace Parser.Internal
_endKeyword = endKeyword; _endKeyword = endKeyword;
} }
internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.FunctionDeclaration, diagnostics) internal FunctionDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, SyntaxToken name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.FunctionDeclaration, diagnostics)
{ {
Slots = 7; Slots = 7;
this.AdjustWidth(functionKeyword); this.AdjustWidth(functionKeyword);
@ -266,8 +304,8 @@ namespace Parser.Internal
internal readonly SyntaxToken _caseKeyword; internal readonly SyntaxToken _caseKeyword;
internal readonly ExpressionSyntaxNode _caseIdentifier; internal readonly ExpressionSyntaxNode _caseIdentifier;
internal readonly SyntaxList<SyntaxToken> _optionalCommas; internal readonly SyntaxList<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body; internal readonly BlockStatementSyntaxNode _body;
internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body): base(TokenKind.SwitchCase) internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body): base(TokenKind.SwitchCase)
{ {
Slots = 4; Slots = 4;
this.AdjustWidth(caseKeyword); this.AdjustWidth(caseKeyword);
@ -280,7 +318,7 @@ namespace Parser.Internal
_body = body; _body = body;
} }
internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, TokenDiagnostic[] diagnostics): base(TokenKind.SwitchCase, diagnostics) internal SwitchCaseSyntaxNode(SyntaxToken caseKeyword, ExpressionSyntaxNode caseIdentifier, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, TokenDiagnostic[] diagnostics): base(TokenKind.SwitchCase, diagnostics)
{ {
Slots = 4; Slots = 4;
this.AdjustWidth(caseKeyword); this.AdjustWidth(caseKeyword);
@ -319,9 +357,9 @@ namespace Parser.Internal
internal readonly SyntaxToken _whileKeyword; internal readonly SyntaxToken _whileKeyword;
internal readonly ExpressionSyntaxNode _condition; internal readonly ExpressionSyntaxNode _condition;
internal readonly SyntaxList<SyntaxToken> _optionalCommas; internal readonly SyntaxList<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body; internal readonly BlockStatementSyntaxNode _body;
internal readonly SyntaxToken _endKeyword; internal readonly SyntaxToken _endKeyword;
internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword): base(TokenKind.WhileStatement) internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword): base(TokenKind.WhileStatement)
{ {
Slots = 5; Slots = 5;
this.AdjustWidth(whileKeyword); this.AdjustWidth(whileKeyword);
@ -336,7 +374,7 @@ namespace Parser.Internal
_endKeyword = endKeyword; _endKeyword = endKeyword;
} }
internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.WhileStatement, diagnostics) internal WhileStatementSyntaxNode(SyntaxToken whileKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.WhileStatement, diagnostics)
{ {
Slots = 5; Slots = 5;
this.AdjustWidth(whileKeyword); this.AdjustWidth(whileKeyword);
@ -377,8 +415,8 @@ namespace Parser.Internal
internal readonly SyntaxToken _elseifKeyword; internal readonly SyntaxToken _elseifKeyword;
internal readonly ExpressionSyntaxNode _condition; internal readonly ExpressionSyntaxNode _condition;
internal readonly SyntaxList<SyntaxToken> _optionalCommas; internal readonly SyntaxList<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body; internal readonly BlockStatementSyntaxNode _body;
internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body): base(TokenKind.ElseifClause) internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body): base(TokenKind.ElseifClause)
{ {
Slots = 4; Slots = 4;
this.AdjustWidth(elseifKeyword); this.AdjustWidth(elseifKeyword);
@ -391,7 +429,7 @@ namespace Parser.Internal
_body = body; _body = body;
} }
internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseifClause, diagnostics) internal ElseifClause(SyntaxToken elseifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseifClause, diagnostics)
{ {
Slots = 4; Slots = 4;
this.AdjustWidth(elseifKeyword); this.AdjustWidth(elseifKeyword);
@ -428,8 +466,8 @@ namespace Parser.Internal
internal class ElseClause : SyntaxNode internal class ElseClause : SyntaxNode
{ {
internal readonly SyntaxToken _elseKeyword; internal readonly SyntaxToken _elseKeyword;
internal readonly SyntaxList _body; internal readonly BlockStatementSyntaxNode _body;
internal ElseClause(SyntaxToken elseKeyword, SyntaxList body): base(TokenKind.ElseClause) internal ElseClause(SyntaxToken elseKeyword, BlockStatementSyntaxNode body): base(TokenKind.ElseClause)
{ {
Slots = 2; Slots = 2;
this.AdjustWidth(elseKeyword); this.AdjustWidth(elseKeyword);
@ -438,7 +476,7 @@ namespace Parser.Internal
_body = body; _body = body;
} }
internal ElseClause(SyntaxToken elseKeyword, SyntaxList body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseClause, diagnostics) internal ElseClause(SyntaxToken elseKeyword, BlockStatementSyntaxNode body, TokenDiagnostic[] diagnostics): base(TokenKind.ElseClause, diagnostics)
{ {
Slots = 2; Slots = 2;
this.AdjustWidth(elseKeyword); this.AdjustWidth(elseKeyword);
@ -473,11 +511,11 @@ namespace Parser.Internal
internal readonly SyntaxToken _ifKeyword; internal readonly SyntaxToken _ifKeyword;
internal readonly ExpressionSyntaxNode _condition; internal readonly ExpressionSyntaxNode _condition;
internal readonly SyntaxList<SyntaxToken> _optionalCommas; internal readonly SyntaxList<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body; internal readonly BlockStatementSyntaxNode _body;
internal readonly SyntaxList<ElseifClause> _elseifClauses; internal readonly SyntaxList<ElseifClause> _elseifClauses;
internal readonly ElseClause? _elseClause; internal readonly ElseClause? _elseClause;
internal readonly SyntaxToken _endKeyword; internal readonly SyntaxToken _endKeyword;
internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword): base(TokenKind.IfStatement) internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword): base(TokenKind.IfStatement)
{ {
Slots = 7; Slots = 7;
this.AdjustWidth(ifKeyword); this.AdjustWidth(ifKeyword);
@ -496,7 +534,7 @@ namespace Parser.Internal
_endKeyword = endKeyword; _endKeyword = endKeyword;
} }
internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.IfStatement, diagnostics) internal IfStatementSyntaxNode(SyntaxToken ifKeyword, ExpressionSyntaxNode condition, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxList<ElseifClause> elseifClauses, ElseClause? elseClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.IfStatement, diagnostics)
{ {
Slots = 7; Slots = 7;
this.AdjustWidth(ifKeyword); this.AdjustWidth(ifKeyword);
@ -541,9 +579,9 @@ namespace Parser.Internal
internal readonly SyntaxToken _forKeyword; internal readonly SyntaxToken _forKeyword;
internal readonly AssignmentExpressionSyntaxNode _assignment; internal readonly AssignmentExpressionSyntaxNode _assignment;
internal readonly SyntaxList<SyntaxToken> _optionalCommas; internal readonly SyntaxList<SyntaxToken> _optionalCommas;
internal readonly SyntaxList _body; internal readonly BlockStatementSyntaxNode _body;
internal readonly SyntaxToken _endKeyword; internal readonly SyntaxToken _endKeyword;
internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword): base(TokenKind.ForStatement) internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword): base(TokenKind.ForStatement)
{ {
Slots = 5; Slots = 5;
this.AdjustWidth(forKeyword); this.AdjustWidth(forKeyword);
@ -558,7 +596,7 @@ namespace Parser.Internal
_endKeyword = endKeyword; _endKeyword = endKeyword;
} }
internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> optionalCommas, SyntaxList body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ForStatement, diagnostics) internal ForStatementSyntaxNode(SyntaxToken forKeyword, AssignmentExpressionSyntaxNode assignment, SyntaxList<SyntaxToken> optionalCommas, BlockStatementSyntaxNode body, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ForStatement, diagnostics)
{ {
Slots = 5; Slots = 5;
this.AdjustWidth(forKeyword); this.AdjustWidth(forKeyword);
@ -688,10 +726,10 @@ namespace Parser.Internal
internal class TryCatchStatementSyntaxNode : StatementSyntaxNode internal class TryCatchStatementSyntaxNode : StatementSyntaxNode
{ {
internal readonly SyntaxToken _tryKeyword; internal readonly SyntaxToken _tryKeyword;
internal readonly SyntaxList _tryBody; internal readonly BlockStatementSyntaxNode _tryBody;
internal readonly CatchClauseSyntaxNode? _catchClause; internal readonly CatchClauseSyntaxNode? _catchClause;
internal readonly SyntaxToken _endKeyword; internal readonly SyntaxToken _endKeyword;
internal TryCatchStatementSyntaxNode(SyntaxToken tryKeyword, SyntaxList tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword): base(TokenKind.TryCatchStatement) internal TryCatchStatementSyntaxNode(SyntaxToken tryKeyword, BlockStatementSyntaxNode tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword): base(TokenKind.TryCatchStatement)
{ {
Slots = 4; Slots = 4;
this.AdjustWidth(tryKeyword); this.AdjustWidth(tryKeyword);
@ -704,7 +742,7 @@ namespace Parser.Internal
_endKeyword = endKeyword; _endKeyword = endKeyword;
} }
internal TryCatchStatementSyntaxNode(SyntaxToken tryKeyword, SyntaxList tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.TryCatchStatement, diagnostics) internal TryCatchStatementSyntaxNode(SyntaxToken tryKeyword, BlockStatementSyntaxNode tryBody, CatchClauseSyntaxNode? catchClause, SyntaxToken endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.TryCatchStatement, diagnostics)
{ {
Slots = 4; Slots = 4;
this.AdjustWidth(tryKeyword); this.AdjustWidth(tryKeyword);
@ -1878,9 +1916,9 @@ namespace Parser.Internal
internal readonly CompoundNameExpressionSyntaxNode _name; internal readonly CompoundNameExpressionSyntaxNode _name;
internal readonly FunctionInputDescriptionSyntaxNode? _inputDescription; internal readonly FunctionInputDescriptionSyntaxNode? _inputDescription;
internal readonly SyntaxList<SyntaxToken> _commas; internal readonly SyntaxList<SyntaxToken> _commas;
internal readonly SyntaxList _body; internal readonly BlockStatementSyntaxNode _body;
internal readonly EndKeywordSyntaxNode? _endKeyword; internal readonly EndKeywordSyntaxNode? _endKeyword;
internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.ConcreteMethodDeclaration) internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword): base(TokenKind.ConcreteMethodDeclaration)
{ {
Slots = 7; Slots = 7;
this.AdjustWidth(functionKeyword); this.AdjustWidth(functionKeyword);
@ -1899,7 +1937,7 @@ namespace Parser.Internal
_endKeyword = endKeyword; _endKeyword = endKeyword;
} }
internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, SyntaxList body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ConcreteMethodDeclaration, diagnostics) internal ConcreteMethodDeclarationSyntaxNode(SyntaxToken functionKeyword, FunctionOutputDescriptionSyntaxNode? outputDescription, CompoundNameExpressionSyntaxNode name, FunctionInputDescriptionSyntaxNode? inputDescription, SyntaxList<SyntaxToken> commas, BlockStatementSyntaxNode body, EndKeywordSyntaxNode? endKeyword, TokenDiagnostic[] diagnostics): base(TokenKind.ConcreteMethodDeclaration, diagnostics)
{ {
Slots = 7; Slots = 7;
this.AdjustWidth(functionKeyword); this.AdjustWidth(functionKeyword);

View File

@ -4,13 +4,16 @@
<Field Type="SyntaxList" Name="statementList" /> <Field Type="SyntaxList" Name="statementList" />
<Field Type="SyntaxToken" Name="endOfFile" /> <Field Type="SyntaxToken" Name="endOfFile" />
</Class> </Class>
<Class Name="BlockStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="BlockStatement">
<Field Type="SyntaxList" Name="statements" />
</Class>
<Class Name="FunctionDeclarationSyntaxNode" BaseClass="StatementSyntaxNode" Kind="FunctionDeclaration"> <Class Name="FunctionDeclarationSyntaxNode" BaseClass="StatementSyntaxNode" Kind="FunctionDeclaration">
<Field Type="SyntaxToken" Name="functionKeyword" /> <Field Type="SyntaxToken" Name="functionKeyword" />
<Field Type="FunctionOutputDescriptionSyntaxNode" Name="outputDescription" Nullable="true" /> <Field Type="FunctionOutputDescriptionSyntaxNode" Name="outputDescription" Nullable="true" />
<Field Type="SyntaxToken" Name="name" /> <Field Type="SyntaxToken" Name="name" />
<Field Type="FunctionInputDescriptionSyntaxNode" Name="inputDescription" Nullable="true"/> <Field Type="FunctionInputDescriptionSyntaxNode" Name="inputDescription" Nullable="true"/>
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="commas" /> <Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="commas" />
<Field Type="SyntaxList" Name="body" /> <Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="EndKeywordSyntaxNode" Name="endKeyword" Nullable="true"/> <Field Type="EndKeywordSyntaxNode" Name="endKeyword" Nullable="true"/>
</Class> </Class>
<Class Name="FunctionOutputDescriptionSyntaxNode" BaseClass="SyntaxNode" Kind="FunctionOutputDescription"> <Class Name="FunctionOutputDescriptionSyntaxNode" BaseClass="SyntaxNode" Kind="FunctionOutputDescription">
@ -33,30 +36,30 @@
<Field Type="SyntaxToken" Name="caseKeyword" /> <Field Type="SyntaxToken" Name="caseKeyword" />
<Field Type="ExpressionSyntaxNode" Name="caseIdentifier" /> <Field Type="ExpressionSyntaxNode" Name="caseIdentifier" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" /> <Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" /> <Field Type="BlockStatementSyntaxNode" Name="body" />
</Class> </Class>
<Class Name="WhileStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="WhileStatement"> <Class Name="WhileStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="WhileStatement">
<Field Type="SyntaxToken" Name="whileKeyword" /> <Field Type="SyntaxToken" Name="whileKeyword" />
<Field Type="ExpressionSyntaxNode" Name="condition" /> <Field Type="ExpressionSyntaxNode" Name="condition" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" /> <Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" /> <Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="SyntaxToken" Name="endKeyword" /> <Field Type="SyntaxToken" Name="endKeyword" />
</Class> </Class>
<Class Name="ElseifClause" BaseClass="SyntaxNode" Kind="ElseifClause"> <Class Name="ElseifClause" BaseClass="SyntaxNode" Kind="ElseifClause">
<Field Type="SyntaxToken" Name="elseifKeyword" /> <Field Type="SyntaxToken" Name="elseifKeyword" />
<Field Type="ExpressionSyntaxNode" Name="condition" /> <Field Type="ExpressionSyntaxNode" Name="condition" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" /> <Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" /> <Field Type="BlockStatementSyntaxNode" Name="body" />
</Class> </Class>
<Class Name="ElseClause" BaseClass="SyntaxNode" Kind="ElseClause"> <Class Name="ElseClause" BaseClass="SyntaxNode" Kind="ElseClause">
<Field Type="SyntaxToken" Name="elseKeyword" /> <Field Type="SyntaxToken" Name="elseKeyword" />
<Field Type="SyntaxList" Name="body" /> <Field Type="BlockStatementSyntaxNode" Name="body" />
</Class> </Class>
<Class Name="IfStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="IfStatement"> <Class Name="IfStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="IfStatement">
<Field Type="SyntaxToken" Name="ifKeyword" /> <Field Type="SyntaxToken" Name="ifKeyword" />
<Field Type="ExpressionSyntaxNode" Name="condition" /> <Field Type="ExpressionSyntaxNode" Name="condition" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" /> <Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" /> <Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="SyntaxList&lt;ElseifClause&gt;" Name="elseifClauses" /> <Field Type="SyntaxList&lt;ElseifClause&gt;" Name="elseifClauses" />
<Field Type="ElseClause" Name="elseClause" Nullable="true" /> <Field Type="ElseClause" Name="elseClause" Nullable="true" />
<Field Type="SyntaxToken" Name="endKeyword" /> <Field Type="SyntaxToken" Name="endKeyword" />
@ -65,7 +68,7 @@
<Field Type="SyntaxToken" Name="forKeyword" /> <Field Type="SyntaxToken" Name="forKeyword" />
<Field Type="AssignmentExpressionSyntaxNode" Name="assignment" /> <Field Type="AssignmentExpressionSyntaxNode" Name="assignment" />
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" /> <Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="optionalCommas" />
<Field Type="SyntaxList" Name="body" /> <Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="SyntaxToken" Name="endKeyword" /> <Field Type="SyntaxToken" Name="endKeyword" />
</Class> </Class>
<Class Name="AssignmentExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="AssignmentExpression"> <Class Name="AssignmentExpressionSyntaxNode" BaseClass="ExpressionSyntaxNode" Kind="AssignmentExpression">
@ -79,7 +82,7 @@
</Class> </Class>
<Class Name="TryCatchStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="TryCatchStatement"> <Class Name="TryCatchStatementSyntaxNode" BaseClass="StatementSyntaxNode" Kind="TryCatchStatement">
<Field Type="SyntaxToken" Name="tryKeyword" /> <Field Type="SyntaxToken" Name="tryKeyword" />
<Field Type="SyntaxList" Name="tryBody" /> <Field Type="BlockStatementSyntaxNode" Name="tryBody" />
<Field Type="CatchClauseSyntaxNode" Name="catchClause" Nullable="true" /> <Field Type="CatchClauseSyntaxNode" Name="catchClause" Nullable="true" />
<Field Type="SyntaxToken" Name="endKeyword" /> <Field Type="SyntaxToken" Name="endKeyword" />
</Class> </Class>
@ -196,7 +199,7 @@
<Field Type="CompoundNameExpressionSyntaxNode" Name="name" /> <Field Type="CompoundNameExpressionSyntaxNode" Name="name" />
<Field Type="FunctionInputDescriptionSyntaxNode" Name="inputDescription" Nullable="true"/> <Field Type="FunctionInputDescriptionSyntaxNode" Name="inputDescription" Nullable="true"/>
<Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="commas" /> <Field Type="SyntaxList&lt;SyntaxToken&gt;" Name="commas" />
<Field Type="SyntaxList" Name="body" /> <Field Type="BlockStatementSyntaxNode" Name="body" />
<Field Type="EndKeywordSyntaxNode" Name="endKeyword" Nullable="true" /> <Field Type="EndKeywordSyntaxNode" Name="endKeyword" Nullable="true" />
</Class> </Class>
<Class Name="AbstractMethodDeclarationSyntaxNode" BaseClass="MethodDeclarationSyntaxNode" Kind="AbstractMethodDeclaration"> <Class Name="AbstractMethodDeclarationSyntaxNode" BaseClass="MethodDeclarationSyntaxNode" Kind="AbstractMethodDeclaration">

View File

@ -41,6 +41,38 @@ namespace Parser
} }
} }
public class BlockStatementSyntaxNode : StatementSyntaxNode
{
private SyntaxNode? _statements;
internal BlockStatementSyntaxNode(SyntaxNode parent, Internal.GreenNode green, int position): base(parent, green, position)
{
}
public SyntaxNodeOrTokenList Statements
{
get
{
var red = this.GetRed(ref this._statements!, 0);
return red is null ? throw new System.Exception("statements cannot be null.") : (SyntaxNodeOrTokenList)red;
}
}
internal override SyntaxNode? GetNode(int i)
{
return i switch
{
0 => GetRed(ref _statements!, 0), _ => null
}
;
}
public override void Accept(SyntaxVisitor visitor)
{
visitor.VisitBlockStatement(this);
}
}
public class FunctionDeclarationSyntaxNode : StatementSyntaxNode public class FunctionDeclarationSyntaxNode : StatementSyntaxNode
{ {
private SyntaxNode? _outputDescription; private SyntaxNode? _outputDescription;
@ -95,12 +127,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList Body public BlockStatementSyntaxNode Body
{ {
get get
{ {
var red = this.GetRed(ref this._body!, 5); var red = this.GetRed(ref this._body!, 5);
return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }
@ -320,12 +352,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList Body public BlockStatementSyntaxNode Body
{ {
get get
{ {
var red = this.GetRed(ref this._body!, 3); var red = this.GetRed(ref this._body!, 3);
return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }
@ -388,12 +420,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList Body public BlockStatementSyntaxNode Body
{ {
get get
{ {
var red = this.GetRed(ref this._body!, 3); var red = this.GetRed(ref this._body!, 3);
return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }
@ -448,12 +480,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList Body public BlockStatementSyntaxNode Body
{ {
get get
{ {
var red = this.GetRed(ref this._body!, 3); var red = this.GetRed(ref this._body!, 3);
return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }
@ -488,12 +520,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList Body public BlockStatementSyntaxNode Body
{ {
get get
{ {
var red = this.GetRed(ref this._body!, 1); var red = this.GetRed(ref this._body!, 1);
return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }
@ -558,12 +590,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList Body public BlockStatementSyntaxNode Body
{ {
get get
{ {
var red = this.GetRed(ref this._body!, 3); var red = this.GetRed(ref this._body!, 3);
return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }
@ -644,12 +676,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList Body public BlockStatementSyntaxNode Body
{ {
get get
{ {
var red = this.GetRed(ref this._body!, 3); var red = this.GetRed(ref this._body!, 3);
return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }
@ -783,12 +815,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList TryBody public BlockStatementSyntaxNode TryBody
{ {
get get
{ {
var red = this.GetRed(ref this._tryBody!, 1); var red = this.GetRed(ref this._tryBody!, 1);
return red is null ? throw new System.Exception("tryBody cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("tryBody cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }
@ -1935,12 +1967,12 @@ namespace Parser
} }
} }
public SyntaxNodeOrTokenList Body public BlockStatementSyntaxNode Body
{ {
get get
{ {
var red = this.GetRed(ref this._body!, 5); var red = this.GetRed(ref this._body!, 5);
return red is null ? throw new System.Exception("body cannot be null.") : (SyntaxNodeOrTokenList)red; return red is null ? throw new System.Exception("body cannot be null.") : (BlockStatementSyntaxNode)red;
} }
} }

View File

@ -8,6 +8,11 @@ namespace Parser
DefaultVisit(node); DefaultVisit(node);
} }
public virtual void VisitBlockStatement(BlockStatementSyntaxNode node)
{
DefaultVisit(node);
}
public virtual void VisitFunctionDeclaration(FunctionDeclarationSyntaxNode node) public virtual void VisitFunctionDeclaration(FunctionDeclarationSyntaxNode node)
{ {
DefaultVisit(node); DefaultVisit(node);

View File

@ -142,6 +142,10 @@
// result = abstractMethod(object) // result = abstractMethod(object)
AbstractMethodDeclaration, AbstractMethodDeclaration,
// statement1
// statement2;
BlockStatement,
// classdef MyClass < BaseClass, AnotherBaseClass // classdef MyClass < BaseClass, AnotherBaseClass
// properties // properties
// y // y