From 040b54cc3b4bf18553b18495bed673032249bced Mon Sep 17 00:00:00 2001 From: Remy Willems Date: Thu, 4 Jul 2024 11:19:28 +0200 Subject: [PATCH] Refactor codebase in preparation for hide PR (#5594) Factors out the refactoring parts of https://github.com/dafny-lang/dafny/pull/5562 ### Description - Extracted methods into separate files - Extracted code into separate methods ### How has this been tested? - Pure refactoring, no additional tests needed By submitting this pull request, I confirm that my contribution is made under the terms of the [MIT license](https://github.com/dafny-lang/dafny/blob/master/LICENSE.txt). --- .../AST/Grammar/Printer/Printer.Statement.cs | 34 +- .../AST/Statements/Verification/RevealStmt.cs | 47 ++ .../PreType/PreTypeResolve.Expressions.cs | 6 +- .../PreType/PreTypeResolve.Statements.cs | 83 +--- .../Resolver/PreType/PreTypeResolve.cs | 18 +- .../Resolver/PreType/PreTypeResolver.Match.cs | 4 +- .../BoogieGenerator.ExpressionTranslator.cs | 107 +---- .../Verifier/BoogieGenerator.LetExpr.cs | 107 +++++ .../Verifier/BoogieGenerator.Methods.cs | 418 +++++++++--------- .../Verifier/BoogieGenerator.SplitExpr.cs | 51 +-- .../BoogieGenerator.TrPredicateStatement.cs | 169 +++++++ .../Verifier/BoogieGenerator.TrStatement.cs | 155 ------- Source/DafnyCore/Verifier/BoogieGenerator.cs | 10 +- 13 files changed, 622 insertions(+), 587 deletions(-) create mode 100644 Source/DafnyCore/Verifier/BoogieGenerator.TrPredicateStatement.cs diff --git a/Source/DafnyCore/AST/Grammar/Printer/Printer.Statement.cs b/Source/DafnyCore/AST/Grammar/Printer/Printer.Statement.cs index 5714378297..7188e4da1f 100644 --- a/Source/DafnyCore/AST/Grammar/Printer/Printer.Statement.cs +++ b/Source/DafnyCore/AST/Grammar/Printer/Printer.Statement.cs @@ -70,22 +70,8 @@ public void PrintStatement(Statement stmt, int indent) { PrintAttributeArgs(s.Args, true); wr.Write(";"); - } else if (stmt is RevealStmt) { - var s = (RevealStmt)stmt; - wr.Write("reveal "); - var sep = ""; - foreach (var e in s.Exprs) { - wr.Write(sep); - sep = ", "; - if (RevealStmt.SingleName(e) != null) { - // this will do the printing correctly for labels (or label-lookalikes) like 00_023 (which by PrintExpression below would be printed as 23) - wr.Write(RevealStmt.SingleName(e)); - } else { - PrintExpression(e, true); - } - } - wr.Write(";"); - + } else if (stmt is RevealStmt revealStmt) { + PrintRevealStmt(revealStmt); } else if (stmt is BreakStmt) { var s = (BreakStmt)stmt; if (s.TargetLabel != null) { @@ -471,6 +457,22 @@ public void PrintStatement(Statement stmt, int indent) { } } + private void PrintRevealStmt(RevealStmt revealStmt) { + wr.Write("reveal "); + var sep = ""; + foreach (var e in revealStmt.Exprs) { + wr.Write(sep); + sep = ", "; + if (RevealStmt.SingleName(e) != null) { + // this will do the printing correctly for labels (or label-lookalikes) like 00_023 (which by PrintExpression below would be printed as 23) + wr.Write(RevealStmt.SingleName(e)); + } else { + PrintExpression(e, true); + } + } + wr.Write(";"); + } + private void PrintModifyStmt(int indent, ModifyStmt s, bool omitFrame) { Contract.Requires(0 <= indent); Contract.Requires(s != null); diff --git a/Source/DafnyCore/AST/Statements/Verification/RevealStmt.cs b/Source/DafnyCore/AST/Statements/Verification/RevealStmt.cs index cf42991960..38852d2de1 100644 --- a/Source/DafnyCore/AST/Statements/Verification/RevealStmt.cs +++ b/Source/DafnyCore/AST/Statements/Verification/RevealStmt.cs @@ -53,4 +53,51 @@ public static string SingleName(Expression e) { public bool SetIndent(int indentBefore, TokenNewIndentCollector formatter) { return formatter.SetIndentPrintRevealStmt(indentBefore, OwnedTokens); } + + public void ResolveRevealStmt(PreTypeResolver preTypeResolver, ResolutionContext resolutionContext) { + foreach (var expr in Exprs) { + var name = RevealStmt.SingleName(expr); + var labeledAssert = name == null ? null : preTypeResolver.DominatingStatementLabels.Find(name) as AssertLabel; + if (labeledAssert != null) { + LabeledAsserts.Add(labeledAssert); + } else { + var revealResolutionContext = resolutionContext with { InReveal = true }; + if (expr is ApplySuffix applySuffix) { + var methodCallInfo = preTypeResolver.ResolveApplySuffix(applySuffix, revealResolutionContext, true); + if (methodCallInfo == null) { + // error has already been reported + } else if (methodCallInfo.Callee.Member is TwoStateLemma && !revealResolutionContext.IsTwoState) { + preTypeResolver.ReportError(methodCallInfo.Tok, "a two-state function can only be revealed in a two-state context"); + } else if (methodCallInfo.Callee.AtLabel != null) { + Contract.Assert(methodCallInfo.Callee.Member is TwoStateLemma); + preTypeResolver.ReportError(methodCallInfo.Tok, "to reveal a two-state function, do not list any parameters or @-labels"); + } else { + var call = new CallStmt(RangeToken, new List(), methodCallInfo.Callee, methodCallInfo.ActualParameters); + ResolvedStatements.Add(call); + } + } else if (expr is NameSegment or ExprDotName) { + if (expr is NameSegment) { + preTypeResolver.ResolveNameSegment((NameSegment)expr, true, null, revealResolutionContext, true); + } else { + preTypeResolver.ResolveDotSuffix((ExprDotName)expr, true, null, revealResolutionContext, true); + } + var callee = (MemberSelectExpr)((ConcreteSyntaxExpression)expr).ResolvedExpression; + if (callee == null) { + } else if (callee.Member is Lemma or TwoStateLemma && Attributes.Contains(callee.Member.Attributes, "axiom")) { + //The revealed member is a function + preTypeResolver.ReportError(callee.tok, "to reveal a function ({0}), append parentheses", callee.Member.ToString().Substring(7)); + } else { + var call = new CallStmt(RangeToken, new List(), callee, new List(), expr.tok); + ResolvedStatements.Add(call); + } + } else { + preTypeResolver.ResolveExpression(expr, revealResolutionContext); + } + } + } + + foreach (var a in ResolvedStatements) { + preTypeResolver.ResolveStatement(a, resolutionContext); + } + } } \ No newline at end of file diff --git a/Source/DafnyCore/Resolver/PreType/PreTypeResolve.Expressions.cs b/Source/DafnyCore/Resolver/PreType/PreTypeResolve.Expressions.cs index ad8ea839dc..98ec7e2665 100644 --- a/Source/DafnyCore/Resolver/PreType/PreTypeResolve.Expressions.cs +++ b/Source/DafnyCore/Resolver/PreType/PreTypeResolve.Expressions.cs @@ -1184,7 +1184,7 @@ private void ReportMemberNotFoundError(IToken tok, string memberName, [CanBeNull /// If "true", treats an expression "f" where "f" is an instance function, as "this.f", even though /// there is no "this" in scope. This seems like a terrible hack, because it breaks scope invariants about the AST. But, for now, it's here /// to mimic what the legacy resolver does. - Expression ResolveNameSegment(NameSegment expr, bool isLastNameSegment, List args, + public Expression ResolveNameSegment(NameSegment expr, bool isLastNameSegment, List args, ResolutionContext resolutionContext, bool allowMethodCall, bool complain = true, bool specialOpaqueHackAllowance = false) { Contract.Requires(expr != null); Contract.Requires(!expr.WasResolved()); @@ -1439,7 +1439,7 @@ private bool ResolveDatatypeConstructor(NameSegment expr, List/*? /// /// If false, generates an error if the name denotes a method. If true and the name denotes a method, returns /// a Resolver_MethodCall. - Expression ResolveDotSuffix(ExprDotName expr, bool isLastNameSegment, List args, ResolutionContext resolutionContext, bool allowMethodCall) { + public Expression ResolveDotSuffix(ExprDotName expr, bool isLastNameSegment, List args, ResolutionContext resolutionContext, bool allowMethodCall) { Contract.Requires(expr != null); Contract.Requires(!expr.WasResolved()); Contract.Requires(resolutionContext != null); @@ -1710,7 +1710,7 @@ public MethodCallInformation ResolveApplySuffix(ApplySuffix e, ResolutionContext } Label atLabel = null; if (e.AtTok != null) { - atLabel = dominatingStatementLabels.Find(e.AtTok.val); + atLabel = DominatingStatementLabels.Find(e.AtTok.val); if (atLabel == null) { ReportError(e.AtTok, "no label '{0}' in scope at this time", e.AtTok.val); } diff --git a/Source/DafnyCore/Resolver/PreType/PreTypeResolve.Statements.cs b/Source/DafnyCore/Resolver/PreType/PreTypeResolve.Statements.cs index f9dac43cbf..b3e4551a0e 100644 --- a/Source/DafnyCore/Resolver/PreType/PreTypeResolve.Statements.cs +++ b/Source/DafnyCore/Resolver/PreType/PreTypeResolve.Statements.cs @@ -13,14 +13,9 @@ namespace Microsoft.Dafny { public partial class PreTypeResolver : INewOrOldResolver { - private Scope enclosingStatementLabels; - private readonly Scope