/
GenericSourceTargetObjectFactory.cs
30 lines (26 loc) · 1.23 KB
/
GenericSourceTargetObjectFactory.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Riok.Mapperly.Helpers;
using static Riok.Mapperly.Emit.Syntax.SyntaxFactoryHelper;
namespace Riok.Mapperly.Descriptors.ObjectFactories;
public class GenericSourceTargetObjectFactory(
GenericTypeChecker typeChecker,
SymbolAccessor symbolAccessor,
IMethodSymbol method,
int sourceTypeParameterIndex
) : ObjectFactory(symbolAccessor, method)
{
private readonly int _targetTypeParameterIndex = (sourceTypeParameterIndex + 1) % 2;
public override bool CanCreateType(ITypeSymbol sourceType, ITypeSymbol targetTypeToCreate) =>
typeChecker.CheckTypes(
(Method.TypeParameters[sourceTypeParameterIndex], sourceType),
(Method.TypeParameters[_targetTypeParameterIndex], targetTypeToCreate)
);
protected override ExpressionSyntax BuildCreateType(ITypeSymbol sourceType, ITypeSymbol targetTypeToCreate, ExpressionSyntax source)
{
var typeParams = new TypeSyntax[2];
typeParams[sourceTypeParameterIndex] = NonNullableIdentifier(sourceType);
typeParams[_targetTypeParameterIndex] = NonNullableIdentifier(targetTypeToCreate);
return GenericInvocation(Method.Name, typeParams, source);
}
}