Skip to content

Commit fe79c63

Browse files
committed
fix for preconditions
1 parent 4242846 commit fe79c63

15 files changed

Lines changed: 119 additions & 50 deletions

src/main/scala/decider/Decider.scala

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ trait DefaultDeciderProvider extends VerifierComponent { this: Verifier =>
174174
analysisSourceInfoStack = AnalysisSourceInfoStack()
175175
}
176176

177-
def getAnalysisInfo(assumptionType: AssumptionType): AnalysisInfo = AnalysisInfo(this, dependencyAnalyzer, analysisSourceInfoStack.getFullSourceInfo, assumptionType, analysisSourceInfoStack.isJoinRelevantAssumption)
177+
def getAnalysisInfo(assumptionType: AssumptionType): AnalysisInfo = AnalysisInfo(this, dependencyAnalyzer, analysisSourceInfoStack.getFullSourceInfo, assumptionType, analysisSourceInfoStack.isJoinRelevantNode)
178178

179179
def functionDecls: Set[FunctionDecl] = _declaredFreshFunctions
180180
def macroDecls: Vector[MacroDecl] = _declaredFreshMacros
@@ -421,7 +421,7 @@ trait DefaultDeciderProvider extends VerifierComponent { this: Verifier =>
421421
}
422422

423423
val filteredAssumptionsWithLabels = filteredAssumptions map{case (t, _) =>
424-
val assumptionId: Option[Int] = dependencyAnalyzer.addAssumption(t, analysisSourceInfo, assumptionType, analysisSourceInfoStack.isJoinRelevantAssumption)
424+
val assumptionId: Option[Int] = dependencyAnalyzer.addAssumption(t, analysisSourceInfo, assumptionType, analysisSourceInfoStack.isJoinRelevantNode)
425425
(t, DependencyAnalyzer.createAssumptionLabel(assumptionId))
426426
}
427427

