Skip to content

Commit c093147

Browse files
committed
clarify when varargs should be called
Given an overload with options like `(a: A, x: T)` and `(a: A, xs: T*)`, you'll get the first alternative when supplying two arguments: ``` scala> object O { def o(x: Int, y: String) = "1"; def o(x: Int, y: String*) = "multi" } defined object O scala> O.o(1, "a") res0: String = 1 ``` This is true on 2.12 and 2.13. I don't understand what the original code was testing, so I hope I fixed it correctly...
1 parent 7e21de4 commit c093147

File tree

4 files changed

+76
-69
lines changed

4 files changed

+76
-69
lines changed

src/main/scala/com/typesafe/scalalogging/package.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@ package object scalalogging {
2323
type Seq[+A] = scala.collection.immutable.Seq[A]
2424

2525
type IndexedSeq[+A] = scala.collection.immutable.IndexedSeq[A]
26+
2627
}

src/test/scala/com/typesafe/scalalogging/LoggerSpec.scala

Lines changed: 33 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,13 @@ import org.slf4j.{ Logger => Underlying }
2424
import org.scalatest.{ Matchers, WordSpec }
2525
import org.scalatest.mockito.MockitoSugar
2626

27-
class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
27+
trait Varargs {
28+
// TODO: we used to wrap in List(...): _*, which I assume was to force the varags method to be chosen.
29+
// I encapsulated that here in something that works across 2.12/2.13.
30+
def forceVarargs[T](xs: T*): scala.Seq[T] = scala.Seq(xs: _*)
31+
}
32+
33+
class LoggerSpec extends WordSpec with Matchers with MockitoSugar with Varargs {
2834

2935
// Error
3036

@@ -58,7 +64,7 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
5864
val f = fixture(_.isErrorEnabled, isEnabled = true)
5965
import f._
6066
logger.error(s"msg $arg1 $arg2")
61-
verify(underlying).error("msg {} {}", List(arg1, arg2): _*)
67+
verify(underlying).error("msg {} {}", forceVarargs(arg1, arg2): _*)
6268
}
6369

6470
}
@@ -86,9 +92,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
8692
val f = fixture(_.isErrorEnabled, isEnabled = true)
8793
import f._
8894
logger.error(msg, arg1)
89-
verify(underlying).error(msg, List(arg1): _*)
95+
verify(underlying).error(msg, arg1)
9096
logger.error(msg, arg1, arg2)
91-
verify(underlying).error(msg, List(arg1, arg2): _*)
97+
verify(underlying).error(msg, forceVarargs(arg1, arg2): _*)
9298
logger.error(msg, arg1, arg2, arg3)
9399
verify(underlying).error(msg, arg1, arg2, arg3)
94100
}
@@ -97,9 +103,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
97103
val f = fixture(_.isErrorEnabled, isEnabled = false)
98104
import f._
99105
logger.error(msg, arg1)
100-
verify(underlying, never).error(msg, List(arg1): _*)
106+
verify(underlying, never).error(msg, arg1)
101107
logger.error(msg, arg1, arg2)
102-
verify(underlying, never).error(msg, List(arg1, arg2): _*)
108+
verify(underlying, never).error(msg, forceVarargs(arg1, arg2): _*)
103109
logger.error(msg, arg1, arg2, arg3)
104110
verify(underlying, never).error(msg, arg1, arg2, arg3)
105111
}
@@ -137,7 +143,7 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
137143
val f = fixture(_.isWarnEnabled, isEnabled = true)
138144
import f._
139145
logger.warn(s"msg $arg1 $arg2")
140-
verify(underlying).warn("msg {} {}", List(arg1, arg2): _*)
146+
verify(underlying).warn("msg {} {}", forceVarargs(arg1, arg2): _*)
141147
}
142148
}
143149

@@ -164,9 +170,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
164170
val f = fixture(_.isWarnEnabled, isEnabled = true)
165171
import f._
166172
logger.warn(msg, arg1)
167-
verify(underlying).warn(msg, List(arg1): _*)
173+
verify(underlying).warn(msg, arg1)
168174
logger.warn(msg, arg1, arg2)
169-
verify(underlying).warn(msg, List(arg1, arg2): _*)
175+
verify(underlying).warn(msg, forceVarargs(arg1, arg2): _*)
170176
logger.warn(msg, arg1, arg2, arg3)
171177
verify(underlying).warn(msg, arg1, arg2, arg3)
172178
}
@@ -175,9 +181,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
175181
val f = fixture(_.isWarnEnabled, isEnabled = false)
176182
import f._
177183
logger.warn(msg, arg1)
178-
verify(underlying, never).warn(msg, List(arg1): _*)
184+
verify(underlying, never).warn(msg, arg1)
179185
logger.warn(msg, arg1, arg2)
180-
verify(underlying, never).warn(msg, List(arg1, arg2): _*)
186+
verify(underlying, never).warn(msg, forceVarargs(arg1, arg2): _*)
181187
logger.warn(msg, arg1, arg2, arg3)
182188
verify(underlying, never).warn(msg, arg1, arg2, arg3)
183189
}
@@ -215,7 +221,7 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
215221
val f = fixture(_.isInfoEnabled, isEnabled = true)
216222
import f._
217223
logger.info(s"msg $arg1 $arg2")
218-
verify(underlying).info("msg {} {}", List(arg1, arg2): _*)
224+
verify(underlying).info("msg {} {}", forceVarargs(arg1, arg2): _*)
219225
}
220226
}
221227

