Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 90 additions & 1 deletion src/VaVare.Tests/Statements/SelectionStatementTests.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
using NUnit.Framework;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using NUnit.Framework;
using VaVare.Generators.Common;
using VaVare.Generators.Common.Arguments.ArgumentTypes;
using VaVare.Generators.Common.BinaryExpressions;
using VaVare.Generators.Common.Patterns;
using VaVare.Models.References;
using VaVare.Statements;
using Assert = NUnit.Framework.Assert;
Expand Down Expand Up @@ -106,5 +109,91 @@ public void If_WhenCreatingAnIfWithBinaryExpressionAndExpressionStatement_Should
Assert.AreEqual("if(2==3)MyMethod();",
conditional.If(new ConditionalBinaryExpression(new ConstantReference(2), new ConstantReference(3), ConditionalStatements.Equal), Statement.Expression.Invoke("MyMethod").AsStatement()).ToString());
}

[Test]
public void If_ConditionalIsExpression()
{
var expected = "if(a is string){}".Replace(" ", "");
var sut = conditional.If(new ValueArgument("a", false), new ValueArgument("string", false), ConditionalStatements.Is, BodyGenerator.Create());

Assert.That(sut.ToFullString(), Is.EqualTo(expected));
}

[Test]
public void If_DeclarationPattern()
{
var expected = "if(a is string b){}".Replace(" ", "");

var declarationPattern = new DeclarationPattern(SyntaxFactory.ParseTypeName("string"), "b");
var sut = conditional.If(new ValueArgument("a", false), declarationPattern, BodyGenerator.Create());

Assert.That(sut.ToFullString(), Is.EqualTo(expected));
}

[Test]
public void If_NotTypePattern()
{
var expected = "if(a is not string){}".Replace(" ", "");

var typePattern = new TypePattern(SyntaxFactory.ParseTypeName("string"));
var pattern = new NotPattern(typePattern);
var sut = conditional.If(new ValueArgument("a", false), pattern, BodyGenerator.Create());

Assert.That(sut.ToFullString(), Is.EqualTo(expected));
}

[Test]
public void If_NotConstantPattern()
{
var expected = "if(a is not 12){}".Replace(" ", "");

var typePattern = new ConstantPattern(new ValueArgument(12));
var pattern = new NotPattern(typePattern);
var sut = conditional.If(new ValueArgument("a", false), pattern, BodyGenerator.Create());

Assert.That(sut.ToFullString(), Is.EqualTo(expected));
}

[Test]
public void If_NotAndRelationalPattern()
{
var expected = "if(a is not 12 and > 15){}".Replace(" ", "");

var typePattern = new ConstantPattern(new ValueArgument(12));
var relationPattern = new RelationalPattern(ConditionalStatements.GreaterThan, new ValueArgument(15));
var and = new AndPattern(typePattern, relationPattern);
var pattern = new NotPattern(and);
var sut = conditional.If(new ValueArgument("a", false), pattern, BodyGenerator.Create());

Assert.That(sut.ToFullString(), Is.EqualTo(expected));
}

[Test]
public void If_NotAndRelationalPatternGreaterEquals()
{
var expected = "if(a is not 12 and >= 15){}".Replace(" ", "");

var typePattern = new ConstantPattern(new ValueArgument(12));
var relationPattern = new RelationalPattern(ConditionalStatements.GreaterThanOrEqual, new ValueArgument(15));
var and = new AndPattern(typePattern, relationPattern);
var pattern = new NotPattern(and);
var sut = conditional.If(new ValueArgument("a", false), pattern, BodyGenerator.Create());

Assert.That(sut.ToFullString(), Is.EqualTo(expected));
}