@@ -457,7 +457,7 @@ trait DefaultDeciderProvider extends VerifierComponent { this: Verifier =>
457457

458458
private def addAssumptionLabels(filteredTerms: Iterable[Term], assumptionType: AssumptionType) = {
459459
filteredTerms map (t => {
460-
val assumptionIds = dependencyAnalyzer.addAssumption(t, analysisSourceInfoStack.getFullSourceInfo, assumptionType, analysisSourceInfoStack.isJoinRelevantAssumption)
460+
val assumptionIds = dependencyAnalyzer.addAssumption(t, analysisSourceInfoStack.getFullSourceInfo, assumptionType, analysisSourceInfoStack.isJoinRelevantNode)
461461
(t, DependencyAnalyzer.createAssumptionLabel(assumptionIds))
462462
})
463463
}
@@ -519,7 +519,7 @@ trait DefaultDeciderProvider extends VerifierComponent { this: Verifier =>
519519
def checkSmoke(isAssert: Boolean=false): Boolean = checkSmoke(analysisSourceInfoStack.getAssertionType, isAssert)
520520

521521
def checkSmoke(assumptionType: AssumptionType, isAssert: Boolean): Boolean = {
522-
val checkNode = dependencyAnalyzer.createAssertOrCheckNode(False, assumptionType, analysisSourceInfoStack.getFullSourceInfo, !isAssert)
522+
val checkNode = dependencyAnalyzer.createAssertOrCheckNode(False, assumptionType, analysisSourceInfoStack.getFullSourceInfo, !isAssert, analysisSourceInfoStack.isJoinRelevantNode)
523523
val label = DependencyAnalyzer.createAssertionLabel(checkNode.map(_.id))
524524

525525
val timeout = if (isAssert) Verifier.config.assertTimeout.toOption else Verifier.config.checkTimeout.toOption
@@ -553,7 +553,7 @@ trait DefaultDeciderProvider extends VerifierComponent { this: Verifier =>
553553
}
554554

555555
override def handleFailedAssertionForDependencyAnalysis(failedAssertion: Term, assertionType: AssumptionType, assumeFailedAssertion: Boolean): Unit = {
556-
dependencyAnalyzer.addAssertionFailedNode(failedAssertion, assertionType, analysisSourceInfoStack.getFullSourceInfo)
556+
dependencyAnalyzer.addAssertionFailedNode(failedAssertion, assertionType, analysisSourceInfoStack.getFullSourceInfo, analysisSourceInfoStack.isJoinRelevantNode)
557557
if(assumeFailedAssertion){
558558
assume(failedAssertion, None, None, AssumptionType.Explicit)
559559
failedAssertion match {
@@ -594,7 +594,7 @@ trait DefaultDeciderProvider extends VerifierComponent { this: Verifier =>
594594

595595
val asserted = if(isDependencyAnalysisEnabled) t.equals(True) else isKnownToBeTrue(t)
596596

597-
val assertNode = if(!asserted) dependencyAnalyzer.createAssertOrCheckNode(t, assumptionType, decider.analysisSourceInfoStack.getFullSourceInfo, isCheck) else None
597+
val assertNode = if(!asserted) dependencyAnalyzer.createAssertOrCheckNode(t, assumptionType, decider.analysisSourceInfoStack.getFullSourceInfo, isCheck, analysisSourceInfoStack.isJoinRelevantNode) else None
598598

599599
val result = asserted || proverAssert(t, timeout, DependencyAnalyzer.createAssertionLabel(assertNode map (_.id)))
600600

src/main/scala/dependencyAnalysis/AnalysisInfo.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ object AssumptionType extends Enumeration {
99

1010
def explicitAssumptionTypes: Set[AssumptionType] = Set(Explicit, ExplicitPostcondition)
1111
def postconditionTypes: Set[AssumptionType] = Set(ImplicitPostcondition, ExplicitPostcondition, ImportedPostcondition)
12+
def preconditionTypes: Set[AssumptionType] = Set(Precondition)
1213
def explicitAssertionTypes: Set[AssumptionType] = Set(Explicit, ImplicitPostcondition, ExplicitPostcondition)
1314
def internalTypes: Set[AssumptionType] = Set(Internal, Trigger, CustomInternal) // will always be hidden from user
14-
def joinConditionTypes: Set[AssumptionType] = postconditionTypes ++ Set(FunctionBody)
15+
def joinConditionTypes: Set[AssumptionType] = preconditionTypes ++ postconditionTypes ++ Set(FunctionBody, MethodCall)
1516
def importedTypes: Set[AssumptionType] = Set(ImportedPostcondition)
1617
def verificationAnnotationTypes: Set[AssumptionType] = Set(FunctionBody, LoopInvariant, Rewrite, ExplicitPostcondition, ImplicitPostcondition, ImportedPostcondition, Precondition, Explicit, DomainAxiom, Annotation)
1718
def sourceCodeTypes: Set[AssumptionType] = AssumptionType.values.diff(explicitAssumptionTypes ++ explicitAssertionTypes ++ verificationAnnotationTypes ++ internalTypes)

src/main/scala/dependencyAnalysis/DependencyAnalysisNode.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ case class AxiomAssumptionNode(term: Term, description: Option[String], sourceIn
9898
case class SimpleAssertionNode(term: Term, assumptionType: AssumptionType, sourceInfo: AnalysisSourceInfo, isClosed: Boolean, hasFailed: Boolean = false, isJoinNode: Boolean = false, _id: Option[Int]=None) extends GeneralAssertionNode {
9999
override def getNodeString: String = "assert " + term.toString
100100

101-
override def getAssertFailedNode(): GeneralAssertionNode = SimpleAssertionNode(term, assumptionType, sourceInfo, isClosed, hasFailed=true)
101+
override def getAssertFailedNode(): GeneralAssertionNode = SimpleAssertionNode(term, assumptionType, sourceInfo, isClosed, hasFailed=true, isJoinNode=isJoinNode)
102102
}
103103

104104
case class SimpleCheckNode(term: Term, assumptionType: AssumptionType, sourceInfo: AnalysisSourceInfo, isClosed: Boolean, hasFailed: Boolean = false, isJoinNode: Boolean = false, _id: Option[Int]=None) extends GeneralAssertionNode {

src/main/scala/dependencyAnalysis/DependencyAnalyzer.scala

Lines changed: 68 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ import viper.silicon.interfaces.state.{Chunk, GeneralChunk}
66
import viper.silicon.state.terms._
77
import viper.silicon.verifier.Verifier
88
import viper.silver.ast
9+
import viper.silver.ast.utility.Expressions.isKnownWellDefined
10+
import viper.silver.ast.{Apply, Applying, Assert, Asserting, Assume, Div, Exhale, Exp, ExtensionStmt, FieldAccess, FieldAccessPredicate, FieldAssign, Fold, FuncApp, Goto, If, Inhale, Label, LocalVarAssign, LocalVarDeclStmt, MapLookup, MethodCall, Mod, NewStmt, Package, Program, Quasihavoc, Quasihavocall, SeqIndex, Seqn, Stmt, Unfold, Unfolding, While}
11+
import viper.silver.ast.utility.{Expressions, ViperStrategy}
912

1013
import java.util.concurrent.atomic.AtomicLong
1114
import scala.collection.mutable
@@ -37,8 +40,8 @@ trait DependencyAnalyzer {
3740
def registerExhaleChunk[CH <: GeneralChunk](sourceChunks: Set[Chunk], buildChunk: Term => CH, perm: Term, labelNodeOpt: Option[LabelNode], analysisInfo: AnalysisInfo): CH = buildChunk(perm)
3841
def createLabelNode(label: Var, sourceChunks: Iterable[Chunk], sourceTerms: Iterable[Term]): Option[LabelNode]
3942

40-
def createAssertOrCheckNode(term: Term, assumptionType: AssumptionType, analysisSourceInfo: AnalysisSourceInfo, isCheck: Boolean): Option[GeneralAssertionNode]
41-
def addAssertFalseNode(isCheck: Boolean, assumptionType: AssumptionType, sourceInfo: AnalysisSourceInfo): Option[Int]
43+
def createAssertOrCheckNode(term: Term, assumptionType: AssumptionType, analysisSourceInfo: AnalysisSourceInfo, isCheck: Boolean, isJoinNode: Boolean): Option[GeneralAssertionNode]
44+
def addAssertFalseNode(isCheck: Boolean, assumptionType: AssumptionType, sourceInfo: AnalysisSourceInfo, isJoinNode: Boolean): Option[Int]
4245
def addInfeasibilityNode(isCheck: Boolean, sourceInfo: AnalysisSourceInfo, assumptionType: AssumptionType): Option[Int]
4346

4447
def addDependency(source: Option[Int], dest: Option[Int]): Unit
@@ -60,14 +63,14 @@ trait DependencyAnalyzer {
6063
/**
6164
* Adds an assertion and assumption node with the given analysis source info and dependencies to the current infeasibility node.
6265
*/
63-
def addAssertionWithDepToInfeasNode(infeasNodeId: Option[Int], analysisSourceInfo: AnalysisSourceInfo, dependencyType: DependencyType): Unit = {}
66+
def addAssertionWithDepToInfeasNode(infeasNodeId: Option[Int], analysisSourceInfo: AnalysisSourceInfo, dependencyType: DependencyType, isJoinNode: Boolean): Unit = {}
6467

6568
/**
6669
* @return the final dependency graph representing all direct and transitive dependencies
6770
*/
6871
def buildFinalGraph(): Option[DependencyGraph]
6972

70-
def addAssertionFailedNode(failedAssertion: Term, assertionType: AssumptionType, sourceInfo: AnalysisSourceInfo): Option[Int]
73+
def addAssertionFailedNode(failedAssertion: Term, assertionType: AssumptionType, sourceInfo: AnalysisSourceInfo, isJoinNode: Boolean): Option[Int]
7174
}
7275

7376
object DependencyAnalyzer {
@@ -229,12 +232,56 @@ object DependencyAnalyzer {
229232
else newGraph.addEdges(src, targets)
230233
}
231234

235+
val relevantAssertionNodes = joinCandidateAssertions // method call pres assertions
236+
.filter(_.isJoinNode)
237+
.groupBy(_.sourceInfo.getFineGrainedSource)
238+
.view.mapValues(_.map(_.id))
239+
.toMap
240+
joinCandidateNodes
241+
.map(node => (node.id, relevantAssertionNodes.getOrElse(node.sourceInfo.getTopLevelSource, Seq.empty)))
242+
.foreach { case (target, sources) =>
243+
if (customInternalNodes.intersect(sources.toSet.union(Set(target))).isEmpty) newGraph.addEdgesConnectingMethods(sources, target)
244+
else newGraph.addEdges(sources, target)
245+
}
246+
232247

233248
stopTimeMeasurementAndAddToTotal(startTime, timeForMethodJoin)
234249

235250
val newInterpreter = new DependencyGraphInterpreter(name, newGraph, dependencyGraphInterpreters.toList.flatMap(_.getErrors))
236251
newInterpreter
237252
}
253+
254+
def extractAssertionsForJoin(exp: ast.Exp, program: ast.Program): Seq[ast.Exp] = {
255+
exp match {
256+
case FieldAccessPredicate(FieldAccess(rcv, _), prm) =>
257+
// Extra case for field access predicates because the contained field access does NOT require already having the field permission.
258+
extractAssertionsForJoin(rcv, program) ++ extractAssertionsForJoin(prm.get, program)
259+
case f: FuncApp =>
260+
program.findFunction(f.funcname).pres
261+
case other => other.subExps.flatMap(extractAssertionsForJoin(_, program))
262+
}
263+
}
264+
265+
def extractAssertionsForJoin(s: Stmt, p: Program): Seq[ast.Exp] = {
266+
def goE(exp: Exp): Seq[ast.Exp] = extractAssertionsForJoin(exp, p)
267+
268+
def goEs(exps: Seq[Exp]): Seq[ast.Exp] = exps flatMap goE
269+
270+
s match {
271+
case NewStmt(lhs, _) => goE(lhs)
272+
case LocalVarAssign(lhs, rhs) => goE(lhs) ++ goE(rhs)
273+
case MethodCall(methodName, args, targets) =>
274+
p.findMethod(methodName).pres.flatMap(_.topLevelConjuncts) ++ goEs(args) ++ goEs(targets)
275+
case Inhale(exp) => goE(exp)
276+
case Assume(exp) => goE(exp)
277+
case Seqn(ss, _) => ss flatMap (extractAssertionsForJoin(_, p))
278+
case If(cond, thn, els) => goE(cond) ++ extractAssertionsForJoin(thn, p) ++ extractAssertionsForJoin(els, p)
279+
case While(cond, invs, body) => goEs(invs) ++ goE(cond) ++ extractAssertionsForJoin(body, p)
280+
case Label(_, invs) => goEs(invs)
281+
case _ => goEs(s.subnodes.filter(_.isInstanceOf[ast.Exp]).map(
282+
_.asInstanceOf[ast.Exp]))
283+
}
284+
}
238285
}
239286

240287
class DefaultDependencyAnalyzer(member: ast.Member) extends DependencyAnalyzer {
@@ -333,21 +380,21 @@ class DefaultDependencyAnalyzer(member: ast.Member) extends DependencyAnalyzer {
333380
}
334381

335382
// adding assertion nodes
336-
override def createAssertOrCheckNode(term: Term, assumptionType: AssumptionType, analysisSourceInfo: AnalysisSourceInfo, isCheck: Boolean): Option[GeneralAssertionNode] = {
383+
override def createAssertOrCheckNode(term: Term, assumptionType: AssumptionType, analysisSourceInfo: AnalysisSourceInfo, isCheck: Boolean, isJoinNode: Boolean): Option[GeneralAssertionNode] = {
337384
if(isCheck)
338-
Some(SimpleCheckNode(term, assumptionType, analysisSourceInfo, isClosed_))
385+
Some(SimpleCheckNode(term, assumptionType, analysisSourceInfo, isClosed_, isJoinNode=isJoinNode))
339386
else
340-
Some(SimpleAssertionNode(term, assumptionType, analysisSourceInfo, isClosed_))
387+
Some(SimpleAssertionNode(term, assumptionType, analysisSourceInfo, isClosed_, isJoinNode=isJoinNode))
341388
}
342389

343-
def addAssertNode(term: Term, assumptionType: AssumptionType, analysisSourceInfo: AnalysisSourceInfo): Option[Int] = {
344-
val node = createAssertOrCheckNode(term, assumptionType, analysisSourceInfo, isCheck=false)
390+
def addAssertNode(term: Term, assumptionType: AssumptionType, analysisSourceInfo: AnalysisSourceInfo, isJoinNode: Boolean): Option[Int] = {
391+
val node = createAssertOrCheckNode(term, assumptionType, analysisSourceInfo, isCheck=false, isJoinNode=isJoinNode)
345392
node foreach addAssertionNode
346393
node map (_.id)
347394
}
348395

349-
override def addAssertFalseNode(isCheck: Boolean, assumptionType: AssumptionType, sourceInfo: AnalysisSourceInfo): Option[Int] = {
350-
val node = createAssertOrCheckNode(False, assumptionType, sourceInfo, isCheck)
396+
override def addAssertFalseNode(isCheck: Boolean, assumptionType: AssumptionType, sourceInfo: AnalysisSourceInfo, isJoinNode: Boolean): Option[Int] = {
397+
val node = createAssertOrCheckNode(False, assumptionType, sourceInfo, isCheck, isJoinNode)
351398
addAssertionNode(node.get)
352399
node.map(_.id)
353400
}
@@ -358,10 +405,10 @@ class DefaultDependencyAnalyzer(member: ast.Member) extends DependencyAnalyzer {
358405
Some(node.id)
359406
}
360407

361-
override def addAssertionFailedNode(failedAssertion: Term, assertionType: AssumptionType, sourceInfo: AnalysisSourceInfo): Option[Int] = {
408+
override def addAssertionFailedNode(failedAssertion: Term, assertionType: AssumptionType, sourceInfo: AnalysisSourceInfo, isJoinNode: Boolean): Option[Int] = {
362409
val assumptionType = if(AssumptionType.postconditionTypes.contains(assertionType)) AssumptionType.ExplicitPostcondition else AssumptionType.Explicit
363-
val assumeNode = SimpleAssumptionNode(failedAssertion, None, sourceInfo, assumptionType, isClosed=false, isJoinNode=false)
364-
val assertFailedNode = SimpleAssertionNode(failedAssertion, assertionType, sourceInfo, isClosed=false, hasFailed=true)
410+
val assumeNode = SimpleAssumptionNode(failedAssertion, None, sourceInfo, assumptionType, isClosed=false, isJoinNode=isJoinNode)
411+
val assertFailedNode = SimpleAssertionNode(failedAssertion, assertionType, sourceInfo, isClosed=false, hasFailed=true, isJoinNode=isJoinNode)
365412
dependencyGraph.addNode(assumeNode)
366413
dependencyGraph.addNode(assertFailedNode)
367414
dependencyGraph.addEdges(Set(assumeNode.id), assertFailedNode.id)
@@ -412,8 +459,8 @@ class DefaultDependencyAnalyzer(member: ast.Member) extends DependencyAnalyzer {
412459
}
413460

414461
override def addDependenciesForAbstractMembers(sourceExps: Seq[ast.Exp], targetExps: Seq[ast.Exp], postConditionType: AssumptionType = AssumptionType.ExplicitPostcondition): Unit = {
415-
val sourceNodeIds = sourceExps.flatMap(e => addAssumption(True, AnalysisSourceInfo.createAnalysisSourceInfo(e), AssumptionType.Precondition, isJoinNode=false, None))
416-
val targetNodes = targetExps.flatMap(e => addAssertNode(True, postConditionType, AnalysisSourceInfo.createAnalysisSourceInfo(e)))
462+
val sourceNodeIds = sourceExps.flatMap(e => addAssumption(True, AnalysisSourceInfo.createAnalysisSourceInfo(e), AssumptionType.Precondition, isJoinNode=true, None))
463+
val targetNodes = targetExps.flatMap(e => addAssertNode(True, postConditionType, AnalysisSourceInfo.createAnalysisSourceInfo(e), isJoinNode=true))
417464
dependencyGraph.addEdges(sourceNodeIds, targetNodes)
418465
}
419466

@@ -500,8 +547,8 @@ class DefaultDependencyAnalyzer(member: ast.Member) extends DependencyAnalyzer {
500547
* Adds an assertion node with the given analysis source info and dependencies to the current infeasibility node.
501548
* The resulting assertion node is required to detect dependencies of the source statement/expression on infeasible paths.
502549
*/
503-
override def addAssertionWithDepToInfeasNode(infeasNodeId: Option[Int], analysisSourceInfo: AnalysisSourceInfo, dependencyType: DependencyType): Unit = {
504-
val newAssertionNodeId = addAssertNode(False, dependencyType.assertionType, analysisSourceInfo)
550+
override def addAssertionWithDepToInfeasNode(infeasNodeId: Option[Int], analysisSourceInfo: AnalysisSourceInfo, dependencyType: DependencyType, isJoinNode: Boolean): Unit = {
551+
val newAssertionNodeId = addAssertNode(False, dependencyType.assertionType, analysisSourceInfo, isJoinNode)
505552
addDependency(infeasNodeId, newAssertionNodeId)
506553
}
507554

@@ -523,10 +570,10 @@ class NoDependencyAnalyzer extends DependencyAnalyzer {
523570
override def addAxiom(assumption: Term, analysisSourceInfo: AnalysisSourceInfo, assumptionType: AssumptionType, description: Option[String]): Option[Int] = None
524571
override def createLabelNode(labelTerm: Var, sourceChunks: Iterable[Chunk], sourceTerms: Iterable[Term]): Option[LabelNode] = None
525572

526-
override def createAssertOrCheckNode(term: Term, assumptionType: AssumptionType, analysisSourceInfo: AnalysisSourceInfo, isCheck: Boolean): Option[GeneralAssertionNode] = None
527-
override def addAssertFalseNode(isCheck: Boolean, assumptionType: AssumptionType, sourceInfo: AnalysisSourceInfo): Option[Int] = None
573+
override def createAssertOrCheckNode(term: Term, assumptionType: AssumptionType, analysisSourceInfo: AnalysisSourceInfo, isCheck: Boolean, isJoinNode: Boolean): Option[GeneralAssertionNode] = None
574+
override def addAssertFalseNode(isCheck: Boolean, assumptionType: AssumptionType, sourceInfo: AnalysisSourceInfo, isJoinNode: Boolean): Option[Int] = None
528575
override def addInfeasibilityNode(isCheck: Boolean, sourceInfo: AnalysisSourceInfo, assumptionType: AssumptionType): Option[Int] = None
529-
override def addAssertionFailedNode(failedAssertion: Term, assertionType: AssumptionType, sourceInfo: AnalysisSourceInfo): Option[Int] = None
576+
override def addAssertionFailedNode(failedAssertion: Term, assertionType: AssumptionType, sourceInfo: AnalysisSourceInfo, isJoinNode: Boolean): Option[Int] = None
530577

531578
override def addDependency(source: Option[Int], dest: Option[Int]): Unit = {}
532579
override def processUnsatCoreAndAddDependencies(dep: String, assertionLabel: String): Unit = {}

src/main/scala/dependencyAnalysis/DependencyGraphInterpreter.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class DependencyGraphInterpreter(name: String, dependencyGraph: ReadOnlyDependen
8686

8787
def getNonInternalAssumptionNodes(nodes: Set[DependencyAnalysisNode]): Set[DependencyAnalysisNode] = nodes filter (node =>
8888
(node.isInstanceOf[GeneralAssumptionNode] && !AssumptionType.internalTypes.contains(node.assumptionType))
89-
|| AssumptionType.postconditionTypes.contains(node.assumptionType) // postconditions act as assumptions for callers
89+
|| AssumptionType.postconditionTypes.contains(node.assumptionType) || node.isJoinNode // postconditions act as assumptions for callers
9090
)
9191

9292
def getExplicitAssumptionNodes: Set[DependencyAnalysisNode] = getNonInternalAssumptionNodes filter (node =>
@@ -98,7 +98,8 @@ class DependencyGraphInterpreter(name: String, dependencyGraph: ReadOnlyDependen
9898
.exists(node => dependencyGraph.existsAnyDependency(Set(node.id), nodesToAnalyze map (_.id) filter (_ != node.id), includeInfeasibilityNodes))
9999

100100

101-
def getNonInternalAssertionNodes: Set[DependencyAnalysisNode] = getAssertionNodes filter (node => !AssumptionType.internalTypes.contains(node.assumptionType))
101+
def getNonInternalAssertionNodes: Set[DependencyAnalysisNode] = getAssertionNodes filter (node =>
102+
!AssumptionType.internalTypes.contains(node.assumptionType) || node.isJoinNode)
102103

103104
def getExplicitAssertionNodes: Set[DependencyAnalysisNode] =
104105
getNonInternalAssertionNodes.filter(node => AssumptionType.explicitAssertionTypes.contains(node.assumptionType))

0 commit comments

Comments
 (0)