scala / scala3

The Scala 3 compiler, also known as Dotty.
https://dotty.epfl.ch
Apache License 2.0
5.86k stars 1.06k forks source link

Compilation performance regression on 3.4.0 #19924

Closed OlegYch closed 5 months ago

OlegYch commented 7 months ago

Compiler version

3.4.0

Expectation

using sbt 1.9.8 in a project of about 500 files split equally between 4 modules compilation time was 70 seconds on scala 3.3.3 scalacOptions is -feature, -unchecked, -deprecation, -explaintypes, -encoding, UTF8, -language:_, -Yretain-trees, -Xmax-inlines:100, -no-indent

Actual

with scala version 3.4.0 same sources with same libs compile in about 120 seconds

WojciechMazur commented 7 months ago

Tracking compiler performance regression might be hard without getting into the codebase. You can start with checking if it maybe relates to https://github.com/scala/scala3/issues/19907 or https://github.com/scala/scala3/issues/19892 if so we'll try to fix it asap, hopefully in 3.4.1 or 3.4.2

OlegYch commented 7 months ago

those don't look related, it's a regression specifically moving from 3.3.3 to 3.4.0

OlegYch commented 7 months ago

for a single module with ~150 files it regresses from 17 seconds to 28

OlegYch commented 7 months ago

i think i have a lead - one file using reflection heavily via https://github.com/softwaremill/magnolia is compiled in 2 secs on 3.3 and in 3 secs on 3.4 without reflection usage it compiles in 1.3 secs on both 3.3 and 3.4 any idea what might have changed in reflection to cause that?

Gedochao commented 7 months ago

i think i have a lead - one file using reflection heavily via https://github.com/softwaremill/magnolia is compiled in 2 secs on 3.3 and in 3 secs on 3.4 without reflection usage it compiles in 1.3 secs on both 3.3 and 3.4 any idea what might have changed in reflection to cause that?

@jchyb @nicolasstucki any ideas, where we might look?

@OlegYch as was said earlier in the thread, it may be very hard to track this in any way without diving into the codebase. I figure minimising it on your side might be quite difficult as well, but maybe you could help us bisect it instead? By bisecting I mean trying to compile with compiler nightly versions to try to pinpoint the exact change in the compiler which caused the performance drop.

nicolasstucki commented 7 months ago

In order I would try

OlegYch commented 7 months ago

ok here is profile output: 3.3.3

header(main/background),startNs,endNs,runId,phaseId,phaseName,purpose,task-count,threadId,threadName,runNs,idleNs,cpuTimeNs,userTimeNs,allocatedByte,heapSize
header(GC),startNs,endNs,startMs,endMs,name,action,cause,threads
EventType(main),96195484119900,96195488041200,45,1,parser,,0,6996,pool-207-thread-13,3921300,0,0,0,339944,759816048 
EventType(main),96195493550600,96195731903500,45,2,typer,,0,6996,pool-207-thread-13,238352900,0,0,0,75451816,835313520 
EventType(main),96195733266500,96195733310500,45,4,inlinedPositions,,0,6996,pool-207-thread-13,44000,0,0,0,2192,835313520 
EventType(main),96195733331700,96195741330300,45,5,sbt-deps,,0,6996,pool-207-thread-13,7998600,0,0,0,7257800,843702128 
EventType(main),96195741399800,96195778222300,45,7,posttyper,,0,6996,pool-207-thread-13,36822500,0,0,0,7058880,847896432 
EventType(main),96195778292400,96195807364300,45,8,sbt-api,,0,6996,pool-207-thread-13,29071900,0,15625000,15625000,13398160,864673648 
EventType(main),96195807459600,96195807534700,45,9,SetRootTree,,0,6996,pool-207-thread-13,75100,0,0,0,4368,864673648 
EventType(main),96195807546200,96195814955300,45,10,pickler,,0,6996,pool-207-thread-13,7409100,0,0,0,1684496,864673648 
EventType(main),96195814994500,96196691451000,45,11,inlining,,0,6996,pool-207-thread-13,876456500,0,31250000,31250000,299788072,1166663536 
EventType(main),96196691498400,96196691518600,45,12,postInlining,,0,6996,pool-207-thread-13,20200,0,0,0,2192,1166663536 
EventType(main),96196691551600,96196695130700,45,14,staging,,0,6996,pool-207-thread-13,3579100,0,0,0,1329008,1170857840 
EventType(main),96196695150500,96196699918000,45,15,splicing,,0,6996,pool-207-thread-13,4767500,0,0,0,1393584,1170857840 
EventType(main),96196699990000,96196703834600,45,16,pickleQuotes,,0,6996,pool-207-thread-13,3844600,0,0,0,1390096,1170857840 
EventType(main),96196703861300,96196721271200,45,17,MegaPhase{crossVersionChecks  firstTransform  checkReentrant  elimPackagePrefixes  cookComments  checkStatic  checkLoopingImplicits  betaReduce  inlineVals  expandSAMs  elimRepeated  refchecks},,0,6996,pool-207-thread-13,17409900,0,0,0,7926832,1179246448 
EventType(main),96196721343900,96196732099400,45,29,MegaPhase{protectedAccessors  extmethods  uncacheGivenAliases  elimByName  hoistSuperArgs  forwardDepChecks  specializeApplyMethods  tryCatchPatterns  patternMatcher},,0,6996,pool-207-thread-13,10755500,0,0,0,3654904,1183440752 
EventType(main),96196732153100,96196732171900,45,38,preRecheck,,0,6996,pool-207-thread-13,18800,0,0,0,2192,1183440752 
EventType(main),96196732178600,96196732184800,45,39,cc,,0,6996,pool-207-thread-13,6200,0,0,0,2192,1183440752 
EventType(main),96196732188900,96196737801900,45,40,MegaPhase{elimOpaque  explicitOuter  explicitSelf  interpolators  dropBreaks},,0,6996,pool-207-thread-13,5613000,0,0,0,1277808,1187635056 
EventType(main),96196737945900,96196749307000,45,45,MegaPhase{pruneErasedDefs  uninitialized  inlinePatterns  vcInlineMethods  seqLiterals  intercepted  getters  specializeFunctions  specializeTuples  liftTry  collectNullableFields  elimOuterSelect  resolveSuper  functionXXLForwarders  paramForwarding  genericTuples  letOverApply  arrayConstructors},,0,6996,pool-207-thread-13,11361100,0,0,0,2252416,1187635056 
EventType(main),96196749384400,96196796615000,45,63,erasure,,0,6996,pool-207-thread-13,47230600,0,15625000,15625000,15610304,1204412272 
EventType(main),96196796671800,96196828569000,45,64,MegaPhase{elimErasedValueType  pureStats  vcElideAllocations  etaReduce  arrayApply  elimPolyFunction  tailrec  completeJavaEnums  mixin  lazyVals  memoize  nonLocalReturns  capturedVars},,0,6996,pool-207-thread-13,31897200,0,0,0,8643944,1212800880 
EventType(main),96196828625400,96196835413200,45,77,constructors,,0,6996,pool-207-thread-13,6787800,0,0,0,842152,1212800880 
EventType(main),96196835468200,96196857544800,45,78,MegaPhase{lambdaLift  elimStaticThis  countOuterAccesses},,0,6996,pool-207-thread-13,22076600,0,0,0,4786016,1216995184 
EventType(main),96196857609000,96196866482300,45,81,MegaPhase{dropOuterAccessors  checkNoSuperThis  flatten  transformWildcards  moveStatic  expandPrivate  restoreScopes  selectStatic  Collect entry points  collectSuperCalls  repeatableAnnotations},,0,6996,pool-207-thread-13,8873300,0,0,0,1194776,1221189488 
EventType(main),96196866568600,96196984754200,45,93,genBCode,,0,6996,pool-207-thread-13,118185600,0,0,0,40927632,1258938224 

3.4.0