@@ -242,9 +248,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
242248
val f = fixture(_.isInfoEnabled, isEnabled = true)
243249
import f._
244250
logger.info(msg, arg1)
245-
verify(underlying).info(msg, List(arg1): _*)
251+
verify(underlying).info(msg, arg1)
246252
logger.info(msg, arg1, arg2)
247-
verify(underlying).info(msg, List(arg1, arg2): _*)
253+
verify(underlying).info(msg, forceVarargs(arg1, arg2): _*)
248254
logger.info(msg, arg1, arg2, arg3)
249255
verify(underlying).info(msg, arg1, arg2, arg3)
250256
}
@@ -253,9 +259,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
253259
val f = fixture(_.isInfoEnabled, isEnabled = false)
254260
import f._
255261
logger.info(msg, arg1)
256-
verify(underlying, never).info(msg, List(arg1): _*)
262+
verify(underlying, never).info(msg, arg1)
257263
logger.info(msg, arg1, arg2)
258-
verify(underlying, never).info(msg, List(arg1, arg2): _*)
264+
verify(underlying, never).info(msg, forceVarargs(arg1, arg2): _*)
259265
logger.info(msg, arg1, arg2, arg3)
260266
verify(underlying, never).info(msg, arg1, arg2, arg3)
261267
}
@@ -292,7 +298,7 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
292298
val f = fixture(_.isDebugEnabled, isEnabled = true)
293299
import f._
294300
logger.debug(s"msg $arg1 $arg2")
295-
verify(underlying).debug("msg {} {}", List(arg1, arg2): _*)
301+
verify(underlying).debug("msg {} {}", forceVarargs(arg1, arg2): _*)
296302
}
297303
}
298304

@@ -319,9 +325,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
319325
val f = fixture(_.isDebugEnabled, isEnabled = true)
320326
import f._
321327
logger.debug(msg, arg1)
322-
verify(underlying).debug(msg, List(arg1): _*)
328+
verify(underlying).debug(msg, arg1)
323329
logger.debug(msg, arg1, arg2)
324-
verify(underlying).debug(msg, List(arg1, arg2): _*)
330+
verify(underlying).debug(msg, forceVarargs(arg1, arg2): _*)
325331
logger.debug(msg, arg1, arg2, arg3)
326332
verify(underlying).debug(msg, arg1, arg2, arg3)
327333
}
@@ -330,9 +336,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
330336
val f = fixture(_.isDebugEnabled, isEnabled = false)
331337
import f._
332338
logger.debug(msg, arg1)
333-
verify(underlying, never).debug(msg, List(arg1): _*)
339+
verify(underlying, never).debug(msg, arg1)
334340
logger.debug(msg, arg1, arg2)
335-
verify(underlying, never).debug(msg, List(arg1, arg2): _*)
341+
verify(underlying, never).debug(msg, forceVarargs(arg1, arg2): _*)
336342
logger.debug(msg, arg1, arg2, arg3)
337343
verify(underlying, never).debug(msg, arg1, arg2, arg3)
338344
}
@@ -370,7 +376,7 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
370376
val f = fixture(_.isTraceEnabled, isEnabled = true)
371377
import f._
372378
logger.trace(s"msg $arg1 $arg2")
373-
verify(underlying).trace("msg {} {}", List(arg1, arg2): _*)
379+
verify(underlying).trace("msg {} {}", forceVarargs(arg1, arg2): _*)
374380
}
375381
}
376382

