public void TestFileWithValueAnalysisMode(string file, ValueAnalysisMode valueAnalysisMode) => ExecuteWithinSettingsTransaction(
            store =>
            {
                RunGuarded(() => store.SetValue<HighlightingSettings, ValueAnalysisMode>(s => s.ValueAnalysisMode, valueAnalysisMode));

                DoTestSolution(file);
            });
Esempio n. 2
0
        public void TestFileWithValueAnalysisMode(string file, ValueAnalysisMode valueAnalysisMode)
        => ExecuteWithinSettingsTransaction(
            store =>
        {
            RunGuarded(() => store.SetValue <HighlightingSettings, ValueAnalysisMode>(s => s.ValueAnalysisMode, valueAnalysisMode));

            DoTestSolution(file);
        });
        static void AnalyzeOther(
            ValueAnalysisMode valueAnalysisMode,
            [NotNull] IHighlightingConsumer consumer,
            [NotNull] NullnessProvider nullnessProvider,
            [NotNull] CodeAnnotationsConfiguration codeAnnotationsConfiguration,
            [NotNull] IAttributesOwnerDeclaration attributesOwnerDeclaration)
        {
            switch (valueAnalysisMode)
            {
            case ValueAnalysisMode.OPTIMISTIC:
                foreach (var attributeMark in GetAttributeMarks(nullnessProvider, attributesOwnerDeclaration))
                {
                    if (attributeMark == null)
                    {
                        var nonNullAnnotationAttributeType = codeAnnotationsConfiguration.GetAttributeTypeForElement(
                            attributesOwnerDeclaration,
                            NullnessProvider.NotNullAttributeShortName);
                        var canBeNullAnnotationAttributeType = codeAnnotationsConfiguration.GetAttributeTypeForElement(
                            attributesOwnerDeclaration,
                            NullnessProvider.CanBeNullAttributeShortName);
                        if (nonNullAnnotationAttributeType != null || canBeNullAnnotationAttributeType != null)
                        {
                            consumer.AddHighlighting(
                                new MissingAnnotationHighlighting(
                                    string.Format(
                                        @"Declared element is nullable, but is not annotated with '{0}' or '{1}'.",
                                        NullnessProvider.NotNullAttributeShortName,
                                        NullnessProvider.CanBeNullAttributeShortName),
                                    attributesOwnerDeclaration));
                        }
                        break;
                    }
                }
                break;

            case ValueAnalysisMode.PESSIMISTIC:
                foreach (var attributeMark in GetAttributeMarks(nullnessProvider, attributesOwnerDeclaration))
                {
                    if (attributeMark != null && attributeMark.AnnotationNullableValue == CodeAnnotationNullableValue.CAN_BE_NULL)
                    {
                        consumer.AddHighlighting(
                            new RedundantAnnotationHighlighting(
                                attributesOwnerDeclaration,
                                attributeMark.Attribute,
                                "Annotation is redundant because the declared element can be null by default."));
                    }
                }
                break;
            }
        }
        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;
                    }
                }