using System.Collections.Generic;
using MarketAlly.IronJava.Core.AST.Visitors;
namespace MarketAlly.IronJava.Core.AST.Nodes
{
///
/// Base class for class/interface members.
///
public abstract class MemberDeclaration : JavaNode
{
public Modifiers Modifiers { get; }
public IReadOnlyList Annotations { get; }
public JavaDoc? JavaDoc { get; }
protected MemberDeclaration(
SourceRange location,
Modifiers modifiers,
IReadOnlyList annotations,
JavaDoc? javaDoc) : base(location)
{
Modifiers = modifiers;
Annotations = annotations;
JavaDoc = javaDoc;
AddChildren(annotations);
if (javaDoc != null) AddChild(javaDoc);
}
}
///
/// Represents a field declaration.
///
public class FieldDeclaration : MemberDeclaration
{
public TypeReference Type { get; }
public IReadOnlyList Variables { get; }
public FieldDeclaration(
SourceRange location,
Modifiers modifiers,
IReadOnlyList annotations,
TypeReference type,
IReadOnlyList variables,
JavaDoc? javaDoc)
: base(location, modifiers, annotations, javaDoc)
{
Type = type;
Variables = variables;
AddChild(type);
AddChildren(variables);
}
public override T Accept(IJavaVisitor visitor) => visitor.VisitFieldDeclaration(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitFieldDeclaration(this);
}
///
/// Represents a method declaration.
///
public class MethodDeclaration : MemberDeclaration
{
public string Name { get; }
public TypeReference? ReturnType { get; } // null for constructors
public IReadOnlyList TypeParameters { get; }
public IReadOnlyList Parameters { get; }
public IReadOnlyList Throws { get; }
public BlockStatement? Body { get; }
public bool IsConstructor { get; }
public MethodDeclaration(
SourceRange location,
string name,
Modifiers modifiers,
IReadOnlyList annotations,
TypeReference? returnType,
IReadOnlyList typeParameters,
IReadOnlyList parameters,
IReadOnlyList throws,
BlockStatement? body,
JavaDoc? javaDoc,
bool isConstructor = false)
: base(location, modifiers, annotations, javaDoc)
{
Name = name;
ReturnType = returnType;
TypeParameters = typeParameters;
Parameters = parameters;
Throws = throws;
Body = body;
IsConstructor = isConstructor;
if (returnType != null) AddChild(returnType);
AddChildren(typeParameters);
AddChildren(parameters);
AddChildren(throws);
if (body != null) AddChild(body);
}
public override T Accept(IJavaVisitor visitor) => visitor.VisitMethodDeclaration(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitMethodDeclaration(this);
}
///
/// Represents an initializer block (static or instance).
///
public class InitializerBlock : MemberDeclaration
{
public BlockStatement Body { get; }
public bool IsStatic { get; }
public InitializerBlock(
SourceRange location,
BlockStatement body,
bool isStatic)
: base(location, isStatic ? Modifiers.Static : Modifiers.None, new List(), null)
{
Body = body;
IsStatic = isStatic;
AddChild(body);
}
public override T Accept(IJavaVisitor visitor) => visitor.VisitInitializerBlock(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitInitializerBlock(this);
}
///
/// Represents a variable declarator (used in fields and local variables).
///
public class VariableDeclarator : JavaNode
{
public string Name { get; }
public int ArrayDimensions { get; }
public Expression? Initializer { get; }
public VariableDeclarator(
SourceRange location,
string name,
int arrayDimensions,
Expression? initializer) : base(location)
{
Name = name;
ArrayDimensions = arrayDimensions;
Initializer = initializer;
if (initializer != null) AddChild(initializer);
}
public override T Accept(IJavaVisitor visitor) => visitor.VisitVariableDeclarator(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitVariableDeclarator(this);
}
///
/// Represents a method parameter.
///
public class Parameter : JavaNode
{
public TypeReference Type { get; }
public string Name { get; }
public bool IsVarArgs { get; }
public bool IsFinal { get; }
public IReadOnlyList Annotations { get; }
public Parameter(
SourceRange location,
TypeReference type,
string name,
bool isVarArgs,
bool isFinal,
IReadOnlyList annotations) : base(location)
{
Type = type;
Name = name;
IsVarArgs = isVarArgs;
IsFinal = isFinal;
Annotations = annotations;
AddChild(type);
AddChildren(annotations);
}
public override T Accept(IJavaVisitor visitor) => visitor.VisitParameter(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitParameter(this);
}
///
/// Represents an enum constant.
///
public class EnumConstant : JavaNode
{
public string Name { get; }
public IReadOnlyList Annotations { get; }
public IReadOnlyList Arguments { get; }
public ClassDeclaration? Body { get; }
public EnumConstant(
SourceRange location,
string name,
IReadOnlyList annotations,
IReadOnlyList arguments,
ClassDeclaration? body) : base(location)
{
Name = name;
Annotations = annotations;
Arguments = arguments;
Body = body;
AddChildren(annotations);
AddChildren(arguments);
if (body != null) AddChild(body);
}
public override T Accept(IJavaVisitor visitor) => visitor.VisitEnumConstant(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitEnumConstant(this);
}
///
/// Represents an annotation member.
///
public class AnnotationMember : JavaNode
{
public string Name { get; }
public TypeReference Type { get; }
public Expression? DefaultValue { get; }
public AnnotationMember(
SourceRange location,
string name,
TypeReference type,
Expression? defaultValue) : base(location)
{
Name = name;
Type = type;
DefaultValue = defaultValue;
AddChild(type);
if (defaultValue != null) AddChild(defaultValue);
}
public override T Accept(IJavaVisitor visitor) => visitor.VisitAnnotationMember(this);
public override void Accept(IJavaVisitor visitor) => visitor.VisitAnnotationMember(this);
}
}