diff options
author | Martin Odersky <odersky@gmail.com> | 2017-03-18 11:48:48 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-04-06 13:15:28 +0200 |
commit | c67217594bb40e1eab7e567c97bdf29ac0654864 (patch) | |
tree | d6f684b1854b5f869c98e444a558aee3878e02a2 /compiler/src/dotty/tools/dotc/core/Types.scala | |
parent | db4f7a19c9329d59da09a4de6b8476b4b6988cdf (diff) | |
download | dotty-c67217594bb40e1eab7e567c97bdf29ac0654864.tar.gz dotty-c67217594bb40e1eab7e567c97bdf29ac0654864.tar.bz2 dotty-c67217594bb40e1eab7e567c97bdf29ac0654864.zip |
Eliminate LambdaAbstract
Use fromParams instead.
Diffstat (limited to 'compiler/src/dotty/tools/dotc/core/Types.scala')
-rw-r--r-- | compiler/src/dotty/tools/dotc/core/Types.scala | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/Types.scala b/compiler/src/dotty/tools/dotc/core/Types.scala index a7401f6f9..4ba0a2924 100644 --- a/compiler/src/dotty/tools/dotc/core/Types.scala +++ b/compiler/src/dotty/tools/dotc/core/Types.scala @@ -2566,12 +2566,11 @@ object Types { protected def paramName(param: ParamInfo.Of[N])(implicit ctx: Context): N = param.paramName - protected def paramInfo(param: ParamInfo.Of[N])(implicit ctx: Context): Type = - param.paramInfo - def fromParams[PI <: ParamInfo.Of[N]](params: List[PI], resultType: Type)(implicit ctx: Context): LT = - apply(params.map(paramName))( - tl => params.map(param => tl.integrate(params, paramInfo(param)).asInstanceOf[PInfo]), + def fromParams[PI <: ParamInfo.Of[N]](params: List[PI], resultType: Type)(implicit ctx: Context): Type = + if (params.isEmpty) resultType + else apply(params.map(paramName))( + tl => params.map(param => tl.integrate(params, param.paramInfo).asInstanceOf[PInfo]), tl => tl.integrate(params, resultType)) } @@ -2755,6 +2754,25 @@ object Types { override def paramName(param: ParamInfo.Of[TypeName])(implicit ctx: Context): TypeName = param.paramName.withVariance(param.paramVariance) + + /** Distributes Lambda inside type bounds. Examples: + * + * type T[X] = U becomes type T = [X] -> U + * type T[X] <: U becomes type T >: Nothign <: ([X] -> U) + * type T[X] >: L <: U becomes type T >: ([X] -> L) <: ([X] -> U) + */ + override def fromParams[PI <: ParamInfo.Of[TypeName]](params: List[PI], resultType: Type)(implicit ctx: Context): Type = { + def expand(tp: Type) = PolyType.fromParams(params, tp) //### + resultType match { + case rt: TypeAlias => + rt.derivedTypeAlias(expand(rt.alias)) + case rt @ TypeBounds(lo, hi) => + rt.derivedTypeBounds( + if (lo.isRef(defn.NothingClass)) lo else expand(lo), expand(hi)) + case rt => + expand(rt) + } + } } object PolyType extends TypeLambdaCompanion[PolyType] { |