2014-09-09 2 views
3

다음 코드를 사용하여 Roslyn 메서드 본문을 대체합니다. 나는이 작업을 수행 할 때메서드 본문을 바꾸면 다음 줄 바꿈이 제거됩니다.

/* method is instance of MethodDeclarationSyntax */ 
BlockSyntax newBody = SyntaxFactory.Block(SyntaxFactory.ParseStatement("throw new NotImplementedException();")); 
BlockSyntax body = method.Body; 
var modifiedMethod = method.ReplaceNode(body, newBody); 

는하지만, 방법 후 줄 바꿈 제거하고 #region 또는 #endregion 태그는 방법 후에있을 경우 오류가 발생합니다. 예

#region 
    static void RemoveRegions(string str) 
    { 
     return; 
    } 
    #endregion 

및 그것에 몸을

#region 
    static void RemoveRegions(string str) 
    { 
     throw new NotImplementedException(); 
    }  #endregion // This cause to compiling error 

답변

1

어느 Format 새로운 노드 또는 추가 SyntaxTrivia 교환 후

.

+1

케빈 더 설명 할 수 있습니까? 나는 Roslyn에서 새로운 사람이다. –

+1

옵션 2에 대해 "SyntaxTriva를 추가한다"- 개행은 BlockSyntax에서 "trailing trivia"이다. 퀴즈는 공백, 주석 등입니다. GetTrailingTrivia (http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis/Syntax/SyntaxNode.cs,2c8b23967d743711)를 사용하여 원본 BlockSyntax에 후행 트리 비어를 요청한 다음 WithTrailingTrivia (http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis/Syntax/SyntaxNodeExtensions.cs,c18822a3db364e2b,references)를 통해 newBody에 추가하십시오. 그런 다음 원 본문 뒤에 공백이 있으면 원하는 메서드 본문을 갖게됩니다. –

+0

자세한 설명은이 설명을 별도로 작성하십시오. –

10

원본 BlockSyntax body에는 중괄호 뒤에 공백 (줄 바꿈) 형태로 "Trailing Trivia"가 포함되어 있습니다. 생성 된 BlockSyntax newBody에도 중괄호가 포함되지만 중괄호 뒤에 공백이 있어야하는지 여부는 알 수 없습니다.

세 가지 중 하나를 수행 할 수 있습니다. 나는 # 1이 최선의 선택이라고 생각하지만 완전성을 위해 다른 사람을 나열하고 있습니다 :

  1. 재사용 원래 노드에서 후행 퀴즈. 당신은 GetTrailingTriviaWithTrailingTrivia를 사용하여 원래 노드에서 후행 퀴즈를 사용할 수있다 : 제 생각에는

    var originalTrailingTrivia = body.GetTrailingTrivia(); 
    newBody = newBody.WithTrailingTrivia(originalTrailingTrivia); 
    

    을, 이것은 당신의 최선의 방법이다. 후행 퀴즈 (공백 행 하나, 공백 행 5 개, 빈 행 0 개, 공백 2 개, 공백 및 주석 1 개 등)를 유지함으로써 코드 레이아웃을 보존하므로 더 일반적으로 적합합니다 다른 시나리오에서는 아직 꿈꿔 본 적이 없습니다.

  2. 새 노드를 포맷하십시오.하자 내장 포맷터가 Formatter.Annotation을 추가 WithAdditionalAnnotations를 사용하여 공백을 처리하고 newBody이 들어있는 나무에 Formatter.FormatAsync을 수행하는 방법을 결정 :이 또한 방법의 내용을 포맷합니다

    newBody = newBody.WithAdditionalAnnotation(Formatter.Annotation) 
    // Code that replaces this node back into the document 
    var formattedDocument = Formatter.Format(document, Formatter.Annotation); 
    

    하는 것으로. 에만의 형식을 지정할 수 있습니다. Formatter.Annotation을 전체 BlockSyntax 대신에 중괄호 자체에 직접 추가하고 동일한 단계를 수행하여 닫는 중괄호와 토큰을 서식 지정 할 수 있습니다. 이 접근법은 합리적인 방법으로 물건을 배치 할 수 있지만 닫기 중괄호에 첨부 된 설명이나 의도적으로 이상한 공백을 제거합니다.

  3. 수동으로 후미 줄 바꿈을 수동으로 추가하십시오. 수동으로 줄 바꿈을 만들고 WithTrailingTrivia와 newBody에 추가 :

    newBody = newBody.WithTrailingTrivia(SyntaxFactory.CarriageReturnLineFeed); 
    

    이 또한 의견이나 가까운 중괄호에 부착 의도적으로 이상한 공백을 제거합니다. 또한 모든 컨텍스트를 무시하고 메서드 블록의 원하는 레이아웃을 변경할 수있는 사용자 지정 서식 설정을 따르지 않습니다.

+0

정말 고맙습니다. 나는 왜 그들이 나를 위해 일하지 않는지 모르겠다. ( –

+0

) 내 newdoc (Document의 인스턴스)를 저장하기 위해'File.WriteAllText (newDoc.FilePath, code);'를 사용하고있다. 아마도 여기에 문제가있다. –

+0

아마도 "newdoc.GetTextAsync(). Result.ToString()"으로 업데이트 된 코드를 인쇄 해보면 더 나은 것으로 보입니다. 그렇다면 저장 방법에 문제가있을 것입니다. 어떤 방법 으로든 문제가 계속되는 경우 추가 코드 컨텍스트가 도움이 될 것입니다 .. –

관련 문제