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; } }
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; } } }