Skip to content

Commit

Permalink
Merge pull request #804 from viperproject/sem-highlight
Browse files Browse the repository at this point in the history
Add information required for LSP features to Parse AST
  • Loading branch information
marcoeilers authored Feb 11, 2024
2 parents 635e18e + 37f2919 commit 6cb2961
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 23 deletions.
2 changes: 1 addition & 1 deletion silver
Submodule silver updated 75 files
+26 −2 src/main/scala/viper/silver/ast/Position.scala
+12 −21 src/main/scala/viper/silver/ast/Program.scala
+2 −2 src/main/scala/viper/silver/ast/utility/Consistency.scala
+17 −0 src/main/scala/viper/silver/ast/utility/FileLoader.scala
+2 −2 src/main/scala/viper/silver/ast/utility/QuantifiedPermissions.scala
+26 −16 src/main/scala/viper/silver/ast/utility/rewriter/Rewritable.scala
+20 −10 src/main/scala/viper/silver/ast/utility/rewriter/Strategy.scala
+6 −3 src/main/scala/viper/silver/frontend/Frontend.scala
+6 −3 src/main/scala/viper/silver/frontend/SilFrontend.scala
+1 −1 src/main/scala/viper/silver/frontend/ViperPAstProvider.scala
+4 −11 src/main/scala/viper/silver/parser/FastMessage.scala
+720 −625 src/main/scala/viper/silver/parser/FastParser.scala
+172 −109 src/main/scala/viper/silver/parser/MacroExpander.scala
+828 −721 src/main/scala/viper/silver/parser/ParseAst.scala
+519 −0 src/main/scala/viper/silver/parser/ParseAstKeyword.scala
+512 −484 src/main/scala/viper/silver/parser/Resolver.scala
+0 −184 src/main/scala/viper/silver/parser/Transformer.scala
+272 −275 src/main/scala/viper/silver/parser/Translator.scala
+13 −9 src/main/scala/viper/silver/plugin/ParserPluginTemplate.scala
+228 −228 src/main/scala/viper/silver/plugin/standard/adt/AdtPASTExtension.scala
+36 −40 src/main/scala/viper/silver/plugin/standard/adt/AdtPlugin.scala
+1 −1 src/main/scala/viper/silver/plugin/standard/predicateinstance/PredicateInstanceASTExtension.scala
+19 −16 src/main/scala/viper/silver/plugin/standard/predicateinstance/PredicateInstancePASTExtension.scala
+5 −10 src/main/scala/viper/silver/plugin/standard/predicateinstance/PredicateInstancePlugin.scala
+1 −1 src/main/scala/viper/silver/plugin/standard/refute/RefuteErrors.scala
+4 −2 src/main/scala/viper/silver/plugin/standard/refute/RefutePASTExtension.scala
+7 −11 src/main/scala/viper/silver/plugin/standard/refute/RefutePlugin.scala
+4 −6 src/main/scala/viper/silver/plugin/standard/smoke/SmokeDetectionPlugin.scala
+4 −2 src/main/scala/viper/silver/plugin/standard/smoke/UnreachablePASTExtension.scala
+13 −13 src/main/scala/viper/silver/plugin/standard/termination/TerminationPASTExtension.scala
+52 −55 src/main/scala/viper/silver/plugin/standard/termination/TerminationPlugin.scala
+2 −2 src/main/scala/viper/silver/plugin/standard/termination/transformation/DecreasesCheck.scala
+1 −1 src/main/scala/viper/silver/plugin/standard/termination/transformation/NestedPredicates.scala
+11 −2 src/main/scala/viper/silver/reporter/Message.scala
+2 −0 src/main/scala/viper/silver/reporter/package.scala
+3 −3 src/main/scala/viper/silver/utility/Sanitizer.scala
+4 −1 src/main/scala/viper/silver/verifier/VerificationResult.scala
+1 −1 src/test/resources/adt/declarations_4.vpr
+1 −1 src/test/resources/adt/declarations_5.vpr
+2 −1 src/test/resources/all/basic/syntax.vpr
+2 −2 src/test/resources/all/issues/carbon/0364.vpr
+2 −2 src/test/resources/all/issues/silicon/0291.vpr
+4 −4 src/test/resources/all/issues/silver/0039.vpr
+5 −5 src/test/resources/all/issues/silver/0069.vpr
+1 −1 src/test/resources/all/issues/silver/0105-1.vpr
+1 −1 src/test/resources/all/issues/silver/0105.vpr
+3 −3 src/test/resources/all/issues/silver/0106-1.vpr
+1 −1 src/test/resources/all/issues/silver/0114-1.vpr
+1 −0 src/test/resources/all/issues/silver/0114.vpr
+2 −2 src/test/resources/all/issues/silver/0120.vpr
+1 −1 src/test/resources/all/issues/silver/0164.vpr
+1 −1 src/test/resources/all/issues/silver/0175b.vpr
+1 −1 src/test/resources/all/issues/silver/0456.vpr
+1 −1 src/test/resources/all/issues/silver/0469.vpr
+3 −2 src/test/resources/all/issues/silver/0500.vpr
+4 −4 src/test/resources/all/issues/silver/0697.vpr
+1 −1 src/test/resources/all/issues/silver/0720.vpr
+7 −0 src/test/resources/all/parsing/assign_ambig.vpr
+8 −0 src/test/resources/all/parsing/typed_call_ambig.vpr
+14 −0 src/test/resources/all/parsing/typed_call_ambig2.vpr
+4 −4 src/test/resources/all/permission_introspection/forpermCheck.vpr
+2 −2 src/test/resources/termination/functions/basic/allTypes.vpr
+2 −2 src/test/resources/wands/new_syntax/ApplyingBranching.vpr
+1 −1 src/test/resources/wands/new_syntax/SnapshotsWithPredicates.vpr
+0 −16 src/test/resources/wands/regression/consistency.vpr
+22 −0 src/test/resources/wands/regression/consistency2.vpr
+1 −1 src/test/resources/wands/regression/snapshots.vpr
+22 −20 src/test/scala/ASTTransformationTests.scala
+1 −1 src/test/scala/AstAnnotationTests.scala
+1 −1 src/test/scala/AstPositionsTests.scala
+1 −1 src/test/scala/ConsistencyTests.scala
+4 −11 src/test/scala/PluginTests.scala
+1 −1 src/test/scala/PrettyPrinterTest.scala
+4 −4 src/test/scala/RewriterTests.scala
+9 −7 src/test/scala/SemanticAnalysisTests.scala
11 changes: 4 additions & 7 deletions src/main/scala/extensions/TryBlockParserPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,13 @@ import viper.silver.plugin.{ParserPluginTemplate, SilverPlugin}

