Skip to content

Commit

Permalink
Reduce multiarg infix applications
Browse files Browse the repository at this point in the history
  • Loading branch information
som-snytt committed May 4, 2020
1 parent 0aad2ab commit 53200dc
Show file tree
Hide file tree
Showing 44 changed files with 138 additions and 147 deletions.
2 changes: 1 addition & 1 deletion src/compiler/scala/reflect/macros/compiler/Errors.scala
Expand Up @@ -100,7 +100,7 @@ trait Errors extends Traces {

private def showMeth(pss: List[List[Symbol]], restpe: Type, abbreviate: Boolean, untype: Boolean) = {
def preprocess(tpe: Type) = if (untype) untypeMetalevel(tpe) else tpe
var pssPart = (pss map (ps => ps map (p => p.defStringSeenAs(preprocess(p.info))) mkString ("(", ", ", ")"))).mkString
var pssPart = pss.map(_.map(p => p.defStringSeenAs(preprocess(p.info))).mkString("(", ", ", ")")).mkString
if (abbreviate) pssPart = abbreviateCoreAliases(pssPart)
var retPart = preprocess(restpe).toString
if (abbreviate || macroDdef.tpt.tpe == null) retPart = abbreviateCoreAliases(retPart)
Expand Down
1 change: 1 addition & 0 deletions src/compiler/scala/reflect/reify/utils/SymbolTables.scala
Expand Up @@ -58,6 +58,7 @@ trait SymbolTables {
case None => EmptyTree
}

@deprecated("use add instead", since="2.13.3")
def +(sym: Symbol, name: TermName, reification: Tree): SymbolTable = add(sym, name, reification)
def +(symDef: Tree): SymbolTable = add(symDef)
def ++(symDefs: IterableOnce[Tree]): SymbolTable = symDefs.iterator.foldLeft(this)((symtab, symDef) => symtab.add(symDef))
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/Reporting.scala
Expand Up @@ -229,7 +229,7 @@ trait Reporting extends internal.Reporting { self: ast.Positions with Compilatio
)
reportedFeature += featureTrait

val msg = s"$featureDesc $req be enabled\nby making the implicit value $fqname visible.$explain" replace ("#", construct)
val msg = s"$featureDesc $req be enabled\nby making the implicit value $fqname visible.$explain".replace("#", construct)
// maybe pos.source.file.file.getParentFile.getName or Path(source.file.file).parent.name
def parentFileName(source: internal.util.SourceFile) =
Option(java.nio.file.Paths.get(source.path).getParent).map(_.getFileName.toString)
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/ast/TreeGen.scala
Expand Up @@ -364,7 +364,7 @@ abstract class TreeGen extends scala.reflect.internal.TreeGen with TreeDSL {
}

def expandFunction(localTyper: analyzer.Typer)(fun: Function, inConstructorFlag: Long): Tree = {
val anonClass = fun.symbol.owner newAnonymousFunctionClass(fun.pos, inConstructorFlag)
val anonClass = fun.symbol.owner.newAnonymousFunctionClass(fun.pos, inConstructorFlag)
val parents = if (isFunctionType(fun.tpe)) {
anonClass addAnnotation SerialVersionUIDAnnotation
addSerializable(abstractFunctionType(fun.vparams.map(_.symbol.tpe), fun.body.tpe.deconst))
Expand Down
18 changes: 9 additions & 9 deletions src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
Expand Up @@ -2187,7 +2187,7 @@ self =>
private def addMod(mods: Modifiers, mod: Long, pos: Position): Modifiers = {
if (mods hasFlag mod) syntaxError(in.offset, "repeated modifier", skipIt = false)
in.nextToken()
(mods | mod) withPosition (mod, pos)
(mods | mod).withPosition(mod, pos)
}

private def tokenRange(token: TokenData) =
Expand Down Expand Up @@ -2397,7 +2397,7 @@ self =>
if (mods.isLazy) syntaxError("lazy modifier not allowed here. Use call-by-name parameters instead", skipIt = false)
in.token match {
case v @ (VAL | VAR) =>
mods = mods withPosition (in.token.toLong, tokenRange(in))
mods = mods.withPosition(in.token.toLong, tokenRange(in))
if (v == VAR) mods |= Flags.MUTABLE
in.nextToken()
case _ =>
Expand Down Expand Up @@ -2632,13 +2632,13 @@ self =>
syntaxError("lazy not allowed here. Only vals can be lazy", skipIt = false)
in.token match {
case VAL =>
patDefOrDcl(pos, mods withPosition(VAL, tokenRange(in)))
patDefOrDcl(pos, mods.withPosition(VAL, tokenRange(in)))
case VAR =>
patDefOrDcl(pos, (mods | Flags.MUTABLE) withPosition (VAR, tokenRange(in)))
patDefOrDcl(pos, (mods | Flags.MUTABLE).withPosition(VAR, tokenRange(in)))
case DEF =>
List(funDefOrDcl(pos, mods withPosition(DEF, tokenRange(in))))
List(funDefOrDcl(pos, mods.withPosition(DEF, tokenRange(in))))
case TYPE =>
List(typeDefOrDcl(pos, mods withPosition(TYPE, tokenRange(in))))
List(typeDefOrDcl(pos, mods.withPosition(TYPE, tokenRange(in))))
case _ =>
List(tmplDef(pos, mods))
}
Expand Down Expand Up @@ -2897,15 +2897,15 @@ self =>
if (mods.isLazy) syntaxError("classes cannot be lazy", skipIt = false)
in.token match {
case TRAIT =>
classDef(pos, (mods | Flags.TRAIT | Flags.ABSTRACT) withPosition (Flags.TRAIT, tokenRange(in)))
classDef(pos, (mods | Flags.TRAIT | Flags.ABSTRACT).withPosition(Flags.TRAIT, tokenRange(in)))
case CLASS =>
classDef(pos, mods)
case CASECLASS =>
classDef(pos, (mods | Flags.CASE) withPosition (Flags.CASE, tokenRange(in.prev /*scanner skips on 'case' to 'class', thus take prev*/)))
classDef(pos, (mods | Flags.CASE).withPosition(Flags.CASE, tokenRange(in.prev /*scanner skips on 'case' to 'class', thus take prev*/)))
case OBJECT =>
objectDef(pos, mods)
case CASEOBJECT =>
objectDef(pos, (mods | Flags.CASE) withPosition (Flags.CASE, tokenRange(in.prev /*scanner skips on 'case' to 'object', thus take prev*/)))
objectDef(pos, (mods | Flags.CASE).withPosition(Flags.CASE, tokenRange(in.prev /*scanner skips on 'case' to 'object', thus take prev*/)))
case _ =>
syntaxErrorOrIncompleteAnd("expected start of definition", skipIt = true)(
// assume a class definition so as to have somewhere to stash the annotations
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/symtab/SymbolTrackers.scala
Expand Up @@ -147,7 +147,7 @@ trait SymbolTrackers {
else {
indicatorString + indent + symString(root) + (
if (children.isEmpty) ""
else children map (c => c.indentString(indent + " ")) mkString ("\n", "\n", "")
else children.map(_.indentString(indent + " ")).mkString("\n", "\n", "")
)
}
}
Expand Down
14 changes: 4 additions & 10 deletions src/compiler/scala/tools/nsc/transform/Constructors.scala
Expand Up @@ -272,16 +272,10 @@ abstract class Constructors extends Statics with Transform with TypingTransforme

closureClass setInfoAndEnter new ClassInfoType(closureParents, newScope, closureClass)

val outerField: TermSymbol = (
closureClass
newValue(nme.OUTER, impl.pos, PrivateLocal | PARAMACCESSOR)
setInfoAndEnter clazz.tpe
)
val applyMethod: MethodSymbol = (
closureClass
newMethod(nme.apply, impl.pos, FINAL)
setInfoAndEnter MethodType(Nil, ObjectTpe)
)
val outerField: TermSymbol =
closureClass.newValue(nme.OUTER, impl.pos, PrivateLocal | PARAMACCESSOR) setInfoAndEnter clazz.tpe
val applyMethod: MethodSymbol =
closureClass.newMethod(nme.apply, impl.pos, FINAL) setInfoAndEnter MethodType(Nil, ObjectTpe)
val outerFieldDef = ValDef(outerField)
val closureClassTyper = localTyper.atOwner(closureClass)
val applyMethodTyper = closureClassTyper.atOwner(applyMethod)
Expand Down
6 changes: 3 additions & 3 deletions src/compiler/scala/tools/nsc/transform/ExtensionMethods.scala
Expand Up @@ -138,14 +138,14 @@ abstract class ExtensionMethods extends Transform with TypingTransformers {
val resultType = MethodType(List(thisParam), dropNullaryMethod(methodResult))
val selfParamType = singleType(currentOwner.companionModule.thisType, thisParam)

def fixres(tp: Type) = tp substThisAndSym (clazz, selfParamType, clazz.typeParams, tparamsFromClass)
def fixtparam(tp: Type) = tp substSym (clazz.typeParams, tparamsFromClass)
def fixres(tp: Type) = tp.substThisAndSym(clazz, selfParamType, clazz.typeParams, tparamsFromClass)
def fixtparam(tp: Type) = tp.substSym(clazz.typeParams, tparamsFromClass)

// We can't substitute symbols on the entire polytype because we
// need to modify the bounds of the cloned type parameters, but we
// don't want to substitute for the cloned type parameters themselves.
val tparams = tparamsFromMethod ::: tparamsFromClass
tparams foreach (_ modifyInfo fixtparam)
tparams.foreach(_ modifyInfo fixtparam)
GenPolyType(tparams, fixres(resultType))

// For reference, calling fix on the GenPolyType plays out like this:
Expand Down
Expand Up @@ -804,7 +804,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers {
def overrideIn(clazz: Symbol, sym: Symbol) = {
val newFlags = (sym.flags | OVERRIDE | SPECIALIZED) & ~(DEFERRED | CASEACCESSOR | PARAMACCESSOR)
val sym1 = sym.cloneSymbol(clazz, newFlags)
sym1 modifyInfo (_ asSeenFrom (clazz.tpe, sym1.owner))
sym1.modifyInfo(_.asSeenFrom(clazz.tpe, sym1.owner))
}
val specVal = specializedOverload(sClass, m, env)

Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/transform/TailCalls.scala
Expand Up @@ -174,7 +174,7 @@ abstract class TailCalls extends Transform {
val thisParam = method.newSyntheticValueParam(currentClass.typeOfThis)
label setInfo MethodType(thisParam :: method.tpe.params, method.tpe_*.finalResultType)
if (isEligible)
label substInfo (method.tpe.typeParams, tparams)
label.substInfo(method.tpe.typeParams, tparams)

label
}
Expand Down
10 changes: 5 additions & 5 deletions src/compiler/scala/tools/nsc/transform/patmat/Logic.scala
Expand Up @@ -517,7 +517,7 @@ trait ScalaLogic extends Interface with Logic with TreeAndTypeAnalysis {

def resetUniques() = {_nextId = 0; uniques.clear()}
private val uniques = new mutable.HashMap[Tree, Var]
def apply(x: Tree): Var = uniques getOrElseUpdate(x, new Var(x, x.tpe))
def apply(x: Tree): Var = uniques.getOrElseUpdate(x, new Var(x, x.tpe))
def unapply(v: Var) = Some(v.path)
}
class Var(val path: Tree, staticTp: Type) extends AbsVar {
Expand Down Expand Up @@ -575,11 +575,11 @@ trait ScalaLogic extends Interface with Logic with TreeAndTypeAnalysis {

// populate equalitySyms
// don't care about the result, but want only one fresh symbol per distinct constant c
def registerEquality(c: Const): Unit = {ensureCanModify(); symForEqualsTo getOrElseUpdate(c, Sym(this, c))}
def registerEquality(c: Const): Unit = { ensureCanModify() ; symForEqualsTo.getOrElseUpdate(c, Sym(this, c)) }

// return the symbol that represents this variable being equal to the constant `c`, if it exists, otherwise False (for robustness)
// (registerEquality(c) must have been called prior, either when constructing the domain or from outside)
def propForEqualsTo(c: Const): Prop = {observed(); symForEqualsTo.getOrElse(c, False)}
def propForEqualsTo(c: Const): Prop = { observed() ; symForEqualsTo.getOrElse(c, False) }

// [implementation NOTE: don't access until all potential equalities have been registered using registerEquality]p
/** the information needed to construct the boolean proposition that encodes the equality proposition (V = C)
Expand Down Expand Up @@ -709,8 +709,8 @@ trait ScalaLogic extends Interface with Logic with TreeAndTypeAnalysis {
// don't call until all equalities have been registered and registerNull has been called (if needed)
def describe = {
def domain_s = domain match {
case Some(d) => d mkString (" ::= ", " | ", "// "+ symForEqualsTo.keys)
case _ => symForEqualsTo.keys mkString (" ::= ", " | ", " | ...")
case Some(d) => d.mkString(" ::= ", " | ", "// "+ symForEqualsTo.keys)
case _ => symForEqualsTo.keys.mkString(" ::= ", " | ", " | ...")
}
s"$this: ${staticTp}${domain_s} // = $path"
}
Expand Down
Expand Up @@ -234,14 +234,14 @@ trait MatchApproximation extends TreeAndTypeAnalysis with ScalaLogic with MatchT
private[this] val uniqueTypeProps = new mutable.HashMap[(Tree, Type), Eq]

def uniqueEqualityProp(testedPath: Tree, rhs: Tree): Prop =
uniqueEqualityProps getOrElseUpdate((testedPath, rhs), Eq(Var(testedPath), ValueConst(rhs)))
uniqueEqualityProps.getOrElseUpdate((testedPath, rhs), Eq(Var(testedPath), ValueConst(rhs)))

// overridden in TreeMakersToPropsIgnoreNullChecks
def uniqueNonNullProp (testedPath: Tree): Prop =
uniqueNonNullProps getOrElseUpdate(testedPath, Not(Eq(Var(testedPath), NullConst)))
uniqueNonNullProps.getOrElseUpdate(testedPath, Not(Eq(Var(testedPath), NullConst)))

def uniqueTypeProp(testedPath: Tree, pt: Type): Prop =
uniqueTypeProps getOrElseUpdate((testedPath, pt), Eq(Var(testedPath), TypeConst(checkableType(pt))))
uniqueTypeProps.getOrElseUpdate((testedPath, pt), Eq(Var(testedPath), TypeConst(checkableType(pt))))

// a variable in this set should never be replaced by a tree that "does not consist of a selection on a variable in this set" (intuitively)
private val pointsToBound = mutable.HashSet(root)
Expand Down Expand Up @@ -646,7 +646,7 @@ trait MatchAnalysis extends MatchApproximation {

def varAssignmentString(varAssignment: Map[Var, (Seq[Const], Seq[Const])]) =
varAssignment.toSeq.sortBy(_._1.toString).map { case (v, (trues, falses)) =>
val assignment = "== "+ (trues mkString("(", ", ", ")")) +" != ("+ (falses mkString(", ")) +")"
val assignment = "== "+ trues.mkString("(", ", ", ")") +" != ("+ falses.mkString(", ") +")"
v +"(="+ v.path +": "+ v.staticTpCheckable +") "+ assignment
}.mkString("\n")

Expand Down
Expand Up @@ -294,7 +294,7 @@ trait Interface extends ast.TreeDSL {
}
new Substitution(newFrom.prependToList(other.from), newTo.prependToList(other.to.mapConserve(apply)))
}
override def toString = (from.map(_.name) zip to) mkString("Substitution(", ", ", ")")
override def toString = from.map(_.name).zip(to).mkString("Substitution(", ", ", ")")
}

object EmptySubstitution extends Substitution(Nil, Nil) {
Expand Down
Expand Up @@ -188,7 +188,7 @@ trait NamesDefaults { self: Analyzer =>
blockTyper.context.scope enter sym
val vd = atPos(sym.pos)(ValDef(sym, qual) setType NoType)
// it stays in Vegas: scala/bug#5720, scala/bug#5727
qual changeOwner (blockTyper.context.owner, sym)
qual.changeOwner(blockTyper.context.owner, sym)

val newQual = atPos(qual.pos.focus)(blockTyper.typedQualifier(Ident(sym.name)))
val baseFunTransformed = atPos(baseFun.pos.makeTransparent) {
Expand Down
Expand Up @@ -434,7 +434,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT
if (owner.isClass) validCurrentOwner = true
val savedLocalTyper = localTyper
localTyper = localTyper.atOwner(tree, if (owner.isModuleNotMethod) owner.moduleClass else owner)
typers = typers updated (owner, localTyper)
typers = typers.updated(owner, localTyper)
val result = super.atOwner(tree, owner)(trans)
localTyper = savedLocalTyper
validCurrentOwner = savedValid
Expand Down
10 changes: 5 additions & 5 deletions src/compiler/scala/tools/nsc/typechecker/TypeDiagnostics.scala
Expand Up @@ -145,7 +145,7 @@ trait TypeDiagnostics {
case _ => Nil
}
def alternativesString(tree: Tree) =
alternatives(tree) map (x => " " + methodTypeErrorString(x)) mkString ("", " <and>\n", "\n")
alternatives(tree).map(x => " " + methodTypeErrorString(x)).mkString("", " <and>\n", "\n")

/** The symbol which the given accessor represents (possibly in part).
* This is used for error messages, where we want to speak in terms
Expand Down Expand Up @@ -278,7 +278,7 @@ trait TypeDiagnostics {
val messages = relationships.flatten
// the condition verifies no type argument came back None
if (messages.size == foundArgs.size)
return messages filterNot (_ == "") mkString ("\n", "\n", "")
return messages.filterNot(_ == "").mkString("\n", "\n", "")
}
}
}
Expand Down Expand Up @@ -344,13 +344,13 @@ trait TypeDiagnostics {
val caseString =
if (clazz.isCaseClass && (clazz isSubClass ptSym))
( clazz.caseFieldAccessors
map (_ => "_") // could use the actual param names here
mkString (s"`case ${clazz.name}(", ",", ")`")
.map(_ => "_") // could use the actual param names here
.mkString(s"`case ${clazz.name}(", ",", ")`")
)
else
"`case _: " + (clazz.typeParams match {
case Nil => "" + clazz.name
case xs => xs map (_ => "_") mkString (clazz.name + "[", ",", "]")
case xs => xs.map(_ => "_").mkString(clazz.name + "[", ",", "]")
})+ "`"

if (!clazz.exists) ""
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/nsc/typechecker/Typers.scala
Expand Up @@ -2775,7 +2775,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper

// applyOrElse's default parameter:
val B1 = methodSym newTypeParameter (newTypeName("B1")) setInfo TypeBounds.empty
val default = methodSym newValueParameter (newTermName("default"), tree.pos.focus, SYNTHETIC) setInfo functionType(List(A1.tpe), B1.tpe)
val default = methodSym.newValueParameter(newTermName("default"), tree.pos.focus, SYNTHETIC) setInfo functionType(List(A1.tpe), B1.tpe)

val paramSyms = List(x, default)
methodSym setInfo genPolyType(List(A1, B1), MethodType(paramSyms, B1.tpe))
Expand Down
2 changes: 1 addition & 1 deletion src/compiler/scala/tools/reflect/ToolBoxFactory.scala
Expand Up @@ -246,7 +246,7 @@ abstract class ToolBoxFactory[U <: JavaUniverse](val u: U) { factorySelf =>
case _ => NoSymbol
}
trace("wrapping ")(defOwner(expr) -> meth)
val methdef = DefDef(meth, expr changeOwner (defOwner(expr), meth))
val methdef = DefDef(meth, expr.changeOwner(defOwner(expr), meth))

val moduledef = ModuleDef(
obj,
Expand Down
4 changes: 2 additions & 2 deletions src/interactive/scala/tools/nsc/interactive/Global.scala
Expand Up @@ -876,10 +876,10 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
sym.isType || {
try {
val tp1 = pre.memberType(alt) onTypeError NoType
val tp2 = adaptToNewRunMap(sym.tpe) substSym (originalTypeParams, sym.owner.typeParams)
val tp2 = adaptToNewRunMap(sym.tpe).substSym(originalTypeParams, sym.owner.typeParams)
matchesType(tp1, tp2, alwaysMatchSimple = false) || {
debugLog(s"findMirrorSymbol matchesType($tp1, $tp2) failed")
val tp3 = adaptToNewRunMap(sym.tpe) substSym (originalTypeParams, alt.owner.typeParams)
val tp3 = adaptToNewRunMap(sym.tpe).substSym(originalTypeParams, alt.owner.typeParams)
matchesType(tp1, tp3, alwaysMatchSimple = false) || {
debugLog(s"findMirrorSymbol fallback matchesType($tp1, $tp3) failed")
false
Expand Down

0 comments on commit 53200dc

Please sign in to comment.