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