Skip to content

Commit 59fe9e6

Browse files
authored
Merge pull request #355 from adrianoc/vnext
October 2025 Update
2 parents 2670871 + 88898a3 commit 59fe9e6

215 files changed

Lines changed: 6428 additions & 3388 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net9.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\Cecilifier.Core\Cecilifier.Core.csproj" />
11+
</ItemGroup>
12+
13+
</Project>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System.Text;
2+
using Cecilifier.Core.AST;
3+
using Cecilifier.Core.Extensions;
4+
using Cecilifier.Core.Naming;
5+
using Microsoft.CodeAnalysis;
6+
7+
namespace Cecilifier.ApiDriver.MonoCecil.Extensions;
8+
9+
public static class MonoCecilStringExtensions
10+
{
11+
public static string[] CloneMethodReferenceOverriding(this string methodRef, IVisitorContext context, Dictionary<string, string> overridenProperties, IMethodSymbol method, out string resolvedVariable)
12+
{
13+
var cloned = new StringBuilder($"new MethodReference({methodRef}.Name, {methodRef}.ReturnType) {{ ");
14+
foreach (var propName in MethodReferencePropertiesToClone)
15+
{
16+
if (!overridenProperties.TryGetValue(propName, out var propValue))
17+
{
18+
propValue = $"{methodRef}.{propName}";
19+
}
20+
21+
cloned.Append($" {propName} = {propValue},");
22+
}
23+
24+
cloned.Append("}");
25+
26+
if (method.Parameters.Length == 0 && !method.IsGenericMethod)
27+
{
28+
resolvedVariable = cloned.ToString();
29+
return Array.Empty<string>();
30+
}
31+
32+
var exps = new List<string>();
33+
resolvedVariable = context.Naming.SyntheticVariable(method.SafeIdentifier(), ElementKind.MemberReference);
34+
35+
exps.Add($"var {resolvedVariable} = {cloned};");
36+
if (method.Parameters.Length > 0)
37+
{
38+
exps.Add($"foreach(var p in {methodRef}.Parameters)");
39+
exps.Add("{");
40+
exps.Add($"\t{resolvedVariable}.Parameters.Add(new ParameterDefinition(p.Name, p.Attributes, p.ParameterType));");
41+
exps.Add("}");
42+
}
43+
44+
if (method.IsGenericMethod)
45+
{
46+
exps.Add($"foreach(var gp in {methodRef}.GenericParameters)");
47+
exps.Add("{");
48+
exps.Add($"\t{resolvedVariable}.GenericParameters.Add(new Mono.Cecil.GenericParameter(gp.Name, {resolvedVariable}));");
49+
exps.Add("}");
50+
}
51+
52+
return exps.ToArray();
53+
}
54+
55+
private static readonly List<string> MethodReferencePropertiesToClone =
56+
[
57+
"HasThis",
58+
"ExplicitThis",
59+
"DeclaringType",
60+
"CallingConvention"
61+
];
62+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using Cecilifier.ApiDriver.MonoCecil.TypeSystem;
2+
using Cecilifier.Core;
3+
using Cecilifier.Core.AST;
4+
using Cecilifier.Core.Misc;
5+
using Cecilifier.Core.TypeSystem;
6+
using Microsoft.CodeAnalysis;
7+
8+
namespace Cecilifier.ApiDriver.MonoCecil;
9+
10+
public class MonoCecilContext : CecilifierContextBase, IVisitorContext
11+
{
12+
public MonoCecilContext(CecilifierOptions options, SemanticModel semanticModel, byte indentation = 3) : base(options, semanticModel, indentation)
13+
{
14+
MemberResolver = new MonoCecilMemberResolver(this);
15+
TypeResolver = new MonoCecilTypeResolver(this);
16+
ApiDriver = new MonoCecilGeneratorDriver();
17+
18+
CecilifiedLineNumber = ApiDriver.PreambleLineCount;
19+
StartLineNumber = ApiDriver.PreambleLineCount;
20+
ApiDefinitionsFactory = ApiDriver.CreateDefinitionsFactory();
21+
}
22+
23+
public static IVisitorContext CreateContext(CecilifierOptions options, SemanticModel semanticModel) => new MonoCecilContext(options, semanticModel);
24+
public static string[] BclAssembliesForCompilation()
25+
{
26+
return ((string) AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES")).Split(Path.PathSeparator);
27+
}
28+
29+
public override void OnFinishedTypeDeclaration() { }
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using Cecilifier.Core.AST;
2+
3+
namespace Cecilifier.ApiDriver.MonoCecil;
4+
5+
public class MonoCecilDeferredIlContext : IlContext
6+
{
7+
private readonly IVisitorContext _context;
8+
private bool _emitted;
9+
10+
protected internal MonoCecilDeferredIlContext(IVisitorContext context, string ilVarName, string relatedMethodVar) : base(ilVarName, relatedMethodVar)
11+
{
12+
_context = context;
13+
_emitted = false;
14+
}
15+
16+
public override string VariableName
17+
{
18+
get
19+
{
20+
if (!_emitted)
21+
{
22+
_emitted = true;
23+
_context.Generate($"var {base.VariableName} = {AssociatedMethodVariable}.Body.GetILProcessor();");
24+
_context.WriteNewLine();
25+
}
26+
27+
return base.VariableName;
28+
}
29+
}
30+
}

0 commit comments

Comments
 (0)