/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" Test FunctionName ") Ċ Ċ package Ġorg . jetbrains . kotlin . test . frontend . classic Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġorg . jetbrains . kotlin . container . Storage Component Container Ċ import Ġorg . jetbrains . kotlin . container . use Instance Ċ import Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . impl . Module Descriptor Impl Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . resolve . Compiler Environment Ċ import Ġorg . jetbrains . kotlin . resolve . Module Path Ċ import Ġorg . jetbrains . kotlin . resolve . Module Structure Oracle Ċ import Ġorg . jetbrains . kotlin . resolve . Target Environment Ċ import Ġorg . jetbrains . kotlin . resolve . multi platform . is Common Source Ċ import Ġorg . jetbrains . kotlin . test . directives . Multi platform Diagnostics Directives . ENABLE _ MULTI PLATFORM _ COMP OS ITE _ ANAL YS IS _ MODE Ċ import Ġorg . jetbrains . kotlin . test . model .* Ċ import Ġorg . jetbrains . kotlin . test . services .* Ċ import Ġorg . jetbrains . kotlin . types . type Util . closure Ċ Ċ internal Ġfun ĠMulti platform Analysis Configuration ( test Services : ĠTest Services ): ĠMulti platform Analysis Configuration Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( test Services . module Structure . all Directives . contains ( ENABLE _ MULTI PLATFORM _ COMP OS ITE _ ANAL YS IS _ MODE )) Ġ{ ĊĠĠĠĠĠĠĠ ĠMulti platform Composite Analysis Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Services . dependency Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Services . source File Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Services . module Descriptor Provider , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠMulti platform Separ ate Analysis Configuration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Services . dependency Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Services . source File Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Services . module Descriptor Provider ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġinterface ĠMulti platform Analysis Configuration Ġ{ ĊĠĠĠ Ġfun Ġget Compiler Environment ( module : ĠTest Module ): ĠTarget Environment ĊĠĠĠ Ġfun Ġget Kt Files For For Source Files ( project : ĠProject , Ġmodule : ĠTest Module ): ĠMap < Test File , ĠK t File > ĊĠĠĠ Ġfun Ġget Dependency Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > ĊĠĠĠ Ġfun Ġget Friend Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > ĊĠĠĠ Ġfun Ġget Dep ends On Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > Ċ } Ċ Ċ /** Ċ Ġ* ĠTr ad itional Ġ' compiler Ġcli ' Ġconfiguration Ġin Ġwhich Ġevery Ġplatform Ġgets Ġanalyzed Ġ' separate ' Ċ Ġ* Ġby Ġincluding Ġdepends On Ġsource Ġfiles Ġdirectly Ġinto Ġthe Ġmodule Ġdescriptor . Ċ Ġ* Ċ Ġ* ĠThis Ġmode Ġworks Ġsimilar Ġto Ġhow Ġactual Ġuser Ġprojects Ġwould Ġcompile Ġplatforms Ġlike Ġ' jvm ', Ġ' native ' Ġor Ġjs Ġtargets . Ċ Ġ*/ Ċ internal Ġclass ĠMulti platform Separ ate Analysis Configuration ( ĊĠĠĠ Ġprivate Ġval Ġdependency Provider : ĠDependency Provider , ĊĠĠĠ Ġprivate Ġval Ġsource File Provider : ĠSource File Provider , ĊĠĠĠ Ġprivate Ġval Ġmodule Descriptor Provider : ĠModule Descriptor Provider Ċ ) Ġ: ĠMulti platform Analysis Configuration Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Compiler Environment ( module : ĠTest Module ): ĠTarget Environment Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠCompiler Environment ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Dependency Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Descriptors ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . all Dependencies Ġ- Ġmodule . depends On Dependencies . toSet (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Provider , Ġmodule Descriptor Provider ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Dep ends On Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Friend Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Descriptors ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . friend Dependencies , Ġdependency Provider , Ġmodule Descriptor Provider ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Kt Files For For Source Files ( project : ĠProject , Ġmodule : ĠTest Module ): ĠMap < Test File , ĠK t File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkt Files Map Ġ= Ġsource File Provider . get Kt Files For Source Files ( module . files , Ġproject ). to Mutable Map () ĊĠĠĠĠĠĠĠ Ġfun Ġadd Dep ends On Sources ( dependencies : ĠList < Dependency Description >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dependencies . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dependency Ġin Ġdependencies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Module Ġ= Ġdependency Provider . getTest Module ( dependency . moduleName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifact Ġ= Ġdependency Provider . get Artifact ( dependency Module , ĠFrontend Kinds . Classic Frontend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWe Ġneed Ġcreate ĠK t Files Ġagain Ġwith Ġnew Ġproject Ġbecause Ġotherwise Ġwe Ġcan Ġaccess Ġto Ġsome Ġcaches Ġusing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Ġproject Ġas Ġkey Ġwhich Ġmay Ġleads Ġto Ġmissing Ġservices Ġin Ġcore Ġenvironment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt Files Ġ= Ġsource File Provider . get Kt Files For Source Files ( artifact . all Kt Files . keys , Ġproject ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkt Files . values . forEach Ġ{ Ġkt File Ġ-> Ġkt File . is Common Source Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkt Files Map . put All ( kt Files ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Dep ends On Sources ( dependency Module . depends On Dependencies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Dep ends On Sources ( module . depends On Dependencies ) ĊĠĠĠĠĠĠĠ Ġreturn Ġkt Files Map ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠConfiguration Ġthat Ġwill Ġwork Ġ' more Ġsimilar ' Ġto Ġhow Ġthe ĠIDE Ġworks Ġwhere Ġdepends On Ġedges Ġwill Ġbe Ġlocated Ċ Ġ* Ġin Ġseparate Ġmodule Ġdescriptors . ĠThe Ġkey Ġdifference Ġto Ġthe ĠIDE Ġis , Ġthat Ġthis Ġmode Ġwill Ġnot Ġ( yet ) Ġsupport Ċ Ġ* Ġreversed Ġdepends Ġon Ġpaths Ġsee Ġ[ Composite Analysis Module Structure Oracle ] Ċ Ġ*/ Ċ internal Ġclass ĠMulti platform Composite Analysis Configuration ( ĊĠĠĠ Ġprivate Ġval Ġdependency Provider : ĠDependency Provider , ĊĠĠĠ Ġprivate Ġval Ġsource File Provider : ĠSource File Provider , ĊĠĠĠ Ġprivate Ġval Ġmodule Descriptor Provider : ĠModule Descriptor Provider , Ċ ) Ġ: ĠMulti platform Analysis Configuration Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Compiler Environment ( module : ĠTest Module ): ĠTarget Environment Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠComposite Analysis Target Environment ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Kt Files For For Source Files ( project : ĠProject , Ġmodule : ĠTest Module ): ĠMap < Test File , ĠK t File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsource File Provider . get Kt Files For Source Files ( module . files , Ġproject ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Dependency Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTrans itive Ġdepends On Ġdescriptors Ġshould Ġalso Ġbe Ġreturned Ġas Ġdependencies ĊĠĠĠĠĠĠĠ Ġval Ġall Dep ends On Dependencies Ġ= Ġmodule . depends On Dependencies . closure ( preserve Order Ġ= Ġtrue ) Ġ{ Ġdepends On Dependency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Provider . getTest Module ( depends On Dependency . moduleName ). depends On Dependencies ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġall Dependencies Ġ= Ġ( module . all Dependencies Ġ+ Ġall Dep ends On Dependencies ). distinct () ĊĠĠĠĠĠĠĠ Ġreturn Ġget Descriptors ( all Dependencies , Ġdependency Provider , Ġmodule Descriptor Provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Dep ends On Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Descriptors ( module . depends On Dependencies , Ġdependency Provider , Ġmodule Descriptor Provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Friend Descriptors ( module : ĠTest Module ): ĠList < Module Descriptor Impl > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Descriptors ( module . friend Dependencies , Ġdependency Provider , Ġmodule Descriptor Provider ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠComposite Analysis Target Environment Ġ: ĠTarget Environment (" Test : ĠMulti platform Ġwith ĠComposite ĠAnalysis ") Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġconfigure ( container : ĠStorage Component Container ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCompiler Environment . configure ( container ) ĊĠĠĠĠĠĠĠ Ġcontainer . use Instance ( Composite Analysis Module Structure Oracle ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġobject ĠComposite Analysis Module Structure Oracle Ġ: ĠModule Structure Oracle Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġhas Implement ing Modules ( module : ĠModule Descriptor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠfindAll Re versed Dep ends On Paths ( module ). isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠfindAll Re versed Dep ends On Paths ( module : ĠModule Descriptor ): ĠList < Module Path > Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ ĠThis Ġfeature Ġis Ġnot Ġsupported Ġyet , Ġsince Ġduring Ġtesting Ġof Ġ' common Ġmodules ', ĊĠĠĠĠĠĠĠ Ġthe Ġ' less Ġcommon Ġmodules ' Ġare Ġnot Ġavailable Ġas Ġdescriptors . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠfindAll Dep ends On Paths ( module : ĠModule Descriptor ): ĠList < Module Path > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmodule . expected By Modules . flatMap Ġ{ Ġexpected By Module Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhead Ġ= ĠlistOf ( module , Ġexpected By Module ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected By Module . expected By Modules . isEmpty ()) ĠlistOf ( Module Path ( head )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠfindAll Dep ends On Paths ( expected By Module ). map Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModule Path ( head Ġ+ Ġpath . nodes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* ĠUtils Ġ*/ Ċ Ċ private Ġfun Ġget Descriptors ( ĊĠĠĠ Ġdependencies : ĠIterable < Dependency Description >, ĊĠĠĠ Ġdependency Provider : ĠDependency Provider , ĊĠĠĠ Ġmodule Descriptor Provider : ĠModule Descriptor Provider Ċ ): ĠList < Module Descriptor Impl > Ġ{ ĊĠĠĠ Ġreturn Ġdependencies . filter Ġ{ Ġit . kind Ġ== ĠDependency Kind . Source Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdependency Description Ġ-> Ġdependency Provider . getTest Module ( dependency Description . moduleName ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġdependency Module Ġ-> Ġmodule Descriptor Provider . getModule Descriptor ( dependency Module ) Ġ} Ċ } Ċ