Skip to content

Commit a6b61f5

Browse files
committed
Inelegantly restore distinct SelfLogging to each Api object, and resort to an inelegant test program. See scala/scala3#23245
1 parent d64ee0f commit a6b61f5

File tree

7 files changed

+109
-7
lines changed

7 files changed

+109
-7
lines changed

mlog/src/logadapter/mlog/Api.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ package logadapter.mlog
33
object Api extends logadapter.Api[LogAdapter]:
44
def logAdapterFor( loggerName : String ) : LogAdapter = new LogAdapter( loggerName )
55

6+
// We should be able to provide this nested trait once, in logadapter.Api
7+
// But because of an apparent Scala bug, we cannot,
8+
// we have to provide this trait separately in each implementation
9+
// for now!
10+
//
11+
// See https://github.com/scala/scala3/issues/23245
12+
//
613
trait SelfLogging:
714
given adapter : LogAdapter = logAdapterFor(this)
815
end Api

scribe/src/logadapter/scribe/Api.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ package logadapter.scribe
33
object Api extends logadapter.Api[LogAdapter]:
44
def logAdapterFor( loggerName : String ) : LogAdapter = new LogAdapter( loggerName )
55

6+
// We should be able to provide this nested trait once, in logadapter.Api
7+
// But because of an apparent Scala bug, we cannot,
8+
// we have to provide this trait separately in each implementation
9+
// for now!
10+
//
11+
// See https://github.com/scala/scala3/issues/23245
12+
//
613
trait SelfLogging:
714
given adapter : LogAdapter = logAdapterFor(this)
815
end Api

scribe/src/logadapter/scribe/dynamic/Api.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ package logadapter.scribe.dynamic
33
object Api extends logadapter.Api[LogAdapter]:
44
def logAdapterFor( loggerName : String ) : LogAdapter = new LogAdapter( loggerName )
55

6+
// We should be able to provide this nested trait once, in logadapter.Api
7+
// But because of an apparent Scala bug, we cannot,
8+
// we have to provide this trait separately in each implementation
9+
// for now!
10+
//
11+
// See https://github.com/scala/scala3/issues/23245
12+
//
613
trait SelfLogging:
714
given adapter : LogAdapter = logAdapterFor(this)
815
end Api

src/logadapter/Api.scala

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,18 @@ trait Api[T <: LogAdapter]:
5757
def classNameToLoggerName( clzName : String ) : String = clzName.reverse.dropWhile( _ == '$' ).map( c => if ( c == '$' ) '.' else c ).reverse
5858

5959
def logAdapterFor( loggerName : String ) : T
60-
def logAdapterFor( clz : Class[_] ) : T = logAdapterFor(classNameToLoggerName(clz.getName))
60+
def logAdapterFor( clz : Class[?] ) : T = logAdapterFor(classNameToLoggerName(clz.getName))
6161
def logAdapterFor( obj : Any ) : T = logAdapterFor(obj.getClass)
6262

6363
def logAdapterByFilename( using fn : sourcecode.FileName ) : T = logAdapterFor( fn.value )
64+
65+
// We should be able to provide this nested trait once, here, as below.
66+
// But because of an apparent Scala bug, we cannot,
67+
// we have to provide this trait separately in each implementation
68+
// for now!
69+
//
70+
// See https://github.com/scala/scala3/issues/23245
71+
//
72+
// trait SelfLogging:
73+
// given adapter : T = logAdapterFor(this)
6474
end Api

src/logadapter/jul/Api.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ package logadapter.jul
33
object Api extends logadapter.Api[LogAdapter]:
44
def logAdapterFor( loggerName : String ) : LogAdapter = new LogAdapter( loggerName )
55

6+
// We should be able to provide this nested trait once, in logadapter.Api
7+
// But because of an apparent Scala bug, we cannot,
8+
// we have to provide this trait separately in each implementation
9+
// for now!
10+
//
11+
// See https://github.com/scala/scala3/issues/23245
12+
//
613
trait SelfLogging:
714
given adapter : LogAdapter = logAdapterFor(this)
815
end Api

