public ICSharpControlFlowGraph GetControlFlowGraph()
        {
            if (!_controlFlowGraphCached)
            {
                if (this.SelectedElement is ICSharpTreeNode)
                {
                    ITreeNode containingGraphOwner = ControlFlowBuilder.GetContainingGraphOwner(this.SelectedElement);
                    if (containingGraphOwner != null)
                    {
                        new CachingNonQualifiedReferencesResolver().Process(containingGraphOwner);
                        _cachedControlFlowGraph = ControlFlowBuilder.GetGraph(containingGraphOwner) as ICSharpControlFlowGraph;
                    }
                }

                _controlFlowGraphCached = true;
            }

            return(_cachedControlFlowGraph);
        }
        public ICSharpControlFlowAnalysisResult InspectControlFlowGraph()
        {
            if (!_controlFlowGraphInspected)
            {
                ICSharpControlFlowGraph controlFlowGraph = this.GetControlFlowGraph();
                if (controlFlowGraph != null)
                {
                    ValueAnalysisMode analysisMode = this.SelectedElement.NotNull("context != null").GetSettingsStore().GetValue(HighlightingSettingsAccessor.ValueAnalysisMode);
                    CSharpControlFlowGraphInspector flowGraphInspector = CSharpControlFlowGraphInspector.Inspect(controlFlowGraph, analysisMode);
                    if (!flowGraphInspector.HasComplexityOverflow)
                    {
                        _cachedControlFlowGraphInspectionResult = flowGraphInspector;
                    }
                }

                _controlFlowGraphInspected = true;
            }

            return(_cachedControlFlowGraphInspectionResult);
        }
            public static new Inspector Inspect(
                [NotNull] ICSharpControlFlowGraph controlFlowGraph,
                ValueAnalysisMode analysisMode,
                bool shouldDisableValueAnalysisIfNullableWarningsEnabled           = true,
                [CanBeNull] Func <ITreeNode, ICSharpControlFlowGraph> graphBuilder = null)
            {
                var declaration    = controlFlowGraph.Declaration;
                var containingFile = (ICSharpFile)declaration.GetContainingFile();

                var forceClosuresCollection = false;

                if ((uint)analysisMode > 0U && shouldDisableValueAnalysisIfNullableWarningsEnabled)
                {
                    var file                = containingFile;
                    var treeTextRange       = declaration.GetTreeTextRange();
                    ref TreeTextRange local = ref treeTextRange;
                    if (file.IsNullableWarningsEnabledEverywhereIn(in local))
                    {
                        analysisMode            = ValueAnalysisMode.OFF;
                        forceClosuresCollection = true;
                    }
                }
Exemple #4
0
        static void AnalyzeAssertions(
            [NotNull] ElementProblemAnalyzerData data,
            [NotNull] IHighlightingConsumer consumer,
            [NotNull] ICSharpTreeNode rootNode,
            [NotNull] ICSharpControlFlowGraph controlFlowGraph)
        {
            var codeAnnotationsCache = rootNode.GetPsiServices().GetCodeAnnotationsCache();

            var nullnessProvider = codeAnnotationsCache.GetProvider <NullnessProvider>();
            var assertionMethodAnnotationProvider    = codeAnnotationsCache.GetProvider <AssertionMethodAnnotationProvider>();
            var assertionConditionAnnotationProvider = codeAnnotationsCache.GetProvider <AssertionConditionAnnotationProvider>();

            var assertions = Assertion.CollectAssertions(assertionMethodAnnotationProvider, assertionConditionAnnotationProvider, rootNode);

            assertions.ExceptWith(
                from highlightingInfo in consumer.Highlightings
                where highlightingInfo != null
                let redundantAssertionHighlighting = highlightingInfo.Highlighting as RedundantAssertionHighlighting
                                                     where redundantAssertionHighlighting != null
                                                     select redundantAssertionHighlighting.Assertion);

            if (assertions.Count == 0)
            {
                return; // no (new) assertions found
            }

            var inspector = CSharpControlFlowGraphInspector.Inspect(controlFlowGraph, data.GetValueAnalysisMode());

            var alwaysSuccessTryCastExpressions = new HashSet <IAsExpression>(inspector.AlwaysSuccessTryCastExpressions ?? new IAsExpression[] { });

            foreach (var assertion in assertions)
            {
                switch (assertion.AssertionConditionType)
                {
                case AssertionConditionType.IS_TRUE:
                    AnalyzeWhenExpressionIsKnownToBeTrueOrFalse(
                        consumer,
                        nullnessProvider,
                        inspector,
                        alwaysSuccessTryCastExpressions,
                        assertion,
                        true);
                    break;

                case AssertionConditionType.IS_FALSE:
                    AnalyzeWhenExpressionIsKnownToBeTrueOrFalse(
                        consumer,
                        nullnessProvider,
                        inspector,
                        alwaysSuccessTryCastExpressions,
                        assertion,
                        false);
                    break;

                case AssertionConditionType.IS_NOT_NULL:
                    AnalyzeWhenExpressionIsKnownToBeNullOrNotNull(
                        consumer,
                        nullnessProvider,
                        inspector,
                        alwaysSuccessTryCastExpressions,
                        assertion,
                        false);
                    break;

                case AssertionConditionType.IS_NULL:
                    AnalyzeWhenExpressionIsKnownToBeNullOrNotNull(
                        consumer,
                        nullnessProvider,
                        inspector,
                        alwaysSuccessTryCastExpressions,
                        assertion,
                        true);
                    break;
                }
            }
        }
        void AnalyzeAssertions(
            [NotNull] ElementProblemAnalyzerData data,
            [NotNull] IHighlightingConsumer consumer,
            [NotNull] ICSharpTreeNode rootNode,
            [NotNull] ICSharpControlFlowGraph controlFlowGraph)
        {
            var assertions = Assertion.CollectAssertions(assertionMethodAnnotationProvider, assertionConditionAnnotationProvider, rootNode);

            assertions.ExceptWith(
                from highlightingInfo in consumer.Highlightings
                where highlightingInfo != null
                let redundantAssertionHighlighting = highlightingInfo.Highlighting as RedundantAssertionSuggestion
                                                     where redundantAssertionHighlighting != null
                                                     select redundantAssertionHighlighting.Assertion);

            if (assertions.Count == 0)
            {
                return; // no (new) assertions found
            }

            CSharpCompilerNullableInspector nullabilityInspector;
            CSharpControlFlowGraphInspector inspector;
            HashSet <IAsExpression>         alwaysSuccessTryCastExpressions;

            if (rootNode.IsNullableWarningsContextEnabled())
            {
                nullabilityInspector = (CSharpCompilerNullableInspector)CSharpCompilerNullableInspector.Inspect(
                    controlFlowGraph,
                    null,
                    ValueAnalysisMode.OFF); // wrong [NotNull] annotation in R# code
                inspector = null;
                alwaysSuccessTryCastExpressions = null;
            }
            else
            {
                nullabilityInspector            = null;
                inspector                       = CSharpControlFlowGraphInspector.Inspect(controlFlowGraph, data.GetValueAnalysisMode());
                alwaysSuccessTryCastExpressions =
                    new HashSet <IAsExpression>(inspector.AlwaysSuccessTryCastExpressions ?? Array.Empty <IAsExpression>());
            }

            foreach (var assertion in assertions)
            {
                switch (assertion.AssertionConditionType)
                {
                case AssertionConditionType.IS_TRUE:
                    AnalyzeWhenExpressionIsKnownToBeTrueOrFalse(
                        consumer,
                        nullabilityInspector,
                        inspector,
                        alwaysSuccessTryCastExpressions,
                        assertion,
                        true);
                    break;

                case AssertionConditionType.IS_FALSE:
                    AnalyzeWhenExpressionIsKnownToBeTrueOrFalse(
                        consumer,
                        nullabilityInspector,
                        inspector,
                        alwaysSuccessTryCastExpressions,
                        assertion,
                        false);
                    break;

                case AssertionConditionType.IS_NOT_NULL:
                    AnalyzeWhenExpressionIsKnownToBeNullOrNotNull(
                        consumer,
                        nullabilityInspector,
                        inspector,
                        alwaysSuccessTryCastExpressions,
                        assertion,
                        false);
                    break;

                case AssertionConditionType.IS_NULL:
                    AnalyzeWhenExpressionIsKnownToBeNullOrNotNull(
                        consumer,
                        nullabilityInspector,
                        inspector,
                        alwaysSuccessTryCastExpressions,
                        assertion,
                        true);
                    break;
                }
            }
        }