Skip to content

Fix/#646 array addition #667

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 22, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 21 additions & 9 deletions src/dotty/DottyPredef.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,34 @@ import scala.reflect.ClassTag
import scala.reflect.runtime.universe.TypeTag
import scala.Predef.??? // this is currently ineffective, because of #530

object DottyPredef {
/** implicits for ClassTag and TypeTag. Should be implemented with macros */
abstract class I1 {
implicit def classTag[T]: ClassTag[T] = scala.Predef.???
implicit def typeTag[T]: TypeTag[T] = scala.Predef.???


/** ClassTags for final classes */
implicit val DoubleClassTag: ClassTag[Double] = ClassTag.Double
}
abstract class I2 extends I1 {
implicit val FloatClassTag: ClassTag[Double] = ClassTag.Double
}
abstract class I3 extends I2 {
implicit val LongClassTag: ClassTag[Long] = ClassTag.Long
}
abstract class I4 extends I3 {
implicit val IntClassTag: ClassTag[Int] = ClassTag.Int
implicit val ByteClassTag: ClassTag[Byte] = ClassTag.Byte
}
abstract class I5 extends I4 {
implicit val ShortClassTag: ClassTag[Short] = ClassTag.Short
}
abstract class I6 extends I5 {
implicit val ByteClassTag: ClassTag[Byte] = ClassTag.Byte
implicit val CharClassTag: ClassTag[Char] = ClassTag.Char
implicit val LongClassTag: ClassTag[Long] = ClassTag.Long
implicit val FloatClassTag: ClassTag[Float] = ClassTag.Float
implicit val DoubleClassTag: ClassTag[Double] = ClassTag.Double
implicit val BooleanClassTag: ClassTag[Boolean] = ClassTag.Boolean
implicit val UnitClassTag: ClassTag[Unit] = ClassTag.Unit
implicit val NullClassTag: ClassTag[Null] = ClassTag.Null
}

/** implicits for ClassTag and TypeTag. Should be implemented with macros */
object DottyPredef extends I6 {

/** ClassTags for final classes */
implicit val NothingClassTag: ClassTag[Nothing] = ClassTag.Nothing
}
22 changes: 15 additions & 7 deletions src/dotty/tools/dotc/core/Contexts.scala
Original file line number Diff line number Diff line change
Expand Up @@ -386,13 +386,6 @@ object Contexts {
final def withOwner(owner: Symbol): Context =
if (owner ne this.owner) fresh.setOwner(owner) else this

final def withMode(mode: Mode): Context =
if (mode != this.mode) fresh.setMode(mode) else this

final def addMode(mode: Mode): Context = withMode(this.mode | mode)
final def maskMode(mode: Mode): Context = withMode(this.mode & mode)
final def retractMode(mode: Mode): Context = withMode(this.mode &~ mode)

override def toString =
"Context(\n" +
(outersIterator map ( ctx => s" owner = ${ctx.owner}, scope = ${ctx.scope}") mkString "\n")
Expand Down Expand Up @@ -444,6 +437,21 @@ object Contexts {
def setDebug = setSetting(base.settings.debug, true)
}

implicit class ModeChanges(val c: Context) extends AnyVal {
final def withMode(mode: Mode): Context =
if (mode != c.mode) c.fresh.setMode(mode) else c

final def addMode(mode: Mode): Context = withMode(c.mode | mode)
final def maskMode(mode: Mode): Context = withMode(c.mode & mode)
final def retractMode(mode: Mode): Context = withMode(c.mode &~ mode)
}

implicit class FreshModeChanges(val c: FreshContext) extends AnyVal {
final def addMode(mode: Mode): c.type = c.setMode(c.mode | mode)
final def maskMode(mode: Mode): c.type = c.setMode(c.mode & mode)
final def retractMode(mode: Mode): c.type = c.setMode(c.mode &~ mode)
}

/** A class defining the initial context with given context base
* and set of possible settings.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/dotty/tools/dotc/printing/PlainPrinter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import typer.Mode
import scala.annotation.switch

class PlainPrinter(_ctx: Context) extends Printer {
protected[this] implicit def ctx: Context = _ctx.fresh.addMode(Mode.Printing)
protected[this] implicit def ctx: Context = _ctx.addMode(Mode.Printing)

protected def maxToTextRecursions = 100

Expand Down
3 changes: 2 additions & 1 deletion src/dotty/tools/dotc/printing/RefinedPrinter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,8 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
case JavaArrayType(elemtp) =>
return toText(elemtp) ~ "[]"
case tp: SelectionProto =>
return "?{ " ~ toText(tp.name) ~ ": " ~ toText(tp.memberProto) ~ " }"
return "?{ " ~ toText(tp.name) ~ (" " provided !tp.name.decode.last.isLetterOrDigit) ~
": " ~ toText(tp.memberProto) ~ " }"
case tp: ViewProto =>
return toText(tp.argType) ~ " ?=>? " ~ toText(tp.resultType)
case tp @ FunProto(args, resultType, _) =>
Expand Down
16 changes: 11 additions & 5 deletions src/dotty/tools/dotc/typer/Implicits.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

Expand Down Expand Up @@ -384,7 +384,9 @@ trait Implicits { self: Typer =>
&& (ctx.mode is Mode.ImplicitsEnabled)
&& from.isInstanceOf[ValueType]
&& ( from.isValueSubType(to)
|| inferView(dummyTreeOfType(from), to)(ctx.fresh.setExploreTyperState).isInstanceOf[SearchSuccess]
|| inferView(dummyTreeOfType(from), to)
(ctx.fresh.addMode(Mode.ImplicitExploration).setExploreTyperState)
.isInstanceOf[SearchSuccess]
)
)

Expand Down Expand Up @@ -480,7 +482,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 {
Expand Down Expand Up @@ -514,8 +517,11 @@ trait Implicits { self: Typer =>
case fail: SearchFailure =>
rankImplicits(pending1, acc)
case best: SearchSuccess =>
val newPending = pending1 filter (isAsGood(_, best.ref)(nestedContext.setExploreTyperState))
rankImplicits(newPending, best :: acc)
if (ctx.mode.is(Mode.ImplicitExploration)) best :: Nil
else {
val newPending = pending1 filter (isAsGood(_, best.ref)(nestedContext.setExploreTyperState))
rankImplicits(newPending, best :: acc)
}
}
case nil => acc
}
Expand Down
6 changes: 6 additions & 0 deletions src/dotty/tools/dotc/typer/Mode.scala
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,11 @@ object Mode {
*/
val ImplicitShadowing = newMode(11, "ImplicitShadowing")

/** We are currently in a `viewExists` check. In that case, ambiguous
* implicits checks are disabled and we succeed with the first implicit
* found.
*/
val ImplicitExploration = newMode(12, "ImplicitExploration")

val PatternOrType = Pattern | Type
}
2 changes: 1 addition & 1 deletion src/dotty/tools/dotc/typer/Namer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ class Namer { typer: Typer =>

// println(s"final inherited for $sym: ${inherited.toString}") !!!
// println(s"owner = ${sym.owner}, decls = ${sym.owner.info.decls.show}")
val rhsCtx = ctx.fresh addMode Mode.InferringReturnType
val rhsCtx = ctx.addMode(Mode.InferringReturnType)
def rhsType = ctx.deskolemize(
typedAheadExpr(mdef.rhs, rhsProto)(rhsCtx).tpe.widen.approximateUnion)
def lhsType = fullyDefinedType(rhsType, "right-hand side", mdef.pos)
Expand Down
File renamed without changes.
File renamed without changes.