From 3ff9805089df60c364836e5d4dcafb0865262b21 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <colder@php.net> Date: Fri, 15 Nov 2013 20:20:53 +0100 Subject: [PATCH] Add/Fix support for (a: Type) patterns --- src/main/scala/leon/plugin/CodeExtraction.scala | 9 +++++++-- src/main/scala/leon/purescala/TreeOps.scala | 9 ++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/scala/leon/plugin/CodeExtraction.scala b/src/main/scala/leon/plugin/CodeExtraction.scala index dd71afeec..8e19f1008 100644 --- a/src/main/scala/leon/plugin/CodeExtraction.scala +++ b/src/main/scala/leon/plugin/CodeExtraction.scala @@ -317,16 +317,21 @@ trait CodeExtraction extends Extractors { private def extractPattern(p: Tree, binder: Option[Identifier] = None): Pattern = p match { - case b @ Bind(name, Typed(pat, tpe)) => + case b @ Bind(name, t @ Typed(pat, tpe)) => val newID = FreshIdentifier(name.toString).setType(extractType(tpe.tpe)) varSubsts(b.symbol) = (() => Variable(newID)) - extractPattern(pat, Some(newID)) + extractPattern(t, Some(newID)) case b @ Bind(name, pat) => val newID = FreshIdentifier(name.toString).setType(extractType(b.symbol.tpe)) varSubsts(b.symbol) = (() => Variable(newID)) extractPattern(pat, Some(newID)) + case t @ Typed(Ident(nme.WILDCARD), tpe) if t.tpe.typeSymbol.isCase && + classesToClasses.contains(t.tpe.typeSymbol) => + val cd = classesToClasses(t.tpe.typeSymbol).asInstanceOf[CaseClassDef] + InstanceOfPattern(binder, cd) + case Ident(nme.WILDCARD) => WildcardPattern(binder) diff --git a/src/main/scala/leon/purescala/TreeOps.scala b/src/main/scala/leon/purescala/TreeOps.scala index 1d0cb59f3..8371b8f0c 100644 --- a/src/main/scala/leon/purescala/TreeOps.scala +++ b/src/main/scala/leon/purescala/TreeOps.scala @@ -691,7 +691,14 @@ object TreeOps { def rec(in: Expr, pattern: Pattern): Expr = { pattern match { case WildcardPattern(ob) => bind(ob, in) - case InstanceOfPattern(_,_) => scala.sys.error("InstanceOfPattern not yet supported.") + case InstanceOfPattern(ob, ct) => + ct match { + case _: AbstractClassDef => + bind(ob, in) + + case cd: CaseClassDef => + And(CaseClassInstanceOf(cd, in), bind(ob, in)) + } case CaseClassPattern(ob, ccd, subps) => { assert(ccd.fields.size == subps.size) val pairs = ccd.fields.map(_.id).toList zip subps.toList -- GitLab