Skip to content

Commit 4c53c67

Browse files
committed
Disallow toplevel statements other than definitions
Have tests for other sorts of definitions
1 parent d93ac50 commit 4c53c67

File tree

10 files changed

+34
-10
lines changed

10 files changed

+34
-10
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -2620,7 +2620,7 @@ object Parsers {
26202620
if (in.token == CASE)
26212621
syntaxErrorOrIncomplete(OnlyCaseClassOrCaseObjectAllowed())
26222622
else
2623-
syntaxErrorOrIncomplete(ExpectedClassOrObjectDef())
2623+
syntaxErrorOrIncomplete(ExpectedToplevelDef())
26242624
}
26252625
acceptStatSepUnlessAtEnd()
26262626
}

compiler/src/dotty/tools/dotc/reporting/diagnostic/ErrorMessageID.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public enum ErrorMessageID {
8888
ValueClassParameterMayNotBeAVarID,
8989
ValueClassNeedsExactlyOneValParamID,
9090
OnlyCaseClassOrCaseObjectAllowedID,
91-
ExpectedClassOrObjectDefID,
91+
ExpectedTopLevelDefID,
9292
AnonymousFunctionMissingParamTypeID,
9393
SuperCallsNotAllowedInlineableID,
9494
ModifiersNotAllowedID,

compiler/src/dotty/tools/dotc/reporting/diagnostic/messages.scala

+3-3
Original file line numberDiff line numberDiff line change
@@ -1670,10 +1670,10 @@ object messages {
16701670
val explanation: String = ""
16711671
}
16721672

1673-
case class ExpectedClassOrObjectDef()(implicit ctx: Context)
1674-
extends Message(ExpectedClassOrObjectDefID) {
1673+
case class ExpectedToplevelDef()(implicit ctx: Context)
1674+
extends Message(ExpectedTopLevelDefID) {
16751675
val kind: String = "Syntax"
1676-
val msg: String = "Expected class or object definition"
1676+
val msg: String = "Expected a toplevel definition"
16771677
val explanation: String = ""
16781678
}
16791679

compiler/test/dotty/tools/dotc/reporting/ErrorMessagesTests.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,7 @@ class ErrorMessagesTests extends ErrorMessagesTest {
966966
implicit val ctx: Context = ictx
967967
assertMessageCount(1, messages)
968968
val err :: Nil = messages
969-
assertEquals(err, ExpectedClassOrObjectDef())
969+
assertEquals(err, ExpectedToplevelDef())
970970
}
971971

972972
@Test def implicitClassPrimaryConstructorArity =

docs/docs/reference/dropped-features/package-objects.md

+10-3
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,18 @@ Package objects
1212
```
1313
will be dropped. They are still available in Scala 3.0, but will be deprecated and removed afterwards.
1414

15-
Package objects are no longer needed since all kinds of definitions and statements can now be written at the top-level. E.g.
15+
Package objects are no longer needed since all kinds of definitions can now be written at the top-level. E.g.
1616
```scala
1717
package p
18-
val a = ...
19-
def b = ...
18+
type Labelled[T] = (String, T)
19+
val a: Labelled[Int] = ("count", 1)
20+
def b = a._2
21+
22+
case class C()
23+
24+
implicit object Cops {
25+
def (x: C) pair (y: C) = (x, y)
26+
}
2027
```
2128
There may be several source files in a package containing such toplevel definitions, and source files can freely mix toplevel value, method, and tyoe definitions with classes and objects.
2229

tests/neg/toplevel.scala

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
println("hello") // error: Expected a toplevel definition

tests/neg/validate.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ trait X {
44
abstract def y: Y // error: abstract term
55
}
66

7-
implicit object Z { // error: implicit at toplevel
7+
implicit object Z { // now ok: implicit at top level
88
implicit case class C() // error: implicit classes may not be case classes
99
implicit type T = Int // error: implicit modifier cannot be used for types or traits
1010
implicit trait U // error: implicit modifier cannot be used for types or traits

tests/run/toplevel-defs.check

+3
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
...
12
hello, Bill
23
hello, Bob
4+
hello, Eve
5+
total : 3

tests/run/toplevel-defs/Test_2.scala

+4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
object Test extends App {
22
println(hello("Bill"))
33
println(O.hi)
4+
println(hello(her))
5+
6+
val x: Labelled[Int] = ("total", 3)
7+
println(showLabelled(x))
48
}

tests/run/toplevel-defs/defs_1.scala

+9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
def hello(name: String) = s"hello, $name"
22

3+
val her = {
4+
println("...")
5+
"Eve"
6+
}
7+
8+
type Labelled[T] = (String, T)
9+
10+
def showLabelled[T](x: Labelled[T]) = s"${x(0)} : ${x(1)}"
11+
312
object O {
413
def hi = hello("Bob")
514
}

0 commit comments

Comments
 (0)