diff options
Diffstat (limited to 'src/dotty/tools/dotc/typer/Namer.scala')
-rw-r--r-- | src/dotty/tools/dotc/typer/Namer.scala | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala index 7a2348cd3..a0862ee38 100644 --- a/src/dotty/tools/dotc/typer/Namer.scala +++ b/src/dotty/tools/dotc/typer/Namer.scala @@ -273,6 +273,18 @@ class Namer { typer: Typer => } val inSuperCall = if (ctx.mode is Mode.InSuperCall) InSuperCall else EmptyFlags + + /** The position of the name defined by `tree` + * This is a point position if tree is synthetic, a range position if it comes from source. + * It might also be that tree does not have a position (for instance when synthesized by + * a calling chain from `viewExists`), in that case the return position is NoPosition. + */ + def namePos(tree: MemberDef) = + if (tree.pos.exists) + if (tree.mods.is(Synthetic)) Position(tree.pos.point, tree.pos.point) + else Position(tree.pos.point, tree.pos.point + tree.name.length, tree.pos.point) + else tree.pos + tree match { case tree: TypeDef if tree.isClassDef => val name = checkNoConflict(tree.name.encode).asTypeName @@ -280,7 +292,7 @@ class Namer { typer: Typer => val cls = recordSym(ctx.newClassSymbol( ctx.owner, name, flags | inSuperCall, cls => adjustIfModule(new ClassCompleter(cls, tree)(ctx), tree), - privateWithinClass(tree.mods), tree.pos, ctx.source.file), tree) + privateWithinClass(tree.mods), namePos(tree), ctx.source.file), tree) cls.completer.asInstanceOf[ClassCompleter].init() cls case tree: MemberDef => @@ -315,7 +327,7 @@ class Namer { typer: Typer => recordSym(ctx.newSymbol( ctx.owner, name, flags | deferred | method | higherKinded | inSuperCall1, adjustIfModule(completer, tree), - privateWithinClass(tree.mods), tree.pos), tree) + privateWithinClass(tree.mods), namePos(tree)), tree) case tree: Import => recordSym(ctx.newSymbol( ctx.owner, nme.IMPORT, Synthetic, new Completer(tree), NoSymbol, tree.pos), tree) |