Skip to content

Commit 88bc6bd

Browse files
committed
Fix macros with array parameters
1 parent def8b69 commit 88bc6bd

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

compiler/src/dotty/tools/dotc/transform/Splicer.scala

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,24 @@ object Splicer {
173173
sym.signature.paramsSig.map { param =>
174174
defn.valueTypeNameToJavaType(param) match {
175175
case Some(clazz) => clazz
176-
case None => classLoader.loadClass(param.toString)
176+
case None =>
177+
def javaArraySig(name: String): String = {
178+
if (name.endsWith("[]")) "[" + javaArraySig(name.dropRight(2))
179+
else name match {
180+
case "scala.Boolean" => "Z"
181+
case "scala.Byte" => "B"
182+
case "scala.Short" => "S"
183+
case "scala.Int" => "I"
184+
case "scala.Long" => "J"
185+
case "scala.Float" => "F"
186+
case "scala.Double" => "D"
187+
case "scala.Char" => "C"
188+
case paramName => "L" + paramName + ";"
189+
}
190+
}
191+
def javaSig(name: String): String =
192+
if (name.endsWith("[]")) javaArraySig(name) else name
193+
java.lang.Class.forName(javaSig(param.toString), false, classLoader)
177194
}
178195
}
179196
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
object Macro {
3+
4+
inline def foo1(arr: Array[Boolean]): Unit = ~{ '() }
5+
inline def foo2(arr: Array[Byte]): Unit = ~{ '() }
6+
inline def foo3(arr: Array[Short]): Unit = ~{ '() }
7+
inline def foo4(arr: Array[Int]): Unit = ~{ '() }
8+
inline def foo5(arr: Array[Long]): Unit = ~{ '() }
9+
inline def foo6(arr: Array[Float]): Unit = ~{ '() }
10+
inline def foo7(arr: Array[Double]): Unit = ~{ '() }
11+
inline def foo8(arr: Array[Char]): Unit = ~{ '() }
12+
inline def foo9(arr: Array[Object]): Unit = ~{ '() }
13+
inline def foo10(arr: Array[String]): Unit = ~{ '() }
14+
inline def foo11[T](arr: Array[T]): Unit = ~{ '() }
15+
inline def foo12(arr: Array[Array[Int]]): Unit = ~{ '() }
16+
inline def foo13(arr: Array[Array[String]]): Unit = ~{ '() }
17+
inline def foo14(arr: Array[Array[Array[Int]]]): Unit = ~{ '() }
18+
inline def foo15(arr: Array[Any]): Unit = ~{ '() }
19+
inline def foo16(arr: Array[AnyVal]): Unit = ~{ '() }
20+
inline def foo17(arr: Array[AnyRef]): Unit = ~{ '() }
21+
inline def foo18(arr: Array[Foo]): Unit = ~{ '() }
22+
23+
}
24+
25+
class Foo
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
object PowerInlined1 {
2+
Macro.foo1(Array.empty)
3+
Macro.foo2(Array.empty)
4+
Macro.foo3(Array.empty)
5+
Macro.foo4(Array.empty)
6+
Macro.foo5(Array.empty)
7+
Macro.foo6(Array.empty)
8+
Macro.foo7(Array.empty)
9+
Macro.foo8(Array.empty)
10+
Macro.foo9(Array.empty)
11+
Macro.foo10(Array.empty)
12+
Macro.foo11[String](Array.empty)
13+
Macro.foo12(Array.empty)
14+
Macro.foo13(Array.empty)
15+
Macro.foo14(Array.empty)
16+
Macro.foo15(Array.empty)
17+
Macro.foo16(Array.empty)
18+
Macro.foo17(Array.empty)
19+
Macro.foo18(Array.empty)
20+
}

0 commit comments

Comments
 (0)