/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . fir . visitor s . generator Ċ Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . find Desc endant OfType Ċ Ċ class ĠData Collector Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġreferences Ġ= Ġmutable Map Of < String , ĠList < String >>() ĊĠĠĠ Ġprivate Ġval Ġpackage Per Class Ġ= Ġmutable Map Of < String , ĠF q Name >() ĊĠĠĠ Ġprivate Ġval Ġbase Trans formed Types Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġfun ĠreadFile ( file : ĠK t File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . accept Children ( object Ġ: ĠK t Visitor Void () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Kt Element ( element : ĠK t Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Kt Element ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . accept Children ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class ( klass : ĠK t Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġklass . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( klass . is Interface () Ġ&& ĠclassName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Per Class [ className ] Ġ= Ġfile . package Fq Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Base TT Ġ= Ġklass . annotation Entries . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . short Name ?. asString () Ġ== ĠBASE _ TRANS FOR MED _ TYPE _ AN NOT ATION _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Base TT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Trans formed Types Ġ+= ĠclassName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanual Ġ= Ġklass . super TypeList Entries . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Reference ?. find Desc endant OfType < Kt Annotation Entry > Ġ{ Ġannotation Entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Entry . short Name ?. asString () Ġ== ĠVIS IT ED _ SUPER TYPE _ AN NOT ATION _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manual Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferences [ className ] Ġ= ĠlistOf NotNull ( manual . type As User Type ?. referenced Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferences [ className ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġklass . super TypeList Entries . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type As User Type ?. referenced Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Class ( klass ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠMap < String , ĠList < String >> . compute Back References (): ĠMap < String , ĠList < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < String , ĠList < String >>() ĊĊĠĠĠĠĠĠĠ Ġthis . forEach Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . merge ( it , ĠlistOf ( k )) Ġ{ Ġa , Ġb Ġ-> Ġa Ġ+ Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠMap < String , ĠList < String >> . sorted (): ĠMap < String , ĠList < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . to Sorted Map (). map Values Ġ{ Ġ(_, Ġv ) Ġ-> Ġv . sorted () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompute Result (): ĠReferences Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġback Ġ= Ġreferences . compute Back References () ĊĊĠĠĠĠĠĠĠ Ġval Ġkeys To Keep Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Sequence ( listOf ( FI R _ ELEMENT _ CLASS _ NAME )) Ġ{ Ġfir Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Name . flatMap Ġ{ Ġback [ it ]. or Empty () Ġ}. take Unless Ġ{ Ġit . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatten (). toSet () ĊĊĠĠĠĠĠĠĠ Ġval Ġclean Back Ġ= Ġback . filter Keys Ġ{ Ġit Ġin Ġkeys To Keep Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠReferences Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclean Back . compute Back References (). sorted (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclean Back . sorted (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Per Class . filter Keys Ġ{ Ġit Ġin Ġkeys To Keep Ġ}. values . distinct (). sorted By Ġ{ Ġit . asString () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Trans formed Types . sorted () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠReferences Data ( ĊĠĠĠĠĠĠĠ Ġval Ġdirect : ĠMap < String , ĠList < String >>, ĊĠĠĠĠĠĠĠ Ġval Ġback : ĠMap < String , ĠList < String >>, ĊĠĠĠĠĠĠĠ Ġval Ġused Packages : ĠList < Fq Name >, ĊĠĠĠĠĠĠĠ Ġval Ġbase Trans formed Types : ĠList < String > ĊĠĠĠ Ġ) Ċ }