コード例 #1
0
            public void AnalyzeCodeBlockEnd(CodeBlockAnalysisContext context)
            {
                foreach (KeyValuePair <ISymbol, XmlDocumentEnvironment> p in _xmlDocumentEnvironments)
                {
                    XmlDocumentEnvironment env = p.Value;
                    if (!(env.IsXmlResolverSet | env.IsSecureResolver))
                    {
                        Diagnostic diag = Diagnostic.Create(
                            RuleDoNotUseInsecureDTDProcessing,
                            env.XmlDocumentDefinition.GetLocation(),
                            SecurityDiagnosticHelpers.GetLocalizableResourceString(
                                nameof(DesktopAnalyzersResources.XmlDocumentWithNoSecureResolverMessage),
                                env.EnclosingConstructSymbol.Name));
                        context.ReportDiagnostic(diag);
                    }
                }


                foreach (KeyValuePair <ISymbol, XmlTextReaderEnvironment> p in _xmlTextReaderEnvironments)
                {
                    XmlTextReaderEnvironment env = p.Value;
                    if (!(env.IsXmlResolverSet | env.IsSecureResolver) ||
                        !(env.IsDtdProcessingSet | env.IsDtdProcessingDisabled))
                    {
                        Diagnostic diag = Diagnostic.Create(
                            RuleDoNotUseInsecureDTDProcessing,
                            env.XmlTextReaderDefinition.GetLocation(),
                            SecurityDiagnosticHelpers.GetLocalizableResourceString(
                                nameof(DesktopAnalyzersResources.XmlTextReaderConstructedWithNoSecureResolutionMessage),
                                env.EnclosingConstructSymbol.Name));

                        context.ReportDiagnostic(diag);
                    }
                }
            }
コード例 #2
0
 public void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
 {
     if (IsEmptyFinalizer(context.CodeBlock, context.SemanticModel))
     {
         context.ReportDiagnostic(context.OwningSymbol.CreateDiagnostic(CA1821DiagnosticAnalyzerRule.Rule));
     }
 }
コード例 #3
0
            public void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
            {
                if (_analyzer.IsIgnoredCodeBlock(context.CodeBlock))
                {
                    return;
                }

                var(completed, intervalTree) = _codeBlockIntervals.GetOrAdd(context.CodeBlock.SyntaxTree, _ => (new StrongBox <bool>(false), SimpleIntervalTree.Create(new TextSpanIntervalIntrospector(), Array.Empty <TextSpan>())));
                if (completed.Value)
                {
                    return;
                }

                RoslynDebug.AssertNotNull(intervalTree);
                lock (completed)
                {
                    if (completed.Value)
                    {
                        return;
                    }

                    if (intervalTree.HasIntervalThatOverlapsWith(context.CodeBlock.FullSpan.Start, context.CodeBlock.FullSpan.End))
                    {
                        return;
                    }

                    intervalTree.AddIntervalInPlace(context.CodeBlock.FullSpan);
                }

                _analyzer.AnalyzeCodeBlock(context);
            }
コード例 #4
0
        private static void AnalyzeMethodDeclaration(CodeBlockAnalysisContext context)
        {
            MethodDeclarationSyntax methodSyntax = context.CodeBlock as MethodDeclarationSyntax;
            IMethodSymbol           method       = context.OwningSymbol as IMethodSymbol;

            if (method == null || methodSyntax == null)
            {
                return;
            }

            var baseTypeOverridingMethods = GetBaseTypeOverridingMethod(method);
            var contractMethods           = baseTypeOverridingMethods.SelectMany(o => GetContractTypeMethods(o, method)).ToList();

            contractMethods.AddRange(baseTypeOverridingMethods.SelectMany(o => GetVirtualMethodsWithContracts(o, method)));

            context.CancellationToken.ThrowIfCancellationRequested();

            if (contractMethods.Count > 0)
            {
                var requireStatements = contractMethods.SelectMany(o => ExtractRequires(o, context.CancellationToken)).ToList();
                requireStatements = DeduplicateRequires(requireStatements, ExtractRequires(methodSyntax, ExtractStatementsKind).ToList(), ExtractStatementsKind != ExtractStatements.Default);
                if (requireStatements.Count > 0)
                {
                    StringBuilder bldr = new StringBuilder();
                    foreach (var st in requireStatements)
                    {
                        bldr.AppendLine(st.ToString());
                    }

                    context.ReportDiagnostic(Diagnostic.Create(Rule, methodSyntax.Identifier.GetLocation(), bldr.ToString()));
                }
            }
        }
