protected override void OnTestMethod(SyntaxNodeAnalysisContext context, MethodDeclarationSyntax methodDeclaration, bool isDataTestMethod)
        {
            SyntaxList <AttributeListSyntax> attributeLists = methodDeclaration.AttributeLists;

            Location categoryLocation;


            ClassDeclarationSyntax classDeclaration = methodDeclaration.Parent as ClassDeclarationSyntax;

            if (classDeclaration != null)
            {
                var exceptions = AdditionalFilesHelper.LoadExceptions(FileName);
                if (exceptions.Contains($"{classDeclaration.Identifier.Text}.{methodDeclaration.Identifier.Text}"))
                {
                    return;
                }
            }

            if (Helper.HasAttribute(attributeLists, context, MsTestFrameworkDefinitions.TestCategoryAttribute, out categoryLocation, out string category))
            {
                List <string> allowedCategories = AdditionalFilesHelper.GetValuesFromEditorConfig(Rule.Id, @"allowed_test_categories");
                if (!allowedCategories.Contains(category.Replace("\"", string.Empty)))
                {
                    Diagnostic diagnostic = Diagnostic.Create(Rule, categoryLocation);
                    context.ReportDiagnostic(diagnostic);
                }
            }
            else
            {
                Diagnostic diagnostic = Diagnostic.Create(Rule, methodDeclaration.Identifier.GetLocation());
                context.ReportDiagnostic(diagnostic);
            }
        }
            private bool TryGetAllowedTimeouts(string category, out ImmutableList <string> values)
            {
                lock (_lock1)
                {
                    if (_configuredTimeouts.TryGetValue(category, out values))
                    {
                        return(values != null);
                    }
                }

                List <string> allowedTimeouts = _additionalFilesHelper.GetValuesFromEditorConfig(Rule.Id, category);

                lock (_lock1)
                {
                    if (allowedTimeouts.Count > 0)
                    {
                        _configuredTimeouts[category] = values = allowedTimeouts.ToImmutableList();
                        return(true);
                    }
                    else
                    {
                        _configuredTimeouts[category] = null;
                        return(false);
                    }
                }
            }
        protected override void OnInitializeAnalyzer(AnalyzerOptions options, Compilation compilation)
        {
            AdditionalFilesHelper helper = new AdditionalFilesHelper(options, compilation);

            _exceptions        = helper.LoadExceptions(FileName);
            _allowedCategories = helper.GetValuesFromEditorConfig(Rule.Id, @"allowed_test_categories");
        }
        protected override TestMethodImplementation OnInitializeTestMethodAnalyzer(AnalyzerOptions options, Compilation compilation, MsTestAttributeDefinitions definitions)
        {
            AdditionalFilesHelper helper = new AdditionalFilesHelper(options, compilation);

            var exceptions        = helper.LoadExceptions(FileName);
            var allowedCategories = helper.GetValuesFromEditorConfig(Rule.Id, @"allowed_test_categories").ToImmutableHashSet();

            return(new TestHasCategoryAttribute(exceptions, allowedCategories, definitions));
        }
        /// <summary>
        /// <inheritdoc/>
        /// </summary>
        public override void Initialize(AnalysisContext context)
        {
            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
            context.EnableConcurrentExecution();
            context.RegisterCompilationStartAction(
                startContext =>
            {
                var additionalFiles = new AdditionalFilesHelper(
                    startContext.Options,
                    startContext.Compilation);
                var methodNames = additionalFiles.GetValuesFromEditorConfig(Rule.Id, LogMethodNames);

                var compilationAnalyzer = new CompilationAnalyzer(methodNames);

                if (methodNames.Count == 0)
                {
                    startContext.RegisterCompilationEndAction(compilationAnalyzer.ReportParsingError);
                }
                else
                {
                    startContext.RegisterSyntaxNodeAction(compilationAnalyzer.AnalyzeCatchException, SyntaxKind.CatchClause);
                }
            });
        }