Могу ли я добавить UsingStatement с помощью Roslyn DocumentEditor - PullRequest
0 голосов
/ 10 февраля 2019

Моему расширению 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 ;
}

То, что я пытался сделать, это получить CompilationUnitSyntax из объекта Document ...

  var Tree      = await RoslynDoc.GetSyntaxTreeAsync() ;
  var Root      = Tree.GetRoot() ;
  var cus       = Root as CompilationUnitSyntax ;

и добавить инструкцию Usingс InsertBefore ()

  var usingSmnt = UsingStatement ( namespaceName ) ;
  RoslynEditor.InsertBefore ( cus.Members.First(), usingSmnt ) ;

На этом этапе он не генерирует ошибку, но когда я наконец вызываю метод GetChangedDocument () для DocumentEditor,это приводит к InvalidCastException (не может привести UsingDirectiveSyntax к MemberDeclarationSyntax)

Я знаю, что могу добавить UsingDirectiveSyntax к CompilationUnitSyntax с помощью метода AddUsings () , но я бы предпочел внести все изменениячерез объект DocumentEditor, если это возможно.

1 Ответ

0 голосов
/ 11 февраля 2019

Вы не можете добавить UsingDirectiveSyntax тип в список MemberDeclarationSyntax type

Измените оператор вставки на этот, и он будет работать:

RoslynEditor.InsertBefore(compilationUnit.Usings.First(), usingSmnt);
...