요청 :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의 기능을 활용할 수있다 나는 그것이 얼마나 실현 가능한지 잘 모르겠습니다. 적절한 기능이나 이미 존재하는 것에 대한 제안은 환영 할만한 것이 아닙니다.
내가 나중에 들으면, 내 마지막 생각은 이것 (만약 당신이 잘못된 소리를 낼 수 있다면?). resharper의 CsharpService 구현을 무시하는 자체 C# 언어 서비스를 만들면 어떻게됩니까? 필자는 기존의 resharper 서비스를 내 자신으로 꾸미고, CSharpParser를 내 파서로 포장하여 잠재적으로 AST의 최종 파싱을 처리 할 수 있습니까? –
나는 운이 최고라고 말할 것이다. 나는 실제로 어떤 일이 일어날 지 전혀 모른다. 그러나 그것이 효과가 있다면 놀랄 것이다. ReSharper는 대서양 표준시와 문서의 텍스트를 동기화 상태로 유지합니다. 변경하면 변경됩니다. 당신이 한 편을 다른쪽으로 만들면, 나는 그것이 끝날 것 같지 않습니다. 필자는 제어 흐름 그래프를 사용하는 분석기를 작성하는 것이 더 쉬울 것이라고 생각합니다 (그러나 여전히 사소하지는 않지만). 하지만, 이봐, 반은 재미있다. :) – citizenmatt