src/logadapter/stderr/Api.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@ package logadapter.stderr
33
object Api extends logadapter.Api[LogAdapter]:
44
def logAdapterFor( loggerName : String ) : LogAdapter = new LogAdapter( loggerName )
55

6+
7+
// We should be able to provide this nested trait once, in logadapter.Api
8+
// But because of an apparent Scala bug, we cannot,
9+
// we have to provide this trait separately in each implementation
10+
// for now!
11+
//
12+
// See https://github.com/scala/scala3/issues/23245
13+
//
614
trait SelfLogging:
715
given adapter : LogAdapter = logAdapterFor(this)
816
end Api

test/src/logadapter/test/Hello.scala

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,71 @@
11
package logadapter.test
22

3-
//import com.mchange.sc.logadapter.*, Level.*
43

5-
import logadapter.scribe.Api.*
4+
// I'd like to be able to elegantly abstract over the Api objects.
5+
// But it's tricky, and I'm hitting this bug, so I'm going to go with inelegant repetition for now!
6+
//
7+
// Bug: https://github.com/scala/scala3/issues/23245
68

7-
object Hello extends SelfLogging:
8-
def main(args : Array[String]) : Unit =
9-
//given MLogAdapter = com.mchange.sc.logadapter.mlog.logAdapterByFilename
10-
INFO.log("hello!")
9+
object Hello:
10+
def helloScribe() : Unit =
11+
println( s"------------- hello scribe -------------" )
12+
import logadapter.scribe.Api.*
13+
object HelloObject extends SelfLogging:
14+
def inside() : Unit =
15+
INFO.log(s"Hello scribe!")
16+
INFO.log("goodbye!")
17+
SEVERE.logDebug("Ouch!")
18+
HelloObject.inside()
19+
given LogAdapter = logAdapterByFilename
20+
INFO.log(s"Hello scribe!")
21+
INFO.log("goodbye!")
22+
SEVERE.logDebug("Ouch!")
23+
def helloStderr() : Unit =
24+
println( s"------------- hello stderr -------------" )
25+
import logadapter.stderr.Api.*
26+
object HelloObject extends SelfLogging:
27+
def inside() : Unit =
28+
INFO.log(s"Hello stderr!")
29+
INFO.log("goodbye!")
30+
SEVERE.logDebug("Ouch!")
31+
HelloObject.inside()
32+
given LogAdapter = logAdapterByFilename
33+
INFO.log(s"Hello stderr!")
34+
INFO.log("goodbye!")
35+
SEVERE.logDebug("Ouch!")
36+
def helloMlog() : Unit =
37+
println( s"------------- hello mlog -------------" )
38+
import logadapter.mlog.Api.*
39+
object HelloObject extends SelfLogging:
40+
def inside() : Unit =
41+
INFO.log(s"Hello mlog!")
42+
INFO.log("goodbye!")
43+
SEVERE.logDebug("Ouch!")
44+
HelloObject.inside()
45+
given LogAdapter = logAdapterByFilename
46+
INFO.log(s"Hello mlog!")
1147
INFO.log("goodbye!")
1248
SEVERE.logDebug("Ouch!")
49+
def helloJul() : Unit =
50+
println( s"------------- hello jul -------------" )
51+
import logadapter.jul.Api.*
52+
object HelloObject extends SelfLogging:
53+
def inside() : Unit =
54+
INFO.log(s"Hello jul!")
55+
INFO.log("goodbye!")
56+
SEVERE.logDebug("Ouch!")
57+
HelloObject.inside()
58+
given LogAdapter = logAdapterByFilename
59+
INFO.log(s"Hello jul!")
60+
INFO.log("goodbye!")
61+
SEVERE.logDebug("Ouch!")
62+
def main(args : Array[String]) : Unit =
63+
helloScribe()
64+
helloStderr()
65+
helloMlog()
66+
helloJul()
67+
68+
1369

1470

1571

0 commit comments

Comments
 (0)