From ba1c6fa888488774a7e510ee09ebb80ff0ce2a3c Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Fri, 17 Jan 2014 18:33:16 +0100 Subject: Fix problem with duplicate companion objects for classes with default parameters in constructors. --- src/dotty/tools/dotc/Main.scala | 1 - src/dotty/tools/dotc/typer/Namer.scala | 21 ++++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) (limited to 'src/dotty/tools/dotc') diff --git a/src/dotty/tools/dotc/Main.scala b/src/dotty/tools/dotc/Main.scala index f4da16a6a..22d6d46b8 100644 --- a/src/dotty/tools/dotc/Main.scala +++ b/src/dotty/tools/dotc/Main.scala @@ -13,7 +13,6 @@ import reporting.Reporter * - make use of AndOrType * - review isSubType * - have a second look at normalization (leave at method types if pt is method type?) - * - fix problem with duplicate companion objects for classes with default parameters in constructors * - Check usages of isAliasType and replace where possible by looking at the info. * - Don't open package objects from class files if they are present in source */ diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala index 2433c49b5..952c7997e 100644 --- a/src/dotty/tools/dotc/typer/Namer.scala +++ b/src/dotty/tools/dotc/typer/Namer.scala @@ -298,19 +298,22 @@ class Namer { typer: Typer => * and the real companion, if both exist. */ def mergeCompanionDefs() = { - val caseClassDef = mutable.Map[TypeName, TypeDef]() + val classDef = mutable.Map[TypeName, TypeDef]() for (cdef @ TypeDef(mods, name, _) <- stats) - if (mods is Case) caseClassDef(name) = cdef + if (cdef.isClassDef) classDef(name) = cdef for (mdef @ ModuleDef(_, name, _) <- stats) - caseClassDef get name.toTypeName match { + classDef get name.toTypeName match { case Some(cdef) => val Thicket(vdef :: (mcls @ TypeDef(_, _, impl: Template)) :: Nil) = expandedTree(mdef) - val Thicket(cls :: mval :: TypeDef(_, _, compimpl: Template) :: crest) = expandedTree(cdef) - val mcls1 = cpy.TypeDef(mcls, mcls.mods, mcls.name, - cpy.Template(impl, impl.constr, impl.parents, impl.self, - compimpl.body ++ impl.body)) - expandedTree(mdef) = Thicket(vdef :: mcls1 :: Nil) - expandedTree(cdef) = Thicket(cls :: crest) + expandedTree(cdef) match { + case Thicket(cls :: mval :: TypeDef(_, _, compimpl: Template) :: crest) => + val mcls1 = cpy.TypeDef(mcls, mcls.mods, mcls.name, + cpy.Template(impl, impl.constr, impl.parents, impl.self, + compimpl.body ++ impl.body)) + expandedTree(mdef) = Thicket(vdef :: mcls1 :: Nil) + expandedTree(cdef) = Thicket(cls :: crest) + case _ => + } case none => } } -- cgit v1.2.3