// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ċ package Ġorg . jetbrains . kotlin . idea . test Integration Ċ Ċ import Ġcom . intellij . code Insight . Test Frameworks Ċ import Ġcom . intellij . openapi . util . Pair Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Named Element Ċ import Ġcom . intellij . psi . search . Psi Short Names Cache Ċ import Ġcom . intellij . test Integration . Java Test Finder Ċ import Ġcom . intellij . test Integration . Test Finder Helper Ċ import Ġcom . intellij . util . Common Processors Ċ import Ġorg . jetbrains . kotlin . as Java . classes . Kt Light Class For Facade Ċ import Ġorg . jetbrains . kotlin . as Java . classes . Kt Light Class For Source Declaration Ċ import Ġorg . jetbrains . kotlin . as Java . find Facade Class Ċ import Ġorg . jetbrains . kotlin . as Java . to Light Class Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . resolve To Descriptor If Any Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . parent sWith Self Ċ import Ġjava . util . regex . Pattern Ċ Ċ // ĠBased Ġon Ġcom . intellij . test Integration . Java Test Finder . Java Test Finder Ġimplementation Ċ // ĠTODO : ĠWe Ġcan Ġreuse ĠJava Test Finder Ġif ĠKotlin Ġclasses Ġhave Ġtheir Ġis Physical () Ġreturn Ġtrue Ċ class ĠKotlin Test Finder Ġ: ĠJava Test Finder () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġfind Source Element ( from : ĠPsi Element ): ĠPsi Class ? Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . find Source Element ( from )?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġfrom . parent sWith Self . filter Is Instance < Kt Class Or Object >(). first OrNull Ġ{ Ġ! it . is Local Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( it . resolve To Descriptor If Any () Ġ== Ġnull ) Ġnull Ġelse Ġit . to Light Class () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( from . containing File Ġas ? ĠK t File )?. find Facade Class () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Test ( element : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Element Ġ= Ġfind Source Element ( element ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . is Test ( source Element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Classes For Test ( element : ĠPsi Element ): ĠCollection < Psi Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġfind Source Element ( element ) Ġ?: Ġreturn Ġempty Set () ĊĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġget Search Scope ( element , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠPsi Short Names Cache . getInstance ( element . project ) ĊĊĠĠĠĠĠĠĠ Ġval Ġframeworks Ġ= ĠTest Frameworks . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġclasses With Weights Ġ= ĠArrayList < Pair < out ĠPsi Named Element , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( candidate Name With Weight Ġin ĠTest Finder Helper . collect Possible ClassNames With Weights ( klass . name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( each Class Ġin Ġcache . get Classes ByName ( candidate Name With Weight . first , Ġscope )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( each Class . is Annotation Type Ġ|| Ġframeworks . is TestClass ( each Class )) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( each Class Ġis ĠK t Light Class For Facade ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeach Class . files . map To ( classes With Weights ) Ġ{ ĠPair . create ( it , Ġcandidate Name With Weight . second ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( each Class . is Physical Ġ|| Ġeach Class Ġis ĠK t Light Class For Source Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses With Weights . add ( Pair . create ( each Class , Ġcandidate Name With Weight . second )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTest Finder Helper . get Sorted Elements ( classes With Weights , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind Tests For Class ( element : ĠPsi Element ): ĠCollection < Psi Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġklass Ġ= Ġfind Source Element ( element ) Ġ?: Ġreturn Ġempty Set () ĊĊĠĠĠĠĠĠĠ Ġval Ġclasses With Prox im ities Ġ= ĠArrayList < Pair < out ĠPsi Named Element , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġval Ġprocessor Ġ= ĠCommon Processors . Collect Processor ( classes With Prox im ities ) ĊĊĠĠĠĠĠĠĠ Ġval Ġklass Name Ġ= Ġklass . name !! ĊĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= ĠPattern . compile (" .* " Ġ+ ĠString Util . escape To Regexp ( klass Name ) Ġ+ Ġ" .* ", ĠPattern . CASE _ INS ENS ITIVE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġget Search Scope ( klass , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġframeworks Ġ= ĠTest Frameworks . getInstance () ĊĊĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĠPsi Short Names Cache . getInstance ( klass . project ) ĊĠĠĠĠĠĠĠ Ġcache . process All ClassNames Ġ{ Ġcandidate Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! pattern . matcher ( candidate Name ). matches ()) Ġreturn @ process All ClassNames Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( candidate Class Ġin Ġcache . get Classes ByName ( candidate Name , Ġscope )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( frameworks . is TestClass ( candidate Class ) Ġ|| Ġframeworks . is Potential TestClass ( candidate Class ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ process All ClassNames Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! candidate Class . is Physical Ġ&& Ġcandidate Class Ġ! is ĠK t Light Class For Source Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ process All ClassNames Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! processor . process ( Pair . create ( candidate Class , ĠTest Finder Helper . calc Test Name Prox imity ( klass Name , Ġcandidate Name )))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ process All ClassNames Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ process All ClassNames Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTest Finder Helper . get Sorted Elements ( classes With Prox im ities , Ġtrue ) ĊĠĠĠ Ġ} Ċ }