Skip to content

Commit

Permalink
Examine args only once
Browse files Browse the repository at this point in the history
  • Loading branch information
som-snytt committed Mar 3, 2024
1 parent f6ae7c3 commit bb0b858
Showing 1 changed file with 15 additions and 14 deletions.
29 changes: 15 additions & 14 deletions src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
Original file line number Diff line number Diff line change
Expand Up @@ -1738,22 +1738,23 @@ abstract class RefChecks extends Transform {
def onlyLeadingBool = numBools == 1 && params.head.tpe == BooleanTpe
val checkable = if (settings.Ylint.value) numBools > 0 && !onlyLeadingBool else numBools >= 2
if (checkable) {
val unnamed = args.lazyZip(params).iterator
.filter {
case (arg, param) if param.tpe.typeSymbol == BooleanClass =>
val suspicious = arg match {
case Literal(Constant(_: Boolean)) => isUnnamedArg(arg)
case _ => arg.symbol != null && arg.symbol.isDefaultGetter
}
suspicious && !param.deprecatedParamName.contains(nme.NO_NAME)
case _ => false
val (unnamed, numSuspicious) = args.lazyZip(params).iterator
.foldLeft((List.empty[(Tree, Symbol)], 0)) { (acc, ap) =>
ap match {
case (arg, param) if param.tpe.typeSymbol == BooleanClass && !param.deprecatedParamName.contains(nme.NO_NAME) =>
arg match {
case Literal(Constant(_: Boolean)) =>
if (isUnnamedArg(arg)) (ap :: acc._1, acc._2 + 1) else acc
case _ =>
if (arg.symbol != null && arg.symbol.isDefaultGetter) (acc._1, acc._2 + 1) else acc
}
case _ => acc
}
}
.toList
val hasLiteral = unnamed.exists { case (arg, _) => isUnnamedArg(arg) case _ => false }
val warn = hasLiteral && (settings.Ylint.value || unnamed.lengthCompare(2) >= 0)
val warn = !unnamed.isEmpty && (settings.Ylint.value || numSuspicious >= 2)
if (warn)
unnamed.foreach {
case (arg, param) if isUnnamedArg(arg) =>
unnamed.reverse.foreach {
case (arg, param) =>
val msg = s"Boolean literals should be passed using named argument syntax for parameter ${param.name}."
val action = runReporting.codeAction("name boolean literal", arg.pos.withEnd(arg.pos.start), s"${param.name} = ", msg)
runReporting.warning(arg.pos, msg, WarningCategory.WFlagNamedLiteral, sym, action)
Expand Down

0 comments on commit bb0b858

Please sign in to comment.