@@ -397,9 +403,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
397403
val f = fixture(_.isTraceEnabled, isEnabled = true)
398404
import f._
399405
logger.trace(msg, arg1)
400-
verify(underlying).trace(msg, List(arg1): _*)
406+
verify(underlying).trace(msg, arg1)
401407
logger.trace(msg, arg1, arg2)
402-
verify(underlying).trace(msg, List(arg1, arg2): _*)
408+
verify(underlying).trace(msg, forceVarargs(arg1, arg2): _*)
403409
logger.trace(msg, arg1, arg2, arg3)
404410
verify(underlying).trace(msg, arg1, arg2, arg3)
405411
}
@@ -408,9 +414,9 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
408414
val f = fixture(_.isTraceEnabled, isEnabled = false)
409415
import f._
410416
logger.trace(msg, arg1)
411-
verify(underlying, never).trace(msg, List(arg1): _*)
417+
verify(underlying, never).trace(msg, arg1)
412418
logger.trace(msg, arg1, arg2)
413-
verify(underlying, never).trace(msg, List(arg1, arg2): _*)
419+
verify(underlying, never).trace(msg, forceVarargs(arg1, arg2): _*)
414420
logger.trace(msg, arg1, arg2, arg3)
415421
verify(underlying, never).trace(msg, arg1, arg2, arg3)
416422
}
@@ -468,7 +474,7 @@ class LoggerSpec extends WordSpec with Matchers with MockitoSugar {
468474
val f = fixture(_.isErrorEnabled, isEnabled = true)
469475
import f._
470476
logger.error("foo {}, bar {}", arg4, arg5)
471-
verify(underlying).error("foo {}, bar {}", Array(arg4ref, arg5ref): _*)
477+
verify(underlying).error("foo {}, bar {}", forceVarargs(arg4ref, arg5ref): _*)
472478
}
473479

