Skip to content

Commit 1a19d50

Browse files
Merge pull request #15089 from dotty-staging/fix-main-param-type-name
Fix MainAnnotation.Parameter.typeName
2 parents 06a8f22 + e96e5f6 commit 1a19d50

File tree

3 files changed

+76
-2
lines changed

3 files changed

+76
-2
lines changed

compiler/src/dotty/tools/dotc/ast/MainProxies.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,10 @@ object MainProxies {
242242
val param = paramName.toString
243243
val paramType0 = if formal.isRepeatedParam then formal.argTypes.head.dealias else formal.dealias
244244
val paramType = paramType0.dealias
245-
246-
val paramTypeStr = formal.dealias.typeSymbol.owner.showFullName + "." + paramType.show
245+
val paramTypeOwner = paramType.typeSymbol.owner
246+
val paramTypeStr =
247+
if paramTypeOwner == defn.EmptyPackageClass then paramType.show
248+
else paramTypeOwner.showFullName + "." + paramType.show
247249
val hasDefault = defaultValueSymbols.contains(idx)
248250
val isRepeated = formal.isRepeatedParam
249251
val paramDoc = documentation.argDocs.getOrElse(param, "")
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Expression: Plus(Number(1),Number(2))
2+
Calculated: 3
3+
executing sum2 with inputs: 2 3
4+
Expression: Plus(Number(2),Number(3))
5+
Calculated: 5
6+
executing sumAll with inputs: 1 2 3
7+
Expression: Plus(Plus(Number(1),Number(2)),Number(3))
8+
Calculated: 6
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
sealed trait Expression:
2+
def eval(): Int
3+
case class Number(n: Int) extends Expression:
4+
def eval(): Int = n
5+
case class Plus(e1: Expression, e2: Expression) extends Expression:
6+
def eval(): Int = e1.eval() + e2.eval()
7+
8+
////
9+
10+
@main def sum(n1: Int, n2: Int) =
11+
val x1 = Number(n1)
12+
val x2 = Number(n2)
13+
val expr = Plus(x1, x2)
14+
println(s"Expression: $expr")
15+
val result = expr.eval()
16+
println(s"Calculated: $result")
17+
18+
////
19+
20+
import scala.annotation.{ MainAnnotation, experimental }
21+
import scala.annotation.MainAnnotation.{ Info, Parameter }
22+
import scala.util.CommandLineParser.FromString
23+
24+
@experimental class showAndEval extends MainAnnotation[FromString, Expression]:
25+
def command(info: Info, args: Seq[String]): Option[Seq[String]] =
26+
assert(info.parameters.forall(param => param.typeName == "Number"), "Only Number parameters allowed")
27+
println(s"executing ${info.name} with inputs: ${args.mkString(" ")}")
28+
Some(args)
29+
30+
def argGetter[T](param: Parameter, arg: String, defaultArgument: Option[() => T])(using parser: FromString[T]): () => T =
31+
() => parser.fromString(arg)
32+
33+
def varargGetter[T](param: Parameter, args: Seq[String])(using parser: FromString[T]): () => Seq[T] =
34+
() => args.map(arg => parser.fromString(arg))
35+
36+
def run(program: () => Expression): Unit =
37+
val expr = program()
38+
println(s"Expression: $expr")
39+
val result = expr.eval()
40+
println(s"Calculated: $result")
41+
end showAndEval
42+
43+
given FromString[Number] = (x: String) => Number(x.toInt)
44+
45+
////
46+
47+
@showAndEval def sum2(x1: Number, x2: Number): Expression =
48+
sumAll(x1, x2)
49+
50+
@showAndEval def sumAll(xs: Number*): Expression =
51+
if xs.isEmpty then Number(0)
52+
else xs.tail.fold[Expression](xs.head)(Plus)
53+
54+
////
55+
56+
@main def Test: Unit =
57+
def callMain(name: String, args: String*): Unit =
58+
val clazz = Class.forName(name)
59+
val method = clazz.getMethod("main", classOf[Array[String]])
60+
method.invoke(null, args.toArray)
61+
callMain("sum", "1", "2")
62+
callMain("sum2", "2", "3")
63+
callMain("sumAll", "1", "2", "3")
64+
end Test

0 commit comments

Comments
 (0)