class TryBlockParserPlugin(fp: FastParser) extends SilverPlugin with ParserPluginTemplate {
import fastparse._
import viper.silver.parser.FastParserCompanion.whitespace
import fp.{FP, block, ParserExtension}
import viper.silver.parser.FastParserCompanion.{PositionParsing, reservedKw, whitespace}
import fp.{ParserExtension, lineCol, _file, stmtBlock}


private val tryKeyword = "try"

def tryBlock[_:P]: P[PTryBlock] =FP("try" ~/ block) map { case (pos, s) => PTryBlock(s)(pos) }
def tryBlock[$: P]: P[PTryBlock] = P((P(PTryKeyword) ~ stmtBlock()) map (PTryBlock.apply _).tupled).pos

override def beforeParse(input: String, isImported: Boolean): String = {
ParserExtension.addNewKeywords(Set(tryKeyword))
ParserExtension.addNewKeywords(Set(PTryKeyword))
ParserExtension.addNewStmtAtEnd(tryBlock(_))

input
Expand Down
8 changes: 5 additions & 3 deletions src/main/scala/extensions/TryBlockStmt.scala
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ package viper.silicon.extensions

import viper.silver.ast._
import viper.silver.ast.pretty.PrettyPrintPrimitives
import viper.silver.parser.{NameAnalyser, PExtender, PNode, PStmt, Translator, TypeChecker}
import viper.silver.parser.{NameAnalyser, PExtender, PStmt, Translator, TypeChecker, PKw, PKeywordStmt, PReserved}

final case class PTryBlock(body: PStmt)(val pos: (Position, Position) = (NoPosition, NoPosition)) extends PExtender with PStmt {
override val getSubnodes: Seq[PNode] = Seq(body)
/** Keyword used to define `try` statement. */
case object PTryKeyword extends PKw("try") with PKeywordStmt

final case class PTryBlock(kw: PReserved[PTryKeyword.type], body: PStmt)(val pos: (Position, Position) = (NoPosition, NoPosition)) extends PExtender with PStmt {

override def translateStmt(translator: Translator): Stmt = {
TryBlock(translator.stmt(body))(translator.liftPos(this))
Expand Down
17 changes: 15 additions & 2 deletions src/main/scala/rules/Evaluator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -678,8 +678,21 @@ object evaluator extends EvaluationRules {

val body = eQuant.exp
// Remove whitespace in identifiers to avoid parsing problems for the axiom profiler.
val posString = viper.silicon.utils.ast.sourceLine(sourceQuant).replaceAll(" ", "")
val name = s"prog.l$posString"
// TODO: add flag to enable old behavior for AxiomProfiler
val fallbackName = "l" + viper.silicon.utils.ast.sourceLine(sourceQuant).replaceAll(" ", "")
val posString = if (!sourceQuant.pos.isInstanceOf[ast.AbstractSourcePosition]) {
fallbackName
} else {
val pos = sourceQuant.pos.asInstanceOf[ast.AbstractSourcePosition]
if (pos.end.isEmpty) {
fallbackName
} else {
val file = pos.file.toString()
val end = pos.end.get
s"$file@${pos.start.line}@${pos.start.column}@${end.line}@${end.column}"
}
}
val name = s"prog.$posString"
evalQuantified(s, qantOp, eQuant.variables, Nil, Seq(body), Some(eTriggers), name, pve, v){
case (s1, tVars, _, Seq(tBody), tTriggers, (tAuxGlobal, tAux), v1) =>
val tAuxHeapIndep = tAux.flatMap(v.quantifierSupporter.makeTriggersHeapIndependent(_, v1.decider.fresh))
Expand Down
4 changes: 2 additions & 2 deletions src/main/scala/verifier/DefaultMainVerifier.scala
Original file line number Diff line number Diff line change
Expand Up @@ -172,13 +172,13 @@ class DefaultMainVerifier(config: Config,
val res = viper.silicon.utils.ast.autoTrigger(forall, forall.autoTrigger)
if (res.triggers.isEmpty)
reporter.report(WarningsDuringVerification(Seq(VerifierWarning("No triggers provided or inferred for quantifier.", res.pos))))
reporter report QuantifierChosenTriggersMessage(res, res.triggers)
reporter report QuantifierChosenTriggersMessage(res, res.triggers, forall.triggers)
res
case exists: ast.Exists =>
val res = viper.silicon.utils.ast.autoTrigger(exists, exists.autoTrigger)
if (res.triggers.isEmpty)
reporter.report(WarningsDuringVerification(Seq(VerifierWarning("No triggers provided or inferred for quantifier.", res.pos))))
reporter report QuantifierChosenTriggersMessage(res, res.triggers)
reporter report QuantifierChosenTriggersMessage(res, res.triggers, exists.triggers)
res
}, Traverse.BottomUp)

Expand Down
16 changes: 8 additions & 8 deletions src/test/scala/CounterexampleTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import viper.silicon.interfaces.SiliconMappedCounterexample
import viper.silicon.reporting.{ExtractedModel, ExtractedModelEntry, LitIntEntry, LitPermEntry, NullRefEntry, RecursiveRefEntry, RefEntry, SeqEntry}
import viper.silicon.state.terms.Rational
import viper.silver.parser.FastParserCompanion.whitespace
import viper.silver.parser.{FastParser, PAccPred, PBinExp, PExp, PFieldAccess, PIdnUse, PIntLit, PLookup, PUnExp}
import viper.silver.parser.{FastParser, PAccPred, PBinExp, PExp, PFieldAccess, PIdnUse, PIntLit, PLookup, PUnExp, PSymOp}
import viper.silver.verifier.{FailureContext, VerificationError}

import java.nio.file.Path
Expand Down Expand Up @@ -112,7 +112,7 @@ case class ExpectedCounterexampleAnnotation(id: OutputAnnotationId, file: Path,
def meetsExpectations(model1: ExpectedCounterexample, model2: ExtractedModel): Boolean = {
model1.exprs.forall {
case accPred: PAccPred => containsAccessPredicate(accPred, model2)
case PBinExp(lhs, "==", rhs) => containsEquality(lhs, rhs, model2)
case PBinExp(lhs, r, rhs) if r.rs == PSymOp.EqEq => containsEquality(lhs, rhs, model2)
}
}

Expand All @@ -130,13 +130,13 @@ case class ExpectedCounterexampleAnnotation(id: OutputAnnotationId, file: Path,
/** resolves `expr` to a model entry in the given model. In case it's a field access, the corresponding permissions are returned as well */
def resolve(expr: PExp, model: ExtractedModel): Option[(ExtractedModelEntry, Option[Rational])] = expr match {
case PIntLit(value) => Some(LitIntEntry(value), None)
case PUnExp("-", PIntLit(value)) => Some(LitIntEntry(-value), None)
case PBinExp(PIntLit(n), "/", PIntLit(d)) => Some(LitPermEntry(Rational(n, d)), None)
case PIdnUse(name) => model.entries.get(name).map((_, None))
case PFieldAccess(rcv, idnuse) => resolveWoPerm(rcv, model).flatMap {
case PUnExp(r, PIntLit(value)) if r.rs == PSymOp.Neg => Some(LitIntEntry(-value), None)
case PBinExp(PIntLit(n), r, PIntLit(d)) if r.rs == PSymOp.Div => Some(LitPermEntry(Rational(n, d)), None)
case idnuse: PIdnUse => model.entries.get(idnuse.name).map((_, None))
case PFieldAccess(rcv, _, idnuse) => resolveWoPerm(rcv, model).flatMap {
case RefEntry(_, fields) => fields.get(idnuse.name)
}
case PLookup(base, idx) => resolveWoPerm(Vector(base, idx), model).flatMap {
case PLookup(base, _, idx, _) => resolveWoPerm(Vector(base, idx), model).flatMap {
case Vector(SeqEntry(_, values), LitIntEntry(evaluatedIdx)) if values.size > evaluatedIdx => Some(values(evaluatedIdx.toInt), None)
}
}
Expand Down Expand Up @@ -184,7 +184,7 @@ class CounterexampleParser(fp: FastParser) {
case class ExpectedCounterexample(exprs: Seq[PExp]) {
assert(exprs.forall {
case _: PAccPred => true
case PBinExp(_, "==", _) => true
case PBinExp(_, r, _) if r.rs == PSymOp.EqEq => true
case _ => false
})
}

0 comments on commit 6cb2961

Please sign in to comment.