-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Fix #3823: Unpickle type holes #3833
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
2105863
3f0dca3
2b04c04
e4b93e7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,23 @@ | ||
package scala.quoted | ||
|
||
class Type[T] extends Quoted { | ||
import scala.reflect.ClassTag | ||
|
||
abstract class Type[T] extends Quoted { | ||
type unary_~ = T | ||
} | ||
|
||
/** Some basic type tags, currently incomplete */ | ||
object Type { | ||
implicit def IntTag: Type[Int] = new Type[Int] | ||
implicit def BooleanTag: Type[Boolean] = new Type[Boolean] | ||
|
||
class TaggedPrimitive[T] private[Type] (implicit val ct: ClassTag[T]) extends Type[T] | ||
|
||
implicit def UnitTag: Type[Unit] = new TaggedPrimitive[Unit] | ||
implicit def BooleanTag: Type[Boolean] = new TaggedPrimitive[Boolean] | ||
implicit def ByteTag: Type[Byte] = new TaggedPrimitive[Byte] | ||
implicit def CharTag: Type[Char] = new TaggedPrimitive[Char] | ||
implicit def ShortTag: Type[Short] = new TaggedPrimitive[Short] | ||
implicit def IntTag: Type[Int] = new TaggedPrimitive[Int] | ||
implicit def LongTag: Type[Long] = new TaggedPrimitive[Long] | ||
implicit def FloatTag: Type[Float] = new TaggedPrimitive[Float] | ||
implicit def DoubleTag: Type[Double] = new TaggedPrimitive[Double] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
val z: Int = 2 | ||
() | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import dotty.tools.dotc.quoted.Runners._ | ||
import scala.quoted._ | ||
object Test { | ||
def main(args: Array[String]): Unit = { | ||
def f[T](x: Expr[T])(t: Type[T]) = '{ | ||
val z: t.unary_~ = ~x | ||
} | ||
println(f('(2))(Type.IntTag).show) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
val z: Int = 2 | ||
() | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
import dotty.tools.dotc.quoted.Runners._ | ||
import scala.quoted._ | ||
object Test { | ||
def main(args: Array[String]): Unit = { | ||
def f[T](x: Expr[T])(implicit t: Type[T]) = '{ | ||
val z = ~x | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This quote will be pickled as type T = [[1| ]]
{
val z: T = [[0| ]]
()
} There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After package <empty> {
import dotty.tools.dotc.quoted.Runners._
import scala.quoted._
final lazy module val Test: Test$ = new Test$()
@scala.annotation.internal.SourceFile("Foo.scala") final module class Test$()
extends
Object() { this: Test.type =>
def main(args: Array[String]): Unit =
{
def f[T >: Nothing <: Any](x: quoted.Expr[T])(implicit t: quoted.Type[T]
)
: scala.quoted.Expr[Unit] =
scala.runtime.quoted.Unpickler.unpickleExpr[Unit](
scala.collection.immutable.Nil.::[String](
"\\¡«\037\0203\0200\00\00\00\00\00\00\00\00\00\00\00\00\016\02M0£\01\0204ASTs\01\0206_root_\01\0201\'\01\0203Any\01\0205scala\01\0201z\01\0201T\0200¤\0200¢6\0201\0201\0236\0202u\02036\0204\0214\0226\0214\0211\02\0201\0206\02055\0230ÿ\0201\0200\0203\0211\0206£\0205ÿ\0201\02012\0235\025\025"
)
, [x,new scala.quoted.Type[T]() : Any])
println(
f[Int](
scala.runtime.quoted.Unpickler.unpickleExpr[Int](
scala.collection.immutable.Nil.::[String](
"\\¡«\037\0203\0200\00\00\00\00\00\00\00\00\00\00\00\00\n%fð\0235\01\0204ASTs\01\0206_root_\01\0201\'\01\0203Any\01\0205scala\0200\0216\0200\02146\0201\0201\0210\0202u\02036\0204<\0202\025"
)
, [ : Any])
)(quoted.Type.IntTag).show(
dotty.tools.dotc.quoted.Runners.runner[Unit]
)
)
}
}
} Note that the arguments for the holes are There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we have def f[T](x: Expr[T])(implicit t: Type[T]) = '{
val z: ~t= ~x
} then the hole receives the |
||
// FIXME uncomment next line | ||
// println(f('(2))(Type.IntTag).show) | ||
println("{\n val z: Int = 2\n ()\n}") // TODO remove line | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
val z: Int = 2 | ||
() | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import dotty.tools.dotc.quoted.Runners._ | ||
import scala.quoted._ | ||
object Test { | ||
def main(args: Array[String]): Unit = { | ||
def f[T](x: Expr[T])(t: Type[T]) = '{ | ||
val z: t.unary_~ = ~x | ||
} | ||
println(f('(2))('[Int]).show) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@odersky could you have a look at this one. I did not manage to use the
MacroTransformWithImplicits
andinferImplicitArg
to get the implicit argument. I looked at b466e0a but it might be too outdated.