コード例 #5
0
 public void ReportUnusedParameters(CodeBlockAnalysisContext codeBlockContext)
 {
     foreach (IParameterSymbol unusedParameter in _trackedParameters)
     {
         ReportUnusedParameter(codeBlockContext, unusedParameter);
     }
 }
コード例 #6
0
        private static void AnalyzeSymbol(CodeBlockAnalysisContext context)
        {
            // TODO: Replace the following code with your own analysis, generating Diagnostic objects for any issues you find
            var ifs = context.CodeBlock.DescendantNodes().OfType <IfStatementSyntax>();

            foreach (var ifstament in ifs)
            {
                if (ifstament.Condition is null)
                {
                    continue;
                }

                if (ifstament.Condition.IsKind(SyntaxKind.NotEqualsExpression) || ifstament.Condition.IsKind(SyntaxKind.EqualsExpression) || ifstament.Condition.IsKind(SyntaxKind.IsExpression))
                {
                    var binaryExpression = ifstament.Condition as BinaryExpressionSyntax;

                    if (binaryExpression == null)
                    {
                        return;
                    }
                    var left  = binaryExpression.Left as LiteralExpressionSyntax;
                    var right = binaryExpression.Right as LiteralExpressionSyntax;

                    if (left != null && left.IsKind(SyntaxKind.NullLiteralExpression))
                    {
                        context.ReportDiagnostic(Diagnostic.Create(Rule, ifstament.GetLocation()));
                    }
                    else if (right != null && right.IsKind(SyntaxKind.NullLiteralExpression))
                    {
                        context.ReportDiagnostic(Diagnostic.Create(Rule, ifstament.GetLocation()));
                    }
                }
            }
        }
コード例 #7
0
 private void AnalyzeMethodCodeBlock(CodeBlockAnalysisContext context, MethodDeclarationSyntax methodDeclarationSyntax)
 {
     if (HasMultipleIndentations(methodDeclarationSyntax.Body))
     {
         context.ReportDiagnostic(Diagnostic.Create(Rule, methodDeclarationSyntax.Identifier.GetLocation(), methodDeclarationSyntax.Identifier.Text));
     }
 }
コード例 #8
0
 public void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
 {
     if (!suppress)
     {
         context.ReportDiagnostic(GetDiagnosticLocation(context.CodeBlock).CreateDiagnostic(Rule, context.OwningSymbol.Name));
     }
 }
コード例 #9
0
 //TODO: Look at cleaning this up and making it easier to register processors and fixers etc.
 private void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
 {
     if (this.SupportedDiagnostics.Contains(AvailableDiagnostics.GenericTypeArgumentMissing.Rule))
     {
         AvailableDiagnostics.GenericTypeArgumentMissing.Analyzer.ProcessCodeBlock(context);
     }
 }
コード例 #10
0
 private void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
 {
     foreach (var elseClause in context.CodeBlock.DescendantNodes().OfType <ElseClauseSyntax>())
     {
         context.ReportDiagnostic(Diagnostic.Create(Rule, elseClause.GetLocation()));
     }
 }
コード例 #11
0
 private void AnalyzeMethodCodeBlock(CodeBlockAnalysisContext context, MethodDeclarationSyntax methodDeclarationSyntax)
 {
     if (HasMultipleIndentations(methodDeclarationSyntax.Body))
     {
         context.ReportDiagnostic(Diagnostic.Create(Rule, methodDeclarationSyntax.Identifier.GetLocation(), methodDeclarationSyntax.Identifier.Text));
     }
 }
コード例 #12
0
 private void CodeBlockAction(CodeBlockAnalysisContext context)
 {
     foreach (var analyzer in AnalyzersByContextType[AnalysisContextType.CodeBlock])
     {
         (analyzer as DiagnosticBase <CodeBlockAnalysisContext>).Analyze(context);
     }
 }
