Skip to content

Commit 0e6095b

Browse files
committed
Forbid/warn on redundant/illegal object flags
Fix scala#4936. - Stop using final object in our sources. - Give error for abstract and sealed objects, warning for final ones (as long as - scala/bug#11094 is open).
1 parent 5fe9269 commit 0e6095b

File tree

7 files changed

+18
-4
lines changed

7 files changed

+18
-4
lines changed

compiler/src/dotty/tools/dotc/core/NameOps.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Definitions._
1010

1111
object NameOps {
1212

13-
final object compactify {
13+
object compactify {
1414
lazy val md5: MessageDigest = MessageDigest.getInstance("MD5")
1515

1616
/** COMPACTIFY

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2415,6 +2415,16 @@ object Parsers {
24152415

24162416
def objectDefRest(start: Offset, mods: Modifiers, name: TermName): ModuleDef = {
24172417
val template = templateOpt(emptyConstructor)
2418+
2419+
def flagPos(flag: FlagSet) = mods.mods.find(_.flags == flag).get.pos
2420+
if (mods is Abstract)
2421+
syntaxError(hl"""${Abstract} modifier cannot be used for objects""", flagPos(Abstract))
2422+
if (mods is Sealed)
2423+
syntaxError(hl"""${Sealed} modifier is redundant for objects""", flagPos(Sealed))
2424+
// Maybe this should be an error; see https://github.com/scala/bug/issues/11094.
2425+
if (mods is Final)
2426+
warning(hl"""${Final} modifier is redundant for objects""", source atPos flagPos(Final))
2427+
24182428
finalizeDef(ModuleDef(name, template), mods, start)
24192429
}
24202430

compiler/test/dotty/tools/vulpix/Status.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ package vulpix
44
sealed trait Status
55
final case class Success(output: String) extends Status
66
final case class Failure(output: String) extends Status
7-
final case object Timeout extends Status
7+
case object Timeout extends Status

doc-tool/src/dotty/tools/dottydoc/model/references.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ object references {
1111
final case class BoundsReference(low: Reference, high: Reference) extends Reference
1212
final case class NamedReference(title: String, ref: Reference, isByName: Boolean = false, isRepeated: Boolean = false) extends Reference
1313
final case class ConstantReference(title: String) extends Reference
14-
final case object EmptyReference extends Reference
14+
case object EmptyReference extends Reference
1515

1616
/** Use MaterializableLink for entities that need be picklable */
1717
sealed trait MaterializableLink { def title: String }

tests/neg/i3471.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
sealed object Fun // error

tests/neg/i4936.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
abstract object Foo // error
2+
sealed final abstract case object Bar // error // error
3+
4+
abstract override object Baz // error

tests/pos/i3471.scala

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)