From b8fad2bb6dfb24ced2f633b774bf123092082a99 Mon Sep 17 00:00:00 2001 From: Win Wang Date: Tue, 1 Oct 2019 15:06:33 -0700 Subject: [PATCH] Fix parenthesization of ascribed function types with single tuple argument --- .../src/main/scala/rsc/tests/BetterRscCompat.scala | 7 +++++++ .../src/main/scala/rsc/tests/BetterRscCompat.scala | 7 +++++++ .../scala/rsc/rules/pretty/SemanticdbPrinter.scala | 13 +++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/scalafix/input/src/main/scala/rsc/tests/BetterRscCompat.scala b/scalafix/input/src/main/scala/rsc/tests/BetterRscCompat.scala index 2a49d69b..d11c23c2 100644 --- a/scalafix/input/src/main/scala/rsc/tests/BetterRscCompat.scala +++ b/scalafix/input/src/main/scala/rsc/tests/BetterRscCompat.scala @@ -283,4 +283,11 @@ object BetterRscCompat_Test { class H extends V } + + object FunctionTypes { + + val f1 = (_: (Int, Int)) => () + + def f2 = (_: (Int, Int), _: Int) => () + } } diff --git a/scalafix/output/src/main/scala/rsc/tests/BetterRscCompat.scala b/scalafix/output/src/main/scala/rsc/tests/BetterRscCompat.scala index 9ed8b5e0..1f6fb81e 100644 --- a/scalafix/output/src/main/scala/rsc/tests/BetterRscCompat.scala +++ b/scalafix/output/src/main/scala/rsc/tests/BetterRscCompat.scala @@ -283,4 +283,11 @@ object BetterRscCompat_Test { class H extends V } + + object FunctionTypes { + + val f1: ((Int, Int)) => Unit = (_: (Int, Int)) => () + + def f2: ((Int, Int), Int) => Unit = (_: (Int, Int), _: Int) => () + } } diff --git a/scalafix/rules/src/main/scala/rsc/rules/pretty/SemanticdbPrinter.scala b/scalafix/rules/src/main/scala/rsc/rules/pretty/SemanticdbPrinter.scala index 921380e7..321590f8 100644 --- a/scalafix/rules/src/main/scala/rsc/rules/pretty/SemanticdbPrinter.scala +++ b/scalafix/rules/src/main/scala/rsc/rules/pretty/SemanticdbPrinter.scala @@ -30,13 +30,22 @@ class SemanticdbPrinter( rep(args, ", ")(normal) str(")") } else if (sym.startsWith("scala/Function")) { - var params :+ ret = args + val params :+ ret = args val hasByNameArg = params.exists(_.isInstanceOf[s.ByNameType]) val hasFunctionArg = params.exists { case s.TypeRef(pre, sym, args) if sym.startsWith("scala/Function") => true case _ => false } - val needsExtraParens = hasFunctionArg || hasByNameArg || (params.length != 1) + val singleTupleArg = params.length == 1 && (params.head match { + case s.TypeRef(_, argSym, _) => argSym.startsWith("scala/Tuple") + case _ => false + }) + + val needsExtraParens = hasFunctionArg || + hasByNameArg || + singleTupleArg || + (params.length != 1) + if (needsExtraParens) str("(") rep(params, ", ") { normal } if (needsExtraParens) str(")")