/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 Ġ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 . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . gradle Ċ Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . module . Module Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . project . root Manager Ċ import Ġcom . intellij . openapi . roots .* Ċ import Ġcom . intellij . openapi . roots . impl . Module Order Entry Impl Ċ import Ġcom . intellij . openapi . util . io . File Util Ċ import Ġorg . jetbrains . j ps . model . module . J ps Module Source Root Type Ċ import Ġorg . jetbrains . j ps . util . J ps Path Util Ċ import Ġorg . jetbrains . kotlin . idea . facet . Kotlin Facet Ċ import Ġorg . jetbrains . kotlin . idea . project . is H MP P Enabled Ċ import Ġorg . jetbrains . kotlin . idea . project . language Version Settings Ċ import Ġorg . jetbrains . kotlin . idea . project . platform Ċ import Ġorg . jetbrains . kotlin . platform . Simple Platform Ċ import Ġorg . jetbrains . kotlin . platform . Target Platform Ċ import Ġorg . jetbrains . kotlin . platform . present able Description Ċ Ċ class ĠMessage Collector Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĊĠĠĠ Ġfun Ġreport ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . append ( message ). append ('\ n ') ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġbuilder . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( message . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( false ) Ġ{ Ġmessage Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠProject Info ( ĊĠĠĠ Ġproject : ĠProject , ĊĠĠĠ Ġinternal Ġval Ġproject Path : ĠString , ĊĠĠĠ Ġinternal Ġval Ġex haustive Module List : ĠBoolean , ĊĠĠĠ Ġinternal Ġval Ġex haustive Source Source Root List : ĠBoolean , ĊĠĠĠ Ġinternal Ġval Ġex haustive Dependency List : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġinternal Ġval Ġmessage Collector Ġ= ĠMessage Collector () ĊĠĠĠ Ġprivate Ġval Ġmodule Manager Ġ= ĠModule Manager . getInstance ( project ) ĊĠĠĠ Ġprivate Ġval Ġexpected Module Names Ġ= ĠHashSet < String >() ĊĠĠĠ Ġprivate Ġvar Ġall Modules Ass er ter : Ġ( Module Info . () Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġall Modules ( body : ĠModule Info . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( all Modules Ass er ter Ġ== Ġnull ) ĊĠĠĠĠĠĠĠ Ġall Modules Ass er ter Ġ= Ġbody ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmodule ( name : ĠString , Ġbody : ĠModule Info . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Ġ= Ġmodule Manager . find Module ByName ( name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( module Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Collector . report (" No Ġmodule Ġfound : Ġ'$ name '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmodule Info Ġ= ĠModule Info ( module , Ġthis ) ĊĠĠĠĠĠĠĠ Ġall Modules Ass er ter ?. let Ġ{ Ġmodule Info . it () Ġ} ĊĠĠĠĠĠĠĠ Ġmodule Info . run ( body ) ĊĠĠĠĠĠĠĠ Ġexpected Module Names Ġ+= Ġname ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun ( body : ĠProject Info . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġbody () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( exhaustive Module List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Names Ġ= Ġmodule Manager . modules . map Ġ{ Ġit . name Ġ}. sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Names Ġ= Ġexpected Module Names . sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual Names Ġ!= Ġexpected Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Collector . report (" Expected Ġmodule Ġlist Ġ$ expected Names Ġdoesn 't Ġmatch Ġthe Ġactual Ġone : Ġ$ actual Names ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmessage Collector . check () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠModule Info ( ĊĠĠĠ Ġval Ġmodule : ĠModule , ĊĠĠĠ Ġval Ġproject Info : ĠProject Info Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġroot Model Ġ= Ġmodule . root Manager ĊĠĠĠ Ġprivate Ġval Ġexpected Dependency Names Ġ= ĠHashSet < String >() ĊĠĠĠ Ġprivate Ġval Ġexpected Source Roots Ġ= ĠHashSet < String >() ĊĠĠĠ Ġprivate Ġval Ġsource Folder By Path Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġroot Model . content Entries . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . source Folders . as Sequence () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġit . file ?. path Ġ?: Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Util . get RelativePath ( project Info . project Path , Ġpath , Ġ'/') !! Ġto Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlanguage Version ( version : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Version Ġ= Ġmodule . language Version Settings . language Version . version String ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Version Ġ!= Ġversion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġexpected Ġlanguage Ġversion Ġ'$ version ' Ġbut Ġfound Ġ'$ actual Version '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis H MP P ( value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Value Ġ= Ġmodule . is H MP P Enabled ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Value Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġexpected Ġis H MP P Ġ'$ value ' Ġbut Ġfound Ġ'$ actual Value '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtarget Platform ( var arg Ġplatforms : ĠTarget Platform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġplatforms . flatMap Ġ{ Ġit . component Platforms Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġmodule . platform ?. component Platforms ĊĊĠĠĠĠĠĠĠ Ġif Ġ( actual Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġactual Ġtarget Ġplatform Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnot Found Ġ= Ġexpected . subtract ( actual ) ĊĠĠĠĠĠĠĠ Ġif Ġ( not Found . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġnot Ġfound Ġtarget Ġplatforms : Ġ" Ġ+ Ġnot Found . join ToString ("," )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnot Expected Ġ= Ġactual . subtract ( expected ) ĊĠĠĠĠĠĠĠ Ġif Ġ( not Expected . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġfound Ġunexpected Ġtarget Ġplatforms : Ġ" Ġ+ Ġnot Expected . join ToString ("," )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠapiVersion ( version : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Version Ġ= Ġmodule . language Version Settings . apiVersion . version String ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Version Ġ!= Ġversion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġexpected ĠAPI Ġversion Ġ'$ version ' Ġbut Ġfound Ġ'$ actual Version '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplatform ( platform : ĠTarget Platform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Platform Ġ= Ġmodule . platform ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Platform Ġ!= Ġplatform ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name } ': Ġexpected Ġplatform Ġ'${ platform . present able Description }' Ġbut Ġfound Ġ'${ actual Platform ?. present able Description } '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadditional Arguments ( arguments : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Arguments Ġ= ĠKotlin Facet . get ( module )?. configuration ?. settings ?. compiler Settings ?. additional Arguments ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Arguments Ġ!= Ġarguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name } ': Ġexpected Ġadditional Ġarguments Ġ'$ arguments ' Ġbut Ġfound Ġ'$ actual Arguments '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlibrary Dependency ( library Name : ĠString , Ġscope : ĠDependency Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlibrary Entries Ġ= Ġroot Model . order Entries . filter Is Instance < Library Order Entry >(). filter Ġ{ Ġit . library Name Ġ== Ġlibrary Name Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( library Entries . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġmultiple Ġentries Ġfor Ġlibrary Ġ$ library Name ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( library Entries . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmost Prob able Candidate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Model . order Entries . filter Is Instance < Library Order Entry >(). sorted With ( Comparator < Library Order Entry > Ġ{ Ġo 1 , Ġo 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo 1 len Ġ= Ġo 1 ?. library Name ?. common Prefix With ( library Name )?. length Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġo 2 len Ġ= Ġo 2 ?. library Name ?. common Prefix With ( library Name )?. length Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo 2 len Ġ- Ġo 1 len ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġexpected Ġlibrary Ġdependency Ġ[$ library Name ] Ġbut Ġthe Ġmost Ġprob able Ġcandidate Ġ[ ${ most Prob able Candidate . library Name }] ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Library ( library Entries . single OrNull (), Ġlibrary Name , Ġscope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlibrary Dependency By Url ( classes Url : ĠString , Ġscope : ĠDependency Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlibrary Entries Ġ= Ġroot Model . order Entries . filter Is Instance < Library Order Entry >(). filter Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry . library ?. get Urls ( Order Root Type . CLASSES )?. any Ġ{ Ġit Ġ== Ġclasses Url Ġ} Ġ?: Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( library Entries . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġmultiple Ġentries Ġfor Ġlibrary Ġ$ classes Url ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Library ( library Entries . single OrNull (), Ġclasses Url , Ġscope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Library ( library Entry : ĠLibrary Order Entry ?, Ġid : ĠString , Ġscope : ĠDependency Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( library Entry Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': ĠNo Ġlibrary Ġdependency Ġfound : Ġ'$ id '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Dependency Scope ( library Entry , Ġscope ) ĊĠĠĠĠĠĠĠ Ġexpected Dependency Names Ġ+= Ġlibrary Entry . present able Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmodule Dependency ( moduleName : ĠString , Ġscope : ĠDependency Scope , Ġproduction On Test : ĠBoolean ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Entry Ġ= Ġroot Model . order Entries . filter Is Instance < Module Order Entry >(). single OrNull Ġ{ Ġit . moduleName Ġ== ĠmoduleName Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( module Entry Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Modules Ġ= Ġroot Model . order Entries . filter Is Instance < Module Order Entry >(). map Ġ{ Ġit . moduleName Ġ}. join ToString (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': ĠNo Ġmodule Ġdependency Ġfound : Ġ'$ moduleName '. ĠAll Ġmodule Ġnames : Ġ$ all Modules ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck Dependency Scope ( module Entry , Ġscope ) ĊĠĠĠĠĠĠĠ Ġcheck Production On Test ( module Entry , Ġproduction On Test ) ĊĠĠĠĠĠĠĠ Ġexpected Dependency Names Ġ+= Ġmodule Entry . present able Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠANY _ PACKAGE _ PREFIX Ġ= Ġ" any _ package _ prefix " ĊĊĠĠĠ Ġfun Ġsource Folder ( path In Project : ĠString , Ġroot Type : ĠJ ps Module Source Root Type <* >, Ġpackage Prefix : ĠString ? Ġ= ĠANY _ PACKAGE _ PREFIX ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Folder Ġ= Ġsource Folder By Path [ path In Project ] ĊĠĠĠĠĠĠĠ Ġif Ġ( source Folder Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': ĠNo Ġsource Ġfolder Ġfound : Ġ'$ path In Project '") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( package Prefix Ġ!= ĠANY _ PACKAGE _ PREFIX Ġ&& Ġsource Folder . package Prefix Ġ!= Ġpackage Prefix ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name }', Ġsource Ġroot Ġ'$ path In Project ': ĠExpected Ġpackage Ġprefix Ġ$ package Prefix Ġdoesn 't Ġmatch Ġthe Ġactual Ġone : Ġ${ source Folder . package Prefix }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpected Source Roots Ġ+= Ġpath In Project ĊĠĠĠĠĠĠĠ Ġval Ġactual Root Type Ġ= Ġsource Folder . root Type ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Root Type Ġ!= Ġroot Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name }', Ġsource Ġroot Ġ'$ path In Project ': ĠExpected Ġroot Ġtype Ġ$ root Type Ġdoesn 't Ġmatch Ġthe Ġactual Ġone : Ġ$ actual Root Type " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinherit Project Output () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Inherited Ġ= ĠCompiler Module Extension . getInstance ( module )?. is Compiler Output Path Inherited Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Inherited ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': Ġproject Ġoutput Ġis Ġnot Ġinherited ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoutput Path ( path In Project : ĠString , Ġis Production : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcompiler Module Extension Ġ= ĠCompiler Module Extension . getInstance ( module ) ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġif Ġ( is Production ) Ġcompiler Module Extension ?. compiler Output Url Ġelse Ġcompiler Module Extension ?. compiler Output Url For Tests ĊĠĠĠĠĠĠĠ Ġval Ġactual Path In Project Ġ= Ġurl ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Util . get RelativePath ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . project Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ ps Path Util . url To Path ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'/' ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Path In Project Ġ!= Ġpath In Project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name } ': ĠExpected Ġoutput Ġpath Ġ$ path In Project Ġdoesn 't Ġmatch Ġthe Ġactual Ġone : Ġ$ actual Path In Project " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrun ( body : ĠModule Info . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġbody () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( project Info . exhaustive Dependency List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Dependency Names Ġ= Ġroot Model ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. order Entries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġis ĠModule Order Entry Ġ|| Ġit Ġis ĠLibrary Order Entry Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . present able Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Dependency Names Ġ= Ġexpected Dependency Names . sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual Dependency Names Ġ!= Ġexpected Dependency Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name } ': ĠExpected Ġdependency Ġlist Ġ$ expected Dependency Names Ġdoesn 't Ġmatch Ġthe Ġactual Ġone : Ġ$ actual Dependency Names " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( project Info . exhaustive Source Source Root List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Source Roots Ġ= Ġsource Folder By Path . keys . sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Source Roots Ġ= Ġexpected Source Roots . sorted () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual Source Roots Ġ!= Ġexpected Source Roots ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name } ': ĠExpected Ġsource Ġroot Ġlist Ġ$ expected Source Roots Ġdoesn 't Ġmatch Ġthe Ġactual Ġone : Ġ$ actual Source Roots " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( root Model . sdk Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report (" Module Ġ'${ module . name } ': ĠNo ĠSDK Ġdefined ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Dependency Scope ( library : ĠExport able Order Entry , Ġscope : ĠDependency Scope ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Scope Ġ= Ġlibrary . scope ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Scope Ġ!= Ġscope ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name } ': ĠDependency Ġ'${ library . present able Name } ': Ġexpected Ġscope Ġ'$ scope ' Ġbut Ġfound Ġ'$ actual Scope '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Production On Test ( library : ĠExport able Order Entry , Ġproduction On Test : ĠBoolean ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( production On Test Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġactual Flag Ġ= Ġ( library Ġas ? ĠModule Order Entry Impl )?. is Production On Test Dependency ĊĠĠĠĠĠĠĠ Ġif Ġ( actual Flag Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name } ': ĠDependency Ġ'${ library . present able Name }' Ġhas Ġno Ġproduction On Test Ġproperty " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual Flag Ġ!= Ġproduction On Test ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info . message Collector . report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġ'${ module . name } ': ĠDependency Ġ'${ library . present able Name } ': Ġexpected Ġproduction On Test Ġ'$ production On Test ' Ġbut Ġfound Ġ'$ actual Flag '" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcheck Project Structure ( ĊĠĠĠ Ġproject : ĠProject , ĊĠĠĠ Ġproject Path : ĠString , ĊĠĠĠ Ġex haustive Module List : ĠBoolean , ĊĠĠĠ Ġex haustive Source Source Root List : ĠBoolean , ĊĠĠĠ Ġex haustive Dependency List : ĠBoolean , ĊĠĠĠ Ġbody : ĠProject Info . () Ġ-> ĠUnit Ġ= Ġ{} Ċ ) Ġ{ ĊĠĠĠ ĠProject Info ( ĊĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠ Ġproject Path , ĊĠĠĠĠĠĠĠ Ġex haustive Module List , ĊĠĠĠĠĠĠĠ Ġex haustive Source Source Root List , ĊĠĠĠĠĠĠĠ Ġex haustive Dependency List ĊĠĠĠ Ġ). run ( body ) Ċ }