private static bool IsEquivalentRequireStatements(StatementSyntax a, StatementSyntax b, bool smart) { if (!smart) { return(a.IsEquivalentTo(b)); } var aCond = ContractStatementAnalyzer.ParseInvocation(a, out var aInv) ? aInv.Condition : null; var bCond = ContractStatementAnalyzer.ParseInvocation(b, out var bInv) ? bInv.Condition : null; if (aCond == null || bCond == null) { return(false); } return(aCond.IsEquivalentTo(bCond)); }
internal static void ReplaceWithEnumerable(DocumentEditor editor, SyntaxNode nodeToReplace) { ContractInvocationInfo contractCallInfo = null; if (!ContractStatementAnalyzer.ParseInvocation(nodeToReplace.Parent as ExpressionStatementSyntax, out contractCallInfo)) { if (!ContractStatementAnalyzer.ParseInvocation(nodeToReplace as InvocationExpressionSyntax, out contractCallInfo)) { return; } } if (!contractCallInfo.IsContractType || !ContractForAllToEnumerableAnalyzer.MethodNamesToFix.Contains(contractCallInfo.MethodNameAsString)) { return; } var generator = editor.Generator; var trailingTrivia = nodeToReplace.GetTrailingTrivia(); var leadingTrivia = nodeToReplace.GetLeadingTrivia(); SyntaxNode newCallNode = null; if (contractCallInfo.MethodNameAsString == nameof(System.Diagnostics.Contracts.Contract.ForAll) && contractCallInfo.AllArguments.Arguments.Count == 2) { newCallNode = generator.InvocationExpression( generator.MemberAccessExpression(contractCallInfo.AllArguments.Arguments[0].Expression, nameof(Enumerable.All)), contractCallInfo.AllArguments.Arguments[1]); } else if (contractCallInfo.MethodNameAsString == nameof(System.Diagnostics.Contracts.Contract.Exists) && contractCallInfo.AllArguments.Arguments.Count == 2) { newCallNode = generator.InvocationExpression( generator.MemberAccessExpression(contractCallInfo.AllArguments.Arguments[0].Expression, nameof(Enumerable.Any)), contractCallInfo.AllArguments.Arguments[1]); } if (newCallNode != null) { newCallNode = newCallNode.WithTrailingTrivia(trailingTrivia).WithLeadingTrivia(leadingTrivia); editor.ReplaceNode(nodeToReplace, newCallNode); } }
private static async Task <Document> ReplaceWithTurboContract(Document document, SyntaxNode nodeToReplace, string stringText, CancellationToken cancellationToken) { var editor = await DocumentEditor.CreateAsync(document, cancellationToken).ConfigureAwait(false); var generator = editor.Generator; var semanticModel = await document.GetSemanticModelAsync(cancellationToken); ContractInvocationInfo contractCallInfo = null; if (!ContractStatementAnalyzer.ParseInvocation(nodeToReplace.Parent as ExpressionStatementSyntax, out contractCallInfo) || !contractCallInfo.IsSpecialContractType || !TurboContractConditionStringNotInSyncAnalyzer.MethodNamesToFix.Contains(contractCallInfo.MethodNameAsString)) { return(document); } var trailingTrivia = nodeToReplace.GetTrailingTrivia(); var leadingTrivia = nodeToReplace.GetLeadingTrivia(); SyntaxNode debugAssertCallNode = null; if (contractCallInfo.Message == null) { debugAssertCallNode = generator.InvocationExpression( generator.MemberAccessExpression(generator.IdentifierName(ContractStatementAnalyzer.SpecialContractClass), contractCallInfo.MethodName), contractCallInfo.Condition, generator.Argument("conditionString", RefKind.None, generator.LiteralExpression(contractCallInfo.Condition.ToString()))); } else { debugAssertCallNode = generator.InvocationExpression( generator.MemberAccessExpression(generator.IdentifierName(ContractStatementAnalyzer.SpecialContractClass), contractCallInfo.MethodName), contractCallInfo.Condition, contractCallInfo.Message, generator.Argument("conditionString", RefKind.None, generator.LiteralExpression(contractCallInfo.Condition.ToString()))); } debugAssertCallNode = debugAssertCallNode.WithTrailingTrivia(trailingTrivia).WithLeadingTrivia(leadingTrivia); editor.ReplaceNode(nodeToReplace, debugAssertCallNode); return(editor.GetChangedDocument()); }
internal static void ReplaceWithDebugAssert(DocumentEditor editor, SyntaxNode nodeToReplace) { ContractInvocationInfo contractCallInfo = null; if (!ContractStatementAnalyzer.ParseInvocation(nodeToReplace.Parent as ExpressionStatementSyntax, out contractCallInfo) || !contractCallInfo.IsContractType || !ContractToDebugAssertAnalyzer.MethodNamesToFix.Contains(contractCallInfo.MethodNameAsString)) { return; } var generator = editor.Generator; var trailingTrivia = nodeToReplace.GetTrailingTrivia(); var leadingTrivia = nodeToReplace.GetLeadingTrivia(); SyntaxNode debugAssertCallNode = null; if (contractCallInfo.Message == null) { debugAssertCallNode = generator.InvocationExpression( generator.MemberAccessExpression(generator.IdentifierName(nameof(Debug)), nameof(Debug.Assert)), contractCallInfo.Condition, generator.LiteralExpression(contractCallInfo.Condition.ToString())); } else { debugAssertCallNode = generator.InvocationExpression( generator.MemberAccessExpression(generator.IdentifierName(nameof(Debug)), nameof(Debug.Assert)), contractCallInfo.Condition, generator.LiteralExpression(contractCallInfo.Condition.ToString()), contractCallInfo.Message); } debugAssertCallNode = debugAssertCallNode.WithTrailingTrivia(trailingTrivia).WithLeadingTrivia(leadingTrivia); editor.ReplaceNode(nodeToReplace, debugAssertCallNode); }
private static bool IsDebugAssertStatement(StatementSyntax statement) { return(ContractStatementAnalyzer.ParseInvocation(statement, out var invocationInfo) && invocationInfo.MethodNameAsString == "Assert" && invocationInfo.IsDebugType); }
private static bool IsTurboRequiresStatement(StatementSyntax statement) { return(ContractStatementAnalyzer.ParseInvocation(statement, out var invocationInfo) && invocationInfo.MethodNameAsString == "Requires" && invocationInfo.IsSpecialContractType); }