header(main/background),startNs,endNs,runId,phaseId,phaseName,purpose,task-count,threadId,threadName,runNs,idleNs,cpuTimeNs,userTimeNs,allocatedByte,heapSize
header(GC),startNs,endNs,startMs,endMs,name,action,cause,threads
EventType(main),95483002267300,95483003691800,53,1,parser,,0,3800,pool-114-thread-6,1424500,0,0,0,309688,624696856 
EventType(main),95483006169300,95483353165500,53,2,typer,,0,3800,pool-114-thread-6,346996200,0,125000000,62500000,118977624,746331672 
EventType(main),95483362464900,95483362513900,53,5,inlinedPositions,,0,3800,pool-114-thread-6,49000,0,0,0,2280,746331672 
EventType(main),95483362526000,95483366832900,53,6,sbt-deps,,0,3800,pool-114-thread-6,4306900,0,0,0,5758544,750525976 
EventType(main),95483366917500,95483421644000,53,8,posttyper,,0,3800,pool-114-thread-6,54726500,0,31250000,15625000,13233576,763108888 
EventType(main),95483421714800,95483464550000,53,9,sbt-api,,0,3800,pool-114-thread-6,42835200,0,15625000,15625000,19271824,784080408 
EventType(main),95483468479500,95483468577800,53,10,SetRootTree,,0,3800,pool-114-thread-6,98300,0,0,0,5360,784080408 
EventType(main),95483468607300,95483475977900,53,11,pickler,,0,3800,pool-114-thread-6,7370600,0,15625000,15625000,1720080,784080408 
EventType(main),95483476043200,95485150720200,53,12,inlining,,0,3800,pool-114-thread-6,1674677000,0,875000000,734375000,539213048,1329339928 
EventType(main),95485150780700,95485150817000,53,13,postInlining,,0,3800,pool-114-thread-6,36300,0,0,0,3184,1329339928 
EventType(main),95485150860800,95485155013700,53,15,staging,,0,3800,pool-114-thread-6,4152900,0,0,0,1355936,1329339928 
EventType(main),95485155042700,95485158865400,53,16,splicing,,0,3800,pool-114-thread-6,3822700,0,0,0,1375264,1333534232 
EventType(main),95485158893400,95485161994200,53,17,pickleQuotes,,0,3800,pool-114-thread-6,3100800,0,0,0,1371776,1333534232 
EventType(main),95485162043400,95485183926300,53,18,MegaPhase{crossVersionChecks  firstTransform  checkReentrant  elimPackagePrefixes  cookComments  checkStatic  checkLoopingImplicits  betaReduce  inlineVals  expandSAMs  elimRepeated  refchecks},,0,3800,pool-114-thread-6,21882900,0,15625000,15625000,7715968,1341922840 
EventType(main),95485184050200,95485196682700,53,31,MegaPhase{protectedAccessors  extmethods  uncacheGivenAliases  elimByName  hoistSuperArgs  forwardDepChecks  specializeApplyMethods  tryCatchPatterns  patternMatcher},,0,3800,pool-114-thread-6,12632500,0,0,0,3720120,1346117144 
EventType(main),95485196762900,95485201930900,53,42,MegaPhase{elimOpaque  explicitOuter  explicitSelf  interpolators  dropBreaks},,0,3800,pool-114-thread-6,5168000,0,0,0,1264656,1346117144 
EventType(main),95485201988200,95485211464900,53,47,MegaPhase{pruneErasedDefs  uninitialized  inlinePatterns  vcInlineMethods  seqLiterals  intercepted  getters  specializeFunctions  specializeTuples  collectNullableFields  elimOuterSelect  resolveSuper  functionXXLForwarders  paramForwarding  genericTuples  letOverApply  arrayConstructors},,0,3800,pool-114-thread-6,9476700,0,0,0,1864984,1346117144 
EventType(main),95485211553100,95485258118900,53,64,erasure,,0,3800,pool-114-thread-6,46565800,0,31250000,31250000,15775368,1362894360 
EventType(main),95485258196200,95485286288700,53,65,MegaPhase{elimErasedValueType  pureStats  vcElideAllocations  etaReduce  arrayApply  elimPolyFunction  tailrec  completeJavaEnums  mixin  lazyVals  memoize  nonLocalReturns  capturedVars},,0,3800,pool-114-thread-6,28092500,0,15625000,15625000,8300528,1371282968 
EventType(main),95485286360300,95485293516500,53,78,constructors,,0,3800,pool-114-thread-6,7156200,0,15625000,15625000,819008,1371282968 
EventType(main),95485293607400,95485318007500,53,79,MegaPhase{lambdaLift  elimStaticThis  countOuterAccesses},,0,3800,pool-114-thread-6,24400100,0,15625000,15625000,6317136,1379671576 
EventType(main),95485318080000,95485327217400,53,82,MegaPhase{dropOuterAccessors  checkNoSuperThis  flatten  transformWildcards  moveStatic  expandPrivate  restoreScopes  selectStatic  Collect entry points  collectSuperCalls  repeatableAnnotations},,0,3800,pool-114-thread-6,9137400,0,15625000,15625000,1234088,1379671576 
EventType(main),95485327313900,95485444895000,53,94,genBCode,,0,3800,pool-114-thread-6,117581100,0,62500000,62500000,38206968,1417420312 

i noticed 3.4.0 triggers gc almost every time, while 3.3.3 seems less memory hungry

profile details are the same for 3.3.3 and 3.4.0:

