Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compilation performance regression on 3.4.0 #19924

Closed
OlegYch opened this issue Mar 11, 2024 · 21 comments · Fixed by #20193
Closed

Compilation performance regression on 3.4.0 #19924

OlegYch opened this issue Mar 11, 2024 · 21 comments · Fixed by #20193
Labels
area:inline area:metaprogramming:reflection Issues related to the quotes reflection API itype:performance regression This worked in a previous version but doesn't anymore stat:needs minimization Needs a self contained minimization
Milestone

Comments

@OlegYch
Copy link
Contributor

OlegYch commented Mar 11, 2024

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

@OlegYch OlegYch added itype:bug stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 11, 2024
@WojciechMazur
Copy link
Contributor

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 12, 2024

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 12, 2024

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 12, 2024

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

@Gedochao Gedochao added itype:performance area:metaprogramming:reflection Issues related to the quotes reflection API stat:needs info stat:needs minimization Needs a self contained minimization regression This worked in a previous version but doesn't anymore stat:needs bisection Need to use nightly builds and git bisect to find out the commit where this issue was introduced and removed itype:bug stat:needs triage Every issue needs to have an "area" and "itype" label labels Mar 12, 2024
@Gedochao
Copy link
Contributor

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

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

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

@nicolasstucki
Copy link
Contributor

In order I would try

  • You could compile both with -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.
  • Use -Yprofile-enabled -Yprofile-destination module-profile.csv on both versions to figure out which phase is slower.
  • Minimize
  • Bisect

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 12, 2024

ok here is profile output:
3.3.3

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

3.4.0

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

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

profile details are the same for 3.3.3 and 3.4.0:

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 12, 2024

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

@nicolasstucki
Copy link
Contributor

nicolasstucki commented Mar 13, 2024

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

-  val inlining = noPrinter
+  val inlining = default

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

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

@SethTisue
Copy link
Member

You will need to publish a snapshot of the compiler

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 13, 2024

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 21, 2024

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 21, 2024

not much difference in inlining logging:
3.3.3:

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

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

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

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

 =
  A200.$asInstanceOf[

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

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

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

   = x$1$proxy1
  val product:

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

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

3.4.2:

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

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

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

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

 =
  A200.$asInstanceOf[

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

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

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

   = x$1$proxy1
  val product:

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

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Mar 26, 2024

not sure how to procede further...

@soronpo
Copy link
Contributor

soronpo commented Mar 26, 2024

not sure how to procede further...

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Apr 10, 2024

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

@soronpo
Copy link
Contributor

soronpo commented Apr 10, 2024

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Apr 10, 2024

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

@OlegYch
Copy link
Contributor Author

OlegYch commented Apr 11, 2024

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

@soronpo
Copy link
Contributor

soronpo commented Apr 11, 2024

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

@nicolasstucki

@OlegYch
Copy link
Contributor Author

OlegYch commented Apr 15, 2024

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

OlegYch added a commit to OlegYch/scala3 that referenced this issue Apr 15, 2024
@Gedochao Gedochao removed stat:needs info stat:needs bisection Need to use nightly builds and git bisect to find out the commit where this issue was introduced labels May 7, 2024
jchyb added a commit that referenced this issue May 7, 2024
Caches isDirectory calls

Too many of them were added in
607e4d5
and this degraded compilation performance by up to 100% on Windows

Fixes #19924
backport to release-3.4.2
@Kordyjan Kordyjan added this to the 3.5.0 milestone May 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:inline area:metaprogramming:reflection Issues related to the quotes reflection API itype:performance regression This worked in a previous version but doesn't anymore stat:needs minimization Needs a self contained minimization
Projects
None yet
Development

Successfully merging a pull request may close this issue.

7 participants