public static HashSet <Assertion> CollectAssertions( [NotNull] AssertionMethodAnnotationProvider assertionMethodAnnotationProvider, [NotNull] AssertionConditionAnnotationProvider assertionConditionAnnotationProvider, [NotNull] ICSharpTreeNode rootNode) { var forTypeLevelInitializersOnly = rootNode is IClassLikeDeclaration; var assertions = new HashSet <Assertion>(); foreach (var expression in rootNode.Descendants <ICSharpExpression>()) { Debug.Assert(expression != null); var isInTypeLevelInitializer = expression.PathToRoot() .Any(node => node is IExpressionInitializer && (node.Parent is IFieldDeclaration || node.Parent is IPropertyDeclaration)); if (forTypeLevelInitializersOnly != isInTypeLevelInitializer) { continue; } switch (expression) { case IInvocationExpression invocationExpression: var assertionStatement = AssertionStatement.TryFromInvocationExpression( invocationExpression, assertionMethodAnnotationProvider, assertionConditionAnnotationProvider); if (assertionStatement != null) { assertions.Add(assertionStatement); } var inlineAssertion = InlineAssertion.TryFromInvocationExpression(invocationExpression); if (inlineAssertion != null) { assertions.Add(inlineAssertion); } break; case ISuppressNullableWarningExpression suppressNullableWarningExpression: assertions.Add(new NullForgivingOperation(suppressNullableWarningExpression)); break; } } return(assertions); }
public static AssertionStatement TryFromInvocationExpression( [NotNull] IInvocationExpression invocationExpression, [NotNull] AssertionMethodAnnotationProvider assertionMethodAnnotationProvider, [NotNull] AssertionConditionAnnotationProvider assertionConditionAnnotationProvider) { if (invocationExpression.Reference.Resolve().DeclaredElement is IMethod method && assertionMethodAnnotationProvider.GetInfo(method)) { foreach (var parameter in method.Parameters) { Debug.Assert(parameter != null); var parameterAssertionCondition = assertionConditionAnnotationProvider.GetInfo(parameter); if (parameterAssertionCondition == null && parameter.Type.IsBool()) { parameterAssertionCondition = AssertionConditionType.IS_TRUE; } if (parameterAssertionCondition != null) { var argument = invocationExpression.ArgumentList?.Arguments.FirstOrDefault( a => { Debug.Assert(a != null); return(a.MatchingParameter != null && a.MatchingParameter.Element.ShortName == parameter.ShortName); }); if (argument?.Value != null) { return(new AssertionStatement(invocationExpression, (AssertionConditionType)parameterAssertionCondition, argument.Value)); } } } } return(null); }
public InvalidAssertionMessageProblemAnalyzer(CodeAnnotationsCache annotationsCache) { _contractAnnotationProvider = annotationsCache.GetProvider <ContractAnnotationProvider>(); _assertionMethodAnnotationProvider = annotationsCache.GetProvider <AssertionMethodAnnotationProvider>(); _assertionConditionAnnotationProvider = annotationsCache.GetProvider <AssertionConditionAnnotationProvider>(); }
public ControlFlowAnalyzer([NotNull] CodeAnnotationsCache codeAnnotationsCache) { nullnessProvider = codeAnnotationsCache.GetProvider <NullnessProvider>(); assertionMethodAnnotationProvider = codeAnnotationsCache.GetProvider <AssertionMethodAnnotationProvider>(); assertionConditionAnnotationProvider = codeAnnotationsCache.GetProvider <AssertionConditionAnnotationProvider>(); }