Skip to content

Commit 6156757

Browse files
Merge pull request #4973 from dotty-staging/fix-4936-forbidden-object-flags
Fix #4936: Forbid (or warn on) redundant/illegal object flags
2 parents 2b36ef9 + a17b0b6 commit 6156757

File tree

26 files changed

+50
-36
lines changed

26 files changed

+50
-36
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
@@ -2422,6 +2422,16 @@ object Parsers {
24222422

24232423
def objectDefRest(start: Offset, mods: Modifiers, name: TermName): ModuleDef = {
24242424
val template = templateOpt(emptyConstructor)
2425+
2426+
def flagPos(flag: FlagSet) = mods.mods.find(_.flags == flag).get.pos
2427+
if (mods is Abstract)
2428+
syntaxError(hl"""${Abstract} modifier cannot be used for objects""", flagPos(Abstract))
2429+
if (mods is Sealed)
2430+
syntaxError(hl"""${Sealed} modifier is redundant for objects""", flagPos(Sealed))
2431+
// Maybe this should be an error; see https://github.com/scala/bug/issues/11094.
2432+
if (mods is Final)
2433+
warning(hl"""${Final} modifier is redundant for objects""", source atPos flagPos(Final))
2434+
24252435
finalizeDef(ModuleDef(name, template), mods, start)
24262436
}
24272437

compiler/src/dotty/tools/dotc/printing/Formatting.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,8 @@ object Formatting {
8080
hl.show
8181
case hb: HighlightBuffer =>
8282
hb.toString
83-
case str: String =>
84-
SyntaxHighlighting.highlight(str)
85-
case _ => super.showArg(arg)
83+
case _ =>
84+
SyntaxHighlighting.highlight(super.showArg(arg))
8685
}
8786
}
8887

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 }

