Skip to content

Commit 6ceeaf3

Browse files
committed
Disallow self types in objects
Fixes #11648
1 parent 086d1a8 commit 6ceeaf3

File tree

3 files changed

+11
-21
lines changed

3 files changed

+11
-21
lines changed

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -890,12 +890,9 @@ object desugar {
890890
val modul = ValDef(moduleName, clsRef, New(clsRef, Nil))
891891
.withMods(mods.toTermFlags & RetainedModuleValFlags | ModuleValCreationFlags)
892892
.withSpan(mdef.span.startPos)
893-
val ValDef(selfName, selfTpt, _) = impl.self
894-
val selfMods = impl.self.mods
895-
if (!selfTpt.isEmpty) report.error(ObjectMayNotHaveSelfType(mdef), impl.self.srcPos)
896-
val clsSelf = ValDef(selfName, SingletonTypeTree(Ident(moduleName)), impl.self.rhs)
897-
.withMods(selfMods)
898-
.withSpan(impl.self.span.orElse(impl.span.startPos))
893+
if !impl.self.isEmpty then report.error(ObjectMayNotHaveSelfType(mdef), impl.self.srcPos)
894+
val clsSelf = ValDef(nme.WILDCARD, SingletonTypeTree(Ident(moduleName)), EmptyTree)
895+
.withSpan(impl.span.startPos)
899896
val clsTmpl = cpy.Template(impl)(self = clsSelf, body = impl.body)
900897
val cls = TypeDef(clsName, clsTmpl)
901898
.withMods(mods.toTypeFlags & RetainedModuleClassFlags | ModuleClassCreationFlags)

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -452,21 +452,9 @@ import transform.SymUtils._
452452
}
453453

454454
class ObjectMayNotHaveSelfType(mdef: untpd.ModuleDef)(using Context)
455-
extends SyntaxMsg(ObjectMayNotHaveSelfTypeID) {
456-
def msg = em"""${hl("object")}s must not have a self ${hl("type")}"""
457-
458-
def explain = {
459-
val untpd.ModuleDef(name, tmpl) = mdef
460-
val ValDef(_, selfTpt, _) = tmpl.self
461-
em"""|${hl("object")}s must not have a self ${hl("type")}:
462-
|
463-
|Consider these alternative solutions:
464-
| - Create a trait or a class instead of an object
465-
| - Let the object extend a trait containing the self type:
466-
|
467-
| object $name extends ${selfTpt.show}"""
468-
}
469-
}
455+
extends SyntaxMsg(ObjectMayNotHaveSelfTypeID):
456+
def msg = "objects must not have a self type"
457+
def explain = ""
470458

471459
class RepeatedModifier(modifier: String)(implicit ctx:Context)
472460
extends SyntaxMsg(RepeatedModifierID) {

tests/neg/i11648.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class A {
2+
object B { b => // error
3+
4+
}
5+
}

0 commit comments

Comments
 (0)