示例#1
0
            public void CreateAnalyzerWithinCodeBlock(CodeBlockStartAnalysisContext <SyntaxKind> context)
            {
                var blockAnalyzer = new CodeBlockAnalyzer();

                context.RegisterCodeBlockEndAction(blockAnalyzer.AnalyzeCodeBlock);
                context.RegisterSyntaxNodeAction(blockAnalyzer.AnalyzeNode, blockAnalyzer.SyntaxKindsOfInterest.ToArray());
            }
        /// <summary>
        /// Initialize the analyzer.
        /// </summary>
        /// <param name="analysisContext">Analyzer Context.</param>
        public override void Initialize(AnalysisContext analysisContext)
        {
            analysisContext.RegisterCompilationStartAction(
                (context) =>
            {
                var compilationTypes = new CompilationSecurityTypes(context.Compilation);
                if (compilationTypes.HandleProcessCorruptedStateExceptionsAttribute != null)
                {
                    context.RegisterCodeBlockStartAction <TLanguageKindEnum>(
                        codeBlockStartContext =>
                    {
                        ISymbol owningSymbol = codeBlockStartContext.OwningSymbol;
                        if (owningSymbol.Kind == SymbolKind.Method)
                        {
                            var method = (IMethodSymbol)owningSymbol;

                            ImmutableArray <AttributeData> attributes = method.GetAttributes();
                            if (attributes.FirstOrDefault(attribute => attribute.AttributeClass == compilationTypes.HandleProcessCorruptedStateExceptionsAttribute) != null)
                            {
                                CodeBlockAnalyzer analyzer = GetAnalyzer(compilationTypes, owningSymbol, codeBlockStartContext.CodeBlock);
                                codeBlockStartContext.RegisterSyntaxNodeAction(analyzer.AnalyzeCatchClause, analyzer.CatchClauseKind);
                                codeBlockStartContext.RegisterSyntaxNodeAction(analyzer.AnalyzeThrowStatement, analyzer.ThrowStatementKind);
                                codeBlockStartContext.RegisterCodeBlockEndAction(analyzer.AnalyzeCodeBlockEnd);
                            }
                        }
                    });
                }
            });
        }