2014-05-09 1 views
2

Roslyn을 사용하여 변수 식별자의 이름을 바꾸는 CSharpSyntaxRewriter를 구현하고 있습니다.Roslyn을 사용하여 식별자 이름을 CSharpSyntaxRewriter로 다시 쓸 때 _loosing_ indentation (WhiteSpaceTrivia)을 방지하는 방법

(참고 : 재 작성은 비주얼 스튜디오 CodeAction을 명령 행 유틸리티의 컨텍스트에서 실행되지 않습니다)

것은이 나를 위해 옵션이 아닙니다으로 전체 문서를 포맷하지 않는 것이 좋습니다하십시오 모두 원본 문서에 적용된 서식을 유지하고 싶습니다. "그냥"식별자의 이름을 바꾸고 다른 모든 부분은 그대로 둡니다.

완전히 같은 라인에서 최고의 들여 쓰기를 트림 다음 코드의 문제는 : 나는 앞과 trivias 후행 일부 부모를 잃어버린하고있다 : (더 정확하기

x = 3; 

에되었다
y= 3; 

참고 압입은 간 및 식별자와 같은 할당 연산자의 후단에 공백. 여기

는 C 인 송시, 성공없이 내가 해봤 네 가지 (주석으로 인라인) : 결과 # 59458를 시도

답변

2

그것은 ... 쉬웠다

후 사전에

public override SyntaxNode VisitIdentifierName(IdentifierNameSyntax name) 
{ 
    if (someCondition) 
    { 
     name = name.WithIdentifier(SyntaxFactory.Identifier(GetChangedName(name.Identifier.ValueText))); 

     // Try #1: Does the same 
     //name = name.Update(SyntaxFactory.Identifier(GetChangedName(name.Identifier.ValueText))); 

     // Additional correction tries: 
     //name.NormalizeWhitespace(); // Try #2: does nothing 
     //name = (IdentifierNameSyntax) Formatter.Format(name, _workspace); // Try #3: does nothing 
     //name = name.WithAdditionalAnnotations(Formatter.Annotation); // Try #4: does nothing I suppose because we are not in a VS codeaction 
    } 

    return name; 
} 

덕분에 도착 : 이 그림을 시도하는 모든 사람에 대한

name = name 
     .WithIdentifier(SyntaxFactory.Identifier(GetChangedName(name.Identifier.ValueText))) 
     .WithLeadingTrivia(name.GetLeadingTrivia()) 
     .WithTrailingTrivia(name.GetTrailingTrivia()); 

감사합니다 ...

+0

당신은 앞과 TRAI 복사 .WithTriviaFrom (이름)를 사용할 수 있습니다 한 번의 전화로 퀴즈를 연다. –