Skip to content

Commit ff9accc

Browse files
authored
Merge pull request #337 from adrianoc/staging
May 2025 Update - Version 2.21
2 parents 9424d62 + 727c881 commit ff9accc

38 files changed

+213
-131
lines changed

.github/workflows/cecilifier-ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ jobs:
88
- uses: actions/checkout@v4
99
- uses: actions/setup-dotnet@v4
1010
with:
11-
dotnet-version: '8.0.x'
12-
- run: dotnet tool install --global dotnet-ilverify --version 8.0.0
11+
dotnet-version: '9.0.x'
12+
- run: dotnet tool install --global dotnet-ilverify --version 9.0.0
1313
- run: dotnet restore
1414
- run: dotnet test --filter 'TestCategory !~ Issues' --collect:"XPlat Code Coverage"
1515
- run: dotnet format style --verify-no-changes

Cecilifier.Benchmarks/Cecilifier.Benchmarks.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net8.0</TargetFramework>
5+
<TargetFramework>net9.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>

Cecilifier.Benchmarks/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public static void Main(string[] args)
1313
public class CecilifierExtensionsBenchmarks
1414
{
1515
[ParamsSource(nameof(PascalCaseValues))]
16-
public string PascalCaseValue { get; set; }
16+
private string PascalCaseValue { get; set; } = string.Empty;
1717

1818
[Benchmark(Baseline = true)]
1919
public string PascalCaseNaive()

Cecilifier.Common.props

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
<Project>
22
<PropertyGroup>
3-
<TargetFramework>net8.0</TargetFramework>
4-
<LangVersion>12</LangVersion>
5-
<AssemblyVersion>2.20.0</AssemblyVersion>
3+
<TargetFramework>net9.0</TargetFramework>
4+
<LangVersion>13</LangVersion>
5+
<AssemblyVersion>2.21.0</AssemblyVersion>
66
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
7+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
78

89
<!-- Only copy english resource assemblies -->
910
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>

Cecilifier.CommonPackages.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project>
22
<ItemGroup>
3-
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0-1.final" />
4-
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.12.0-1.final" />
3+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
4+
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.13.0" />
55
<PackageReference Include="Mono.Cecil"><Version>0.11.6</Version></PackageReference>
66
</ItemGroup>
77
</Project>

Cecilifier.Core.Tests/Cecilifier.Core.Tests.csproj

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<Import Project="../Cecilifier.Common.props" />
33
<Import Project="../Cecilifier.CommonPackages.props" />
4+
5+
<PropertyGroup>
6+
<!--
7+
NuGet resolution complains about `Microsoft.CodeAnalysis.CSharp 4.13.0` requiring `System.Reflection.Metadata (>= 9.0.0-rtm.24511.16)`
8+
but according to https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp#dependencies-body-tab when targeting
9+
.NET 9.0 it depends on `System.Reflection.Metadata (>= 8.0.0)`
10+
11+
Cecilifier.Core.Tests.csproj: Warning NU1603 : Microsoft.CodeAnalysis.CSharp 4.13.0 depends on System.Reflection.Metadata (>= 9.0.0-rtm.24511.16) but System.Reflection.Metadata 9.0.0-rtm.24511.16 was not found. System.Reflection.Metadata 9.0.0 was resolved instead.
12+
-->
13+
<NoWarn>$(NoWarn);NU1603</NoWarn>
14+
</PropertyGroup>
415
<ItemGroup>
5-
<PackageReference Include="Basic.Reference.Assemblies.Net80" Version="1.7.9" />
6-
<PackageReference Include="coverlet.collector" Version="6.0.2">
7-
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
16+
<PackageReference Include="Basic.Reference.Assemblies.Net90" Version="1.8.0" />
17+
<PackageReference Include="coverlet.collector" Version="6.0.4">
818
<PrivateAssets>all</PrivateAssets>
19+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
920
</PackageReference>
10-
<PackageReference Include="Microsoft.ILVerification" Version="9.0.0-rc.2.24473.5" />
21+
<PackageReference Include="Microsoft.ILVerification" Version="9.0" />
1122
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
1223
<PackageReference Include="NSubstitute" Version="5.3.0" />
1324
<PackageReference Include="NUnit" Version="4.2.2" />
14-
<PackageReference Include="NUnit3TestAdapter" Version="4.6.0" />
25+
<PackageReference Include="NUnit3TestAdapter" Version="5.0.0-beta.5" />
1526
</ItemGroup>
1627
<ItemGroup>
1728
<ProjectReference Include="..\Cecilifier.Core\Cecilifier.Core.csproj" />

Cecilifier.Core.Tests/TestResources/Integration/Generics/GenericTypesAsMembers.cs.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ using System.Collections.Generic;
22

33
class GenericTypesAsMembers
44
{
5-
public IList<int> field;
6-
public IList<int> Property { get { return field; } set { field = value; } }
5+
public IList<int> asField;
6+
public IList<int> Property { get { return asField; } set { asField = value; } }
77

88
public IList<string> Method(IList<string> l)
99
{

Cecilifier.Core.Tests/TestResources/Integration/Members/Methods/RefProperties.cs.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
class RefProperties
22
{
3-
private int field;
3+
private int prop;
44
ref int Property
55
{
6-
get => ref field;
6+
get => ref prop;
77
}
88

99
public ref int UseRefProperty() => ref Property;

Cecilifier.Core.Tests/Tests/OutputBased/NullCoalescingOperatorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,6 @@ public void TestAssociative(string a, string b, string c, string expectedOutput)
6060
{
6161
AssertOutput($"System.Console.Write({Quote(a)} ?? {Quote(b)} ?? {Quote(c)});", expectedOutput);
6262

63-
string? Quote(string s) => s == null ? "null" : $"\"{s}\"";
63+
string Quote(string s) => s == null ? "null" : $"\"{s}\"";
6464
}
6565
}

Cecilifier.Core.Tests/Tests/OutputBased/RecordTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ record Record(string Name, Record Other);
100100
}
101101

102102
[TestFixture]
103-
public class Equals : OutputBasedTestBase
103+
public class EqualsOverloadTest : OutputBasedTestBase
104104
{
105105
[Test]
106106
public void RecordTypeOverload_WhenInheritingFromObject_Works()

Cecilifier.Core.Tests/Tests/Unit/MemberDependencies/MemberDependencyTestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private protected IReadOnlyCollection<MemberDependency> CollectDependenciesFromS
2323
protected static CSharpCompilation CompilationFor(params string[] code)
2424
{
2525
var syntaxTrees = code.Select(source => CSharpSyntaxTree.ParseText(source));
26-
var comp = CSharpCompilation.Create("Test", syntaxTrees, Basic.Reference.Assemblies.Net80.References.All, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
26+
var comp = CSharpCompilation.Create("Test", syntaxTrees, Basic.Reference.Assemblies.Net90.References.All, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
2727

2828
var errors = comp.GetDiagnostics()
2929
.Where(d => d.Severity == DiagnosticSeverity.Error)

Cecilifier.Core.Tests/Tests/Unit/MethodExtensionsTests.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Diagnostics;
23
using System.Linq;
34
using Cecilifier.Core.Extensions;
45
using Cecilifier.Core.Tests.Tests.Unit.Framework;
@@ -42,7 +43,7 @@ public void ResolvingInnerTypesFromExternalAssembly_UsesReflectionName()
4243
{
4344
var context = NewContext();
4445

45-
var testType = context.SemanticModel.Compilation.GetTypeByMetadataName("Cecilifier.Core.Tests.Tests.Unit.TestScenario");
46+
var testType = context.SemanticModel.Compilation.GetTypeByMetadataName("Cecilifier.Core.Tests.Tests.Unit.TestScenario").EnsureNotNull();
4647
var testMethod = testType.GetMembers("UseNestedType").Single().EnsureNotNull<ISymbol, IMethodSymbol>();
4748

4849
var resolvedMethod = testMethod.MethodResolverExpression(context);
@@ -54,7 +55,7 @@ public void OverloadResolution_DifferentNumberOfArguments()
5455
{
5556
var context = NewContext();
5657

57-
var testType = context.SemanticModel.Compilation.GetTypeByMetadataName("Cecilifier.Core.Tests.Tests.Unit.SomeClass`1");
58+
var testType = context.SemanticModel.Compilation.GetTypeByMetadataName("Cecilifier.Core.Tests.Tests.Unit.SomeClass`1").EnsureNotNull();
5859
var testMethod = testType.GetMembers("Overload1").OfType<IMethodSymbol>().First(m => m.Parameters.Length == 2).EnsureNotNull<ISymbol, IMethodSymbol>();
5960

6061
var resolvedMethod = testMethod.MethodResolverExpression(context);
@@ -79,7 +80,7 @@ public void OverloadResolution_SameNumberOfArguments()
7980
{
8081
var context = NewContext();
8182

82-
var testType = context.SemanticModel.Compilation.GetTypeByMetadataName("Cecilifier.Core.Tests.Tests.Unit.SomeClass`1");
83+
var testType = context.SemanticModel.Compilation.GetTypeByMetadataName("Cecilifier.Core.Tests.Tests.Unit.SomeClass`1").EnsureNotNull();
8384
var testMethod = testType.GetMembers("Overload2").OfType<IMethodSymbol>().First(m => m.Parameters.Length == 2).EnsureNotNull<ISymbol, IMethodSymbol>();
8485

8586
var resolvedMethod = testMethod.MethodResolverExpression(context);

Cecilifier.Core.Tests/Tests/Unit/PrivateImplementationDetailsGeneratorTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ static TestCaseData[] BackingFieldNameTestScenarios()
167167

168168
static TestCaseData TestCaseDataFor<T>(Expression<Func<T[]>> expression, FieldInfo[] fields)
169169
{
170-
Boolean b;
171170
var fieldExpression = (MemberExpression) expression.Body;
172171
var fieldName = fieldExpression.Member.Name.AsSpan();
173172
var sizeSeparatorIndex = fieldName.IndexOf('_');

Cecilifier.Core.Tests/Tests/Unit/TypeResolverTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public void TypeParameterFromDeclaringType_Resolves_To_DeclaredVariable()
4949
{
5050
var context = NewContext();
5151
var m1Syntax = GetMethodSyntax(context, "M1"); // Func<T> M1() {}
52-
var m1Symbol = context.SemanticModel.GetDeclaredSymbol(m1Syntax);
52+
var m1Symbol = context.SemanticModel.GetDeclaredSymbol(m1Syntax).EnsureNotNull();
5353

5454
// Simulates type parameter `T` being registered under type `Foo`
5555
using var _ = context.DefinitionVariables.WithCurrent("Foo<T>", "T", VariableMemberKind.TypeParameter, "TypeParameter_T_var");
@@ -63,7 +63,7 @@ public void TypeParameterFromGenericMethod_Resolves_To_DeclaredVariable()
6363
{
6464
var context = NewContext();
6565
var methodSyntax = GetMethodSyntax(context, "M2"); // Func<TM> M2<TM>() {}
66-
var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodSyntax);
66+
var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodSyntax).EnsureNotNull();
6767

6868
// Simulates type parameter `T` being registered under method `M2`
6969
using var _ = context.DefinitionVariables.WithCurrent("Foo<T>.M2<TM>()", "TM", VariableMemberKind.TypeParameter, "TypeParameter_TM_var");
@@ -77,7 +77,7 @@ public void TypeParameterFromGenericMethodAndGenericType_Resolves_To_DeclaredVar
7777
{
7878
var context = NewContext();
7979
var methodSyntax = GetMethodSyntax(context, "M3"); // Func<T, TM> M3<TM>() {}
80-
var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodSyntax);
80+
var methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodSyntax).EnsureNotNull();
8181

8282
// Simulates type parameters `T` & `TM` being registered under their respective members.
8383
using var t = context.DefinitionVariables.WithCurrent("Foo<T>", "T", VariableMemberKind.TypeParameter, "TypeParameter_Foo");

Cecilifier.Core/AST/BinaryOperatorHandler.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,14 @@ void ThrowIfVisitorIsNull()
4444

4545
public void ProcessRaw(IVisitorContext context, string ilVar, ExpressionSyntax left, ExpressionSyntax right)
4646
{
47-
ThrowIfRawHandlerIsNull();
47+
if (_rawHandler == null)
48+
throw new InvalidOperationException("The constructor taking two ITypeSymbols should be used to initialize this instance.");
49+
4850
_rawHandler(
4951
context,
5052
ilVar,
5153
context.SemanticModel.GetTypeInfo(left).Type,
5254
context.SemanticModel.GetTypeInfo(right).Type);
53-
54-
[ExcludeFromCodeCoverage]
55-
void ThrowIfRawHandlerIsNull()
56-
{
57-
if (_rawHandler == null) throw new InvalidOperationException("The constructor taking two ITypeSymbols should be used to initialize this instance.");
58-
}
5955
}
6056

6157
public BinaryOperatorHandler(Action<IVisitorContext, string, BinaryExpressionSyntax, ExpressionVisitor> handler)
@@ -66,7 +62,7 @@ public BinaryOperatorHandler(Action<IVisitorContext, string, BinaryExpressionSyn
6662

6763
private BinaryOperatorHandler(Action<IVisitorContext, string, ITypeSymbol, ITypeSymbol> action, bool visitRightOperand)
6864
{
69-
_rawHandler = action;
65+
_rawHandler = action!;
7066
_visitRightOperand = visitRightOperand;
7167
}
7268

Cecilifier.Core/AST/CecilExpressionFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ internal static class CecilExpressionFactory
88
{
99
public static void EmitThrow(IVisitorContext context, string ilVar, ExpressionSyntax expression)
1010
{
11-
var _ = LineInformationTracker.Track(context, expression);
11+
_ = LineInformationTracker.Track(context, expression);
1212
ExpressionVisitor.Visit(context, ilVar, expression);
1313
context.EmitCilInstruction(ilVar, OpCodes.Throw);
1414
}

Cecilifier.Core/AST/CollectionExpressionProcessor.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
using Cecilifier.Core.Naming;
1111
using Cecilifier.Core.Variables;
1212
using Microsoft.CodeAnalysis;
13-
using Microsoft.CodeAnalysis.CSharp;
1413
using Microsoft.CodeAnalysis.CSharp.Syntax;
1514
using Microsoft.CodeAnalysis.Operations;
1615
using Mono.Cecil.Cil;
@@ -188,8 +187,8 @@ private static string ConstructorFor<TType>(IVisitorContext context, params Type
188187
if (ctors.Count() == 1)
189188
return ctors.First().MethodResolverExpression(context);
190189

191-
var expectedParamTypes = ctorParamTypes.Select(paramType => context.SemanticModel.Compilation.GetTypeByMetadataName(paramType.FullName!)).ToHashSet();
192-
return ctors.Single(ctor => !ctor.Parameters.Select(p => p.Type).ToHashSet().Except(expectedParamTypes, SymbolEqualityComparer.Default).Any()).MethodResolverExpression(context);
190+
var expectedParamTypes = ctorParamTypes.Select(paramType => context.SemanticModel.Compilation.GetTypeByMetadataName(paramType.FullName!)).ToHashSet(SymbolEqualityComparer.Default);
191+
return ctors.Single(ctor => !ctor.Parameters.Select(p => p.Type).ToHashSet(SymbolEqualityComparer.Default).Except(expectedParamTypes, SymbolEqualityComparer.Default).Any()).MethodResolverExpression(context);
193192
}
194193

195194
private static void HandleAssignmentToArray(ExpressionVisitor visitor, CollectionExpressionSyntax node, IArrayTypeSymbol arrayTypeSymbol)

0 commit comments

Comments
 (0)