From 630137bc3554d857613b0afa3021bcfad32610e6 Mon Sep 17 00:00:00 2001 From: tribbloid Date: Mon, 19 Apr 2021 17:29:49 -0400 Subject: [PATCH] add Info as a validation option for RequireMsgSym Warn and Info validation options for RequireMsgSym now also invoke scala compiler FontEnds logging. --- .../singleton/ops/impl/GeneralMacros.scala | 21 +++++++++++++++++++ src/main/scala/singleton/ops/impl/OpId.scala | 1 + src/main/scala/singleton/ops/package.scala | 1 + 3 files changed, 23 insertions(+) diff --git a/src/main/scala/singleton/ops/impl/GeneralMacros.scala b/src/main/scala/singleton/ops/impl/GeneralMacros.scala index 56fd5578..284f5adc 100644 --- a/src/main/scala/singleton/ops/impl/GeneralMacros.scala +++ b/src/main/scala/singleton/ops/impl/GeneralMacros.scala @@ -666,6 +666,9 @@ trait GeneralMacros { def buildWarningMsg(msg: String): String = s"Warning: $buildWarningMsgLoc $msg" def buildWarningMsg(msg: Tree): Tree = q""" "Warning: " + $buildWarningMsgLoc + " " + $msg """ + def buildInfoMsg(msg: String): String = s"Info: $buildWarningMsgLoc $msg" + def buildInfoMsg(msg: Tree): Tree = q""" "Info: " + $buildWarningMsgLoc + " " + $msg """ + def constantTreeOf(t : Any) : Tree = Literal(Constant(t)) def constantTypeOf(t: Any) : Type = c.internal.constantType(Constant(t)) @@ -1048,6 +1051,13 @@ trait GeneralMacros { case CalcLit.String(msg) => if (cArg.tpe.typeSymbol == symbolOf[Warn]) { println(buildWarningMsg(msg)) + c.warning(c.enclosingPosition, msg) + + CalcLit(false) + } else if (cArg.tpe.typeSymbol == symbolOf[Info]) { + println(buildInfoMsg(msg)) + c.info(c.enclosingPosition, msg, force = true) + CalcLit(false) } else if (cArg.tpe.typeSymbol == symbolOf[NoSym]) { abort(msg) @@ -1059,6 +1069,8 @@ trait GeneralMacros { case CalcNLit(Primitive.String, msg, _) => cArg match { case CalcUnknown(t, _) if t.typeSymbol == symbolOf[Warn] => CalcNLit(Primitive.Boolean, q"""{println(${buildWarningMsg(msg)}); false}""") + case CalcUnknown(t, _) if t.typeSymbol == symbolOf[Info] => + CalcNLit(Primitive.Boolean, q"""{println(${buildInfoMsg(msg)}); false}""") case _ => CalcNLit(Primitive.Boolean, q"{_root_.singleton.ops.impl._require(false, $msg); false}") } @@ -1076,6 +1088,15 @@ trait GeneralMacros { false } }""") + case CalcUnknown(t, _) if t == symbolOf[Info] => + CalcNLit(Primitive.Boolean, + q"""{ + if ($cond) true + else { + println(${buildInfoMsg(msgt)}) + false + } + }""") case _ => CalcNLit(Primitive.Boolean, q"{_root_.singleton.ops.impl._require($cond, $msgt); true}") } diff --git a/src/main/scala/singleton/ops/impl/OpId.scala b/src/main/scala/singleton/ops/impl/OpId.scala index d3a7ced9..99b12125 100644 --- a/src/main/scala/singleton/ops/impl/OpId.scala +++ b/src/main/scala/singleton/ops/impl/OpId.scala @@ -1,6 +1,7 @@ package singleton.ops.impl sealed trait Warn +sealed trait Info sealed trait NoSym sealed trait OpId object OpId { diff --git a/src/main/scala/singleton/ops/package.scala b/src/main/scala/singleton/ops/package.scala index 56d3937c..b3964c19 100644 --- a/src/main/scala/singleton/ops/package.scala +++ b/src/main/scala/singleton/ops/package.scala @@ -93,6 +93,7 @@ package object ops { type RequireMsg[Cond,Msg] = OpMacro[OpId.Require, Cond, Msg, NoSym] type RequireMsgSym[Cond,Msg,Sym] = OpMacro[OpId.Require, Cond, Msg, GetType[Sym]] type Warn = impl.Warn + type Info = impl.Info type ToNat[P1] = OpMacro[OpId.ToNat, P1, NP, NP] type ToChar[P1] = OpMacro[OpId.ToChar, P1, NP, NP] type ToInt[P1] = OpMacro[OpId.ToInt, P1, NP, NP]