summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2014-02-21 21:48:16 +0100
committerEugene Burmako <xeno.by@gmail.com>2014-02-21 21:56:09 +0100
commit31b52ed651e58a68d478aabe41c62287b6d4d718 (patch)
tree15d3d74c2a7b1b76de62f9e5b8abd4225718551c
parent42031708b25f7252fab9992fe444651f8c141e40 (diff)
downloadscala-31b52ed651e58a68d478aabe41c62287b6d4d718.tar.gz
scala-31b52ed651e58a68d478aabe41c62287b6d4d718.tar.bz2
scala-31b52ed651e58a68d478aabe41c62287b6d4d718.zip
bundles now reject invalid context types
Vanilla macros only allow blackbox.Context, whitebox.Context and PrefixType refinements thereof. Bundles should behave in the same way.
-rw-r--r--src/reflect/scala/reflect/internal/Definitions.scala14
-rw-r--r--test/files/neg/macro-bundle-wrongcontext-a.check4
-rw-r--r--test/files/neg/macro-bundle-wrongcontext-a.scala13
-rw-r--r--test/files/neg/macro-bundle-wrongcontext-b.check4
-rw-r--r--test/files/neg/macro-bundle-wrongcontext-b.scala11
5 files changed, 37 insertions, 9 deletions
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index 20f6d51fcf..f8f7673530 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -609,12 +609,8 @@ trait Definitions extends api.StandardDefinitions {
private def macroBundleParamInfo(tp: Type) = {
val ctor = tp.erasure.typeSymbol.primaryConstructor
ctor.paramss match {
- case List(List(c)) =>
- val sym = c.info.typeSymbol
- val isContextCompatible = sym.isNonBottomSubClass(BlackboxContextClass) || sym.isNonBottomSubClass(WhiteboxContextClass)
- if (isContextCompatible) c.info else NoType
- case _ =>
- NoType
+ case List(List(c)) => if (isMacroContextType(c.info)) c.info else NoType
+ case _ => NoType
}
}
@@ -630,9 +626,9 @@ trait Definitions extends api.StandardDefinitions {
def isBlackboxMacroBundleType(tp: Type) = {
val isBundle = isMacroBundleType(tp)
- val isBlackbox = (macroBundleParamInfo(tp) <:< BlackboxContextClass.tpe)
- val notWhitebox = !(macroBundleParamInfo(tp) <:< WhiteboxContextClass.tpe)
- isBundle && isBlackbox && notWhitebox
+ val unwrappedContext = MacroContextType.unapply(macroBundleParamInfo(tp)).getOrElse(NoType)
+ val isBlackbox = unwrappedContext =:= BlackboxContextClass.tpe
+ isBundle && isBlackbox
}
def isListType(tp: Type) = tp <:< classExistentialType(ListClass)
diff --git a/test/files/neg/macro-bundle-wrongcontext-a.check b/test/files/neg/macro-bundle-wrongcontext-a.check
new file mode 100644
index 0000000000..7a48dbfd3a
--- /dev/null
+++ b/test/files/neg/macro-bundle-wrongcontext-a.check
@@ -0,0 +1,4 @@
+macro-bundle-wrongcontext-a.scala:12: error: not found: value Bundle
+ def foo: Any = macro Bundle.impl
+ ^
+one error found
diff --git a/test/files/neg/macro-bundle-wrongcontext-a.scala b/test/files/neg/macro-bundle-wrongcontext-a.scala
new file mode 100644
index 0000000000..ed566fd977
--- /dev/null
+++ b/test/files/neg/macro-bundle-wrongcontext-a.scala
@@ -0,0 +1,13 @@
+import scala.reflect.macros.whitebox._
+import scala.language.experimental.macros
+
+abstract class MyContext extends Context
+
+class Bundle(val c: MyContext) {
+ import c.universe._
+ def impl = q"()"
+}
+
+object Macros {
+ def foo: Any = macro Bundle.impl
+} \ No newline at end of file
diff --git a/test/files/neg/macro-bundle-wrongcontext-b.check b/test/files/neg/macro-bundle-wrongcontext-b.check
new file mode 100644
index 0000000000..9c94c3bc34
--- /dev/null
+++ b/test/files/neg/macro-bundle-wrongcontext-b.check
@@ -0,0 +1,4 @@
+macro-bundle-wrongcontext-b.scala:10: error: not found: value Bundle
+ def foo: Any = macro Bundle.impl
+ ^
+one error found
diff --git a/test/files/neg/macro-bundle-wrongcontext-b.scala b/test/files/neg/macro-bundle-wrongcontext-b.scala
new file mode 100644
index 0000000000..0b4ff7e17c
--- /dev/null
+++ b/test/files/neg/macro-bundle-wrongcontext-b.scala
@@ -0,0 +1,11 @@
+import scala.reflect.macros.whitebox._
+import scala.language.experimental.macros
+
+class Bundle(val c: Context { type Foo <: Int }) {
+ import c.universe._
+ def impl = q"()"
+}
+
+object Macros {
+ def foo: Any = macro Bundle.impl
+} \ No newline at end of file