Profile hook start
Profile hook stop
[info] Sourcefile          Lines   Tokens   Tasty  Complexity/Line    Directory
[info] X.scala    309     2301    1727   5.59  high        XXX
[info]
[info] Most complex methods:
[info] Sourcefile         Method               Lines   Tokens   Tasty  Complexity/Line    Directory
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        1       1   1.00  moderate    XXX
[info] X.scala lineNumber               1        5       1   1.00  moderate    XXX
[info] X.scala bar                      2        5       1   0.50  low         XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productPrefix            1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala productArity             1        1       1   1.00  moderate    XXX
[info] X.scala toString                 2        1       1   0.50  low         XXX
[info] X.scala toString                 2        1       1   0.50  low         XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 2        1       1   0.50  low         XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$7           2        1       1   0.50  low         XXX
[info] X.scala copy$default$6           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$5           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala _3                       1        2       1   1.00  moderate    XXX
[info] X.scala _2                       1        6       1   1.00  moderate    XXX
[info] X.scala _1                       1        6       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala _1                       1        6       1   1.00  moderate    XXX
[info] X.scala _11                      2        5       1   0.50  low         XXX
[info] X.scala _6                       1        2       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala _6                       1        2       1   1.00  moderate    XXX
[info] X.scala _25                      2       10       1   0.50  low         XXX
[info] X.scala _24                      1        5       1   1.00  moderate    XXX
[info] X.scala _23                      1        2       1   1.00  moderate    XXX
[info] X.scala _22                      1        5       1   1.00  moderate    XXX
[info] X.scala _21                      1        6       1   1.00  moderate    XXX
[info] X.scala _20                      1        5       1   1.00  moderate    XXX
[info] X.scala _19                      1        4       1   1.00  moderate    XXX
[info] X.scala _18                      1        7       1   1.00  moderate    XXX
[info] X.scala _17                      1        9       1   1.00  moderate    XXX
[info] X.scala _16                      1        5       1   1.00  moderate    XXX
[info] X.scala _15                      1        5       1   1.00  moderate    XXX
[info] X.scala _14                      1        5       1   1.00  moderate    XXX
[info] X.scala _13                      1        5       1   1.00  moderate    XXX
[info] X.scala _12                      1        9       1   1.00  moderate    XXX
[info] X.scala _11                      1        9       1   1.00  moderate    XXX
[info] X.scala _10                      1        5       1   1.00  moderate    XXX
[info] X.scala _9                       1        5       1   1.00  moderate    XXX
[info] X.scala _8                       1        9       1   1.00  moderate    XXX
[info] X.scala _7                       1        5       1   1.00  moderate    XXX
[info] X.scala _6                       1        5       1   1.00  moderate    XXX
[info] X.scala _5                       1        4       1   1.00  moderate    XXX
[info] X.scala _4                       1        4       1   1.00  moderate    XXX
[info] X.scala _3                       1        9       1   1.00  moderate    XXX
[info] X.scala _2                       1        2       1   1.00  moderate    XXX
[info] X.scala _1                       1        6       1   1.00  moderate    XXX
[info] X.scala _7                       2        3       1   0.50  low         XXX
[info] X.scala _6                       1        6       1   1.00  moderate    XXX
[info] X.scala _5                       1        2       1   1.00  moderate    XXX
[info] X.scala _4                       1        2       1   1.00  moderate    XXX
[info] X.scala _3                       1        4       1   1.00  moderate    XXX
[info] X.scala _2                       1        5       1   1.00  moderate    XXX
[info] X.scala _1                       1        2       1   1.00  moderate    XXX
[info] X.scala _3                       2        3       1   0.50  low         XXX
[info] X.scala _2                       1        4       1   1.00  moderate    XXX
[info] X.scala _1                       1        2       1   1.00  moderate    XXX
[info] X.scala _5                       2        3       1   0.50  low         XXX
[info] X.scala _4                       1        2       1   1.00  moderate    XXX
[info] X.scala _3                       1        2       1   1.00  moderate    XXX
[info] X.scala _2                       1        2       1   1.00  moderate    XXX
[info] X.scala _1                       1        7       1   1.00  moderate    XXX
[info] X.scala _4                       2        3       1   0.50  low         XXX
[info] X.scala _1                       1        2       1   1.00  moderate    XXX
[info] X.scala _1                       1        5       1   1.00  moderate    XXX
[info] X.scala _3                       1        2       1   1.00  moderate    XXX
[info] X.scala _2                       1        2       1   1.00  moderate    XXX
[info] X.scala _1                       1        2       1   1.00  moderate    XXX
[info] X.scala _9                       2        8       1   0.50  low         XXX
[info] X.scala _8                       1        5       1   1.00  moderate    XXX
[info] X.scala _7                       1        2       1   1.00  moderate    XXX
[info] X.scala _6                       1        2       1   1.00  moderate    XXX
[info] X.scala _5                       1        2       1   1.00  moderate    XXX
[info] X.scala _4                       1        6       1   1.00  moderate    XXX
[info] X.scala _3                       1        2       1   1.00  moderate    XXX
[info] X.scala _2                       1        4       1   1.00  moderate    XXX
[info] X.scala _10                      1        2       1   1.00  moderate    XXX
[info] X.scala _9                       1        2       1   1.00  moderate    XXX
[info] X.scala _8                       1        2       1   1.00  moderate    XXX
[info] X.scala _7                       1        2       1   1.00  moderate    XXX
[info] X.scala _5                       1        2       1   1.00  moderate    XXX
[info] X.scala _4                       1        6       1   1.00  moderate    XXX
[info] X.scala _3                       1        4       1   1.00  moderate    XXX
[info] X.scala _2                       1        2       1   1.00  moderate    XXX
[info] X.scala _1                       1        4       1   1.00  moderate    XXX
[info] X.scala _3                       2        3       1   0.50  low         XXX
[info] X.scala _2                       1        2       1   1.00  moderate    XXX
[info] X.scala _1                       1        4       1   1.00  moderate    XXX
[info] X.scala _8                       2        8       1   0.50  low         XXX
[info] X.scala _7                       1        4       1   1.00  moderate    XXX
[info] X.scala _5                       1        7       1   1.00  moderate    XXX
[info] X.scala _4                       1        4       1   1.00  moderate    XXX
[info] X.scala _3                       1        7       1   1.00  moderate    XXX
[info] X.scala _2                       1        4       1   1.00  moderate    XXX
[info] X.scala _1                       1        2       1   1.00  moderate    XXX
[info] X.scala <init>                   1        8       1   1.00  moderate    XXX
[info] X.scala <init>                   1        8       1   1.00  moderate    XXX
[info] X.scala <init>                   1        8       1   1.00  moderate    XXX
[info] X.scala <init>                   1        8       1   1.00  moderate    XXX
[info] X.scala <init>                   1       10       1   1.00  moderate    XXX
[info] X.scala manual                   1        2       1   1.00  moderate    XXX
[info] X.scala auto                     1        2       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala unapply                  1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala <init>                   1        9       1   1.00  moderate    XXX
[info] X.scala hashCode                 1        1       1   1.00  moderate    XXX
[info] X.scala toString                 1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$4           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           2        1       1   0.50  low         XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$9           2        1       1   0.50  low         XXX
[info] X.scala copy$default$8           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$7           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$6           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$5           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$4           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$11          2        1       1   0.50  low         XXX
[info] X.scala copy$default$10          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$9           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$8           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$7           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$6           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$5           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$4           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           2        1       1   0.50  low         XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$25          2        1       1   0.50  low         XXX
[info] X.scala copy$default$24          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$23          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$22          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$21          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$20          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$19          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$18          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$17          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$16          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$15          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$14          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$13          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$12          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$11          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$10          1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$9           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$8           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$7           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$6           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$5           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$4           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala writeReplace             1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$5           2        1       1   0.50  low         XXX
[info] X.scala copy$default$4           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$4           2        1       1   0.50  low         XXX
[info] X.scala copy$default$3           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$8           2        1       1   0.50  low         XXX
[info] X.scala copy$default$7           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$6           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$5           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$4           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$3           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$2           1        1       1   1.00  moderate    XXX
[info] X.scala copy$default$1           1        1       2   2.00  moderate    XXX
[info] X.scala copy$default$1           1        1       2   2.00  moderate    XXX
[info] X.scala apply                    1       11       2   2.00  moderate    XXX
[info] X.scala copy$default$1           1        1       2   2.00  moderate    XXX
[info] X.scala apply                    1       10       2   2.00  moderate    XXX
[info] X.scala copy                     1       11       2   2.00  moderate    XXX
[info] X.scala copy                     1       10       2   2.00  moderate    XXX
[info] X.scala <init>                   1       14       2   2.00  moderate    XXX
[info] X.scala <init>                   5       17       2   0.40  low         XXX
[info] X.scala <init>                   5       17       2   0.40  low         XXX
[info] X.scala <init>                   6       23       2   0.33  low         XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala canEqual                 1        1       2   2.00  moderate    XXX
[info] X.scala apply                    5       18       2   0.40  low         XXX
[info] X.scala apply                    1       15       2   2.00  moderate    XXX
[info] X.scala apply                    5       18       2   0.40  low         XXX
[info] X.scala copy                     5       18       2   0.40  low         XXX
[info] X.scala copy                     1       15       2   2.00  moderate    XXX
[info] X.scala copy                     5       18       2   0.40  low         XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala <init>                   7       28       2   0.29  low         XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala productElementName       1        1       2   2.00  moderate    XXX
[info] X.scala productElement           1        1       2   2.00  moderate    XXX
[info] X.scala fromProduct              1        1       2   2.00  moderate    XXX
[info] X.scala fromProduct              1        1       2   2.00  moderate    XXX
[info] X.scala apply                    6       24       3   0.50  low         XXX
[info] X.scala productElementName       1        1       3   3.00  moderate    XXX
[info] X.scala productElementName       1        1       3   3.00  moderate    XXX
[info] X.scala copy                     6       24       3   0.50  low         XXX
[info] X.scala action                   7       34       3   0.43  low         XXX
[info] X.scala productElement           1        1       3   3.00  moderate    XXX
[info] X.scala productElement           1        1       3   3.00  moderate    XXX
[info] X.scala importBarFineWeight      7       36       3   0.43  low         XXX
[info] X.scala apply                    7       29       3   0.43  low         XXX
[info] X.scala productElementName       1        1       3   3.00  moderate    XXX
[info] X.scala productElementName       1        1       3   3.00  moderate    XXX
[info] X.scala productElementName       1        1       3   3.00  moderate    XXX
[info] X.scala <init>                   9       40       3   0.33  low         XXX
[info] X.scala copy                     7       29       3   0.43  low         XXX
[info] X.scala productElementName       1        1       3   3.00  moderate    XXX
[info] X.scala ordinal                  1        1       3   3.00  moderate    XXX
[info] X.scala completedAuto            1       27       3   3.00  moderate    XXX
[info] X.scala ordinal                  1        1       3   3.00  moderate    XXX
[info] X.scala productElementName       1        1       3   3.00  moderate    XXX
[info] X.scala productElement           1        1       3   3.00  moderate    XXX
[info] X.scala productElement           1        1       3   3.00  moderate    XXX
[info] X.scala productElement           1        1       3   3.00  moderate    XXX
[info] X.scala apply                    9       41       4   0.44  low         XXX
[info] X.scala <init>                  10       56       4   0.40  low         XXX
[info] X.scala allCompleted             1       34       4   4.00  moderate    XXX
[info] X.scala copy                     9       41       4   0.44  low         XXX
[info] X.scala ordinal                  1        1       4   4.00  moderate    XXX
[info] X.scala ordinal                  1        1       4   4.00  moderate    XXX
[info] X.scala productElementName       1        1       4   4.00  moderate    XXX
[info] X.scala <init>                  11       57       4   0.36  low         XXX
[info] X.scala ordinal                  1        1       4   4.00  moderate    XXX
[info] X.scala <init>                  13       57       4   0.31  low         XXX
[info] X.scala productElement           1        1       4   4.00  moderate    XXX
[info] X.scala apply                   10       57       4   0.40  low         XXX
[info] X.scala productElementName       1        1       4   4.00  moderate    XXX
[info] X.scala copy                    10       57       4   0.40  low         XXX
[info] X.scala productElementName       1        1       4   4.00  moderate    XXX
[info] X.scala fromProduct              1        1       4   4.00  moderate    XXX
[info] X.scala fromProduct              1        1       4   4.00  moderate    XXX
[info] X.scala apply                   11       58       4   0.36  low         XXX
[info] X.scala fromProduct              1        1       4   4.00  moderate    XXX
[info] X.scala productElement           1        1       4   4.00  moderate    XXX
[info] X.scala ordinal                  1        1       4   4.00  moderate    XXX
[info] X.scala copy                    11       58       4   0.36  low         XXX
[info] X.scala ordinal                  1        1       4   4.00  moderate    XXX
[info] X.scala productElementName       1        1       5   5.00  high        XXX
[info] X.scala apply                   13       58       5   0.38  low         XXX
[info] X.scala productElement           1        1       5   5.00  high        XXX
[info] X.scala fromProduct              1        1       5   5.00  high        XXX
[info] X.scala copy                    13       58       5   0.38  low         XXX
[info] X.scala hashCode                 1        1       5   5.00  high        XXX
[info] X.scala productElement           1        1       5   5.00  high        XXX
[info] X.scala hashCode                 1        1       5   5.00  high        XXX
[info] X.scala hashCode                 1        1       5   5.00  high        XXX
[info] X.scala equals                   1        1       6   6.00  high        XXX
[info] X.scala productElement           1        1       6   6.00  high        XXX
[info] X.scala equals                   1        1       6   6.00  high        XXX
[info] X.scala fromProduct              1        1       6   6.00  high        XXX
[info] X.scala productElement           1        1       6   6.00  high        XXX
[info] X.scala productElementName       1        1       7   7.00  high        XXX
[info] X.scala nearestMilestone         6       53       8   1.33  moderate    XXX
[info] X.scala equals                   1        1       8   8.00  high        XXX
[info] X.scala next                     7       58       8   1.14  moderate    XXX
[info] X.scala equals                   1        1       8   8.00  high        XXX
[info] X.scala equals                   1        1       8   8.00  high        XXX
[info] X.scala fromProduct              1        1       8   8.00  high        XXX
[info] X.scala equals                   1        1       9   9.00  high        XXX
[info] X.scala hashCode                 1        1       9   9.00  high        XXX
[info] X.scala fromProduct              1        1       9   9.00  high        XXX
[info] X.scala rollback                 5       74       9   1.80  moderate    XXX
[info] X.scala barFineWeight           18      113       9   0.50  low         XXX
[info] X.scala apply                   27      198       9   0.33  low         XXX
[info] X.scala fromProduct              1        1      10  10.00  high        XXX
[info] X.scala copy                    27      198      10   0.37  low         XXX
[info] X.scala equals                   1        1      10  10.00  high        XXX
[info] X.scala hashCode                 1        1      11  11.00  high        XXX
[info] X.scala fromProduct              1        1      11  11.00  high        XXX
[info] X.scala productElement           1        1      11  11.00  high        XXX
[info] X.scala equals                   1        1      12  12.00  high        XXX
[info] X.scala <init>                  27      197      12   0.44  low         XXX
[info] X.scala hashCode                 1        1      13  13.00  high        XXX
[info] X.scala equals                   1        1      13  13.00  high        XXX
[info] X.scala equals                   1        1      14  14.00  high        XXX
[info] X.scala equals                   1        1      16  16.00  high        XXX
[info] X.scala matchList                5       86      18   3.60  moderate    XXX
[info] X.scala fromProduct              1        1      24  24.00  high        XXX
[info] X.scala hashCode                 1        1      25  25.00  extreme     XXX
[info] X.scala ordinal                  1        1      28  28.00  extreme     XXX
[info] X.scala equals                   1        1      29  29.00  extreme     XXX
OlegYch commented 7 months ago

