Add source type namespace to usings if needed.

This commit is contained in:
Mohammadreza Taikandi 2020-12-19 09:05:49 +00:00
parent 1f517dd196
commit 450de3dedc
4 changed files with 54 additions and 13 deletions

View File

@ -66,6 +66,7 @@ namespace MapTo
classModifiers: classSyntax.GetClassModifier(), classModifiers: classSyntax.GetClassModifier(),
className: classSyntax.GetClassName(), className: classSyntax.GetClassName(),
properties: classSymbol.GetAllMembersOfType<IPropertySymbol>(), properties: classSymbol.GetAllMembersOfType<IPropertySymbol>(),
destinationNamespace: destinationTypeSymbol.ContainingNamespace.Name,
destinationClassName: destinationTypeSymbol.Name, destinationClassName: destinationTypeSymbol.Name,
destinationTypeProperties: destinationTypeSymbol.GetAllMembersOfType<IPropertySymbol>()); destinationTypeProperties: destinationTypeSymbol.GetAllMembersOfType<IPropertySymbol>());
} }

View File

@ -6,12 +6,13 @@ namespace MapTo.Models
{ {
public class MapModel public class MapModel
{ {
public MapModel(string? ns, string classModifiers, string className, IEnumerable<IPropertySymbol> properties, string destinationClassName, IEnumerable<IPropertySymbol> destinationTypeProperties) public MapModel(string? ns, string classModifiers, string className, IEnumerable<IPropertySymbol> properties, string destinationNamespace, string destinationClassName, IEnumerable<IPropertySymbol> destinationTypeProperties)
{ {
Namespace = ns; Namespace = ns;
ClassModifiers = classModifiers; ClassModifiers = classModifiers;
ClassName = className; ClassName = className;
Properties = properties; Properties = properties;
DestinationNamespace = destinationNamespace;
DestinationClassName = destinationClassName; DestinationClassName = destinationClassName;
DestinationTypeProperties = destinationTypeProperties; DestinationTypeProperties = destinationTypeProperties;
} }
@ -24,6 +25,8 @@ namespace MapTo.Models
public IEnumerable<IPropertySymbol> Properties { get; } public IEnumerable<IPropertySymbol> Properties { get; }
public string DestinationNamespace { get; }
public string DestinationClassName { get; } public string DestinationClassName { get; }
public IEnumerable<IPropertySymbol> DestinationTypeProperties { get; } public IEnumerable<IPropertySymbol> DestinationTypeProperties { get; }

View File

@ -47,7 +47,7 @@ namespace MapTo
builder builder
.AppendFileHeader() .AppendFileHeader()
.GenerateUsings(); .GenerateUsings(model);
// Namespace declaration // Namespace declaration
builder builder
@ -75,17 +75,22 @@ namespace MapTo
return (builder.ToString(), $"{model.ClassName}.cs"); return (builder.ToString(), $"{model.ClassName}.cs");
} }
private static StringBuilder GenerateUsings(this StringBuilder builder) private static StringBuilder GenerateUsings(this StringBuilder builder, MapModel model)
{ {
return builder builder.AppendLine("using System;");
.AppendLine("using System;")
.AppendLine(); if (!string.IsNullOrWhiteSpace(model.DestinationNamespace) && model.Namespace != model.DestinationNamespace)
{
builder.AppendFormat("using {0};", model.DestinationNamespace).AppendLine();
}
return builder.AppendLine();
} }
private static StringBuilder GenerateConstructor(this StringBuilder builder, MapModel model, out List<IPropertySymbol> mappedProperties) private static StringBuilder GenerateConstructor(this StringBuilder builder, MapModel model, out List<IPropertySymbol> mappedProperties)
{ {
var destinationClassParameterName = model.DestinationClassName.ToCamelCase(); var destinationClassParameterName = model.DestinationClassName.ToCamelCase();
builder builder
.PadLeft(Indent2) .PadLeft(Indent2)
.AppendFormat("public {0}({1} {2})", model.ClassName, model.DestinationClassName, destinationClassParameterName) .AppendFormat("public {0}({1} {2})", model.ClassName, model.DestinationClassName, destinationClassParameterName)
@ -120,7 +125,7 @@ namespace MapTo
.AppendFormat("public static {0} From({1} {2})", model.ClassName, model.DestinationClassName, destinationClassParameterName) .AppendFormat("public static {0} From({1} {2})", model.ClassName, model.DestinationClassName, destinationClassParameterName)
.AppendOpeningBracket(Indent2) .AppendOpeningBracket(Indent2)
.PadLeft(Indent3) .PadLeft(Indent3)
.AppendFormat("return {0} == null ? null : new {1}({0});", destinationClassParameterName, model.ClassName ) .AppendFormat("return {0} == null ? null : new {1}({0});", destinationClassParameterName, model.ClassName)
.AppendClosingBracket(Indent2); .AppendClosingBracket(Indent2);
} }

View File

@ -1,4 +1,5 @@
using System.Linq; using System.Linq;
using System.Text;
using Shouldly; using Shouldly;
using Xunit; using Xunit;
using Xunit.Abstractions; using Xunit.Abstractions;
@ -196,12 +197,36 @@ namespace Test
compilation.SyntaxTrees.Count().ShouldBe(3); compilation.SyntaxTrees.Count().ShouldBe(3);
compilation.SyntaxTrees.Last().ToString().ShouldContain(expectedResult.Trim()); compilation.SyntaxTrees.Last().ToString().ShouldContain(expectedResult.Trim());
} }
private static string GetSourceText(bool includeAttributeNamespace = false) [Fact]
public void When_SourceTypeHasDifferentNamespace_Should_AddToUsings()
{ {
return @$" // Arrange
var source = GetSourceText(sourceClassNamespace: "Bazaar");
const string expectedResult = @"
// <auto-generated />
using System;
using Bazaar;
";
// Act
var (compilation, diagnostics) = CSharpGenerator.GetOutputCompilation(source);
// Assert
diagnostics.ShouldBeSuccessful();
compilation.SyntaxTrees.Count().ShouldBe(3);
compilation.SyntaxTrees.Last().ToString().ShouldStartWith(expectedResult.Trim());
}
private static string GetSourceText(bool includeAttributeNamespace = false, string sourceClassNamespace = "Test")
{
var builder = new StringBuilder();
builder.AppendLine($@"
namespace Test namespace Test
{{ {{
{(sourceClassNamespace != "Test" && !includeAttributeNamespace ? $"using {sourceClassNamespace};": string.Empty)}
{(includeAttributeNamespace ? "[MapTo.MapFrom(typeof(Baz))]" : "[MapFrom(typeof(Baz))]")} {(includeAttributeNamespace ? "[MapTo.MapFrom(typeof(Baz))]" : "[MapFrom(typeof(Baz))]")}
public partial class Foo public partial class Foo
{{ {{
@ -209,7 +234,12 @@ namespace Test
public int Prop2 {{ get; }} public int Prop2 {{ get; }}
public int Prop3 {{ get; }} public int Prop3 {{ get; }}
}} }}
}}
");
builder.AppendLine($@"
namespace {sourceClassNamespace}
{{
public class Baz public class Baz
{{ {{
public int Prop1 {{ get; set; }} public int Prop1 {{ get; set; }}
@ -217,7 +247,9 @@ namespace Test
public int Prop3 {{ get; set; }} public int Prop3 {{ get; set; }}
}} }}
}} }}
"; ");
return builder.ToString();
} }
} }
} }