コード例 #13
0
 internal static void HandleBlockTooLong(
     CodeBlockAnalysisContext context,
     ISet <SyntaxKind> supportedSyntaxKinds,
     DiagnosticDescriptor descriptor,
     int maxLineCount)
 {
     if (context.OwningSymbol.Kind == SymbolKind.Method)
     {
         SyntaxNode block     = context.CodeBlock;
         SyntaxKind blockKind = block.Kind();
         if (supportedSyntaxKinds.Contains(blockKind))
         {
             SyntaxTree tree = block.SyntaxTree;
             if (tree != null && tree.TryGetText(out SourceText treeText))
             {
                 SourceText blockText      = treeText.GetSubText(block.Span);
                 int        blockLineCount = blockText.Lines.Count;
                 if (blockLineCount > maxLineCount)
                 {
                     Location location         = block.GetFirstLineLocation();
                     string   blockName        = context.OwningSymbol.Name;
                     string   blockDescription = GetBlockDescription(blockName, blockKind, context.OwningSymbol?.ContainingType?.Name);
                     context.ReportDiagnostic(Diagnostic.Create(descriptor, location, blockDescription, maxLineCount, blockLineCount));
                 }
             }
         }
     }
 }
コード例 #14
0
        private void AnalyzeMethodBlock(CodeBlockAnalysisContext blockContext, IMethodSymbol methodSymbol, AnalyzerConfig analyzerConfig)
        {
            var declaredThrowTypes = GetDeclaredTypes(methodSymbol);
            var throwStatements    = blockContext.CodeBlock.DescendantNodes().OfType <ThrowStatementSyntax>();

            var offendingThrows = from thrw in throwStatements
                                  let exType = blockContext.SemanticModel.GetTypeInfo(thrw.Expression).Type
                                               where !exType.InheritsFromOrEqualsAny(declaredThrowTypes)
                                               select(expression: thrw, type: exType);

            var uncaughtThrows = from thrw in offendingThrows
                                 where !blockContext.SemanticModel.IsCaught(thrw.type, thrw.expression)
                                 select thrw;

            foreach (var thrw in uncaughtThrows)
            {
                var exceptionType = thrw.type;

                var diagnostic = Diagnostic.Create(
                    Rule,
                    thrw.expression.GetLocation(),
                    methodSymbol.Name,
                    exceptionType.Name
                    );

                blockContext.ReportDiagnostic(diagnostic);
            }
        }
コード例 #15
0
        private static void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
        {
            SyntaxTrivia[] outerCommentTrivia = context.CodeBlock.GetLeadingTrivia().Concat(context.CodeBlock.GetTrailingTrivia())
                                                .Where(IsComment).ToArray();

            AnalyzeCommentTrivia(outerCommentTrivia, context);
        }
コード例 #16
0
 private void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
 {
     foreach (var elseClause in context.CodeBlock.DescendantNodes().OfType<ElseClauseSyntax>())
     {
         context.ReportDiagnostic(Diagnostic.Create(Rule, elseClause.GetLocation()));
     }
 }
        private void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
        {
            var method = context.CodeBlock as MethodDeclarationSyntax;

            if (method == null)
            {
                return;
            }

            if (method.Body != null)
            {
                foreach (var statement in method.Body.Statements.OfType <ExpressionStatementSyntax>())
                {
                    var diagnostic = AnalyzeExpression(statement.Expression);
                    if (diagnostic != null)
                    {
                        context.ReportDiagnostic(diagnostic);
                    }
                }
                return;
            }
            if (method.ExpressionBody != null)
            {
                var diagnostic = AnalyzeExpression(method.ExpressionBody.Expression);
                if (diagnostic != null)
                {
                    context.ReportDiagnostic(diagnostic);
                }
            }
        }