so by comparing runNs it looks like inlining phase is the issue? which kinda makes sense given it's macros related how do i check what's being inlined?

nicolasstucki commented 7 months ago

You may try enabling the inlining printer in https://github.com/scala/scala3/blob/main/compiler/src/dotty/tools/dotc/config/Printers.scala#L46. You will need to publish a snapshot of the compiler with this enabled.

-  val inlining = noPrinter
+  val inlining = default

Then compile the code with -verbose and look for to inline = ... and original expansion = ... to see what code is produced from inlining.

Note that enabling this may slow down the compilation a bit more.

SethTisue commented 7 months ago

You will need to publish a snapshot of the compiler

(Some context for those not already familiar: building a snapshot is necessary to enable this extra logging, because in the production compiler the logging is inlined out of existence for performance reasons.)

OlegYch commented 7 months ago

here is minimized repro https://github.com/OlegYch/magnolia-test

OlegYch commented 7 months ago

fwiw 3.4.0-RC1-bin-20230725-18df4ed-NIGHTLY (earliest 3.4) and 3.4.2-RC1-bin-20240320-0ea0eba-NIGHTLY (latest nightly) both have the issue

OlegYch commented 7 months ago

not much difference in inlining logging: 3.3.3:

[info] compiling 2 Scala sources to D:\magnolia-test\target\scala-3.3.3-bin-SNAPSHOT\classes ...
-----------------------
Inlining Print.derived[A200](
  A200.$asInstanceOf[

      scala.deriving.Mirror.Product{
        type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
          type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
      }

  ]
)
With RHS Derivation.this.derivedMirror[A](x$1):Derivation.this.Typeclass[A]
parameter binding: val x$1$proxy1:

    scala.deriving.Mirror.Product{
      type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
        type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
    }

 =
  A200.$asInstanceOf[

      scala.deriving.Mirror.Product{
        type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
          type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
      }

  ], false
proxy at 3: value Derivation_this = val Derivation_this: Print.type = Print
inliner transform with
thisProxy = trait Derivation --> (Derivation_this : Print.type)
paramProxy = type TypeClass in trait Derivation, type Of in object Mirror, type A --> Print, (x$1$proxy1 :
  scala.deriving.Mirror.Product{
    type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
      type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
  }
), A200
-----------------------
Inlining Derivation_this.derivedMirror[A200](x$1$proxy1)
With RHS (inline mirror match
  {
    case sum @ _:scala.deriving.Mirror.SumOf[A] =>
      Derivation.this.derivedMirrorSum[A](sum)
    case product @ _:scala.deriving.Mirror.ProductOf[A] =>
      Derivation.this.derivedMirrorProduct[A](product)
  }
):Derivation.this.Typeclass[A]
proxy at 3: value Derivation_this = val Derivation_this: (Derivation_this : Print.type) = Derivation_this
inliner transform with
thisProxy = trait Derivation --> (Derivation_this : (Derivation_this : Print.type))
paramProxy = type TypeClass in trait Derivation, type A, type Of in object Mirror --> Print, A200, (x$1$proxy1 :
  scala.deriving.Mirror.Product{
    type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
      type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
  }
)
--- reduce:
inline x$1$proxy1 match
  {
    case sum @ _:scala.deriving.Mirror.SumOf[A200] =>
      Derivation_this.derivedMirrorSum[A200](sum)
    case product @ _:scala.deriving.Mirror.ProductOf[A200] =>
      Derivation_this.derivedMirrorProduct[A200](product)
  }
--- to:
{
  val $scrutinee1:

      (x$1$proxy1 :
        scala.deriving.Mirror.Product{
          type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
            type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
        }
      )

   = x$1$proxy1
  val product:

      scala.deriving.Mirror.Product{
        type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
          type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
      }

   = $scrutinee1
  Derivation_this.derivedMirrorProduct[A200](product)
}
-----------------------
Inlining Derivation_this.derivedMirrorProduct[A200](product)
With RHS CommonDerivation.this.join[A](magnolia1.CaseClassDerivation.fromMirror[[T] =>> TypeClass[T], A](product)):
  CommonDerivation.this.Typeclass[A]
