using System.Collections.Generic; using MarketAlly.IronJava.Core.AST.Visitors; namespace MarketAlly.IronJava.Core.AST.Nodes { /// /// Base class for all statements. /// public abstract class Statement : JavaNode { protected Statement(SourceRange location) : base(location) { } } /// /// Represents a block statement { ... }. /// public class BlockStatement : Statement { public IReadOnlyList Statements { get; } public BlockStatement(SourceRange location, IReadOnlyList statements) : base(location) { Statements = statements; AddChildren(statements); } public override T Accept(IJavaVisitor visitor) => visitor.VisitBlockStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitBlockStatement(this); } /// /// Represents a local variable declaration statement. /// public class LocalVariableStatement : Statement { public TypeReference Type { get; } public IReadOnlyList Variables { get; } public bool IsFinal { get; } public LocalVariableStatement( SourceRange location, TypeReference type, IReadOnlyList variables, bool isFinal) : base(location) { Type = type; Variables = variables; IsFinal = isFinal; AddChild(type); AddChildren(variables); } public override T Accept(IJavaVisitor visitor) => visitor.VisitLocalVariableStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitLocalVariableStatement(this); } /// /// Represents an expression statement. /// public class ExpressionStatement : Statement { public Expression Expression { get; } public ExpressionStatement(SourceRange location, Expression expression) : base(location) { Expression = expression; AddChild(expression); } public override T Accept(IJavaVisitor visitor) => visitor.VisitExpressionStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitExpressionStatement(this); } /// /// Represents an if statement. /// public class IfStatement : Statement { public Expression Condition { get; } public Statement ThenStatement { get; } public Statement? ElseStatement { get; } public IfStatement( SourceRange location, Expression condition, Statement thenStatement, Statement? elseStatement = null) : base(location) { Condition = condition; ThenStatement = thenStatement; ElseStatement = elseStatement; AddChild(condition); AddChild(thenStatement); if (elseStatement != null) AddChild(elseStatement); } public override T Accept(IJavaVisitor visitor) => visitor.VisitIfStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitIfStatement(this); } /// /// Represents a while loop. /// public class WhileStatement : Statement { public Expression Condition { get; } public Statement Body { get; } public WhileStatement( SourceRange location, Expression condition, Statement body) : base(location) { Condition = condition; Body = body; AddChild(condition); AddChild(body); } public override T Accept(IJavaVisitor visitor) => visitor.VisitWhileStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitWhileStatement(this); } /// /// Represents a do-while loop. /// public class DoWhileStatement : Statement { public Statement Body { get; } public Expression Condition { get; } public DoWhileStatement( SourceRange location, Statement body, Expression condition) : base(location) { Body = body; Condition = condition; AddChild(body); AddChild(condition); } public override T Accept(IJavaVisitor visitor) => visitor.VisitDoWhileStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitDoWhileStatement(this); } /// /// Represents a for loop. /// public class ForStatement : Statement { public IReadOnlyList Initializers { get; } public Expression? Condition { get; } public IReadOnlyList Updates { get; } public Statement Body { get; } public ForStatement( SourceRange location, IReadOnlyList initializers, Expression? condition, IReadOnlyList updates, Statement body) : base(location) { Initializers = initializers; Condition = condition; Updates = updates; Body = body; AddChildren(initializers); if (condition != null) AddChild(condition); AddChildren(updates); AddChild(body); } public override T Accept(IJavaVisitor visitor) => visitor.VisitForStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitForStatement(this); } /// /// Represents an enhanced for loop (for-each). /// public class ForEachStatement : Statement { public TypeReference VariableType { get; } public string VariableName { get; } public Expression Iterable { get; } public Statement Body { get; } public bool IsFinal { get; } public ForEachStatement( SourceRange location, TypeReference variableType, string variableName, Expression iterable, Statement body, bool isFinal) : base(location) { VariableType = variableType; VariableName = variableName; Iterable = iterable; Body = body; IsFinal = isFinal; AddChild(variableType); AddChild(iterable); AddChild(body); } public override T Accept(IJavaVisitor visitor) => visitor.VisitForEachStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitForEachStatement(this); } /// /// Represents a switch statement. /// public class SwitchStatement : Statement { public Expression Selector { get; } public IReadOnlyList Cases { get; } public SwitchStatement( SourceRange location, Expression selector, IReadOnlyList cases) : base(location) { Selector = selector; Cases = cases; AddChild(selector); AddChildren(cases); } public override T Accept(IJavaVisitor visitor) => visitor.VisitSwitchStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitSwitchStatement(this); } /// /// Represents a case in a switch statement. /// public class SwitchCase : JavaNode { public IReadOnlyList Labels { get; } // Empty for default case public IReadOnlyList Statements { get; } public bool IsDefault { get; } public SwitchCase( SourceRange location, IReadOnlyList labels, IReadOnlyList statements, bool isDefault) : base(location) { Labels = labels; Statements = statements; IsDefault = isDefault; AddChildren(labels); AddChildren(statements); } public override T Accept(IJavaVisitor visitor) => visitor.VisitSwitchCase(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitSwitchCase(this); } /// /// Represents a break statement. /// public class BreakStatement : Statement { public string? Label { get; } public BreakStatement(SourceRange location, string? label = null) : base(location) { Label = label; } public override T Accept(IJavaVisitor visitor) => visitor.VisitBreakStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitBreakStatement(this); } /// /// Represents a continue statement. /// public class ContinueStatement : Statement { public string? Label { get; } public ContinueStatement(SourceRange location, string? label = null) : base(location) { Label = label; } public override T Accept(IJavaVisitor visitor) => visitor.VisitContinueStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitContinueStatement(this); } /// /// Represents a return statement. /// public class ReturnStatement : Statement { public Expression? Value { get; } public ReturnStatement(SourceRange location, Expression? value = null) : base(location) { Value = value; if (value != null) AddChild(value); } public override T Accept(IJavaVisitor visitor) => visitor.VisitReturnStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitReturnStatement(this); } /// /// Represents a throw statement. /// public class ThrowStatement : Statement { public Expression Exception { get; } public ThrowStatement(SourceRange location, Expression exception) : base(location) { Exception = exception; AddChild(exception); } public override T Accept(IJavaVisitor visitor) => visitor.VisitThrowStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitThrowStatement(this); } /// /// Represents a try statement. /// public class TryStatement : Statement { public IReadOnlyList Resources { get; } public BlockStatement Body { get; } public IReadOnlyList CatchClauses { get; } public BlockStatement? FinallyBlock { get; } public TryStatement( SourceRange location, IReadOnlyList resources, BlockStatement body, IReadOnlyList catchClauses, BlockStatement? finallyBlock = null) : base(location) { Resources = resources; Body = body; CatchClauses = catchClauses; FinallyBlock = finallyBlock; AddChildren(resources); AddChild(body); AddChildren(catchClauses); if (finallyBlock != null) AddChild(finallyBlock); } public override T Accept(IJavaVisitor visitor) => visitor.VisitTryStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitTryStatement(this); } /// /// Represents a resource declaration in try-with-resources. /// public class ResourceDeclaration : JavaNode { public TypeReference Type { get; } public string Name { get; } public Expression Initializer { get; } public bool IsFinal { get; } public ResourceDeclaration( SourceRange location, TypeReference type, string name, Expression initializer, bool isFinal) : base(location) { Type = type; Name = name; Initializer = initializer; IsFinal = isFinal; AddChild(type); AddChild(initializer); } public override T Accept(IJavaVisitor visitor) => visitor.VisitResourceDeclaration(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitResourceDeclaration(this); } /// /// Represents a catch clause. /// public class CatchClause : JavaNode { public IReadOnlyList ExceptionTypes { get; } public string VariableName { get; } public BlockStatement Body { get; } public CatchClause( SourceRange location, IReadOnlyList exceptionTypes, string variableName, BlockStatement body) : base(location) { ExceptionTypes = exceptionTypes; VariableName = variableName; Body = body; AddChildren(exceptionTypes); AddChild(body); } public override T Accept(IJavaVisitor visitor) => visitor.VisitCatchClause(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitCatchClause(this); } /// /// Represents a synchronized statement. /// public class SynchronizedStatement : Statement { public Expression Lock { get; } public BlockStatement Body { get; } public SynchronizedStatement( SourceRange location, Expression @lock, BlockStatement body) : base(location) { Lock = @lock; Body = body; AddChild(@lock); AddChild(body); } public override T Accept(IJavaVisitor visitor) => visitor.VisitSynchronizedStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitSynchronizedStatement(this); } /// /// Represents a labeled statement. /// public class LabeledStatement : Statement { public string Label { get; } public Statement Statement { get; } public LabeledStatement( SourceRange location, string label, Statement statement) : base(location) { Label = label; Statement = statement; AddChild(statement); } public override T Accept(IJavaVisitor visitor) => visitor.VisitLabeledStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitLabeledStatement(this); } /// /// Represents an empty statement (;). /// public class EmptyStatement : Statement { public EmptyStatement(SourceRange location) : base(location) { } public override T Accept(IJavaVisitor visitor) => visitor.VisitEmptyStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitEmptyStatement(this); } /// /// Represents an assert statement. /// public class AssertStatement : Statement { public Expression Condition { get; } public Expression? Message { get; } public AssertStatement( SourceRange location, Expression condition, Expression? message = null) : base(location) { Condition = condition; Message = message; AddChild(condition); if (message != null) AddChild(message); } public override T Accept(IJavaVisitor visitor) => visitor.VisitAssertStatement(this); public override void Accept(IJavaVisitor visitor) => visitor.VisitAssertStatement(this); } }