-
-
Notifications
You must be signed in to change notification settings - Fork 141
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
namespace Riok.Mapperly.Abstractions; | ||
|
||
/// <summary> | ||
/// Uses mapping methods provided by the type of this member to map types. | ||
/// </summary> | ||
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] | ||
public sealed class UseMapperAttribute : Attribute { } |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
namespace Riok.Mapperly.Abstractions; | ||
|
||
/// <summary> | ||
/// Uses static mapping methods provided by the provided type to map types. | ||
/// </summary> | ||
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] | ||
public sealed class UseStaticMapperAttribute : Attribute | ||
{ | ||
/// <summary> | ||
/// Uses static mapping methods provided by <paramref name="mapperType"/> to map types. | ||
/// </summary> | ||
/// <param name="mapperType">The type of which mapping methods will be included.</param> | ||
public UseStaticMapperAttribute(Type mapperType) { } | ||
} | ||
|
||
/// <summary> | ||
/// Uses static mapping methods provided by the provided type to map types. | ||
/// </summary> | ||
/// <typeparam name="T">The type of which mapping methods will be included.</typeparam> | ||
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] | ||
public sealed class UseStaticMapperAttribute<T> : Attribute { } |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
using Microsoft.CodeAnalysis; | ||
|
||
namespace Riok.Mapperly.Configuration; | ||
|
||
public record UseStaticMapperConfiguration(ITypeSymbol MapperType); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
using Microsoft.CodeAnalysis; | ||
using Riok.Mapperly.Abstractions; | ||
using Riok.Mapperly.Configuration; | ||
using Riok.Mapperly.Descriptors.Mappings.UserMappings; | ||
using Riok.Mapperly.Emit; | ||
|
||
namespace Riok.Mapperly.Descriptors.ExternalMappings; | ||
|
||
internal static class ExternalMappingsExtractor | ||
{ | ||
// TODO move to user extractor | ||
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / Analyze (csharp)
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / lint-dotnet
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / build
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / build
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / MappingBenchmarks
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / SourceGeneratorBenchmarks
Check warning on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / sample
Check failure on line 11 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / test
|
||
public static IEnumerable<IUserMapping> ExtractExternalMappings(SimpleMappingBuilderContext ctx, INamedTypeSymbol mapperSymbol) | ||
{ | ||
// TODO extract attribute data accessor | ||
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / Analyze (csharp)
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / lint-dotnet
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / build
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / build
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / MappingBenchmarks
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / SourceGeneratorBenchmarks
Check warning on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / sample
Check failure on line 14 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / test
|
||
var accessor = new AttributeDataAccessor(ctx.SymbolAccessor); | ||
|
||
// TODO should not access syntax factory helper here | ||
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / Analyze (csharp)
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / package
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / lint-dotnet
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / build
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / build
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / MappingBenchmarks
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / SourceGeneratorBenchmarks
Check warning on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / sample
Check failure on line 17 in src/Riok.Mapperly/Descriptors/ExternalMappings/ExternalMappingsExtractor.cs GitHub Actions / test
|
||
var staticExternalMappers = accessor | ||
.Access<UseStaticMapperAttribute, UseStaticMapperConfiguration>(mapperSymbol) | ||
.Concat(accessor.Access<UseStaticMapperAttribute<object>, UseStaticMapperConfiguration>(mapperSymbol)) | ||
.SelectMany( | ||
x => | ||
UserMethodMappingExtractor.ExtractUserImplementedMappings( | ||
ctx, | ||
x.MapperType, | ||
SyntaxFactoryHelper.FullyQualifiedIdentifierName(x.MapperType), | ||
true | ||
) | ||
); | ||
|
||
var externalInstanceMappers = ctx.SymbolAccessor | ||
.GetAllMembers(mapperSymbol) | ||
.Select(x => new { x.Name, Type = (x as IFieldSymbol)?.Type ?? (x as IPropertySymbol)?.Type }) | ||
.Where(x => x.Type != null) | ||
.SelectMany(x => UserMethodMappingExtractor.ExtractUserImplementedMappings(ctx, x.Type!, x.Name, false)); | ||
|
||
return staticExternalMappers.Concat(externalInstanceMappers); | ||
} | ||
} |