proxy at 3: value CommonDerivation_this = val CommonDerivation_this: (Derivation_this : (Derivation_this : Print.type)) = Derivation_this
inliner transform with
thisProxy = trait CommonDerivation --> (CommonDerivation_this : (Derivation_this : (Derivation_this : Print.type)))
paramProxy = type A, type ProductOf in object Mirror, type TypeClass in trait CommonDerivation --> A200, (product :
  scala.deriving.Mirror.Product{
    type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
      type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
  }
), Print
-----------------------
Inlining magnolia1.CaseClassDerivation.fromMirror[Print, A200](product)
With RHS {
  val params: IArray[magnolia1.CaseClass.Param[Typeclass, A]] =
    IArray.apply[magnolia1.CaseClass.Param[Typeclass, A]](
      magnolia1.CaseClassDerivation.paramsFromMaps[Typeclass, A, product.MirroredElemLabels, product.MirroredElemTypes](
        magnolia1.Macro.paramAnns[A].to[Map[String, List[Any]]](
          scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
        magnolia1.Macro.inheritedParamAnns[A].to[Map[String, List[Any]]](
          scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
        magnolia1.Macro.paramTypeAnns[A].to[Map[String, List[Any]]](
          scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
        magnolia1.Macro.repeated[A].to[Map[String, Boolean]](
          scala.collection.MapFactory.toFactory[String, Boolean, Map](Map)),
        magnolia1.Macro.defaultValue[A].to[Map[String, Option[() => Any]]](
          scala.collection.MapFactory.toFactory[String, Option[() => Any], Map](Map)),
        this.paramsFromMaps$default$6[Typeclass, A, product.MirroredElemLabels, product.MirroredElemTypes])*
    )(scala.reflect.ClassTag.apply[magnolia1.CaseClass.Param[Typeclass, A]](classOf[magnolia1.CaseClass.Param]))
  new ProductCaseClass[Typeclass, A](magnolia1.Macro.typeInfo[A], magnolia1.Macro.isObject[A],
    magnolia1.Macro.isValueClass[A], params, IArray.apply[Any](magnolia1.Macro.anns[A]*)(scala.reflect.ClassTag.Any),
    IArray.apply[Any](magnolia1.Macro.inheritedAnns[A]*)(scala.reflect.ClassTag.Any),
    IArray.apply[Any](magnolia1.Macro.typeAnns[A]*)(scala.reflect.ClassTag.Any), product)
}:magnolia1.CaseClass[Typeclass, A]
inliner transform with
thisProxy =  -->
paramProxy = type ProductOf in object Mirror, type Typeclass, type A --> (product :
  scala.deriving.Mirror.Product{
    type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
      type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
  }
), Print, A200
-----------------------
Inlining magnolia1.Macro.paramAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$19: scala.quoted.Quotes): scala.quoted.Expr[List[(String, List[Any])]] =
      magnolia1.Macro.paramAnns[T](scala.quoted.Type.of[T](evidence$19), evidence$19)
    closure($anonfun)
  }
}:List[Tuple2[String, List[Any]]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.inheritedParamAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$20: scala.quoted.Quotes): scala.quoted.Expr[List[(String, List[Any])]] =
      magnolia1.Macro.inheritedParamAnns[T](scala.quoted.Type.of[T](evidence$20), evidence$20)
    closure($anonfun)
  }
}:List[Tuple2[String, List[Any]]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.paramTypeAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$23: scala.quoted.Quotes): scala.quoted.Expr[List[(String, List[Any])]] =
      magnolia1.Macro.paramTypeAnns[T](scala.quoted.Type.of[T](evidence$23), evidence$23)
    closure($anonfun)
  }
}:List[Tuple2[String, List[Any]]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.repeated[A200]
With RHS ${
  {
    def $anonfun(using evidence$24: scala.quoted.Quotes): scala.quoted.Expr[List[(String, Boolean)]] =
      magnolia1.Macro.repeated[T](scala.quoted.Type.of[T](evidence$24), evidence$24)
    closure($anonfun)
  }
}:List[Tuple2[String, Boolean]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.defaultValue[A200]
With RHS ${
  {
    def $anonfun(using evidence$22: scala.quoted.Quotes): scala.quoted.Expr[List[(String, Option[() => Any])]] =
      magnolia1.Macro.defaultValue[T](scala.quoted.Type.of[T](evidence$22), evidence$22)
    closure($anonfun)
  }
}:List[Tuple2[String, Option[() => Any]]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, product.MirroredElemLabels, product.MirroredElemTypes](
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
  (
    List.apply[(String, Boolean)](
      [Tuple2.apply[String, Boolean]("i", false),Tuple2.apply[String, Boolean]("s", false) : (String, Boolean)]*)
  :List[Tuple2[String, Boolean]]).to[Map[String, Boolean]](
    scala.collection.MapFactory.toFactory[String, Boolean, Map](Map)),
  (
    List.apply[(String, Option[() => Any])](
      [Tuple2.apply[String, None.type]("i", None),Tuple2.apply[String, None.type]("s", None) :
        (String, Option[() => Any])]*
    )
  :List[Tuple2[String, Option[() => Any]]]).to[Map[String, Option[() => Any]]](
    scala.collection.MapFactory.toFactory[String, Option[() => Any], Map](Map)),
  CaseClassDerivation.this.paramsFromMaps$default$6[Print, A200, product.MirroredElemLabels, product.MirroredElemTypes])
With RHS (inline scala.compiletime.erasedValue[Tuple2[Labels, Params]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Typeclass, A] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Typeclass, A, p](label,
            magnolia1.CallByNeed.apply[Typeclass[p]](scala.compiletime.summonInline[Typeclass[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated, annotations, inheritedAnnotations, typeAnnotations, idx)
        magnolia1.CaseClassDerivation.paramsFromMaps[Typeclass, A, ltail, ptail](annotations, inheritedAnnotations,
          typeAnnotations, repeated, defaults, idx.+(1)).::[magnolia1.CaseClass.Param[Typeclass, A]](elem$1)
      }
  }
):List[magnolia1.CaseClass.Param[Typeclass, A]]
parameter binding: val annotations$proxy1: Map[String, List[Any]] =
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)), false
parameter binding: val inheritedAnnotations$proxy1: Map[String, List[Any]] =
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)), false
parameter binding: val typeAnnotations$proxy1: Map[String, List[Any]] =
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)), false
parameter binding: val repeated$proxy1: Map[String, Boolean] =
  (
    List.apply[(String, Boolean)](
      [Tuple2.apply[String, Boolean]("i", false),Tuple2.apply[String, Boolean]("s", false) : (String, Boolean)]*)
  :List[Tuple2[String, Boolean]]).to[Map[String, Boolean]](
    scala.collection.MapFactory.toFactory[String, Boolean, Map](Map)), false
parameter binding: val defaults$proxy1: Map[String, Option[() => Any]] =
  (
    List.apply[(String, Option[() => Any])](
      [Tuple2.apply[String, None.type]("i", None),Tuple2.apply[String, None.type]("s", None) :
        (String, Option[() => Any])]*
    )
  :List[Tuple2[String, Option[() => Any]]]).to[Map[String, Option[() => Any]]](
    scala.collection.MapFactory.toFactory[String, Option[() => Any], Map](Map)), false
parameter binding: val idx$proxy1: Int =
  CaseClassDerivation.this.paramsFromMaps$default$6[Print, A200, product.MirroredElemLabels, product.MirroredElemTypes], false
inliner transform with
thisProxy =  -->
paramProxy = type A, type Typeclass, trait Map in package scala.collection.immutable, class Int in package scala, trait Map in package scala.collection.immutable, type Params, type Labels, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable --> A200, Print, (repeated$proxy1 : Map[String, Boolean]), (idx$proxy1 : Int), (defaults$proxy1 : Map[String, Option[() => Any]]), product.MirroredElemTypes, product.MirroredElemLabels, (annotations$proxy1 : Map[String, List[Any]]), (typeAnnotations$proxy1 : Map[String, List[Any]]), (inheritedAnnotations$proxy1 : Map[String, List[Any]])
--- reduce:
inline scala.compiletime.erasedValue[Tuple2[product.MirroredElemLabels, product.MirroredElemTypes]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Print, A200] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, p](label,
            magnolia1.CallByNeed.apply[Print[p]](scala.compiletime.summonInline[Print[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy1)
        magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ltail, ptail](annotations$proxy1,
          inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy1.+(1)).::[
          magnolia1.CaseClass.Param[Print, A200]](elem$1)
      }
  }
--- to:
{
  def unsafeCast(any: Any): Option[Int] =
    Option.when[Int](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[Int]))(any.asInstanceOf[Int])
  val label: String = scala.compiletime.constValue[("i" : String)].asInstanceOf[String]
  {
    val elem$1: magnolia1.CaseClass.Param[Print, A200] =
      magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, Int](label,
        magnolia1.CallByNeed.apply[Print[Int]](scala.compiletime.summonInline[Print[Int]]),
        magnolia1.CallByNeed.apply[Option[Int]](
          defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[Int](
            {
              def $anonfun(d: () => Any): Option[Int] = unsafeCast(d.apply())
              closure($anonfun)
            }
          )
        ),
      repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy1)
    magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ("s" : String) *: EmptyTuple.type,
      String *: EmptyTuple.type](annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1,
      repeated$proxy1, defaults$proxy1, idx$proxy1.+(1)).::[magnolia1.CaseClass.Param[Print, A200]](elem$1)
  }
}
-----------------------
Inlining magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ("s" : String) *: EmptyTuple.type, String *: EmptyTuple.type](
  annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1,
  idx$proxy1.+(1))
With RHS (inline scala.compiletime.erasedValue[Tuple2[Labels, Params]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Typeclass, A] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Typeclass, A, p](label,
            magnolia1.CallByNeed.apply[Typeclass[p]](scala.compiletime.summonInline[Typeclass[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated, annotations, inheritedAnnotations, typeAnnotations, idx)
        magnolia1.CaseClassDerivation.paramsFromMaps[Typeclass, A, ltail, ptail](annotations, inheritedAnnotations,
          typeAnnotations, repeated, defaults, idx.+(1)).::[magnolia1.CaseClass.Param[Typeclass, A]](elem$1)
      }
  }
):List[magnolia1.CaseClass.Param[Typeclass, A]]
parameter binding: val idx$proxy2: Int = idx$proxy1.+(1), false
inliner transform with
thisProxy =  -->
paramProxy = type A, type Typeclass, trait Map in package scala.collection.immutable, class Int in package scala, trait Map in package scala.collection.immutable, type Params, type Labels, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable --> A200, Print, (repeated$proxy1 : Map[String, Boolean]), (idx$proxy2 : Int), (defaults$proxy1 : Map[String, Option[() => Any]]), String *: EmptyTuple.type, ("s" : String) *: EmptyTuple.type, (annotations$proxy1 : Map[String, List[Any]]), (typeAnnotations$proxy1 : Map[String, List[Any]]), (inheritedAnnotations$proxy1 : Map[String, List[Any]])
--- reduce:
inline scala.compiletime.erasedValue[Tuple2[("s" : String) *: EmptyTuple.type, String *: EmptyTuple.type]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Print, A200] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, p](label,
            magnolia1.CallByNeed.apply[Print[p]](scala.compiletime.summonInline[Print[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy2)
        magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ltail, ptail](annotations$proxy1,
          inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy2.+(1)).::[
          magnolia1.CaseClass.Param[Print, A200]](elem$1)
      }
  }
