Nice programing

코드 진단 구문 노드 작업이 닫힌 파일에서 작동하도록하려면 어떻게해야합니까?

nicepro 2020. 11. 2. 19:37
반응형

코드 진단 구문 노드 작업이 닫힌 파일에서 작동하도록하려면 어떻게해야합니까?


Roslyn (VS2015 Preview에서)을 사용하여 코드 진단 세트를 구축하고 있습니다. 이상적으로는 정상적인 언어 규칙을 위반하는 것처럼 그들이 생성하는 오류가 지속적 오류로 작동하기를 바랍니다.

많은 옵션이 있지만 그중 하나가 일관되게 작동하는 데 어려움을 겪고 있습니다. 나는 기초적인 구문 노드 동작을 구현했습니다.

context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);

에서 Initialize내 진단 클래스의 방법. 이 진단을 위반하는 파일을 열면 (VSIX 프로젝트를 실행하는 동안) VS2015에 오류가 표시됩니다.

  • 오른쪽 코드 아래에 빨간색 물결 선
  • 여백의 빨간색 블록
  • 오류 목록의 오류

그러나 파일을 닫으면 오류가 사라집니다.

나는 context.RegisterCompilationEndAction또한 사용해 보았지만 두 가지 문제가 있습니다.

  • 일관되지 않게 발사되는 것 같습니다. 일반적으로 솔루션을 열면 실행되지만 항상 그런 것은 아닙니다. 청소 / 재 구축시 발생하지 않습니다. 이상하게 보입니다.
  • 분석 방법에서 직접 만든 진단이 실행되지만 진단 을 구현하기 위해 방문자를 사용하고 있습니다. 다음과 같이 부적절 할 수 있습니다.

    private static void AnalyzeEndCompilation(CompilationEndAnalysisContext context)
    {
        foreach (var tree in context.Compilation.SyntaxTrees)
        {
            var visitor = new ReportingVisitor(context.Compilation.GetSemanticModel(tree));
            visitor.Visit(tree.GetRoot());
            foreach (var diagnostic in visitor.Diagnostics)
            {
                context.ReportDiagnostic(diagnostic);
            }
        }
    }
    

    진단이 생성되고 있다는 것을 알고 있습니다. ReportDiagnostic라인 의 중단 점이 여러 번 발생했지만 오류 목록에 아무것도 표시되지 않습니다. (비슷한 반면, ReportDiagnostic방법, 또는 파일 경로와 구문 트리 당 하나의 시작에 전화, 않습니다 표시 얻을.)

내가 여기서 뭘 잘못하고 있니? 첫 번째 접근 방식 (구문 노드 동작)은 가능하면 이상적 일 것입니다. 필요한 컨텍스트를 정확히 제공합니다. 컴파일러가 "전체 프로젝트"컴파일과 대화 형 "IDE에서"처리에이를 사용하도록 만드는 데 필요한 프로젝트 속성에 몇 가지 설정이 있습니까? 아직 완료되지 않은 Roslyn 통합의 일부일까요?

(유용하다면 클래스의 전체 코드를 포함 할 수 있습니다.이 경우에는 신호보다 노이즈가 더 많을 것 같습니다.)


닫힌 파일 문제의 경우 열린 파일 또는 닫힌 파일에서 모든 진단이보고됩니다. 도구 \ 옵션 \ 텍스트 편집기 \ C # \ 고급의 미리보기에는 닫힌 파일에 진단을 포함하도록 전환 할 수있는 사용자 옵션이 있습니다. VS 2015가 출시되기 전에 이것을 기본값으로 설정하기를 바랍니다. 그러나이 옵션은 VS 내의 분석에만 적용됩니다. 분석기가 컴파일러에 전달되면 (솔루션 탐색기에서 분석기를 추가하거나 Visual Studio에 VSIX를 설치하는 것과는 반대로 분석기가있는 패키지에 NuGet 패키지 참조를 추가하여) 컴파일러는 다음과 같은 경우 모든 진단 을보고 합니다 . 사용자는 파일이 열려 있는지 여부에 관계없이 빌드합니다.

두 번째 문제의 RegisterCompilationEndedAnalyzer경우 VS 2015 Preview의 Visual Studio 내에서 안정적으로 호출되지 않습니다. 메서드 본문 내부의 "로컬"변경 사항에 대해 모든 것을 다시 분석하지 않도록 몇 가지 최적화를 수행하기 때문입니다. 비슷한 이유로, 우리는 현재 위치와보고 된 오류를보고하지 않습니다 방법은 몸을. 우리는 최근에 VS가 더 긴 지연 후 전체 재분석을 시작하도록 변경 RegisterCompilationEndedAnalyzer하여 향후 빌드에서 안정적으로 호출해야하며 위치에 관계없이 오류를보고 할 것입니다.

그러나 귀하의 경우에 대한 올바른 작업은 SyntaxNodeAnalyzer를 사용하고 VS 옵션을 전환하여 닫힌 파일에서 진단을 활성화하고 진단을 프로젝트 컴파일 옵션에 연결하는 것입니다.

도움이 되었기를 바랍니다!

참고 URL : https://stackoverflow.com/questions/27365841/how-can-i-make-my-code-diagnostic-syntax-node-action-work-on-closed-files

반응형