summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Parsers.scala15
-rw-r--r--test/files/run/t4625c.check3
-rw-r--r--test/files/run/t4625c.scala7
-rw-r--r--test/files/run/t4625c.script6
4 files changed, 27 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
index 1ece580b96..c2f2141fd3 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
@@ -389,8 +389,8 @@ self =>
}
/* For now we require there only be one top level object. */
var seenModule = false
+ var disallowed = EmptyTree: Tree
val newStmts = stmts collect {
- case t @ Import(_, _) => t
case md @ ModuleDef(mods, name, template) if !seenModule && (isApp(template) || md.exists(isMainMethod)) =>
seenModule = true
/* This slightly hacky situation arises because we have no way to communicate
@@ -404,11 +404,18 @@ self =>
else treeCopy.ModuleDef(md, mods, mainModuleName, template)
case md @ ModuleDef(_, _, _) => md
case cd @ ClassDef(_, _, _, _) => cd
- case _ =>
+ case t @ Import(_, _) => t
+ case t =>
/* If we see anything but the above, fail. */
- return None
+ disallowed = t
+ EmptyTree
+ }
+ if (disallowed.isEmpty) Some(makeEmptyPackage(0, newStmts))
+ else {
+ if (seenModule)
+ warning(disallowed.pos.point, "Script has a main object but statement is disallowed")
+ None
}
- Some(makeEmptyPackage(0, newStmts))
}
if (mainModuleName == newTermName(ScriptRunner.defaultScriptMain))
diff --git a/test/files/run/t4625c.check b/test/files/run/t4625c.check
new file mode 100644
index 0000000000..6acb1710b9
--- /dev/null
+++ b/test/files/run/t4625c.check
@@ -0,0 +1,3 @@
+newSource1.scala:2: warning: Script has a main object but statement is disallowed
+val x = "value x"
+ ^
diff --git a/test/files/run/t4625c.scala b/test/files/run/t4625c.scala
new file mode 100644
index 0000000000..44f6225220
--- /dev/null
+++ b/test/files/run/t4625c.scala
@@ -0,0 +1,7 @@
+
+import scala.tools.partest.ScriptTest
+
+object Test extends ScriptTest {
+ // must be called Main to get probing treatment in parser
+ override def testmain = "Main"
+}
diff --git a/test/files/run/t4625c.script b/test/files/run/t4625c.script
new file mode 100644
index 0000000000..fa14f43950
--- /dev/null
+++ b/test/files/run/t4625c.script
@@ -0,0 +1,6 @@
+
+val x = "value x"
+
+object Main extends App {
+ println(s"Test ran with $x.")
+}