Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
 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>();
 }