// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; using System.Collections.Generic; namespace ICSharpCode.NRefactory.VB.Ast { public abstract class Expression : AstNode { #region Null public new static readonly Expression Null = new NullExpression (); sealed class NullExpression : Expression { public override bool IsNull { get { return true; } } public override S AcceptVisitor (IAstVisitor visitor, T data) { return default (S); } protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) { return other == null || other.IsNull; } } #endregion } public class BinaryOperatorExpression : Expression { public readonly static Role LeftExpressionRole = new Role("Left"); public readonly static Role RightExpressionRole = new Role("Right"); public BinaryOperatorExpression(Expression left, BinaryOperatorType type, Expression right) { AddChild(left, LeftExpressionRole); AddChild(right, RightExpressionRole); Operator = type; } public Expression Left { get { return GetChildByRole(LeftExpressionRole); } set { SetChildByRole(LeftExpressionRole, value); } } public BinaryOperatorType Operator { get; set; } public Expression Right { get { return GetChildByRole(RightExpressionRole); } set { SetChildByRole(RightExpressionRole, value); } } protected internal override bool DoMatch(AstNode other, ICSharpCode.NRefactory.PatternMatching.Match match) { throw new NotImplementedException(); } public override S AcceptVisitor(IAstVisitor visitor, T data) { return visitor.VisitBinaryOperatorExpression(this, data); } } public enum BinaryOperatorType { None, /// '&' in C#, 'And' in VB. BitwiseAnd, /// '|' in C#, 'Or' in VB. BitwiseOr, /// '&&' in C#, 'AndAlso' in VB. LogicalAnd, /// '||' in C#, 'OrElse' in VB. LogicalOr, /// '^' in C#, 'Xor' in VB. ExclusiveOr, /// > GreaterThan, /// >= GreaterThanOrEqual, /// '==' in C#, '=' in VB. Equality, /// '!=' in C#, '<>' in VB. InEquality, /// < LessThan, /// <= LessThanOrEqual, /// + Add, /// - Subtract, /// * Multiply, /// / Divide, /// '%' in C#, 'Mod' in VB. Modulus, /// VB-only: \ DivideInteger, /// VB-only: ^ Power, /// VB-only: & Concat, /// C#: << ShiftLeft, /// C#: >> ShiftRight, /// VB-only: Is ReferenceEquality, /// VB-only: IsNot ReferenceInequality, /// VB-only: Like Like, /// /// C#: ?? /// VB: IF(x, y) /// NullCoalescing, /// VB-only: ! DictionaryAccess } public class AssignmentExpression : Expression { public readonly static Role LeftExpressionRole = BinaryOperatorExpression.LeftExpressionRole; public readonly static Role RightExpressionRole = BinaryOperatorExpression.RightExpressionRole; public AssignmentExpression(Expression left, AssignmentOperatorType type, Expression right) { AddChild(left, LeftExpressionRole); AddChild(right, RightExpressionRole); Operator = type; } public Expression Left { get { return GetChildByRole(LeftExpressionRole); } set { SetChildByRole(LeftExpressionRole, value); } } public AssignmentOperatorType Operator { get; set; } public Expression Right { get { return GetChildByRole(RightExpressionRole); } set { SetChildByRole(RightExpressionRole, value); } } protected internal override bool DoMatch(AstNode other, ICSharpCode.NRefactory.PatternMatching.Match match) { throw new NotImplementedException(); } public override S AcceptVisitor(IAstVisitor visitor, T data) { return visitor.VisitAssignmentExpression(this, data); } } /// /// Target(Arguments) /// public class InvocationExpression : Expression { public Expression Target { get { return GetChildByRole (Roles.TargetExpression); } set { SetChildByRole(Roles.TargetExpression, value); } } public AstNodeCollection Arguments { get { return GetChildrenByRole(Roles.Argument); } } public override S AcceptVisitor (IAstVisitor visitor, T data) { return visitor.VisitInvocationExpression(this, data); } public InvocationExpression () { } public InvocationExpression (Expression target, IEnumerable arguments) { AddChild (target, Roles.TargetExpression); if (arguments != null) { foreach (var arg in arguments) { AddChild (arg, Roles.Argument); } } } public InvocationExpression (Expression target, params Expression[] arguments) : this (target, (IEnumerable)arguments) { } protected internal override bool DoMatch(AstNode other, PatternMatching.Match match) { InvocationExpression o = other as InvocationExpression; return o != null && this.Target.DoMatch(o.Target, match) && this.Arguments.DoMatch(o.Arguments, match); } } }