コード例 #18
0
        private void AnalyzeCodeBlock(CodeBlockAnalysisContext context, PXContext pxContext)
        {
            context.CancellationToken.ThrowIfCancellationRequested();

            // Get body from a method or property
            CSharpSyntaxNode body = context.CodeBlock?.GetBody();

            if (body == null)
            {
                return;
            }

            // Collect all PXGraph-typed method parameters passed to BQL queries
            var walker = new BqlGraphArgWalker(context.SemanticModel, pxContext);

            body.Accept(walker);
            if (walker.GraphArguments.IsEmpty)
            {
                return;
            }

            // Collect all available PXGraph instances (@this, method parameters, local variables)
            var existingGraphs = GetExistingGraphInstances(body, context.SemanticModel, pxContext);

            if (existingGraphs.IsEmpty)
            {
                return;
            }

            // Determine if available PXGraph instance is used outside of BQL queries
            var usedGraphs = GetSymbolUsages(body, existingGraphs, context.SemanticModel, walker.GraphArguments)
                             .ToImmutableHashSet();
            var availableGraphs = existingGraphs.Except(usedGraphs).ToArray();

            // Analyze each PXGraph-typed parameter in BQL queries
            foreach (var graphArgSyntax in walker.GraphArguments)
            {
                var instantiationType = graphArgSyntax.GetGraphInstantiationType(context.SemanticModel, pxContext);

                // New PXGraph() / new TGraph() / PXGraph.CreateInstance<TGraph> are reported at all times
                // All other usages are reported only if:
                // 1. There is at least one existing PXGraph instance available
                // 2. PXGraph parameter is not used in any way because its modifications might affect the BQL query results
                if (instantiationType != GraphInstantiationType.None)
                {
                    context.ReportDiagnosticWithSuppressionCheck(Diagnostic.Create(Descriptors.PX1072_PXGraphCreationForBqlQueries,
                                                                                   graphArgSyntax.GetLocation(),
                                                                                   CreateDiagnosticProperties(availableGraphs, pxContext)),
                                                                 pxContext.CodeAnalysisSettings);
                }
                else if (availableGraphs.Length > 0 && context.SemanticModel.GetSymbolInfo(graphArgSyntax).Symbol is ILocalSymbol localVar &&
                         !usedGraphs.Contains(localVar))
                {
                    context.ReportDiagnosticWithSuppressionCheck(Diagnostic.Create(Descriptors.PX1072_PXGraphCreationForBqlQueries,
                                                                                   graphArgSyntax.GetLocation(),
                                                                                   CreateDiagnosticProperties(availableGraphs.Where(g => !Equals(g, localVar)), pxContext)),
                                                                 pxContext.CodeAnalysisSettings);
                }
            }
        }
コード例 #19
0
 public ReportingContext(CodeBlockAnalysisContext context, Diagnostic diagnostic)
 {
     SyntaxTree  = context.GetSyntaxTree();
     Compilation = context.SemanticModel.Compilation;
     Diagnostic  = diagnostic;
     this.contextSpecificReport = context.ReportDiagnostic;
 }
コード例 #20
0
 private void AnalyzeCodeBlock(CodeBlockAnalysisContext blockContext, AnalyzerConfig analyzerConfig)
 {
     if (blockContext.OwningSymbol is IMethodSymbol methodSymbol &&
         analyzerConfig.ShouldAnalyze(methodSymbol.ContainingType))
     {
         AnalyzeMethodBlock(blockContext, methodSymbol, analyzerConfig);
     }
 }
コード例 #21
0
        protected void CheckNumberOfParameters(CodeBlockAnalysisContext obj, int numberOfParameters, IMethodSettings methodSettings)
        {
            if (numberOfParameters < 4)
                return;

            var diagnostic = Diagnostic.Create(ParametersRule, obj.CodeBlock.GetLocation(), new object[] { "Number Of Parameters", 3 });
            obj.ReportDiagnostic(diagnostic);
        }
コード例 #22
0
        private static void ReportAtContainingSymbol(int statementCount, CodeBlockAnalysisContext context)
        {
            string   kind       = GetMemberKind(context.OwningSymbol, context.CancellationToken);
            string   memberName = context.OwningSymbol.ToDisplayString(SymbolDisplayFormat.CSharpShortErrorMessageFormat);
            Location location   = GetMemberLocation(context.OwningSymbol, context.SemanticModel, context.CancellationToken);

            context.ReportDiagnostic(Diagnostic.Create(Rule, location, kind, memberName, statementCount));
        }
コード例 #23
0
        protected void CheckLinesOfCode(CodeBlockAnalysisContext obj, int linesOfCode, IMethodSettings methodSettings)
        {
            if (linesOfCode < 20)
                return;

            var diagnostic = Diagnostic.Create(LinesRule, obj.CodeBlock.GetLocation(), new object[] { "Lines Of Code", 20 });
            obj.ReportDiagnostic(diagnostic);

        }
