Add support for Events (#23)

* event wip...

* Add support for 'event'

* event example
This commit is contained in:
Stef Heyenrath
2021-08-03 21:03:45 +02:00
committed by GitHub
parent 7b158adadc
commit c536e194e7
8 changed files with 228 additions and 159 deletions
@@ -1,10 +1,11 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.CodeAnalysis;
using ProxyInterfaceSourceGenerator.Enums;
using ProxyInterfaceSourceGenerator.Extensions;
using ProxyInterfaceSourceGenerator.SyntaxReceiver;
using ProxyInterfaceSourceGenerator.Utils;
using System.Collections.Generic;
using System.Text;
namespace ProxyInterfaceSourceGenerator.FileGenerators
{
@@ -47,6 +48,8 @@ namespace {ns}
{GenerateProperties(targetClassSymbol, proxyAll)}
{GenerateMethods(targetClassSymbol)}
{GenerateEvents(targetClassSymbol)}
}}
}}";
@@ -89,5 +92,19 @@ namespace {ns}
return str.ToString();
}
private string GenerateEvents(INamedTypeSymbol targetClassSymbol)
{
var str = new StringBuilder();
foreach (var @event in MemberHelper.GetPublicEvents(targetClassSymbol))
{
var ps = @event.First().Parameters.First();
var type = ps.GetTypeEnum() == TypeEnum.Complex ? GetParameterType(ps, out _) : ps.Type.ToString();
str.AppendLine($" event {type} {@event.Key.GetSanitizedName()};");
str.AppendLine();
}
return str.ToString();
}
}
}
@@ -1,4 +1,4 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -20,7 +20,7 @@ namespace ProxyInterfaceSourceGenerator.FileGenerators
{
foreach (var ci in _context.CandidateInterfaces)
{
yield return GenerateFile(ci.Value); //.Namespace, ci.Value.InterfaceName, ci.Value.ClassName, ci.Value.TypeName, ci.Value.ProxyAll);
yield return GenerateFile(ci.Value);
}
}
@@ -54,6 +54,8 @@ namespace {ns}
{GeneratePublicMethods(targetClassSymbol)}
{GenerateEvents(targetClassSymbol)}
public {constructorName}({targetClassSymbol} instance)
{{
_Instance = instance;
@@ -197,5 +199,31 @@ namespace {ns}
return str.ToString();
}
private string GenerateEvents(INamedTypeSymbol targetClassSymbol)
{
var str = new StringBuilder();
foreach (var @event in MemberHelper.GetPublicEvents(targetClassSymbol))
{
var name = @event.Key.GetSanitizedName();
var ps = @event.First().Parameters.First();
var type = ps.GetTypeEnum() == TypeEnum.Complex ? GetParameterType(ps, out _) : ps.Type.ToString();
str.Append($" public event {type} {name} {{");
if (@event.Any(e => e.MethodKind == MethodKind.EventAdd))
{
str.Append($" add {{ _Instance.{name} += value; }}");
}
if (@event.Any(e => e.MethodKind == MethodKind.EventRemove))
{
str.Append($" remove {{ _Instance.{name} -= value; }}");
}
str.AppendLine(" }");
str.AppendLine();
}
return str.ToString();
}
}
}
@@ -1,4 +1,4 @@
using System.Text;
using System.Text;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using ProxyInterfaceSourceGenerator.FileGenerators;
@@ -31,6 +31,23 @@ namespace ProxyInterfaceSourceGenerator.Utils
filter);
}
public static IEnumerable<IGrouping<ISymbol, IMethodSymbol>> GetPublicEvents(INamedTypeSymbol classSymbol, Func<IMethodSymbol, bool>? filter = null)
{
if (filter is null)
{
filter = _ => true;
}
#pragma warning disable CS8619 // Nullability of reference types in value doesn't match target type.
#pragma warning disable RS1024 // Compare symbols correctly
return GetPublicMembers(classSymbol,
m => m.MethodKind == MethodKind.EventAdd || m.MethodKind == MethodKind.EventRemove/* || m.MethodKind == MethodKind.EventRaise*/,
filter)
.GroupBy(e => e.AssociatedSymbol);
#pragma warning restore RS1024 // Compare symbols correctly
#pragma warning restore CS8619 // Nullability of reference types in value doesn't match target type.
}
// TODO : do we need also to check for "SanitizedName()" here?
private static IEnumerable<T> GetPublicMembers<T>(INamedTypeSymbol classSymbol, params Func<T, bool>[] filters) where T : ISymbol
{