|
Scala example source code file (UnCurry.scala)
The UnCurry.scala Scala example source codepackage scala package reflect package internal package transform import Flags._ trait UnCurry { val global: SymbolTable import global._ import definitions._ /** Note: changing tp.normalize to tp.dealias in this method leads to a single * test failure: run/t5688.scala, where instead of the expected output * Vector(ta, tb, tab) * we instead get * Vector(tab, tb, tab) * I think that difference is not the product of sentience but of randomness. * Let us figure out why it is and then change this method. */ private def expandAlias(tp: Type): Type = if (!tp.isHigherKinded) tp.normalize else tp val uncurry: TypeMap = new TypeMap { def apply(tp0: Type): Type = { val tp = expandAlias(tp0) tp match { case MethodType(params, MethodType(params1, restpe)) => // This transformation is described in UnCurryTransformer.dependentParamTypeErasure val packSymbolsMap = new TypeMap { // Wrapping in a TypeMap to reuse the code that opts for a fast path if the function is an identity. def apply(tp: Type): Type = packSymbols(params, tp) } val existentiallyAbstractedParam1s = packSymbolsMap.mapOver(params1) val substitutedResult = restpe.substSym(params1, existentiallyAbstractedParam1s) apply(MethodType(params ::: existentiallyAbstractedParam1s, substitutedResult)) case MethodType(params, ExistentialType(tparams, restpe @ MethodType(_, _))) => abort("unexpected curried method types with intervening existential") case MethodType(h :: t, restpe) if h.isImplicit => apply(MethodType(h.cloneSymbol.resetFlag(IMPLICIT) :: t, restpe)) case NullaryMethodType(restpe) => apply(MethodType(List(), restpe)) case TypeRef(pre, ByNameParamClass, arg :: Nil) => apply(functionType(List(), arg)) case TypeRef(pre, RepeatedParamClass, arg :: Nil) => apply(seqType(arg)) case TypeRef(pre, JavaRepeatedParamClass, arg :: Nil) => apply(arrayType( if (isUnboundedGeneric(arg)) ObjectTpe else arg)) case _ => expandAlias(mapOver(tp)) } } } private val uncurryType = new TypeMap { def apply(tp0: Type): Type = { val tp = expandAlias(tp0) tp match { case ClassInfoType(parents, decls, clazz) => val parents1 = parents mapConserve uncurry if (parents1 eq parents) tp else ClassInfoType(parents1, decls, clazz) // @MAT normalize in decls?? case PolyType(_, _) => mapOver(tp) case _ => tp } } } /** - return symbol's transformed type, * - if symbol is a def parameter with transformed type T, return () => T * * @MAT: starting with this phase, the info of every symbol will be normalized */ def transformInfo(sym: Symbol, tp: Type): Type = if (sym.isType) uncurryType(tp) else uncurry(tp) } Other Scala source code examplesHere is a short list of links related to this Scala UnCurry.scala source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.