コード例 #24
0
        protected void CheckComplexity(CodeBlockAnalysisContext obj, int cyclomaticComplexity, IMethodSettings methodSettings)
        {
            if (cyclomaticComplexity < 10)
                return;

            var diagnostic = Diagnostic.Create(ComplexityRule, obj.CodeBlock.GetLocation(), new object[]{ "Cyclomatic Complexity", 10});
            obj.ReportDiagnostic(diagnostic);

        }
コード例 #25
0
 public void CodeBlockEndAction(CodeBlockAnalysisContext context)
 {
     // Report diagnostics for unused parameters.
     foreach (IParameterSymbol parameter in _unusedParameters)
     {
         Diagnostic diagnostic = Diagnostic.Create(Rule, parameter.Locations[0], parameter.Name, parameter.ContainingSymbol.Name);
         context.ReportDiagnostic(diagnostic);
     }
 }
コード例 #26
0
 private static void Analyze(CodeBlockAnalysisContext context)
 {
     // block contains OpenTK.Graphics.OpenGL
     var walker = new BlockWalker();
     walker.Visit(context.CodeBlock);
     foreach (var diagnostic in walker.Diagnostics)
     {
         context.ReportDiagnostic(diagnostic);
     }
 }
コード例 #27
0
        protected override ImmutableArray <Diagnostic> AnalyzeCodeBlock(CodeBlockAnalysisContext context)
        {
            var semanticModel     = context.SemanticModel;
            var cancellationToken = context.CancellationToken;

            var options = context.GetCSharpAnalyzerOptions().GetSimplifierOptions();

            using var simplifier = new TypeSyntaxSimplifierWalker(this, semanticModel, options, ignoredSpans: null, cancellationToken);
            simplifier.Visit(context.CodeBlock);
            return(simplifier.Diagnostics);
        }
コード例 #28
0
        private static void Action(CodeBlockAnalysisContext context)
        {
            var blockSyntaxes = context.CodeBlock.ChildNodes().OfType <BlockSyntax>();;

            var switchStatements = blockSyntaxes.SelectMany(x => x.Statements.OfType <SwitchStatementSyntax>());

            foreach (var switchStatement in switchStatements)
            {
                CheckSwitch(switchStatement, context);
            }
        }
コード例 #29
0
 async void Analyzeblock(CodeBlockAnalysisContext obj)
 {
     var metricsCalculator = new CodeMetricsCalculator();
     var metrics = await metricsCalculator.Calculate(new List<SyntaxTree> { CSharpSyntaxTree.ParseText(obj.CodeBlock.ToString()) });
     var functionMetric = metrics.ElementAt(0).TypeMetrics.ElementAt(0).MemberMetrics.ElementAt(0);
     //var settings = SettingsHelper.GetSettings(obj.Options);
     var settings = new Settings();
     CheckComplexity(obj, functionMetric.CyclomaticComplexity, settings.MethodSettings);
     CheckNumberOfParameters(obj, functionMetric.NumberOfParameters, settings.MethodSettings);
     CheckLinesOfCode(obj, functionMetric.LinesOfCode, settings.MethodSettings);
 }
コード例 #30
0
        private static void Analyze(CodeBlockAnalysisContext context)
        {
            // block contains OpenTK.Graphics.OpenGL
            var walker = new BlockWalker();

            walker.Visit(context.CodeBlock);
            foreach (var diagnostic in walker.Diagnostics)
            {
                context.ReportDiagnostic(diagnostic);
            }
        }
        protected override ImmutableArray <Diagnostic> AnalyzeCodeBlock(CodeBlockAnalysisContext context)
        {
            var semanticModel     = context.SemanticModel;
            var cancellationToken = context.CancellationToken;

            var syntaxTree = semanticModel.SyntaxTree;
            var optionSet  = context.Options.GetAnalyzerOptionSet(syntaxTree, cancellationToken);
            var simplifier = new TypeSyntaxSimplifierWalker(this, semanticModel, optionSet, ignoredSpans: null, cancellationToken);

            simplifier.Visit(context.CodeBlock);
            return(simplifier.Diagnostics);
        }
コード例 #32
0
 public void AnalyzeCodeBlockEnd(CodeBlockAnalysisContext context)
 {
     foreach (var pair in _catchAllCatchClauses)
     {
         context.ReportDiagnostic(
             Diagnostic.Create(
                 Rule,
                 pair.Key.GetLocation(),
                 _owningSymbol.ToDisplayString(),
                 pair.Value.ToDisplayString()));
     }
 }
