public void TestFileWithValueAnalysisMode(string file, ValueAnalysisMode valueAnalysisMode) => ExecuteWithinSettingsTransaction( store => { RunGuarded(() => store.SetValue<HighlightingSettings, ValueAnalysisMode>(s => s.ValueAnalysisMode, valueAnalysisMode)); DoTestSolution(file); });
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; } }