dotnet/roslyn

Document encoding gets lost on Project.AddDocument

Aberta

#24.045 aberto em 4 de jan. de 2018

 (13 comentários) (1 reação) (0 responsável)C# (4.257 forks)batch import
Area-AnalyzersBughelp wanted

Métricas do repositório

Stars
 (20.414 estrelas)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (256 fundiu PRs em 30d)

Description

Version Used: 2.6.1 Steps to Reproduce: When entirely generating the syntax nodes in-memory, the SyntaxGenerator does not allow specifying an encoding. The workaround is to re-create the syntax tree by using CSharpSyntaxTree.Create with a valid encoding. Problem 1: how bad is this perf hit?

But even after having a valid encoding in the SyntaxTree, the AddDocument does not keep the information (see the last assert in the code below). Again, the workaround is to re-apply the encoding after the compilation has been created, but it looks definitely a weird behavor.

  • Am I missing something?
  • Is there a better way to enforce the encoding for handcrafted in-memory syntax trees?
// Encoding is needed to avoid CS8055: Cannot emit debug information for a source text without encoding
private void TestEncoding1()
{
    var workspace = new AdhocWorkspace();
    var generator = SyntaxGenerator.GetGenerator(workspace, LanguageNames.CSharp);
    var project = workspace.CurrentSolution.AddProject("test", "test", LanguageNames.CSharp);

    var root = GetCode(generator);
    // code generated on the fly does not have encoding
    Debug.Assert(root.SyntaxTree.Encoding == null);

    var encoded = CSharpSyntaxTree.Create(root as CSharpSyntaxNode,
        null, string.Empty, Encoding.UTF8).GetRoot();
    // encoding is now part of the syntax tree
    Debug.Assert(encoded.SyntaxTree.Encoding != null);

    var document = project.AddDocument("test", encoded);
    var documentTree = document.GetSyntaxTreeAsync().Result;
    // why does this assert fails?
    Debug.Assert(documentTree.Encoding != null);
}

private SyntaxNode GetCode(SyntaxGenerator generator)
{
    return generator.NamespaceDeclaration("Foo",
        generator.ClassDeclaration("FooClass", null,
            Accessibility.Public, DeclarationModifiers.Partial,
            null, null, null));
}

Expected Behavior:

  1. I expect there a way to specify the default encoding in the SyntaxGenerator
  2. I expect that AddDocument keep the encoding stored in the specified syntax tree
  3. I want to avoid any possible perf hit that would come from generating the text source code and parsed back in a new syntax tree.

Actual Behavior: The encoding is missing (see asserts in the code)

Guia do colaborador