--- to:
{
  def unsafeCast(any: Any): Option[String] =
    Option.when[String](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[String]))(any.asInstanceOf[String])
  val label: String = scala.compiletime.constValue[("s" : String)].asInstanceOf[String]
  {
    val elem$1: magnolia1.CaseClass.Param[Print, A200] =
      magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, String](label,
        magnolia1.CallByNeed.apply[Print[String]](scala.compiletime.summonInline[Print[String]]),
        magnolia1.CallByNeed.apply[Option[String]](
          defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[String](
            {
              def $anonfun(d: () => Any): Option[String] = unsafeCast(d.apply())
              closure($anonfun)
            }
          )
        ),
      repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy2)
    magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, EmptyTuple.type, EmptyTuple.type](annotations$proxy1,
      inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy2.+(1)).::[
      magnolia1.CaseClass.Param[Print, A200]](elem$1)
  }
}
-----------------------
Inlining magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, EmptyTuple.type, EmptyTuple.type](annotations$proxy1,
  inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy2.+(1))
With RHS (inline scala.compiletime.erasedValue[Tuple2[Labels, Params]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Typeclass, A] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Typeclass, A, p](label,
            magnolia1.CallByNeed.apply[Typeclass[p]](scala.compiletime.summonInline[Typeclass[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated, annotations, inheritedAnnotations, typeAnnotations, idx)
        magnolia1.CaseClassDerivation.paramsFromMaps[Typeclass, A, ltail, ptail](annotations, inheritedAnnotations,
          typeAnnotations, repeated, defaults, idx.+(1)).::[magnolia1.CaseClass.Param[Typeclass, A]](elem$1)
      }
  }
):List[magnolia1.CaseClass.Param[Typeclass, A]]
parameter binding: val idx$proxy3: Int = idx$proxy2.+(1), false
inliner transform with
thisProxy =  -->
paramProxy = type A, type Typeclass, trait Map in package scala.collection.immutable, class Int in package scala, trait Map in package scala.collection.immutable, type Params, type Labels, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable --> A200, Print, (repeated$proxy1 : Map[String, Boolean]), (idx$proxy3 : Int), (defaults$proxy1 : Map[String, Option[() => Any]]), EmptyTuple.type, EmptyTuple.type, (annotations$proxy1 : Map[String, List[Any]]), (typeAnnotations$proxy1 : Map[String, List[Any]]), (inheritedAnnotations$proxy1 : Map[String, List[Any]])
--- reduce:
inline scala.compiletime.erasedValue[Tuple2[EmptyTuple.type, EmptyTuple.type]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Print, A200] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, p](label,
            magnolia1.CallByNeed.apply[Print[p]](scala.compiletime.summonInline[Print[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy3)
        magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ltail, ptail](annotations$proxy1,
          inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy3.+(1)).::[
          magnolia1.CaseClass.Param[Print, A200]](elem$1)
      }
  }
--- to:
Nil
-----------------------
Inlining magnolia1.Macro.typeInfo[A200]
With RHS ${
  {
    def $anonfun(using evidence$25: scala.quoted.Quotes): scala.quoted.Expr[magnolia1.TypeInfo] =
      magnolia1.Macro.typeInfo[T](scala.quoted.Type.of[T](evidence$25), evidence$25)
    closure($anonfun)
  }
}:magnolia1.TypeInfo
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.isObject[A200]
With RHS ${
  {
    def $anonfun(using evidence$14: scala.quoted.Quotes): scala.quoted.Expr[Boolean] =
      magnolia1.Macro.isObject[T](scala.quoted.Type.of[T](evidence$14), evidence$14)
    closure($anonfun)
  }
}:Boolean
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.isValueClass[A200]
With RHS ${
  {
    def $anonfun(using evidence$21: scala.quoted.Quotes): scala.quoted.Expr[Boolean] =
      magnolia1.Macro.isValueClass[T](scala.quoted.Type.of[T](evidence$21), evidence$21)
    closure($anonfun)
  }
}:Boolean
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.anns[A200]
With RHS ${
  {
    def $anonfun(using evidence$16: scala.quoted.Quotes): scala.quoted.Expr[List[Any]] =
      magnolia1.Macro.anns[T](scala.quoted.Type.of[T](evidence$16), evidence$16)
    closure($anonfun)
  }
}:List[Any]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.inheritedAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$17: scala.quoted.Quotes): scala.quoted.Expr[List[Any]] =
      magnolia1.Macro.inheritedAnns[T](scala.quoted.Type.of[T](evidence$17), evidence$17)
    closure($anonfun)
  }
}:List[Any]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.typeAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$18: scala.quoted.Quotes): scala.quoted.Expr[List[Any]] =
      magnolia1.Macro.typeAnns[T](scala.quoted.Type.of[T](evidence$18), evidence$18)
    closure($anonfun)
  }
}:List[Any]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200

3.4.2:

[info] compiling 2 Scala sources to D:\magnolia-test\target\scala-3.4.2-RC1-bin-SNAPSHOT\classes ...
-----------------------
Inlining Print.derived[A200](
  A200.$asInstanceOf[

      scala.deriving.Mirror.Product{
        type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
          type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
      }

  ]
)
With RHS Derivation.this.derivedMirror[A](x$1):Derivation.this.Typeclass[A]
parameter binding: val x$1$proxy1:

    scala.deriving.Mirror.Product{
      type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
        type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
    }

 =
  A200.$asInstanceOf[

      scala.deriving.Mirror.Product{
        type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
          type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
      }

  ], false
proxy at 3: value Derivation_this = val Derivation_this: Print.type = Print
inliner transform with
thisProxy = trait Derivation --> (Derivation_this : Print.type)
paramProxy = type A, type Of in object Mirror, type TypeClass in trait Derivation --> A200, (x$1$proxy1 :
  scala.deriving.Mirror.Product{
    type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
      type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
  }
), Print
-----------------------
Inlining Derivation_this.derivedMirror[A200](x$1$proxy1)
With RHS (inline mirror match
  {
    case sum @ _:scala.deriving.Mirror.SumOf[A] =>
      Derivation.this.derivedMirrorSum[A](sum)
    case product @ _:scala.deriving.Mirror.ProductOf[A] =>
      Derivation.this.derivedMirrorProduct[A](product)
  }
):Derivation.this.Typeclass[A]
proxy at 3: value Derivation_this = val Derivation_this: (Derivation_this : Print.type) = Derivation_this
inliner transform with
thisProxy = trait Derivation --> (Derivation_this : (Derivation_this : Print.type))
paramProxy = type A, type TypeClass in trait Derivation, type Of in object Mirror --> A200, Print, (x$1$proxy1 :
  scala.deriving.Mirror.Product{
    type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
      type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
  }
)
--- reduce:
inline x$1$proxy1 match
  {
    case sum @ _:scala.deriving.Mirror.SumOf[A200] =>
      Derivation_this.derivedMirrorSum[A200](sum)
    case product @ _:scala.deriving.Mirror.ProductOf[A200] =>
      Derivation_this.derivedMirrorProduct[A200](product)
  }
--- to:
{
  val $scrutinee1:

      (x$1$proxy1 :
        scala.deriving.Mirror.Product{
          type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
            type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
        }
      )

   = x$1$proxy1
  val product:

      scala.deriving.Mirror.Product{
        type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
          type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
      }

   = $scrutinee1
  Derivation_this.derivedMirrorProduct[A200](product)
}
-----------------------
Inlining Derivation_this.derivedMirrorProduct[A200](product)
With RHS CommonDerivation.this.join[A](magnolia1.CaseClassDerivation.fromMirror[[T] =>> TypeClass[T], A](product)):
  CommonDerivation.this.Typeclass[A]