474480
"map args to AnyRef for non 2 args" in {

src/test/scala/com/typesafe/scalalogging/LoggerTakingImplicitSpec.scala

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.scalatest.mockito.MockitoSugar
66
import org.scalatest.{ Matchers, WordSpec }
77
import org.slf4j.{ Logger => Underlying }
88

9-
class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar {
9+
class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar with Varargs {
1010

1111
case class CorrelationId(value: String)
1212

@@ -60,9 +60,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
6060
val f = fixture(_.isErrorEnabled, isEnabled = true)
6161
import f._
6262
logger.error(msg, arg1)
63-
verify(underlying).error(logMsg, List(arg1): _*)
63+
verify(underlying).error(logMsg, arg1)
6464
logger.error(msg, arg1, arg2)
65-
verify(underlying).error(logMsg, List(arg1, arg2): _*)
65+
verify(underlying).error(logMsg, forceVarargs(arg1, arg2): _*)
6666
logger.error(msg, arg1, arg2, arg3)
6767
verify(underlying).error(logMsg, arg1, arg2, arg3)
6868
verify(canLogCorrelationId, times(3)).logMessage(msg, correlationId)
@@ -73,9 +73,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
7373
val f = fixture(_.isErrorEnabled, isEnabled = false)
7474
import f._
7575
logger.error(msg, arg1)
76-
verify(underlying, never).error(logMsg, List(arg1): _*)
76+
verify(underlying, never).error(logMsg, arg1)
7777
logger.error(msg, arg1, arg2)
78-
verify(underlying, never).error(logMsg, List(arg1, arg2): _*)
78+
verify(underlying, never).error(logMsg, forceVarargs(arg1, arg2): _*)
7979
logger.error(msg, arg1, arg2, arg3)
8080
verify(underlying, never).error(logMsg, arg1, arg2, arg3)
8181
verify(canLogCorrelationId, never).logMessage(anyString, any[CorrelationId])
@@ -133,9 +133,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
133133
val f = fixture(_.isWarnEnabled, isEnabled = true)
134134
import f._
135135
logger.warn(msg, arg1)
136-
verify(underlying).warn(logMsg, List(arg1): _*)
136+
verify(underlying).warn(logMsg, arg1)
137137
logger.warn(msg, arg1, arg2)
138-
verify(underlying).warn(logMsg, List(arg1, arg2): _*)
138+
verify(underlying).warn(logMsg, forceVarargs(arg1, arg2): _*)
139139
logger.warn(msg, arg1, arg2, arg3)
140140
verify(underlying).warn(logMsg, arg1, arg2, arg3)
141141
verify(canLogCorrelationId, times(3)).logMessage(msg, correlationId)
@@ -146,9 +146,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
146146
val f = fixture(_.isWarnEnabled, isEnabled = false)
147147
import f._
148148
logger.warn(msg, arg1)
149-
verify(underlying, never).warn(logMsg, List(arg1): _*)
149+
verify(underlying, never).warn(logMsg, arg1)
150150
logger.warn(msg, arg1, arg2)
151-
verify(underlying, never).warn(logMsg, List(arg1, arg2): _*)
151+
verify(underlying, never).warn(logMsg, forceVarargs(arg1, arg2): _*)
152152
logger.warn(msg, arg1, arg2, arg3)
153153
verify(underlying, never).warn(logMsg, arg1, arg2, arg3)
154154
verify(canLogCorrelationId, never).logMessage(anyString, any[CorrelationId])
@@ -206,9 +206,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
206206
val f = fixture(_.isInfoEnabled, isEnabled = true)
207207
import f._
208208
logger.info(msg, arg1)
209-
verify(underlying).info(logMsg, List(arg1): _*)
209+
verify(underlying).info(logMsg, arg1)
210210
logger.info(msg, arg1, arg2)
211-
verify(underlying).info(logMsg, List(arg1, arg2): _*)
211+
verify(underlying).info(logMsg, forceVarargs(arg1, arg2): _*)
212212
logger.info(msg, arg1, arg2, arg3)
213213
verify(underlying).info(logMsg, arg1, arg2, arg3)
214214
verify(canLogCorrelationId, times(3)).logMessage(msg, correlationId)
@@ -219,9 +219,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
219219
val f = fixture(_.isInfoEnabled, isEnabled = false)
220220
import f._
221221
logger.info(msg, arg1)
222-
verify(underlying, never).info(logMsg, List(arg1): _*)
222+
verify(underlying, never).info(logMsg, arg1)
223223
logger.info(msg, arg1, arg2)
224-
verify(underlying, never).info(logMsg, List(arg1, arg2): _*)
224+
verify(underlying, never).info(logMsg, forceVarargs(arg1, arg2): _*)
225225
logger.info(msg, arg1, arg2, arg3)
226226
verify(underlying, never).info(logMsg, arg1, arg2, arg3)
227227
verify(canLogCorrelationId, never).logMessage(anyString, any[CorrelationId])
@@ -279,9 +279,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
279279
val f = fixture(_.isDebugEnabled, isEnabled = true)
280280
import f._
281281
logger.debug(msg, arg1)
282-
verify(underlying).debug(logMsg, List(arg1): _*)
282+
verify(underlying).debug(logMsg, arg1)
283283
logger.debug(msg, arg1, arg2)
284-
verify(underlying).debug(logMsg, List(arg1, arg2): _*)
284+
verify(underlying).debug(logMsg, forceVarargs(arg1, arg2): _*)
285285
logger.debug(msg, arg1, arg2, arg3)
286286
verify(underlying).debug(logMsg, arg1, arg2, arg3)
287287
verify(canLogCorrelationId, times(3)).logMessage(msg, correlationId)
@@ -292,9 +292,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
292292
val f = fixture(_.isDebugEnabled, isEnabled = false)
293293
import f._
294294
logger.debug(msg, arg1)
295-
verify(underlying, never).debug(logMsg, List(arg1): _*)
295+
verify(underlying, never).debug(logMsg, arg1)
296296
logger.debug(msg, arg1, arg2)
297-
verify(underlying, never).debug(logMsg, List(arg1, arg2): _*)
297+
verify(underlying, never).debug(logMsg, forceVarargs(arg1, arg2): _*)
298298
logger.debug(msg, arg1, arg2, arg3)
299299
verify(underlying, never).debug(logMsg, arg1, arg2, arg3)
300300
verify(canLogCorrelationId, never).logMessage(anyString, any[CorrelationId])
@@ -352,9 +352,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
352352
val f = fixture(_.isTraceEnabled, isEnabled = true)
353353
import f._
354354
logger.trace(msg, arg1)
355-
verify(underlying).trace(logMsg, List(arg1): _*)
355+
verify(underlying).trace(logMsg, arg1)
356356
logger.trace(msg, arg1, arg2)
357-
verify(underlying).trace(logMsg, List(arg1, arg2): _*)
357+
verify(underlying).trace(logMsg, forceVarargs(arg1, arg2): _*)
358358
logger.trace(msg, arg1, arg2, arg3)
359359
verify(underlying).trace(logMsg, arg1, arg2, arg3)
360360
verify(canLogCorrelationId, times(3)).logMessage(msg, correlationId)
@@ -365,9 +365,9 @@ class LoggerTakingImplicitSpec extends WordSpec with Matchers with MockitoSugar
365365
val f = fixture(_.isTraceEnabled, isEnabled = false)
366366
import f._
367367
logger.trace(msg, arg1)
368-
verify(underlying, never).trace(logMsg, List(arg1): _*)
368+
verify(underlying, never).trace(logMsg, arg1)
369369
logger.trace(msg, arg1, arg2)
370-
verify(underlying, never).trace(logMsg, List(arg1, arg2): _*)
370+
verify(underlying, never).trace(logMsg, forceVarargs(arg1, arg2): _*)
371371
logger.trace(msg, arg1, arg2, arg3)
372372
verify(underlying, never).trace(logMsg, arg1, arg2, arg3)
373373
verify(canLogCorrelationId, never).logMessage(anyString, any[CorrelationId])

0 commit comments

Comments
 (0)