This commit is contained in:
Mohammadreza Taikandi 2021-01-21 16:43:58 +00:00
parent 0fc9540c58
commit 2ef7ded450
6 changed files with 12 additions and 9 deletions

View File

@ -23,7 +23,7 @@ namespace MapTo
Create($"{ErrorId}030", location, "Type Mismatch", $"No matching properties found between '{classType.ToDisplayString()}' and '{sourceType.ToDisplayString()}' types."); Create($"{ErrorId}030", location, "Type Mismatch", $"No matching properties found between '{classType.ToDisplayString()}' and '{sourceType.ToDisplayString()}' types.");
internal static Diagnostic NoMatchingPropertyTypeFoundError(IPropertySymbol property) => internal static Diagnostic NoMatchingPropertyTypeFoundError(IPropertySymbol property) =>
Create($"{ErrorId}031", property.Locations.FirstOrDefault(), "Type Mismatch", $"Cannot create a map for '{property.ToDisplayString()}' property because source and destination types are not implicitly convertible. Consider using '{MapTypeConverterAttributeSource.FullyQualifiedName}' to provide a type converter or ignore the property using '{RootNamespace}.{IgnorePropertyAttributeSource.AttributeName}Attribute'."); Create($"{ErrorId}031", property.Locations.FirstOrDefault(), "Type Mismatch", $"Cannot create a map for '{property.ToDisplayString()}' property because source and destination types are not implicitly convertible. Consider using '{MapTypeConverterAttributeSource.FullyQualifiedName}' to provide a type converter or ignore the property using '{IgnorePropertyAttributeSource.FullyQualifiedName}'.");
internal static Diagnostic InvalidTypeConverterGenericTypesError(IPropertySymbol property, IPropertySymbol sourceProperty) => internal static Diagnostic InvalidTypeConverterGenericTypesError(IPropertySymbol property, IPropertySymbol sourceProperty) =>
Create($"{ErrorId}032", property.Locations.FirstOrDefault(), "Type Mismatch", $"Cannot map '{property.ToDisplayString()}' property because the annotated converter does not implement '{RootNamespace}.{TypeConverterSource.InterfaceName}<{sourceProperty.Type.ToDisplayString()}, {property.Type.ToDisplayString()}>'."); Create($"{ErrorId}032", property.Locations.FirstOrDefault(), "Type Mismatch", $"Cannot map '{property.ToDisplayString()}' property because the annotated converter does not implement '{RootNamespace}.{TypeConverterSource.InterfaceName}<{sourceProperty.Type.ToDisplayString()}, {property.Type.ToDisplayString()}>'.");

View File

@ -5,7 +5,8 @@ namespace MapTo.Sources
internal static class IgnorePropertyAttributeSource internal static class IgnorePropertyAttributeSource
{ {
internal const string AttributeName = "IgnoreProperty"; internal const string AttributeName = "IgnoreProperty";
internal const string FullyQualifiedName = RootNamespace + "." + AttributeName + "Attribute"; internal const string AttributeClassName = AttributeName + "Attribute";
internal const string FullyQualifiedName = RootNamespace + "." + AttributeClassName;
internal static SourceCode Generate(SourceGenerationOptions options) internal static SourceCode Generate(SourceGenerationOptions options)
{ {
@ -26,10 +27,10 @@ namespace MapTo.Sources
builder builder
.WriteLine("[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]") .WriteLine("[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]")
.WriteLine($"public sealed class {AttributeName}Attribute : Attribute {{ }}") .WriteLine($"public sealed class {AttributeClassName} : Attribute {{ }}")
.WriteClosingBracket(); .WriteClosingBracket();
return new(builder.ToString(), $"{AttributeName}Attribute.g.cs"); return new(builder.ToString(), $"{AttributeClassName}.g.cs");
} }
} }
} }

View File

@ -5,6 +5,8 @@ namespace MapTo.Sources
internal static class MapFromAttributeSource internal static class MapFromAttributeSource
{ {
internal const string AttributeName = "MapFrom"; internal const string AttributeName = "MapFrom";
internal const string AttributeClassName = AttributeName + "Attribute";
internal const string FullyQualifiedName = RootNamespace + "." + AttributeClassName;
internal static SourceCode Generate(SourceGenerationOptions options) internal static SourceCode Generate(SourceGenerationOptions options)
{ {

View File

@ -23,12 +23,12 @@ namespace MapTo.Sources
{ {
builder builder
.WriteLine("/// <summary>") .WriteLine("/// <summary>")
.WriteLine("/// Maps a property to property of another object.") .WriteLine("/// Specifies what type to use as a converter for the property this attribute is bound to.")
.WriteLine("/// </summary>"); .WriteLine("/// </summary>");
} }
builder builder
.WriteLine("[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]") .WriteLine("[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]")
.WriteLine($"public sealed class {AttributeClassName} : Attribute") .WriteLine($"public sealed class {AttributeClassName} : Attribute")
.WriteOpeningBracket(); .WriteOpeningBracket();
@ -51,7 +51,7 @@ namespace MapTo.Sources
{ {
builder builder
.WriteLine("/// <summary>") .WriteLine("/// <summary>")
.WriteLine("/// Gets or sets the <see cref=\"ITypeConverter{TSource,TDestination}\" /> to be used to convert the source type.") .WriteLine($"/// Gets or sets the <see cref=\"{TypeConverterSource.InterfaceName}{{TSource,TDestination}}\" /> to be used to convert the source type.")
.WriteLine("/// </summary>"); .WriteLine("/// </summary>");
} }

View File

@ -527,7 +527,7 @@ using System;
namespace MapTo namespace MapTo
{{ {{
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public sealed class MapTypeConverterAttribute : Attribute public sealed class MapTypeConverterAttribute : Attribute
{{ {{
public MapTypeConverterAttribute(Type converter) public MapTypeConverterAttribute(Type converter)

View File

@ -10,7 +10,7 @@ namespace TestConsoleApp.ViewModels
[IgnoreProperty] [IgnoreProperty]
public string LastName { get; } public string LastName { get; }
[MapProperty(Converter = typeof(LastNameConverter))] [MapTypeConverter(typeof(LastNameConverter))]
public string Key { get; } public string Key { get; }
private class LastNameConverter : ITypeConverter<long, string> private class LastNameConverter : ITypeConverter<long, string>