proxy at 3: value CommonDerivation_this = val CommonDerivation_this: (Derivation_this : (Derivation_this : Print.type)) = Derivation_this
inliner transform with
thisProxy = trait CommonDerivation --> (CommonDerivation_this : (Derivation_this : (Derivation_this : Print.type)))
paramProxy = type ProductOf in object Mirror, type TypeClass in trait CommonDerivation, type A --> (product :
  scala.deriving.Mirror.Product{
    type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
      type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
  }
), Print, A200
-----------------------
Inlining magnolia1.CaseClassDerivation.fromMirror[Print, A200](product)
With RHS {
  val params: IArray[magnolia1.CaseClass.Param[Typeclass, A]] =
    IArray.apply[magnolia1.CaseClass.Param[Typeclass, A]](
      magnolia1.CaseClassDerivation.paramsFromMaps[Typeclass, A, product.MirroredElemLabels, product.MirroredElemTypes](
        magnolia1.Macro.paramAnns[A].to[Map[String, List[Any]]](
          scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
        magnolia1.Macro.inheritedParamAnns[A].to[Map[String, List[Any]]](
          scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
        magnolia1.Macro.paramTypeAnns[A].to[Map[String, List[Any]]](
          scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
        magnolia1.Macro.repeated[A].to[Map[String, Boolean]](
          scala.collection.MapFactory.toFactory[String, Boolean, Map](Map)),
        magnolia1.Macro.defaultValue[A].to[Map[String, Option[() => Any]]](
          scala.collection.MapFactory.toFactory[String, Option[() => Any], Map](Map)),
        this.paramsFromMaps$default$6[Typeclass, A, product.MirroredElemLabels, product.MirroredElemTypes])*
    )(scala.reflect.ClassTag.apply[magnolia1.CaseClass.Param[Typeclass, A]](classOf[magnolia1.CaseClass.Param]))
  new ProductCaseClass[Typeclass, A](magnolia1.Macro.typeInfo[A], magnolia1.Macro.isObject[A],
    magnolia1.Macro.isValueClass[A], params, IArray.apply[Any](magnolia1.Macro.anns[A]*)(scala.reflect.ClassTag.Any),
    IArray.apply[Any](magnolia1.Macro.inheritedAnns[A]*)(scala.reflect.ClassTag.Any),
    IArray.apply[Any](magnolia1.Macro.typeAnns[A]*)(scala.reflect.ClassTag.Any), product)
}:magnolia1.CaseClass[Typeclass, A]
inliner transform with
thisProxy =  -->
paramProxy = type ProductOf in object Mirror, type A, type Typeclass --> (product :
  scala.deriving.Mirror.Product{
    type MirroredMonoType = A200; type MirroredType = A200; type MirroredLabel = ("A200" : String);
      type MirroredElemTypes = (Int, String); type MirroredElemLabels = (("i" : String), ("s" : String))
  }
), A200, Print
-----------------------
Inlining magnolia1.Macro.paramAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$19: scala.quoted.Quotes): scala.quoted.Expr[List[(String, List[Any])]] =
      magnolia1.Macro.paramAnns[T](scala.quoted.Type.of[T](evidence$19), evidence$19)
    closure($anonfun)
  }
}:List[Tuple2[String, List[Any]]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.inheritedParamAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$20: scala.quoted.Quotes): scala.quoted.Expr[List[(String, List[Any])]] =
      magnolia1.Macro.inheritedParamAnns[T](scala.quoted.Type.of[T](evidence$20), evidence$20)
    closure($anonfun)
  }
}:List[Tuple2[String, List[Any]]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.paramTypeAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$23: scala.quoted.Quotes): scala.quoted.Expr[List[(String, List[Any])]] =
      magnolia1.Macro.paramTypeAnns[T](scala.quoted.Type.of[T](evidence$23), evidence$23)
    closure($anonfun)
  }
}:List[Tuple2[String, List[Any]]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.repeated[A200]
With RHS ${
  {
    def $anonfun(using evidence$24: scala.quoted.Quotes): scala.quoted.Expr[List[(String, Boolean)]] =
      magnolia1.Macro.repeated[T](scala.quoted.Type.of[T](evidence$24), evidence$24)
    closure($anonfun)
  }
}:List[Tuple2[String, Boolean]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.defaultValue[A200]
With RHS ${
  {
    def $anonfun(using evidence$22: scala.quoted.Quotes): scala.quoted.Expr[List[(String, Option[() => Any])]] =
      magnolia1.Macro.defaultValue[T](scala.quoted.Type.of[T](evidence$22), evidence$22)
    closure($anonfun)
  }
}:List[Tuple2[String, Option[() => Any]]]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, product.MirroredElemLabels, product.MirroredElemTypes](
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)),
  (
    List.apply[(String, Boolean)](
      [Tuple2.apply[String, Boolean]("i", false),Tuple2.apply[String, Boolean]("s", false) : (String, Boolean)]*)
  :List[Tuple2[String, Boolean]]).to[Map[String, Boolean]](
    scala.collection.MapFactory.toFactory[String, Boolean, Map](Map)),
  (
    List.apply[(String, Option[() => Any])](
      [Tuple2.apply[String, None.type]("i", None),Tuple2.apply[String, None.type]("s", None) :
        (String, Option[() => Any])]*
    )
  :List[Tuple2[String, Option[() => Any]]]).to[Map[String, Option[() => Any]]](
    scala.collection.MapFactory.toFactory[String, Option[() => Any], Map](Map)),
  CaseClassDerivation.this.paramsFromMaps$default$6[Print, A200, product.MirroredElemLabels, product.MirroredElemTypes])
With RHS (inline scala.compiletime.erasedValue[Tuple2[Labels, Params]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Typeclass, A] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Typeclass, A, p](label,
            magnolia1.CallByNeed.apply[Typeclass[p]](scala.compiletime.summonInline[Typeclass[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated, annotations, inheritedAnnotations, typeAnnotations, idx)
        magnolia1.CaseClassDerivation.paramsFromMaps[Typeclass, A, ltail, ptail](annotations, inheritedAnnotations,
          typeAnnotations, repeated, defaults, idx.+(1)).::[magnolia1.CaseClass.Param[Typeclass, A]](elem$1)
      }
  }
):List[magnolia1.CaseClass.Param[Typeclass, A]]
parameter binding: val annotations$proxy1: Map[String, List[Any]] =
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)), false
parameter binding: val inheritedAnnotations$proxy1: Map[String, List[Any]] =
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)), false
parameter binding: val typeAnnotations$proxy1: Map[String, List[Any]] =
  (Nil:List[Tuple2[String, List[Any]]]).to[Map[String, List[Any]]](
    scala.collection.MapFactory.toFactory[String, List[Any], Map](Map)), false
parameter binding: val repeated$proxy1: Map[String, Boolean] =
  (
    List.apply[(String, Boolean)](
      [Tuple2.apply[String, Boolean]("i", false),Tuple2.apply[String, Boolean]("s", false) : (String, Boolean)]*)
  :List[Tuple2[String, Boolean]]).to[Map[String, Boolean]](
    scala.collection.MapFactory.toFactory[String, Boolean, Map](Map)), false
parameter binding: val defaults$proxy1: Map[String, Option[() => Any]] =
  (
    List.apply[(String, Option[() => Any])](
      [Tuple2.apply[String, None.type]("i", None),Tuple2.apply[String, None.type]("s", None) :
        (String, Option[() => Any])]*
    )
  :List[Tuple2[String, Option[() => Any]]]).to[Map[String, Option[() => Any]]](
    scala.collection.MapFactory.toFactory[String, Option[() => Any], Map](Map)), false
parameter binding: val idx$proxy1: Int =
  CaseClassDerivation.this.paramsFromMaps$default$6[Print, A200, product.MirroredElemLabels, product.MirroredElemTypes], false
inliner transform with
thisProxy =  -->
paramProxy = trait Map in package scala.collection.immutable, type Params, trait Map in package scala.collection.immutable, type Typeclass, class Int in package scala, trait Map in package scala.collection.immutable, type A, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable, type Labels --> (typeAnnotations$proxy1 : Map[String, List[Any]]), product.MirroredElemTypes, (inheritedAnnotations$proxy1 : Map[String, List[Any]]), Print, (idx$proxy1 : Int), (annotations$proxy1 : Map[String, List[Any]]), A200, (repeated$proxy1 : Map[String, Boolean]), (defaults$proxy1 : Map[String, Option[() => Any]]), product.MirroredElemLabels
--- reduce:
inline scala.compiletime.erasedValue[Tuple2[product.MirroredElemLabels, product.MirroredElemTypes]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Print, A200] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, p](label,
            magnolia1.CallByNeed.apply[Print[p]](scala.compiletime.summonInline[Print[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy1)
        magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ltail, ptail](annotations$proxy1,
          inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy1.+(1)).::[
          magnolia1.CaseClass.Param[Print, A200]](elem$1)
      }
  }
--- to:
{
  def unsafeCast(any: Any): Option[Int] =
    Option.when[Int](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[Int]))(any.asInstanceOf[Int])
  val label: String = scala.compiletime.constValue[("i" : String)].asInstanceOf[String]
  {
    val elem$1: magnolia1.CaseClass.Param[Print, A200] =
      magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, Int](label,
        magnolia1.CallByNeed.apply[Print[Int]](scala.compiletime.summonInline[Print[Int]]),
        magnolia1.CallByNeed.apply[Option[Int]](
          defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[Int](
            {
              def $anonfun(d: () => Any): Option[Int] = unsafeCast(d.apply())
              closure($anonfun)
            }
          )
        ),
      repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy1)
    magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ("s" : String) *: EmptyTuple.type,
      String *: EmptyTuple.type](annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1,
      repeated$proxy1, defaults$proxy1, idx$proxy1.+(1)).::[magnolia1.CaseClass.Param[Print, A200]](elem$1)
  }
}
-----------------------
Inlining magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ("s" : String) *: EmptyTuple.type, String *: EmptyTuple.type](
  annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1,
  idx$proxy1.+(1))