semanticdb/src/dotty/semanticdb/Scala.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ object Scala {
148148
}
149149
}
150150
object Descriptor {
151-
final case object None extends Descriptor { def value: String = "" }
151+
case object None extends Descriptor { def value: String = "" }
152152
final case class Term(value: String) extends Descriptor
153153
final case class Method(value: String, disambiguator: String) extends Descriptor
154154
final case class Type(value: String) extends Descriptor
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
final object Foo // error

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/patmat/i3645.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ object App {
1313
}
1414

1515
sealed abstract class K[A]
16-
final case object KAge extends K[Age]
17-
final case object KInt extends K[Int]
16+
case object KAge extends K[Age]
17+
case object KInt extends K[Int]
1818

1919
val kint: K[Age] = Age.subst[K](KInt)
2020
def get(k: K[Age]): String = k match {

tests/patmat/i3645b.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ object App {
1313
type Bar = Foo
1414

1515
sealed abstract class K[A]
16-
final case object K1 extends K[Int]
17-
final case object K2 extends K[Foo]
18-
final case object K3 extends K[Bar]
16+
case object K1 extends K[Int]
17+
case object K2 extends K[Foo]
18+
case object K3 extends K[Bar]
1919

2020
val foo: K[Int] = Foo.subst[K](K2)
2121
def get(k: K[Int]): Unit = k match {

tests/patmat/i3645c.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ object App {
1313
type Bar = Foo
1414

1515
sealed abstract class K[+A]
16-
final case object K1 extends K[Int]
17-
final case object K2 extends K[Foo]
18-
final case object K3 extends K[Bar]
16+
case object K1 extends K[Int]
17+
case object K2 extends K[Foo]
18+
case object K3 extends K[Bar]
1919

2020
val foo: K[Int] = Foo.subst[K](K2)
2121
def get(k: K[Int]): Unit = k match {

tests/patmat/i3645d.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ object App {
1313
type Bar = Foo
1414

1515
sealed abstract class K[-A]
16-
final case object K1 extends K[Int]
17-
final case object K2 extends K[Foo]
18-
final case object K3 extends K[Bar]
16+
case object K1 extends K[Int]
17+
case object K2 extends K[Foo]
18+
case object K3 extends K[Bar]
1919

2020
val foo: K[Int] = Foo.subst[K](K2)
2121
def get(k: K[Int]): Unit = k match {

tests/patmat/i3645e.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ object App {
2222
type Foo = Module.Foo.Type
2323

2424
sealed abstract class K[F]
25-
final case object K1 extends K[Int]
26-
final case object K2 extends K[Foo]
25+
case object K1 extends K[Int]
26+
case object K2 extends K[Foo]
2727

2828
val kv: K[Foo] = Module.Foo.subst[K](K1)
2929
def test(k: K[Foo]): Unit = k match {

tests/patmat/i3645f.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ object App {
2323
type Foo = Module.Foo.Type
2424

2525
sealed abstract class K[F]
26-
final case object K1 extends K[Int]
27-
final case object K2 extends K[Foo]
26+
case object K1 extends K[Int]
27+
case object K2 extends K[Foo]
2828

2929
val kv: K[Foo] = Module.Foo.subst[K](K1)
3030
def test(k: K[Foo]): Unit = k match {

tests/patmat/i3645g.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ object App {
2222
type Foo = Module.Foo.Type
2323

2424
sealed abstract class K[F]
25-
final case object K1 extends K[Int]
26-
final case object K2 extends K[Foo]
25+
case object K1 extends K[Int]
26+
case object K2 extends K[Foo]
2727

2828
val kv: K[Foo] = Module.Foo.subst[K](K1)
2929
def test(k: K[Foo]): Unit = k match {

tests/patmat/t7353.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
sealed trait EthernetType
22

33
object EthernetType {
4-
final case object Gigabit extends EthernetType
5-
final case object FastEthernet extends EthernetType
4+
case object Gigabit extends EthernetType
5+
case object FastEthernet extends EthernetType
66

77
final def toInt(t: EthernetType) = t match {
88
case Gigabit => 1

tests/pos-kind-polymorphism/anykind.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ object Test {
9393
sealed trait HList
9494
final case class ::[+H, +T <: HList](head : H, tail : T) extends HList
9595
sealed trait HNil extends HList
96-
final case object HNil extends HNil
96+
case object HNil extends HNil
9797

9898
object New {
9999
// The Kind Polymorphic List

tests/pos/byname-implicits-13.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ case class Cat(name: String, friend: Either[Cat, Dog])
1313
sealed trait HList extends Product with Serializable
1414
final case class ::[+H, +T <: HList](head: H, tail: T) extends HList
1515
sealed trait HNil extends HList
16-
final case object HNil extends HNil
16+
case object HNil extends HNil
1717

1818
sealed trait Coproduct extends Product with Serializable
1919
sealed trait :+:[+H, +T <: Coproduct] extends Coproduct

tests/pos/byname-implicits-14.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ case class Cat(name: String, friend: Either[Cat, Dog])
1313
sealed trait HList extends Product with Serializable
1414
final case class ::[+H, +T <: HList](head: H, tail: T) extends HList
1515
sealed trait HNil extends HList
16-
final case object HNil extends HNil
16+
case object HNil extends HNil
1717

1818
sealed trait Coproduct extends Product with Serializable
1919
sealed trait :+:[+H, +T <: Coproduct] extends Coproduct

tests/pos/i3471.scala

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

tests/pos/i3647.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ object App {
1010
type T = String
1111
type Bar[A] = J[A]
1212
sealed abstract class J[A]
13-
final case object JName extends J[T]
14-
final case object JInt extends J[Int]
13+
case object JName extends J[T]
14+
case object JInt extends J[Int]
1515

1616
def get(k: J[T]): String = k match {
1717
case JName => "Age"

tests/run/erased-frameless.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import scala.annotation.implicitNotFound
55

66
sealed trait HList
77
sealed trait HNil extends HList
8-
final case object HNil extends HNil
8+
case object HNil extends HNil
99
final case class ::[H, T <: HList](h: H, t: T) extends HList
1010

1111
/** Generic representation os type T as a labelled sum of product. */

tests/run/hmap-covariant.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
trait Tuple
22
case class TCons[+H, +T <: Tuple](h: H, t: T) extends Tuple
3-
final case object TNil extends Tuple
3+
case object TNil extends Tuple
44

55
// Type level natural numbers -------------------------------------------------
66

tests/run/hmap.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
trait Tuple
22
case class TCons[H, T <: Tuple](h: H, t: T) extends Tuple
3-
final case object TNil extends Tuple
3+
case object TNil extends Tuple
44

55
// Type level natural numbers -------------------------------------------------
66

tests/run/phantom-OnHList.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ sealed trait HNil extends HList
2424

2525
// HList values -----------------------------------------------------------------------------------
2626

27-
final case object HNil extends HNil {
27+
case object HNil extends HNil {
2828
val underlying: Array[Any] = Array.empty[Any]
2929
override def toString(): String = "()"
3030
}

0 commit comments

Comments
 (0)