2017-10-22 25 views
2

Roslyn을 사용하여 일부 이전 선행 처리기 지시문의 코드를 정리하고 싶습니다. 나는 다른 // TEST_1_0을 제거하지만, 다른 // TEST_1_1을 유지하고 싶습니다이 코드Roslyn을 사용하여 선 처리기 지시문을 선택적으로 제거하십시오.

#define TEST_1_0 
#define TEST_1_1 
namespace ConsoleApplication1 
{ 
class TypeName 
{ 
    public static void Main(string[] args) 
    { 
#if TEST_1_0 
     int TEST_1_0 = 1; 
#if TEST_1_1 
     int TEST_1_1 = 1; 
#else//TEST_1_1 
     int TEST_1_1 = 0; 
#endif//TEST_1_1 
#else//TEST_1_0 
     int TEST_1_0 = 0; 
#endif//TEST_1_0 
    } 
} 
} 

에서 예를 들어

. 나는 코멘트에 의지 할 수 없기 때문에 #if를 해당하는 #else와 관련시켜야한다.

#if를 찾는 것은 쉽지만 해당 #else를 찾는 것이 쉽지 않습니다. 여기 내가 분석기에서 #의 다른 // TEST_1_0를 조회하고, 해당 위치 여기

  • 난 그냥 분석기의 #if의 TEST_1_0에 대한 codefix를 생성하기위한 codefix을 만들

    1. :

      나는 두 가지 전략을 시도 CodeFix 공급자에서 해당 항목으로 이동하려고 시도하십시오.

    두 가지 모두 매우 빠르게 복잡해 지므로 지시문이 다른 SyntaxTokens의 leadingTrivia에 퍼져 있다는 것이 문제가되는 것처럼 보입니다. 코드가 변경되면 위치 지시문에 많은 영향을 미치므로 모든 사례를 프로그래밍하는 데 많은 작업이 필요합니다.

    누락 된 항목이 있습니까? 손으로 모든 다른 경우를 프로그래밍하지 않고도이 작업을 수행하는 더 쉬운 방법이 있습니까?

    전략 1 또는 2를 원하십니까?

  • 답변

    1

    나는 로슬린이 여기 갈 길이 없다고 결론을 내렸다.

    Roslyn 모델은 구문 트리에서 퀴즈처럼 사전 지시자 지시어를 사용하며 실제 코드의 구조에 따라 퀴즈 위치가 크게 달라집니다.

    따라서 구문 트리를 작업하면 텍스트 기반으로 작업 할 때 문제가되지 않는 조회 복잡성이 생겨 복잡성이 커집니다. 바이너리는 처리 전/후에 동일해야합니다!

    그래서 Roslyn을 포기하고 코드/지시문 혼합을 텍스트로 구문 분석하고 정규식을 사용하여 구문 분석 한 다음 오래된 스택을 사용하여 지시문 논리를 처리합니다.

    이제 케이크 조각이 훨씬 더 쉽습니다. 여전히 인코딩 문제를 처리해야합니다. :) 해피 파싱!

    1

    저는 Arjan-Roslyn이 작업에 사용할 수 없다고 동의합니다. 비슷한 작업을 해결하기 위해 나는 regexp와 Python sympy 라이브러리를 기반으로하는 내 자신의 간단한 C# 전처리 도구를 만들었다 : undefine. 나는 그것이 당신에게 도움이 될 것이라고 믿습니다. 당신이 설명하는 작업으로, 다음 명령을 시도 : 일반적으로

    >> python undefine apply -d TEST_1_0 YourFile.cs

    +0

    을, 툴 또는 라이브러리에 링크 [사용법 노트, 링크 된 자원이 문제에 대한 적용 방법에 대한 구체적인 설명이 수반되어야한다 , 또는 일부 샘플 코드] (http://meta.stackoverflow.com/a/251605) 또는 위의 모든 가능한 경우. –

    +0

    설명 된 작업에 대해서는 다음 명령을 시도하십시오. >> python undefine -d TEST_1_0 YourFile.cs – gaDZella

    +0

    주석을 편집하여주십시오. 주석은 영구적이지 않습니다.나는 나 자신을 요구하지 않고, 미래의 독자들을 위해, 그리고 당신의 이익을 위해 (그래서 그 대답은 삭제되지 않을 것입니다). –