Skip to content

Commit 31c94df

Browse files
authored
Merge pull request #749 from pieter-bos/seal-verification-errors
Seal VerificationError and ErrorReason?
2 parents ce5523d + 69b4a8e commit 31c94df

5 files changed

Lines changed: 29 additions & 16 deletions

File tree

src/main/scala/viper/silver/plugin/standard/predicateinstance/PredicateInstanceErrors.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66

77
package viper.silver.plugin.standard.predicateinstance
88

9-
import viper.silver.verifier.{AbstractVerificationError, ErrorMessage, ErrorReason}
9+
import viper.silver.verifier.{AbstractVerificationError, ErrorMessage, ErrorReason, ExtensionAbstractVerificationError}
1010
import viper.silver.verifier.reasons.ErrorNode
1111

12-
case class PredicateInstanceNoAccess(override val offendingNode: ErrorNode, override val reason: ErrorReason, override val cached: Boolean) extends AbstractVerificationError {
12+
sealed abstract class PredicateInstanceError extends ExtensionAbstractVerificationError
13+
14+
case class PredicateInstanceNoAccess(override val offendingNode: ErrorNode, override val reason: ErrorReason, override val cached: Boolean) extends PredicateInstanceError {
1315
override protected def text: String = "Accessing predicate instance might fail."
1416

1517
override def withReason(reason: ErrorReason): AbstractVerificationError = PredicateInstanceNoAccess(this.offendingNode, this.reason, cached)

src/main/scala/viper/silver/plugin/standard/refute/RefuteErrors.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ package viper.silver.plugin.standard.refute
88

99
import viper.silver.verifier._
1010

11-
case class RefuteFailed(override val offendingNode: Refute, override val reason: ErrorReason, override val cached: Boolean = false) extends AbstractVerificationError {
11+
sealed abstract class RefuteError extends ExtensionAbstractVerificationError
12+
sealed abstract class RefuteErrorReason extends ExtensionAbstractErrorReason
13+
14+
case class RefuteFailed(override val offendingNode: Refute, override val reason: ErrorReason, override val cached: Boolean = false) extends RefuteError {
1215
override val id = "refute.failed"
1316
override val text = "Refute holds in all cases or could not be reached (e.g. see Silicon `numberOfErrorsToReport`)."
1417

@@ -18,7 +21,7 @@ case class RefuteFailed(override val offendingNode: Refute, override val reason:
1821
override def withReason(r: ErrorReason): RefuteFailed = RefuteFailed(offendingNode, r, cached)
1922
}
2023

21-
case class RefutationTrue(offendingNode: reasons.ErrorNode) extends AbstractErrorReason {
24+
case class RefutationTrue(offendingNode: reasons.ErrorNode) extends RefuteErrorReason {
2225
override val id: String = "refutation.true"
2326

2427
override val readableMessage: String = s"Assertion $offendingNode definitely holds."

src/main/scala/viper/silver/plugin/standard/termination/TerminationErrors.scala

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ import viper.silver.verifier._
1717
/**
1818
* Error for all termination related failed assertions.
1919
*/
20-
abstract class AbstractTerminationError() extends AbstractVerificationError {
20+
sealed abstract class AbstractTerminationError extends ExtensionAbstractVerificationError {
2121
override val id = "termination.failed"
2222
}
2323

24+
sealed abstract class TerminationErrorReason extends ExtensionAbstractErrorReason
25+
2426
case class FunctionTerminationError(override val offendingNode: ErrorNode,
2527
override val reason: ErrorReason,
2628
override val cached: Boolean = false) extends AbstractTerminationError {
@@ -59,39 +61,39 @@ case class LoopTerminationError(override val offendingNode: ErrorNode,
5961
Reasons for all termination related failed assertions.
6062
*/
6163

62-
case class TerminationConditionFalse(offendingNode: ErrorNode) extends AbstractErrorReason {
64+
case class TerminationConditionFalse(offendingNode: ErrorNode) extends TerminationErrorReason {
6365
override val id: String = "termination.condition.false"
6466

6567
override val readableMessage: String = s"Required termination condition might not hold."
6668

6769
override def withNode(offendingNode: ErrorNode): ErrorMessage = TerminationConditionFalse(offendingNode)
6870
}
6971

70-
case class TupleConditionFalse(offendingNode: ErrorNode) extends AbstractErrorReason {
72+
case class TupleConditionFalse(offendingNode: ErrorNode) extends TerminationErrorReason {
7173
override val id: String = "tuple.condition.false"
7274

7375
override val readableMessage: String = s"Required tuple condition might not hold."
7476

7577
override def withNode(offendingNode: ErrorNode): ErrorMessage = TupleConditionFalse(offendingNode)
7678
}
7779

78-
case class TupleSimpleFalse(offendingNode: ErrorNode) extends AbstractErrorReason {
80+
case class TupleSimpleFalse(offendingNode: ErrorNode) extends TerminationErrorReason {
7981
override val id: String = "tuple.false"
8082

8183
override val readableMessage: String = s"Termination measure might not decrease or might not be bounded."
8284

8385
override def withNode(offendingNode: ErrorNode): ErrorMessage = TupleSimpleFalse(offendingNode)
8486
}
8587

86-
case class TupleDecreasesFalse(offendingNode: ErrorNode) extends AbstractErrorReason {
88+
case class TupleDecreasesFalse(offendingNode: ErrorNode) extends TerminationErrorReason {
8789
override val id: String = "tuple.false"
8890

8991
override val readableMessage: String = s"Termination measure might not decrease."
9092

9193
override def withNode(offendingNode: ErrorNode): ErrorMessage = TupleDecreasesFalse(offendingNode)
9294
}
9395

94-
case class TupleBoundedFalse(offendingNode: ErrorNode) extends AbstractErrorReason {
96+
case class TupleBoundedFalse(offendingNode: ErrorNode) extends TerminationErrorReason {
9597
override val id: String = "tuple.false"
9698

9799
override val readableMessage: String = s"Termination measure might not bounded."

src/main/scala/viper/silver/verifier/VerificationError.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ trait ErrorMessage {
160160
}
161161
}
162162

163-
trait VerificationError extends AbstractError with ErrorMessage {
163+
sealed trait VerificationError extends AbstractError with ErrorMessage {
164164
def reason: ErrorReason
165165
def readableMessage(withId: Boolean = false, withPosition: Boolean = false): String
166166
override def readableMessage: String = {
@@ -196,7 +196,7 @@ case object DummyReason extends AbstractErrorReason {
196196
def withNode(offendingNode: errors.ErrorNode = this.offendingNode) = DummyReason
197197
}
198198

199-
trait ErrorReason extends ErrorMessage
199+
sealed trait ErrorReason extends ErrorMessage
200200

201201
trait PartialVerificationError {
202202
def f: ErrorReason => VerificationError
@@ -226,7 +226,7 @@ case object NullPartialVerificationError extends PartialVerificationError {
226226
def f = _ => null
227227
}
228228

229-
abstract class AbstractVerificationError extends VerificationError {
229+
sealed abstract class AbstractVerificationError extends VerificationError {
230230
protected def text: String
231231

232232
def pos = offendingNode.pos
@@ -253,11 +253,15 @@ abstract class AbstractVerificationError extends VerificationError {
253253
override def toString = readableMessage(true, true) + (if (cached) " - cached" else "")
254254
}
255255

256-
abstract class AbstractErrorReason extends ErrorReason {
256+
abstract class ExtensionAbstractVerificationError extends AbstractVerificationError
257+
258+
sealed abstract class AbstractErrorReason extends ErrorReason {
257259
def pos = offendingNode.pos
258260
override def toString = readableMessage
259261
}
260262

263+
abstract class ExtensionAbstractErrorReason extends AbstractErrorReason
264+
261265
object errors {
262266
type ErrorNode = Node with Positioned with TransformableErrors with Rewritable
263267

src/test/scala/IOTests.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,16 @@ class IOTests extends AnyFunSuite with Matchers {
165165

166166
override def verify(program: Program): VerificationResult = {
167167
if (pass) Success
168-
else Failure(Seq(new VerificationError {
168+
else Failure(Seq(new ExtensionAbstractVerificationError {
169169
override def reason: ErrorReason = DummyReason
170170
override def readableMessage(withId: Boolean, withPosition: Boolean): String =
171171
"MockIOVerifier failed the verification (as requested)."
172-
override def withNode(offendingNode: ErrorNode): ErrorMessage = DummyReason
172+
override def withNode(offendingNode: ErrorNode): ErrorMessage = this
173173
override def pos: Position = NoPosition
174174
override def offendingNode: ErrorNode = DummyNode
175175
override def id: String = "MockIOVerifier.verification.failure"
176+
override protected def text: String = ""
177+
override def withReason(reason: ErrorReason): AbstractVerificationError = this
176178
}))
177179
}
178180

0 commit comments

Comments
 (0)