[Test]
public void If_NotOrRelationalPatternGreaterEquals()
{
var expected = "if(a is not 12 or >= 15){}".Replace(" ", "");

var typePattern = new ConstantPattern(new ValueArgument(12));
var relationPattern = new RelationalPattern(ConditionalStatements.GreaterThanOrEqual, new ValueArgument(15));
var and = new OrPattern(typePattern, relationPattern);
var pattern = new NotPattern(and);
var sut = conditional.If(new ValueArgument("a", false), pattern, BodyGenerator.Create());

Assert.That(sut.ToFullString(), Is.EqualTo(expected));
}
}
}
5 changes: 5 additions & 0 deletions src/VaVare/Enums.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ public enum ConditionalStatements
/// Generate with a less than or equal conditional statement: <c>"&lt;="</c>.
/// </summary>
LessThanOrEqual,

/// <summary>
/// Generate with an is statement: <c>"is"</c>.
/// </summary>
Is,
}

/// <summary>
Expand Down
23 changes: 23 additions & 0 deletions src/VaVare/Factories/ConditionalFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,29 @@ public static SyntaxKind GetSyntaxKind(ConditionalStatements conditional)
return SyntaxKind.LessThanExpression;
case ConditionalStatements.LessThanOrEqual:
return SyntaxKind.LessThanOrEqualExpression;
case ConditionalStatements.Is:
return SyntaxKind.IsExpression;
default:
throw new ArgumentOutOfRangeException(nameof(conditional), conditional, null);
}
}

