Skip to content

Commit

Permalink
Now handle proper event pattern, fix bug in unit generation
Browse files Browse the repository at this point in the history
  • Loading branch information
glennawatson committed May 2, 2019
1 parent f8f56e6 commit 685f5c6
Showing 1 changed file with 8 additions and 26 deletions.
34 changes: 8 additions & 26 deletions src/EventBuilder.Core/Reflection/Generators/EventGeneratorBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,18 @@ protected static PropertyDeclarationSyntax GenerateEventWrapperObservable(IEvent
}

// If we are using a standard approach of using 2 parameters use the "FromEventPattern", otherwise, use "FromEvent" where we have to use converters.
if (invokeMethod.Parameters.Count == 2)
if (invokeMethod.Parameters.Count == 2 && invokeMethod.Parameters[0].Type.FullName == "System.Object")
{
(expressionBody, observableEventArgType) = GenerateFromEventPatternExpressionClauseAndType(eventDetails, dataObjectName, invokeMethod);
}
else if (invokeMethod.Parameters.Count == 0)
{
observableEventArgType = IdentifierName(RoslynHelpers.ObservableUnitName).GenerateObservableType();
expressionBody = GenerateUnitFromEventExpression(eventDetails, dataObjectName);
}
else
{
(expressionBody, observableEventArgType) = GenerateFromEventObservableExpressionClauseAndType(eventDetails, dataObjectName, invokeMethod);
(expressionBody, observableEventArgType) = GenerateFromEventExpression(eventDetails, invokeMethod, dataObjectName);
}

if (observableEventArgType == null || expressionBody == null)
Expand All @@ -72,29 +77,6 @@ protected static PropertyDeclarationSyntax GenerateEventWrapperObservable(IEvent
.WithLeadingTrivia(XmlSyntaxFactory.GenerateSummarySeeAlsoComment("Gets an observable which signals when when the {0} event triggers.", eventDetails.FullName));
}

private static (ArrowExpressionClauseSyntax, TypeSyntax) GenerateFromEventObservableExpressionClauseAndType(IEvent eventDetails, string dataObjectName, IMethod invokeMethod)
{
var eventType = eventDetails.GetEventType();

ArrowExpressionClauseSyntax expression;
TypeSyntax typeSyntax;

// If we have no parameters, use the unit version of the arguments.
// If we have only one member, just pass that directly, since our observable will have one generic type parameter.
// If we have more than one parameter we have to pass them by value tuples, since observables only have one generic type parameter.
if (eventType.FullName == "System.Action" && eventType.TypeParameterCount == 0)
{
typeSyntax = TypeArgumentList(SingletonSeparatedList<TypeSyntax>(IdentifierName(RoslynHelpers.ObservableUnitName))).GenerateObservableType();
expression = GenerateUnitFromEventExpression(eventDetails, dataObjectName);
}
else
{
(expression, typeSyntax) = GenerateFromEventExpression(eventDetails, invokeMethod, dataObjectName);
}

return (expression, typeSyntax);
}

private static (ArrowExpressionClauseSyntax, TypeSyntax) GenerateFromEventExpression(IEvent eventDetails, IMethod invokeMethod, string dataObjectName)
{
var returnType = IdentifierName(eventDetails.ReturnType.GenerateFullGenericName());
Expand Down Expand Up @@ -164,7 +146,7 @@ private static ArrowExpressionClauseSyntax GenerateUnitFromEventExpression(IEven
MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
IdentifierName("System.Reactive.Linq.Observable"),
GenericName(Identifier("FromEvent"))))
IdentifierName("FromEvent")))
.WithArgumentList(
ArgumentList(
SeparatedList<ArgumentSyntax>(
Expand Down

0 comments on commit 685f5c6

Please # to comment.