我的Visual Studio扩展需要进行多次更新源代码文件。使用DocumentEditor(Microsoft.CodeAnalysis.Editing.DocumentEditor)类似乎是推荐的方法来做到这一点。
其中一个变化可能是插入using语句。
我可以生成与下面的代码UsingStatementSyntax:
public UsingDirectiveSyntax UsingStatement ( string namespaceName )
{
var qualifiedName = SyntaxFactory.ParseName ( namespaceName ) ;
var usingSmnt = SyntaxFactory.UsingDirective ( qualifiedName ) ;
return usingSmnt ;
}
我所试图做的,是从Document对象获得CompilationUnitSyntax ...
var Tree = await RoslynDoc.GetSyntaxTreeAsync() ;
var Root = Tree.GetRoot() ;
var cus = Root as CompilationUnitSyntax ;
并添加与该的insertBefore使用说明()
var usingSmnt = UsingStatement ( namespaceName ) ;
RoslynEditor.InsertBefore ( cus.Members.First(), usingSmnt ) ;
在这一点上,它不产生一个错误,但是当我最后调用GetChangedDocument()方法的DocumentEditor,它导致一个InvalidCastException(不能投UsingDirectiveSyntax到MemberDeclarationSyntax)
我知道,我可以用AddUsings()方法中添加UsingDirectiveSyntax到CompilationUnitSyntax,但我宁愿通过DocumentEditor对象,使所有的变化,如果这是可能的。
你不能UsingDirectiveSyntax
类型添加到MemberDeclarationSyntax
类型的列表
改变插入语句这一点,它的工作:
RoslynEditor.InsertBefore(compilationUnit.Usings.First(), usingSmnt);