Files
ironjava/IronJava.Core/AST/Nodes/Expressions.cs
2025-07-21 22:29:22 -04:00

496 lines
16 KiB
C#

using System.Collections.Generic;
using IronJava.Core.AST.Visitors;
namespace IronJava.Core.AST.Nodes
{
/// <summary>
/// Base class for all expressions.
/// </summary>
public abstract class Expression : JavaNode
{
protected Expression(SourceRange location) : base(location) { }
}
/// <summary>
/// Represents a literal value.
/// </summary>
public class LiteralExpression : Expression
{
public object? Value { get; }
public LiteralKind Kind { get; }
public LiteralExpression(SourceRange location, object? value, LiteralKind kind)
: base(location)
{
Value = value;
Kind = kind;
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitLiteralExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitLiteralExpression(this);
}
public enum LiteralKind
{
Null,
Boolean,
Integer,
Long,
Float,
Double,
Character,
String,
TextBlock
}
/// <summary>
/// Represents an identifier reference.
/// </summary>
public class IdentifierExpression : Expression
{
public string Name { get; }
public IdentifierExpression(SourceRange location, string name) : base(location)
{
Name = name;
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitIdentifierExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitIdentifierExpression(this);
}
/// <summary>
/// Represents 'this' expression.
/// </summary>
public class ThisExpression : Expression
{
public Expression? Qualifier { get; }
public ThisExpression(SourceRange location, Expression? qualifier = null) : base(location)
{
Qualifier = qualifier;
if (qualifier != null) AddChild(qualifier);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitThisExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitThisExpression(this);
}
/// <summary>
/// Represents 'super' expression.
/// </summary>
public class SuperExpression : Expression
{
public Expression? Qualifier { get; }
public SuperExpression(SourceRange location, Expression? qualifier = null) : base(location)
{
Qualifier = qualifier;
if (qualifier != null) AddChild(qualifier);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitSuperExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitSuperExpression(this);
}
/// <summary>
/// Represents a binary expression (a + b, a AND b, etc.).
/// </summary>
public class BinaryExpression : Expression
{
public Expression Left { get; }
public BinaryOperator Operator { get; }
public Expression Right { get; }
public BinaryExpression(
SourceRange location,
Expression left,
BinaryOperator @operator,
Expression right) : base(location)
{
Left = left;
Operator = @operator;
Right = right;
AddChild(left);
AddChild(right);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitBinaryExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitBinaryExpression(this);
}
public enum BinaryOperator
{
// Arithmetic
Add, Subtract, Multiply, Divide, Modulo,
// Bitwise
BitwiseAnd, BitwiseOr, BitwiseXor, LeftShift, RightShift, UnsignedRightShift,
// Logical
LogicalAnd, LogicalOr,
// Comparison
Equals, NotEquals, LessThan, LessThanOrEqual, GreaterThan, GreaterThanOrEqual,
// Assignment
Assign, AddAssign, SubtractAssign, MultiplyAssign, DivideAssign, ModuloAssign,
BitwiseAndAssign, BitwiseOrAssign, BitwiseXorAssign,
LeftShiftAssign, RightShiftAssign, UnsignedRightShiftAssign
}
/// <summary>
/// Represents a unary expression (!a, ++i, etc.).
/// </summary>
public class UnaryExpression : Expression
{
public UnaryOperator Operator { get; }
public Expression Operand { get; }
public bool IsPrefix { get; }
public UnaryExpression(
SourceRange location,
UnaryOperator @operator,
Expression operand,
bool isPrefix = true) : base(location)
{
Operator = @operator;
Operand = operand;
IsPrefix = isPrefix;
AddChild(operand);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitUnaryExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitUnaryExpression(this);
}
public enum UnaryOperator
{
Plus, Minus, BitwiseNot, LogicalNot,
PreIncrement, PreDecrement, PostIncrement, PostDecrement
}
/// <summary>
/// Represents a conditional expression (a ? b : c).
/// </summary>
public class ConditionalExpression : Expression
{
public Expression Condition { get; }
public Expression ThenExpression { get; }
public Expression ElseExpression { get; }
public ConditionalExpression(
SourceRange location,
Expression condition,
Expression thenExpression,
Expression elseExpression) : base(location)
{
Condition = condition;
ThenExpression = thenExpression;
ElseExpression = elseExpression;
AddChild(condition);
AddChild(thenExpression);
AddChild(elseExpression);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitConditionalExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitConditionalExpression(this);
}
/// <summary>
/// Represents a method call expression.
/// </summary>
public class MethodCallExpression : Expression
{
public Expression? Target { get; }
public string MethodName { get; }
public IReadOnlyList<TypeArgument> TypeArguments { get; }
public IReadOnlyList<Expression> Arguments { get; }
public MethodCallExpression(
SourceRange location,
Expression? target,
string methodName,
IReadOnlyList<TypeArgument> typeArguments,
IReadOnlyList<Expression> arguments) : base(location)
{
Target = target;
MethodName = methodName;
TypeArguments = typeArguments;
Arguments = arguments;
if (target != null) AddChild(target);
AddChildren(typeArguments);
AddChildren(arguments);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitMethodCallExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitMethodCallExpression(this);
}
/// <summary>
/// Represents a field access expression.
/// </summary>
public class FieldAccessExpression : Expression
{
public Expression Target { get; }
public string FieldName { get; }
public FieldAccessExpression(
SourceRange location,
Expression target,
string fieldName) : base(location)
{
Target = target;
FieldName = fieldName;
AddChild(target);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitFieldAccessExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitFieldAccessExpression(this);
}
/// <summary>
/// Represents an array access expression.
/// </summary>
public class ArrayAccessExpression : Expression
{
public Expression Array { get; }
public Expression Index { get; }
public ArrayAccessExpression(
SourceRange location,
Expression array,
Expression index) : base(location)
{
Array = array;
Index = index;
AddChild(array);
AddChild(index);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitArrayAccessExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitArrayAccessExpression(this);
}
/// <summary>
/// Represents a cast expression.
/// </summary>
public class CastExpression : Expression
{
public TypeReference Type { get; }
public Expression Expression { get; }
public CastExpression(
SourceRange location,
TypeReference type,
Expression expression) : base(location)
{
Type = type;
Expression = expression;
AddChild(type);
AddChild(expression);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitCastExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitCastExpression(this);
}
/// <summary>
/// Represents an instanceof expression.
/// </summary>
public class InstanceOfExpression : Expression
{
public Expression Expression { get; }
public TypeReference Type { get; }
public string? PatternVariable { get; }
public InstanceOfExpression(
SourceRange location,
Expression expression,
TypeReference type,
string? patternVariable = null) : base(location)
{
Expression = expression;
Type = type;
PatternVariable = patternVariable;
AddChild(expression);
AddChild(type);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitInstanceOfExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitInstanceOfExpression(this);
}
/// <summary>
/// Represents a 'new' expression for object creation.
/// </summary>
public class NewExpression : Expression
{
public ClassOrInterfaceType Type { get; }
public IReadOnlyList<Expression> Arguments { get; }
public ClassDeclaration? AnonymousClassBody { get; }
public NewExpression(
SourceRange location,
ClassOrInterfaceType type,
IReadOnlyList<Expression> arguments,
ClassDeclaration? anonymousClassBody = null) : base(location)
{
Type = type;
Arguments = arguments;
AnonymousClassBody = anonymousClassBody;
AddChild(type);
AddChildren(arguments);
if (anonymousClassBody != null) AddChild(anonymousClassBody);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitNewExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitNewExpression(this);
}
/// <summary>
/// Represents an array creation expression.
/// </summary>
public class NewArrayExpression : Expression
{
public TypeReference ElementType { get; }
public IReadOnlyList<Expression> Dimensions { get; }
public ArrayInitializer? Initializer { get; }
public NewArrayExpression(
SourceRange location,
TypeReference elementType,
IReadOnlyList<Expression> dimensions,
ArrayInitializer? initializer = null) : base(location)
{
ElementType = elementType;
Dimensions = dimensions;
Initializer = initializer;
AddChild(elementType);
AddChildren(dimensions);
if (initializer != null) AddChild(initializer);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitNewArrayExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitNewArrayExpression(this);
}
/// <summary>
/// Represents an array initializer.
/// </summary>
public class ArrayInitializer : Expression
{
public IReadOnlyList<Expression> Elements { get; }
public ArrayInitializer(
SourceRange location,
IReadOnlyList<Expression> elements) : base(location)
{
Elements = elements;
AddChildren(elements);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitArrayInitializer(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitArrayInitializer(this);
}
/// <summary>
/// Represents a lambda expression.
/// </summary>
public class LambdaExpression : Expression
{
public IReadOnlyList<LambdaParameter> Parameters { get; }
public JavaNode Body { get; } // Can be Expression or BlockStatement
public LambdaExpression(
SourceRange location,
IReadOnlyList<LambdaParameter> parameters,
JavaNode body) : base(location)
{
Parameters = parameters;
Body = body;
AddChildren(parameters);
AddChild(body);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitLambdaExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitLambdaExpression(this);
}
/// <summary>
/// Represents a lambda parameter.
/// </summary>
public class LambdaParameter : JavaNode
{
public string Name { get; }
public TypeReference? Type { get; }
public bool IsFinal { get; }
public LambdaParameter(
SourceRange location,
string name,
TypeReference? type = null,
bool isFinal = false) : base(location)
{
Name = name;
Type = type;
IsFinal = isFinal;
if (type != null) AddChild(type);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitLambdaParameter(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitLambdaParameter(this);
}
/// <summary>
/// Represents a method reference expression (String::length).
/// </summary>
public class MethodReferenceExpression : Expression
{
public Expression Target { get; }
public string MethodName { get; }
public IReadOnlyList<TypeArgument> TypeArguments { get; }
public MethodReferenceExpression(
SourceRange location,
Expression target,
string methodName,
IReadOnlyList<TypeArgument> typeArguments) : base(location)
{
Target = target;
MethodName = methodName;
TypeArguments = typeArguments;
AddChild(target);
AddChildren(typeArguments);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitMethodReferenceExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitMethodReferenceExpression(this);
}
/// <summary>
/// Represents a class literal expression (String.class).
/// </summary>
public class ClassLiteralExpression : Expression
{
public TypeReference Type { get; }
public ClassLiteralExpression(SourceRange location, TypeReference type) : base(location)
{
Type = type;
AddChild(type);
}
public override T Accept<T>(IJavaVisitor<T> visitor) => visitor.VisitClassLiteralExpression(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitClassLiteralExpression(this);
}
}