예제 #1
0
    private static SourceText Build(INamedTypeSymbol source, INamedTypeSymbol destination, ImmutableArray <string> propertyNames,
                                    MappingContext context, Compilation compilation, ConfigurationValues configurationValues)
    {
        using var writer       = new StringWriter();
        using var indentWriter = new IndentedTextWriter(writer,
                                                        configurationValues.IndentStyle == IndentStyle.Tab ? "\t" : new string (' ', (int)configurationValues.IndentSize));

        var namespaces       = new NamespaceGatherer();
        var emittedNamespace = false;

        if (context.ContainingNamespaceKind != ContainingNamespaceKind.Global)
        {
            if (context.ContainingNamespaceKind == ContainingNamespaceKind.Source)
            {
                if (source.ContainingNamespace.IsGlobalNamespace ||
                    !source.ContainingNamespace.Contains(destination.ContainingNamespace))
                {
                    namespaces.Add(destination.ContainingNamespace);
                }

                if (!source.ContainingNamespace.IsGlobalNamespace)
                {
                    indentWriter.WriteLine($"namespace {source.ContainingNamespace.ToDisplayString()}");
                    indentWriter.WriteLine("{");
                    indentWriter.Indent++;
                    emittedNamespace = true;
                }
            }
            else if (context.ContainingNamespaceKind == ContainingNamespaceKind.Destination)
            {
                if (destination.ContainingNamespace.IsGlobalNamespace ||
                    !destination.ContainingNamespace.Contains(source.ContainingNamespace))
                {
                    namespaces.Add(source.ContainingNamespace);
                }

                if (!destination.ContainingNamespace.IsGlobalNamespace)
                {
                    indentWriter.WriteLine($"namespace {destination.ContainingNamespace.ToDisplayString()}");
                    indentWriter.WriteLine("{");
                    indentWriter.Indent++;
                    emittedNamespace = true;
                }
            }
        }
        else
        {
            namespaces.Add(source.ContainingNamespace);
            namespaces.Add(destination.ContainingNamespace);
        }

        MappingBuilder.BuildType(source, destination, propertyNames, compilation, indentWriter, namespaces);

        if (emittedNamespace)
        {
            indentWriter.Indent--;
            indentWriter.WriteLine("}");
        }

        var code = namespaces.Values.Count > 0 ?
                   string.Join(Environment.NewLine,
                               string.Join(Environment.NewLine, namespaces.Values.Select(_ => $"using {_};")),
                               string.Empty, "#nullable enable", string.Empty, writer.ToString()) :
                   string.Join(Environment.NewLine, "#nullable enable", string.Empty, writer.ToString());

        return(SourceText.From(code, Encoding.UTF8));
    }