Closed OlegYch closed 5 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
those don't look related, it's a regression specifically moving from 3.3.3 to 3.4.0
for a single module with ~150 files it regresses from 17 seconds to 28
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?
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.
In order I would try
-Vprofile -Vprofile-details 1000
to see if there is some unexpected growth in the code. Maybe a macro decided to create more code in a particular case.-Yprofile-enabled -Yprofile-destination module-profile.csv
on both versions to figure out which phase is slower.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
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?
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.
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.)
here is minimized repro https://github.com/OlegYch/magnolia-test
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
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
not sure how to procede further...
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
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?
Maybe it's (also) Java-specific? What JDK are you using?
thought so, but i tried 17,21,22 oracle or graal on win, and 17 and 21 openjdk on wsl
ok, i managed to bisect and it says 607e4d59d93e4ceb0e46469923161516c4e04b60 is the first bad commit, which seems plausible
ok, i managed to bisect and it says 607e4d59d93e4ceb0e46469923161516c4e04b60 is the first bad commit, which seems plausible
@nicolasstucki
looks like it's just a matter of calling isDirectory too much
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