コード例 #33
0
            private void ReportUnusedParameter(CodeBlockAnalysisContext codeBlockContext, IParameterSymbol unusedParameter)
            {
                // I've seen it empty when the parameter list is being edited.
                if (unusedParameter.DeclaringSyntaxReferences.Length == 0)
                {
                    return;
                }

                SyntaxReference syntaxReference = unusedParameter.DeclaringSyntaxReferences[0];
                Diagnostic      diagnostic      = Diagnostic.Create(_rule, syntaxReference.SyntaxTree.GetLocation(syntaxReference.Span), unusedParameter.Name);

                codeBlockContext.ReportDiagnostic(diagnostic);
            }
コード例 #34
0
        private static BlockSyntax GetBody(CodeBlockAnalysisContext context)
        {
            switch (context.CodeBlock)
            {
            case MethodDeclarationSyntax s: return(s.Body);

            case ConstructorDeclarationSyntax s: return(s.Body);

            case AccessorDeclarationSyntax s: return(s.Body);

            default: return(null);
            }
        }
コード例 #35
0
        private static void AnalyzeSymbol(CodeBlockAnalysisContext context)
        {
            // TODO: Replace the following code with your own analysis, generating Diagnostic objects for any issues you find
            var ifs = context.CodeBlock.DescendantNodes().OfType <IfStatementSyntax>();

            foreach (var ifstament in ifs)
            {
                foreach (var nestedif in ifstament.DescendantNodes().OfType <IfStatementSyntax>())
                {
                    context.ReportDiagnostic(Diagnostic.Create(Rule, nestedif.GetLocation()));
                }
            }
        }
コード例 #36
0
        private static void AnalyzeSymbol(CodeBlockAnalysisContext context)
        {
            // TODO: Replace the following code with your own analysis, generating Diagnostic objects for any issues you find
            var returns = context.CodeBlock.DescendantNodes().OfType <ReturnStatementSyntax>();

            foreach (var r in returns)
            {
                foreach (var item in r.DescendantTokens().Where(x => x.IsKind(SyntaxKind.NullKeyword)))
                {
                    context.ReportDiagnostic(Diagnostic.Create(Rule, item.GetLocation()));
                }
            }
        }
コード例 #37
0
        private static void ProcessSwitchCases <T>(
            Func <bool> shouldProceedFunc,
            Func <IEnumerable <SwitchArgumentTypeItem <T> > > allImplementationsFunc,
            Func <IEnumerable <string> > caseImplementationFunc,
            DiagnosticDescriptor rule,
            Location location,
            CodeBlockAnalysisContext context,
            int switchStatementLocation) where T : IComparable
        {
            if (shouldProceedFunc == null ||
                allImplementationsFunc == null ||
                caseImplementationFunc == null ||
                rule == null)
            {
                return;
            }

            if (!shouldProceedFunc())
            {
                return;
            }

            var allImplementations = allImplementationsFunc().ToList();

            var obj = new object();
            var caseImplementations = caseImplementationFunc().ToDictionary(x => x, _ => obj);

            var checkedValues = allImplementations
                                .Where(expectedValue => caseImplementations.ContainsKey(expectedValue.FullName))
                                .ToDictionary(x => x.Value, x => obj);

            var notCheckedValues = allImplementations.Where(x =>
                                                            !checkedValues.ContainsKey(x.Value))
                                   .OrderBy(x => x.FullName)
                                   .ToList();

            if (notCheckedValues.Any())
            {
                var firstUncheckedValue = notCheckedValues.First();
                var typeName            = firstUncheckedValue.Member;
                var symbols             = context.SemanticModel.LookupSymbols(switchStatementLocation);
                var shouldAddNamespace  = !symbols.Any(x => x.Name == typeName && x.ContainingNamespace.Name == firstUncheckedValue.Prefix);

                var notCoveredValues = notCheckedValues.Select(caseName =>
                                                               BuildName(shouldAddNamespace, caseName.Prefix, caseName.FullName));
                var diagnostic = Diagnostic.Create(rule, location, string.Join(", ", notCoveredValues));
                context.ReportDiagnostic(diagnostic);
            }

            string BuildName(bool shouldAddPrefix, string prefix, string fullName) => shouldAddPrefix ? $"{prefix}.{fullName}" : fullName;
        }
