Skip to content

Commit

Permalink
Locking the names of base contructor arguments to the subclass inject…
Browse files Browse the repository at this point in the history
…ed field names. Closes GH-7
  • Loading branch information
jeremydmiller committed May 8, 2024
1 parent 97c324f commit 430b00b
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project>
<PropertyGroup>
<VersionPrefix>3.5.2</VersionPrefix>
<VersionPrefix>3.5.3</VersionPrefix>
<LangVersion>10.0</LangVersion>
<Authors>Jeremy D. Miller;Babu Annamalai;Oskar Dudycz;Joona-Pekka Kokko</Authors>
<TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
Expand Down
39 changes: 39 additions & 0 deletions src/CodegenTests/Bugs/Bug_7_InjectedFieldNamedAsBaseCtor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using JasperFx.CodeGeneration;
using JasperFx.CodeGeneration.Model;
using Shouldly;
using Xunit;

namespace CodegenTests.Bugs;

public class Bug_7_InjectedFieldNamedAsBaseCtor
{
[Fact]
public void ArrangeFrames_WhereInjectedFieldHasTheSameNameAsBaseClass_ShouldUseThatNameInBaseCall()
{
// Arrange
var generatedAssembly = GeneratedAssembly.Empty();
generatedAssembly.ReferenceAssembly(typeof(BaseClass).Assembly);
var generatedType = generatedAssembly.AddType("ChildClass", typeof(BaseClass));
generatedType.AllInjectedFields.Add(new InjectedField(typeof(string), "dependency"));

// Act
generatedType.ArrangeFrames();

// Assert
generatedType.AllInjectedFields[0].CtorArgDeclaration.ShouldBe("int __dependency1");
generatedType.AllInjectedFields[1].CtorArgDeclaration.ShouldBe("string __dependency2");

// This fails because the ctor argument was not renamed
generatedType.BaseConstructorArguments[0].Usage.ShouldBe("__dependency1");
}

public class BaseClass
{
private readonly int dependency;

public BaseClass(int dependency)
{
this.dependency = dependency;
}
}
}
22 changes: 21 additions & 1 deletion src/JasperFx.CodeGeneration/Model/InjectedField.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using JasperFx.CodeGeneration.Frames;
using JasperFx.Core.Reflection;

namespace JasperFx.CodeGeneration.Model;
Expand Down Expand Up @@ -39,6 +40,25 @@ public void WriteAssignment(ISourceWriter writer)

public Variable ToBaseCtorVariable()
{
return new Variable(ArgType, CtorArg);
return new BaseConstructorArgument(this);
}
}

public class BaseConstructorArgument : Variable
{
private readonly InjectedField _field;

public BaseConstructorArgument(InjectedField field) : base(field.ArgType, field.Usage)
{
_field = field;
}

public override string Usage
{
get => _field.CtorArg;
protected set
{
// nothing
}
}
}

0 comments on commit 430b00b

Please sign in to comment.