diff options
author | Martin Odersky <odersky@gmail.com> | 2015-07-09 16:54:40 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-07-09 16:54:40 +0200 |
commit | cfb3ffc4c40640dd0c8359381ea0b85e8a0e6f03 (patch) | |
tree | 3d7009e8008be9b770f06d2c0128d8ea03c53e4a /src/dotty | |
parent | a1206b99253d230684823c2f22fa42f648124672 (diff) | |
download | dotty-cfb3ffc4c40640dd0c8359381ea0b85e8a0e6f03.tar.gz dotty-cfb3ffc4c40640dd0c8359381ea0b85e8a0e6f03.tar.bz2 dotty-cfb3ffc4c40640dd0c8359381ea0b85e8a0e6f03.zip |
Avoid generating dupliocate names
If a name clash is detected, the a fresh name is chosen instead.
Previously, test file clashes.scala caused a crash because of a
duplicate name in enter. That is now avoided.
Diffstat (limited to 'src/dotty')
-rw-r--r-- | src/dotty/tools/dotc/typer/Namer.scala | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala index cdce11f22..f6a0c8cc3 100644 --- a/src/dotty/tools/dotc/typer/Namer.scala +++ b/src/dotty/tools/dotc/typer/Namer.scala @@ -240,22 +240,26 @@ class Namer { typer: Typer => typr.println(i"creating symbol for $tree in ${ctx.mode}") - def checkNoConflict(name: Name): Unit = { + def checkNoConflict(name: Name): Name = { + def errorName(msg: => String) = { + ctx.error(msg, tree.pos) + name.freshened + } def preExisting = ctx.effectiveScope.lookup(name) - if (ctx.owner is PackageClass) { + if (ctx.owner is PackageClass) if (preExisting.isDefinedInCurrentRun) - ctx.error(s"${preExisting.showLocated} is compiled twice, runid = ${ctx.runId}", tree.pos) - } - else if ((!ctx.owner.isClass || name.isTypeName) && preExisting.exists) { - ctx.error(i"$name is already defined as $preExisting", tree.pos) - } + errorName(s"${preExisting.showLocated} is compiled twice") + else name + else + if ((!ctx.owner.isClass || name.isTypeName) && preExisting.exists) + errorName(i"$name is already defined as $preExisting") + else name } val inSuperCall = if (ctx.mode is Mode.InSuperCall) InSuperCall else EmptyFlags tree match { case tree: TypeDef if tree.isClassDef => - val name = tree.name.encode.asTypeName - checkNoConflict(name) + val name = checkNoConflict(tree.name.encode).asTypeName val cls = record(ctx.newClassSymbol( ctx.owner, name, tree.mods.flags | inSuperCall, cls => adjustIfModule(new ClassCompleter(cls, tree)(ctx), tree), @@ -263,8 +267,7 @@ class Namer { typer: Typer => cls.completer.asInstanceOf[ClassCompleter].init() cls case tree: MemberDef => - val name = tree.name.encode - checkNoConflict(name) + val name = checkNoConflict(tree.name.encode) val isDeferred = lacksDefinition(tree) val deferred = if (isDeferred) Deferred else EmptyFlags val method = if (tree.isInstanceOf[DefDef]) Method else EmptyFlags |