Area-AnalyzersBughelp wanted
描述
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:
- I expect there a way to specify the default encoding in the SyntaxGenerator
- I expect that AddDocument keep the encoding stored in the specified syntax tree
- 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)