diff --git a/Sybil.UnitTests/MethodBuilderTests.cs b/Sybil.UnitTests/MethodBuilderTests.cs index 9f766fb..96b8c13 100644 --- a/Sybil.UnitTests/MethodBuilderTests.cs +++ b/Sybil.UnitTests/MethodBuilderTests.cs @@ -20,6 +20,7 @@ namespace Sybil.Tests private const string PublicEmptyMethod = "public string Test() => throw new NotImplementedException() ;"; private const string PublicSealedEmptyMethod = "public sealed string Test() => throw new NotImplementedException() ;"; private const string EmptyMethodWithParameter = "string Test(string someString) => throw new NotImplementedException() ;"; + private const string EmptyMethodWithThisParameter = "string Test(this string someString) => throw new NotImplementedException() ;"; private const string EmptyMethodWithParameterWithDefault = "string Test(string someString = null) => throw new NotImplementedException() ;"; private const string MethodWithArrowExpression = "string Test() => this.someString ;"; private const string PublicSealedMethodWithParameterAndExpression = "public sealed string Test(string someString = null) => this.someString ;"; @@ -131,6 +132,36 @@ namespace Sybil.Tests returnedBuilder.Should().NotBeNull().And.Subject.Should().Be(this.builder); } + [TestMethod] + public void WithThisParameter_ParameterNameNull_ThrowsArgumentNullException() + { + var action = () => + { + this.builder.WithThisParameter(ParameterType, null); + }; + + action.Should().Throw(); + } + + [TestMethod] + public void WithThisParameter_ParameterTypeNull_ThrowsArgumentNullException() + { + var action = () => + { + this.builder.WithThisParameter(null, ParameterName); + }; + + action.Should().Throw(); + } + + [TestMethod] + public void WithThisParameter_ParameterValid_ReturnsBuilder() + { + var returnedBuilder = this.builder.WithThisParameter(ParameterType, ParameterName); + + returnedBuilder.Should().NotBeNull().And.Subject.Should().Be(this.builder); + } + [TestMethod] public void WithBody_BodyNull_ThrowsArgumentNullException() { @@ -209,6 +240,14 @@ namespace Sybil.Tests result.Should().Be(EmptyMethodWithParameterWithDefault); } + [TestMethod] + public void WithThisParameter_ReturnsExpectedString() + { + var result = this.builder.WithThisParameter(ParameterType, ParameterName).Build().ToFullString(); + + result.Should().Be(EmptyMethodWithThisParameter); + } + [TestMethod] public void WithBody_ReturnsExpectedString() { diff --git a/Sybil/MethodBuilder.cs b/Sybil/MethodBuilder.cs index d4c6f6e..648f22c 100644 --- a/Sybil/MethodBuilder.cs +++ b/Sybil/MethodBuilder.cs @@ -53,7 +53,7 @@ namespace Sybil var parameter = SyntaxFactory.Parameter( SyntaxFactory.List(), - new SyntaxTokenList(), + SyntaxFactory.TokenList(), type: SyntaxFactory.ParseTypeName(parameterType), identifier: SyntaxFactory.ParseToken(parameterName), @default: equalsValueClauseSyntax); @@ -62,6 +62,22 @@ namespace Sybil return this; } + public MethodBuilder WithThisParameter(string parameterType, string parameterName) + { + _ = string.IsNullOrWhiteSpace(parameterName) ? throw new ArgumentNullException(nameof(parameterName)) : parameterName; + _ = string.IsNullOrWhiteSpace(parameterType) ? throw new ArgumentNullException(nameof(parameterType)) : parameterType; + + var parameter = SyntaxFactory.Parameter( + SyntaxFactory.List(), + SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.ThisKeyword)), + type: SyntaxFactory.ParseTypeName(parameterType), + identifier: SyntaxFactory.ParseToken(parameterName), + @default: null); + + this.MethodDeclarationSyntax = this.MethodDeclarationSyntax.AddParameterListParameters(parameter); + + return this; + } public MethodBuilder WithBody(string body) { this.BlockBody = SyntaxFactory.Block( diff --git a/Sybil/Sybil.csproj b/Sybil/Sybil.csproj index 5eb13e5..0b8ae23 100644 --- a/Sybil/Sybil.csproj +++ b/Sybil/Sybil.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.2.0 + 0.3.0