public static SyntaxKind GetSyntaxKindToken(ConditionalStatements conditional)
{
switch (conditional)
{
case ConditionalStatements.Equal:
return SyntaxKind.EqualsToken;
case ConditionalStatements.NotEqual:
return SyntaxKind.ExclamationEqualsToken;
case ConditionalStatements.GreaterThan:
return SyntaxKind.GreaterThanToken;
case ConditionalStatements.GreaterThanOrEqual:
return SyntaxKind.GreaterThanEqualsToken;
case ConditionalStatements.LessThan:
return SyntaxKind.LessThanToken;
case ConditionalStatements.LessThanOrEqual:
return SyntaxKind.LessThanEqualsToken;
default:
throw new ArgumentOutOfRangeException(nameof(conditional), conditional, null);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace VaVare.Generators.Common.PatternExpressions
{
public interface IPatternExpression
{
/// <summary>
/// Get the generated pattern expression.
/// </summary>
/// <returns>The generated pattern expression.</returns>
ExpressionSyntax GetPatternExpression();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;

using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace VaVare.Generators.Common.PatternExpressions
{
public class IsPatternExpression : IPatternExpression
{
private readonly ExpressionSyntax _expressionSyntax;
private readonly PatternSyntax _patternSyntax;

public IsPatternExpression(ExpressionSyntax expressionSyntax, PatternSyntax patternSyntax)
{
_expressionSyntax = expressionSyntax;
_patternSyntax = patternSyntax;
}

public ExpressionSyntax GetPatternExpression()
{
return IsPatternExpression(_expressionSyntax, _patternSyntax);
}
}
}
30 changes: 30 additions & 0 deletions src/VaVare/Generators/Common/Patterns/AndPattern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace VaVare.Generators.Common.Patterns
{
public class AndPattern : Pattern
{
private readonly PatternSyntax _left;
private readonly PatternSyntax _right;

public AndPattern(PatternSyntax left, PatternSyntax right)
{
_left = left;
_right = right;
}

public AndPattern(Pattern left, Pattern right)
{
_left = left.GetPatternSyntax();
_right = right.GetPatternSyntax();
}

public override PatternSyntax GetPatternSyntax()
{
return BinaryPattern(SyntaxKind.AndPattern, _left, _right);
}
}
}
26 changes: 26 additions & 0 deletions src/VaVare/Generators/Common/Patterns/ConstantPattern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using VaVare.Generators.Common.Arguments.ArgumentTypes;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace VaVare.Generators.Common.Patterns
{
public class ConstantPattern : Pattern
{
private readonly ExpressionSyntax _expressionSyntax;

public ConstantPattern(ExpressionSyntax expression)
{
_expressionSyntax = expression;
}

public ConstantPattern(IArgument argument)
{
_expressionSyntax = argument.GetArgumentSyntax().Expression;
}

public override PatternSyntax GetPatternSyntax()
{
return ConstantPattern(_expressionSyntax);
}
}
}
37 changes: 37 additions & 0 deletions src/VaVare/Generators/Common/Patterns/DeclarationPattern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using VaVare.Factories;
using VaVare.Generators.Common.Arguments.ArgumentTypes;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace VaVare.Generators.Common.Patterns
{
public class DeclarationPattern : Pattern
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Imho DesignationPattern would be a better name

{
private readonly TypeSyntax _typeSyntax;
private readonly VariableDesignationSyntax _variableDesignationSyntax;

public DeclarationPattern(TypeSyntax syntaxToken, VariableDesignationSyntax expressionSyntax)
{
_typeSyntax = syntaxToken;
_variableDesignationSyntax = expressionSyntax;
}

public DeclarationPattern(TypeSyntax syntaxToken, string identifier)
{
_typeSyntax = syntaxToken;
_variableDesignationSyntax = SingleVariableDesignation(Identifier(identifier));
}

public DeclarationPattern(TypeSyntax syntaxToken, SyntaxToken identifier)
{
_typeSyntax = syntaxToken;
_variableDesignationSyntax = SingleVariableDesignation(identifier);
}

public override PatternSyntax GetPatternSyntax()
{
return DeclarationPattern(_typeSyntax, _variableDesignationSyntax);
}
}
}
13 changes: 13 additions & 0 deletions src/VaVare/Generators/Common/Patterns/DiscardPattern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace VaVare.Generators.Common.Patterns
{
public class DiscardPattern : Pattern
{
public override PatternSyntax GetPatternSyntax()
{
return DiscardPattern();
}
}
}
9 changes: 9 additions & 0 deletions src/VaVare/Generators/Common/Patterns/IPattern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace VaVare.Generators.Common.Patterns
{
public interface IPattern
{
PatternSyntax GetPatternSyntax();
}
}
28 changes: 28 additions & 0 deletions src/VaVare/Generators/Common/Patterns/NotPattern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using VaVare.Factories;
using VaVare.Generators.Common.Arguments.ArgumentTypes;
using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace VaVare.Generators.Common.Patterns
{
public class NotPattern : Pattern
{
private readonly PatternSyntax _pattern;

public NotPattern(PatternSyntax pattern)
{
_pattern = pattern;
}

public NotPattern(Pattern pattern)
{
_pattern = pattern.GetPatternSyntax();
}

public override PatternSyntax GetPatternSyntax()
{
return UnaryPattern(_pattern);
}
}
}
30 changes: 30 additions & 0 deletions src/VaVare/Generators/Common/Patterns/OrPattern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;

using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;

namespace VaVare.Generators.Common.Patterns
{
public class OrPattern : Pattern
{
private readonly PatternSyntax _left;
private readonly PatternSyntax _right;

public OrPattern(PatternSyntax left, PatternSyntax right)
{
_left = left;
_right = right;
}

public OrPattern(Pattern left, Pattern right)
{
_left = left.GetPatternSyntax();
_right = right.GetPatternSyntax();
}

public override PatternSyntax GetPatternSyntax()
{
return BinaryPattern(SyntaxKind.OrPattern, _left, _right);
}
}
}
19 changes: 19 additions & 0 deletions src/VaVare/Generators/Common/Patterns/Pattern.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;

namespace VaVare.Generators.Common.Patterns
{
/// <summary>
/// Provides the base class from which the classes that represent pattern derived.
/// </summary>
public abstract class Pattern : IPattern
{
/// <summary>
/// Initializes a new instance of the <see cref="Pattern"/> class.
/// </summary>
protected Pattern()
{
}

public abstract PatternSyntax GetPatternSyntax();
}
}
Loading