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