diff --git a/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala b/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala index 8e075acdf5e3..dd76110cfe6a 100644 --- a/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala @@ -854,7 +854,7 @@ object JavaParsers { // generate the canonical constructor val canonicalConstructor = - DefDef(nme.CONSTRUCTOR, joinParams(tparams, List(header)), TypeTree(), EmptyTree) + DefDef(nme.CONSTRUCTOR, joinParams(Nil, List(header)), TypeTree(), EmptyTree) .withMods(Modifiers(Flags.JavaDefined | Flags.Synthetic, mods.privateWithin)) // return the trees @@ -866,7 +866,7 @@ object JavaParsers { tparams = tparams, true ) - ).withMods(mods) + ).withMods(mods.withFlags(Flags.JavaDefined | Flags.Final)) } addCompanionObject(statics, recordTypeDef) end recordDecl diff --git a/compiler/src/dotty/tools/dotc/typer/Namer.scala b/compiler/src/dotty/tools/dotc/typer/Namer.scala index ff140e30a2ae..d520c2278161 100644 --- a/compiler/src/dotty/tools/dotc/typer/Namer.scala +++ b/compiler/src/dotty/tools/dotc/typer/Namer.scala @@ -876,6 +876,10 @@ class Namer { typer: Typer => * with a user-defined method in the same scope with a matching type. */ private def invalidateIfClashingSynthetic(denot: SymDenotation): Unit = + + def isJavaRecord(owner: Symbol) = + owner.is(JavaDefined) && owner.derivesFrom(defn.JavaRecordClass) + def isCaseClassOrCompanion(owner: Symbol) = owner.isClass && { if (owner.is(Module)) owner.linkedClass.is(CaseClass) @@ -901,7 +905,7 @@ class Namer { typer: Typer => || // remove synthetic constructor of a java Record if it clashes with a non-synthetic constructor (denot.isConstructor - && denot.owner.is(JavaDefined) && denot.owner.derivesFrom(defn.JavaRecordClass) + && isJavaRecord(denot.owner) && denot.owner.unforcedDecls.lookupAll(denot.name).exists(c => c != denot.symbol && c.info.matches(denot.info)) ) )