With RHS (inline scala.compiletime.erasedValue[Tuple2[Labels, Params]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Typeclass, A] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Typeclass, A, p](label,
            magnolia1.CallByNeed.apply[Typeclass[p]](scala.compiletime.summonInline[Typeclass[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated, annotations, inheritedAnnotations, typeAnnotations, idx)
        magnolia1.CaseClassDerivation.paramsFromMaps[Typeclass, A, ltail, ptail](annotations, inheritedAnnotations,
          typeAnnotations, repeated, defaults, idx.+(1)).::[magnolia1.CaseClass.Param[Typeclass, A]](elem$1)
      }
  }
):List[magnolia1.CaseClass.Param[Typeclass, A]]
parameter binding: val idx$proxy2: Int = idx$proxy1.+(1), false
inliner transform with
thisProxy =  -->
paramProxy = trait Map in package scala.collection.immutable, type Params, trait Map in package scala.collection.immutable, type Typeclass, class Int in package scala, trait Map in package scala.collection.immutable, type A, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable, type Labels --> (typeAnnotations$proxy1 : Map[String, List[Any]]), String *: EmptyTuple.type, (inheritedAnnotations$proxy1 : Map[String, List[Any]]), Print, (idx$proxy2 : Int), (annotations$proxy1 : Map[String, List[Any]]), A200, (repeated$proxy1 : Map[String, Boolean]), (defaults$proxy1 : Map[String, Option[() => Any]]), ("s" : String) *: EmptyTuple.type
--- reduce:
inline scala.compiletime.erasedValue[Tuple2[("s" : String) *: EmptyTuple.type, String *: EmptyTuple.type]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Print, A200] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, p](label,
            magnolia1.CallByNeed.apply[Print[p]](scala.compiletime.summonInline[Print[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy2)
        magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ltail, ptail](annotations$proxy1,
          inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy2.+(1)).::[
          magnolia1.CaseClass.Param[Print, A200]](elem$1)
      }
  }
--- to:
{
  def unsafeCast(any: Any): Option[String] =
    Option.when[String](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[String]))(any.asInstanceOf[String])
  val label: String = scala.compiletime.constValue[("s" : String)].asInstanceOf[String]
  {
    val elem$1: magnolia1.CaseClass.Param[Print, A200] =
      magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, String](label,
        magnolia1.CallByNeed.apply[Print[String]](scala.compiletime.summonInline[Print[String]]),
        magnolia1.CallByNeed.apply[Option[String]](
          defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[String](
            {
              def $anonfun(d: () => Any): Option[String] = unsafeCast(d.apply())
              closure($anonfun)
            }
          )
        ),
      repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy2)
    magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, EmptyTuple.type, EmptyTuple.type](annotations$proxy1,
      inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy2.+(1)).::[
      magnolia1.CaseClass.Param[Print, A200]](elem$1)
  }
}
-----------------------
Inlining magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, EmptyTuple.type, EmptyTuple.type](annotations$proxy1,
  inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy2.+(1))
With RHS (inline scala.compiletime.erasedValue[Tuple2[Labels, Params]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Typeclass, A] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Typeclass, A, p](label,
            magnolia1.CallByNeed.apply[Typeclass[p]](scala.compiletime.summonInline[Typeclass[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated, annotations, inheritedAnnotations, typeAnnotations, idx)
        magnolia1.CaseClassDerivation.paramsFromMaps[Typeclass, A, ltail, ptail](annotations, inheritedAnnotations,
          typeAnnotations, repeated, defaults, idx.+(1)).::[magnolia1.CaseClass.Param[Typeclass, A]](elem$1)
      }
  }
):List[magnolia1.CaseClass.Param[Typeclass, A]]
parameter binding: val idx$proxy3: Int = idx$proxy2.+(1), false
inliner transform with
thisProxy =  -->
paramProxy = trait Map in package scala.collection.immutable, type Params, trait Map in package scala.collection.immutable, type Typeclass, class Int in package scala, trait Map in package scala.collection.immutable, type A, trait Map in package scala.collection.immutable, trait Map in package scala.collection.immutable, type Labels --> (typeAnnotations$proxy1 : Map[String, List[Any]]), EmptyTuple.type, (inheritedAnnotations$proxy1 : Map[String, List[Any]]), Print, (idx$proxy3 : Int), (annotations$proxy1 : Map[String, List[Any]]), A200, (repeated$proxy1 : Map[String, Boolean]), (defaults$proxy1 : Map[String, Option[() => Any]]), EmptyTuple.type
--- reduce:
inline scala.compiletime.erasedValue[Tuple2[EmptyTuple.type, EmptyTuple.type]] match
  {
    case _:Tuple2[EmptyTuple, EmptyTuple] =>
      Nil
    case _:Tuple2[*:[l @ _, ltail @ _], *:[p @ _, ptail @ _]] =>
      def unsafeCast(any: Any): Option[p] =
        Option.when[p](any.==(null).||((any:(any : Any) @unchecked).isInstanceOf[p]))(any.asInstanceOf[p])
      val label: String = scala.compiletime.constValue[l].asInstanceOf[String]
      {
        val elem$1: magnolia1.CaseClass.Param[Print, A200] =
          magnolia1.CaseClassDerivation.inline$paramFromMaps[Print, A200, p](label,
            magnolia1.CallByNeed.apply[Print[p]](scala.compiletime.summonInline[Print[p]]),
            magnolia1.CallByNeed.apply[Option[p]](
              defaults$proxy1.get(label).flatten[() => Any](<:<.refl[Option[() => Any]]).flatMap[p](
                {
                  def $anonfun(d: () => Any): Option[p] = unsafeCast(d.apply())
                  closure($anonfun)
                }
              )
            ),
          repeated$proxy1, annotations$proxy1, inheritedAnnotations$proxy1, typeAnnotations$proxy1, idx$proxy3)
        magnolia1.CaseClassDerivation.paramsFromMaps[Print, A200, ltail, ptail](annotations$proxy1,
          inheritedAnnotations$proxy1, typeAnnotations$proxy1, repeated$proxy1, defaults$proxy1, idx$proxy3.+(1)).::[
          magnolia1.CaseClass.Param[Print, A200]](elem$1)
      }
  }
--- to:
Nil
-----------------------
Inlining magnolia1.Macro.typeInfo[A200]
With RHS ${
  {
    def $anonfun(using evidence$25: scala.quoted.Quotes): scala.quoted.Expr[magnolia1.TypeInfo] =
      magnolia1.Macro.typeInfo[T](scala.quoted.Type.of[T](evidence$25), evidence$25)
    closure($anonfun)
  }
}:magnolia1.TypeInfo
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.isObject[A200]
With RHS ${
  {
    def $anonfun(using evidence$14: scala.quoted.Quotes): scala.quoted.Expr[Boolean] =
      magnolia1.Macro.isObject[T](scala.quoted.Type.of[T](evidence$14), evidence$14)
    closure($anonfun)
  }
}:Boolean
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.isValueClass[A200]
With RHS ${
  {
    def $anonfun(using evidence$21: scala.quoted.Quotes): scala.quoted.Expr[Boolean] =
      magnolia1.Macro.isValueClass[T](scala.quoted.Type.of[T](evidence$21), evidence$21)
    closure($anonfun)
  }
}:Boolean
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.anns[A200]
With RHS ${
  {
    def $anonfun(using evidence$16: scala.quoted.Quotes): scala.quoted.Expr[List[Any]] =
      magnolia1.Macro.anns[T](scala.quoted.Type.of[T](evidence$16), evidence$16)
    closure($anonfun)
  }
}:List[Any]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.inheritedAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$17: scala.quoted.Quotes): scala.quoted.Expr[List[Any]] =
      magnolia1.Macro.inheritedAnns[T](scala.quoted.Type.of[T](evidence$17), evidence$17)
    closure($anonfun)
  }
}:List[Any]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
-----------------------
Inlining magnolia1.Macro.typeAnns[A200]
With RHS ${
  {
    def $anonfun(using evidence$18: scala.quoted.Quotes): scala.quoted.Expr[List[Any]] =
      magnolia1.Macro.typeAnns[T](scala.quoted.Type.of[T](evidence$18), evidence$18)
    closure($anonfun)
  }
}:List[Any]
inliner transform with
thisProxy =  -->
paramProxy = type T --> A200
OlegYch commented 7 months ago

not sure how to procede further...

soronpo commented 7 months ago

not sure how to procede further...

I think bisecting is the best approach ATM. It will give a better hint what caused the regression. See https://github.com/scala/scala3/blob/main/project/scripts/bisect.scala

OlegYch commented 6 months ago

apparently this is a windows specific issue, at least i can't repro it on freebsd or wsl does anyone have a bisect.scala which works on windows or cygwin?

soronpo commented 6 months ago

Maybe it's (also) Java-specific? What JDK are you using?

OlegYch commented 6 months ago

thought so, but i tried 17,21,22 oracle or graal on win, and 17 and 21 openjdk on wsl

OlegYch commented 6 months ago

ok, i managed to bisect and it says 607e4d59d93e4ceb0e46469923161516c4e04b60 is the first bad commit, which seems plausible

soronpo commented 6 months ago

ok, i managed to bisect and it says 607e4d59d93e4ceb0e46469923161516c4e04b60 is the first bad commit, which seems plausible

@nicolasstucki

OlegYch commented 6 months ago

looks like it's just a matter of calling isDirectory too much