コード例 #38
0
        private static void Analyze(CodeBlockAnalysisContext context)
        {
            if (context.OwningSymbol.Kind != SymbolKind.Method)
            {
                return;
            }

            var method = (IMethodSymbol)context.OwningSymbol;

            foreach (var parameter in method.Parameters)
            {
                if (parameter.Type.AllInterfaces.Select(x => x.MetadataName).Contains("IInternalActor"))
                {
                    var diag = Diagnostic.Create(Rule, parameter.Locations[0], parameter.Name,
                        parameter.ContainingSymbol.Name);
                    context.ReportDiagnostic(diag);
                }
            }
        }
コード例 #39
0
ファイル: CodeBlockAnalyzer.cs プロジェクト: CAPCHIK/roslyn
        private static void CodeBlockAction(CodeBlockAnalysisContext codeBlockContext)
        {
            // We only care about method bodies.
            if (codeBlockContext.OwningSymbol.Kind != SymbolKind.Method)
            {
                return;
            }

            // Report diagnostic for void non-virtual methods with empty method bodies.
            var method = (IMethodSymbol)codeBlockContext.OwningSymbol;
            var block = (BlockSyntax)codeBlockContext.CodeBlock.ChildNodes().FirstOrDefault(n => n.Kind() == SyntaxKind.Block);
            if (method.ReturnsVoid && !method.IsVirtual && block != null && block.Statements.Count == 0)
            {
                var tree = block.SyntaxTree;
                var location = method.Locations.First(l => tree.Equals(l.SourceTree));
                var diagnostic = Diagnostic.Create(Rule, location, method.Name);
                codeBlockContext.ReportDiagnostic(diagnostic);
            }
        }
コード例 #40
0
 public static void OnCodeBlockEnded(CodeBlockAnalysisContext context)
 {
     context.ReportDiagnostic(CodeAnalysis.Diagnostic.Create(Descriptor1, Location.None));
 }
コード例 #41
0
ファイル: NullAnalyzer.cs プロジェクト: uxsoft/nullaby
 public CodeBlockAnalyzer(CodeBlockAnalysisContext context)
 {
     this.context = context;
 }
コード例 #42
0
ファイル: NullAnalyzer.cs プロジェクト: uxsoft/nullaby
 private static void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
 {
     new CodeBlockAnalyzer(context).Analyze(context.CodeBlock);
 }
コード例 #43
0
        /// <summary>
        /// Analyzes a code block.
        /// </summary>
        /// <param name="context">The context.</param>
        private void AnalyzeCodeBlock(CodeBlockAnalysisContext context)
        {
            var owner = context.OwningSymbol;
            var block = context.CodeBlock;
            var model = context.SemanticModel;

            // Look over the object for debugging
            var inspect = context;

            // TODO: Tell Alfred
        }
コード例 #44
0
 public void CodeBlockEndAction(CodeBlockAnalysisContext context)
 {
     // Report diagnostics for unused parameters.
     foreach (var parameter in _unusedParameters)
     {
         var diagnostic = Diagnostic.Create(Rule, parameter.Locations[0], parameter.Name, parameter.ContainingSymbol.Name);
         context.ReportDiagnostic(diagnostic);
     }
 }
コード例 #45
0
ファイル: DiagnosticAnalyzer.cs プロジェクト: Kromi75/Codoc
 /// <summary>
 /// Analyzes the code block.
 /// </summary>
 /// <param name="codeBlockAnalysisContext">The code block analysis context.</param>
 private static void AnalyzeCodeBlock(CodeBlockAnalysisContext codeBlockAnalysisContext)
 {
     if (!(codeBlockAnalysisContext.CodeBlock is MethodDeclarationSyntax))
       {
     MemberDeclarationSyntax declaration = (MemberDeclarationSyntax)codeBlockAnalysisContext.CodeBlock;
     if (!declaration.HasLeadingTrivia)
     {
       string memberName = new Parser().GetMemberName(declaration);
       Diagnostic diagnostic = Diagnostic.Create(CodocExtensionAnalyzer.Rule, declaration.GetLocation(), memberName);
       codeBlockAnalysisContext.ReportDiagnostic(diagnostic);
     }
       }
 }