diff options
author | Martin Odersky <odersky@gmail.com> | 2015-06-18 13:27:43 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-06-22 11:40:20 +0200 |
commit | 131ab5c1261608715cf2fde3aa44a04777cbda64 (patch) | |
tree | 3f878ca320f25d064e39d8c1846e0885303da589 /src/dotty/tools/dotc/typer/Implicits.scala | |
parent | 6f4b38cf9d1711ec525219d9b0b8049c95047f38 (diff) | |
download | dotty-131ab5c1261608715cf2fde3aa44a04777cbda64.tar.gz dotty-131ab5c1261608715cf2fde3aa44a04777cbda64.tar.bz2 dotty-131ab5c1261608715cf2fde3aa44a04777cbda64.zip |
Avoid double context creation when modes change on a fresh context.
Move addMode and friends to two decorators, one for Context, the other
for FreshContext. Implement behavior accordingly.
This avoids creating two contexts in situations like:
c.fresh.setxploreTyperState.addMode(...)
Mow we can write
c.fresh.addMode(...).setExploreTyperState
Because addMode returns a fresh context when applied to a fresh context.
Note that we specifically do not want virtual dispatch of addMode, that's
why it was moved to a decorator.
Also: removed mention of ".fresh: when just forllowed by an addMode, because
that one is redundant.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Implicits.scala')
-rw-r--r-- | src/dotty/tools/dotc/typer/Implicits.scala | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/typer/Implicits.scala b/src/dotty/tools/dotc/typer/Implicits.scala index 43d93b2b8..be76553be 100644 --- a/src/dotty/tools/dotc/typer/Implicits.scala +++ b/src/dotty/tools/dotc/typer/Implicits.scala @@ -90,7 +90,7 @@ object Implicits { } if (refs.isEmpty) refs - else refs filter (refMatches(_)(ctx.fresh.setExploreTyperState.addMode(Mode.TypevarsMissContext))) // create a defensive copy of ctx to avoid constraint pollution + else refs filter (refMatches(_)(ctx.fresh.addMode(Mode.TypevarsMissContext).setExploreTyperState)) // create a defensive copy of ctx to avoid constraint pollution } } @@ -480,7 +480,8 @@ trait Implicits { self: Typer => pt) val generated1 = adapt(generated, pt) lazy val shadowing = - typed(untpd.Ident(ref.name) withPos pos.toSynthetic, funProto)(nestedContext.setNewTyperState.addMode(Mode.ImplicitShadowing)) + typed(untpd.Ident(ref.name) withPos pos.toSynthetic, funProto) + (nestedContext.addMode(Mode.ImplicitShadowing).setNewTyperState) def refMatches(shadowing: Tree): Boolean = ref.symbol == closureBody(shadowing).symbol || { shadowing match { |