2016-08-09 3 views
10

요청 :resharper 플러그인에서 AST를 동적으로 다시 쓰는 방법은 무엇입니까?

특정 식에 대해 프록시 값을 제공하고 문서를 다시 파싱 할 수있는 분석기를 작성하고 싶습니다.

동기 :

우리의 코드가 제어 및 변형 그룹과 배포 또는 활성 상태가 될 수 있습니다 ABTests에 산재 해있다. 테스트 상태를 결정하는 작업은 데이터베이스 조회를 통해 수행됩니다. 대조군에 배포 된 시험 , 다음과 같은 형식의 문은 false로 평가됩니다

if(ExperimentService.IsInVariant(ABTest.Test1)) 
{ 
} 

을 내가 그것을 어지는 시간을 개발 다루는이 쉽게하기 위해 도구를 제공하기 위해 노력하고있어 이 시나리오에서는 기본적으로 파서를 직접 플레이해야하기 때문에 이것은 상당히 제한적이고 강력하지 않습니다. 실제 코드는

if(!ExperimentService.IsInVariant(ABTest.Test1)) 

또는

if(ExperimentService.IsInVariant(ABTest.Test1) || true) 

또는

var val = ..... && (ExperimentService.IsInVariant(ABTest.Test1); 
if(val){ 
    // val is always going to be false if we deployed control. 
} 

내가 제공 볼 수있는 가능한 방법입니다 어떤 경우

해고 분석기를 작성하는 우리를있게하는 것입니다 한 번 실제 IDE 파싱이 발생하기 전에 트리를 다시 작성하십시오 (아니면, 두 번째 파싱 만). 이것들은 한 번만 발사되어야하며 특정 표현식을 다른 표현식으로 바꿀 수 있습니다. 이렇게하면이 모든 실험 호출을 true 및 false 리터럴로 교체 할 수 있습니다.

결과,이 부분은 분명히 이것은 단지 예입니다 같은 다른 값을

를 코드는 도달 할 수없는 코드를 어지는뿐만 아니라 변수와 같은 더 복잡한 것들을 가지고하지 않습니다와 다른 모든 IDE의 기능을 활용할 수있다 나는 그것이 얼마나 실현 가능한지 잘 모르겠습니다. 적절한 기능이나 이미 존재하는 것에 대한 제안은 환영 할만한 것이 아닙니다.

답변

1

내가 타협하지 않는 방법이 있다고 생각하지 않습니다를 참조하십시오.

ReSharper는 분석하기 전에 AST를 다시 쓰는 것을 지원하지 않습니다. 단지 파일의 텍스트를 다시 작성하기 만합니다.

if 블록의 내용에 "데드 코드"강조 표시를 적용하여 코드가 회색으로 표시되는 분석기를 작성할 수는 있지만 코드를 구문 분석하고 순서대로 제어 흐름을 분석해야합니다 ReSharper가 제어 흐름 그래프를 제공하므로 걸을 수는 있지만 A.의 반환 값은 IsInVariant입니다.은 어떤 조건 (if 블록을 찾을 때까지 && 또는 || 문)을 통해 그 값을 추적합니다.

또는, 당신은 ContractAnnotation 속성으로 IsInVariant 방법을 표시 할 수있는, 뭔가 같은 :

[ContractAnnotation("=> false")] 
public bool IsInVariant(string identifier) 
{ 
    // whatever... 
} 

이 ReSharper에서의 분석을 말할 것이다이 방법 항상 false가 (당신이 또한 true를 반환합니다 말할 수 반환/false/null/특정 입력을 기준으로 null이 아님). 항상 false을 반환하기 때문에 ReSharper는 if 문 또는 else 분기의 코드를 회색으로 바꿉니다 (if (!IsInVariant(…))).

ReSharper는 if 문에 항상 경고문을 추가하여 표현식이 항상 false을 반환한다는 것을 알려줍니다. 따라서 타협점이지만 경고의 심각도를 힌트로 변경할 수 있으므로 방해가되지 않습니다.

+0

내가 나중에 들으면, 내 마지막 생각은 이것 (만약 당신이 잘못된 소리를 낼 수 있다면?). resharper의 CsharpService 구현을 무시하는 자체 C# 언어 서비스를 만들면 어떻게됩니까? 필자는 기존의 resharper 서비스를 내 자신으로 꾸미고, CSharpParser를 내 파서로 포장하여 잠재적으로 AST의 최종 파싱을 처리 할 수 ​​있습니까? –

+0

나는 운이 최고라고 말할 것이다. 나는 실제로 어떤 일이 일어날 지 전혀 모른다. 그러나 그것이 효과가 있다면 놀랄 것이다. ReSharper는 대서양 표준시와 문서의 텍스트를 동기화 상태로 유지합니다. 변경하면 변경됩니다. 당신이 한 편을 다른쪽으로 만들면, 나는 그것이 끝날 것 같지 않습니다. 필자는 제어 흐름 그래프를 사용하는 분석기를 작성하는 것이 더 쉬울 것이라고 생각합니다 (그러나 여전히 사소하지는 않지만). 하지만, 이봐, 반은 재미있다. :) – citizenmatt

1

실제로는 현상금을 보증하기에 충분하지 않지만 developer documentation에서 적용 할 수있는 한 가지 해결책은 custom language을 만들고 기본 규칙을 확장하는 것입니다.

당신은 내가이 시나리오에서 그것을 어지는에 의해에서 시간을 개발 다루는이 쉽게하기 위해 도구를 제공하기 위해 노력하고있어

말했다.

구문 부분 강조 표시 규칙을 변경하면 해당 부분을 회색으로 처리 할 수 ​​있습니다.

this example for .tt files.