/* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġorg . mode lix . build tools Ċ Ċ import Ġorg . mode lix . build tools . module persistence .* Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . zer ot urn around . zip . Zip Util Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . InputStream Ċ import Ġjava . util .* Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġkotlin . collections . HashMap Ċ Ċ class ĠModules Miner () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmodules : ĠFound Modules Ġ= ĠFound Modules () ĊĊĠĠĠ Ġfun Ġget Modules (): ĠFound Modules Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmodules ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch In Folder ( folder : ĠModule Origin ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch In Folder ( folder ) Ġ{ Ġtrue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch In Folder ( folder : ĠFile , Ġfile Filter : Ġ( File )-> Boolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch In Folder ( Module Origin ( folder . to Path ()), Ġfile Filter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch In Folder ( folder : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch In Folder ( folder ) Ġ{ Ġtrue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsearch In Folder ( folder : ĠModule Origin , Ġfile Filter : Ġ( File )-> Boolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcollect Modules ( folder . local Path . normalize (). to File (), Ġnull , Ġfolder , Ġfile Filter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Modules ( file : ĠFile , Ġowner : ĠModule Owner ?, Ġorigin : ĠModule Origin , Ġfile Filter : Ġ( File )-> Boolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Ignored ( file , Ġfile Filter )) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( file . extension . lowercase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsee Ġjet brains . mps . project . MP S Extent ions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ms d ", Ġ" mpl ", Ġ" dev kit " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Owner Ġ= Ġowner Ġ?: ĠSource Module Owner ( origin . local Module Path ( file )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileInputStream ( file ). use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Modules ( stream , Ġsource Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( module Ġin Ġsource Owner . modules . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġmodule . module Descriptor Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmacros Ġ= ĠMac ros (). with (" module ", Ġfile . parent File . absolute File . to Path ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( model Folder Ġin Ġdescriptor . resolve Model Paths ( macros )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies From Models ( module , Ġmodel Folder . to File ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" jar " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . name Ġ== Ġ" mps - workbench . jar " Ġ&& Ġfile . parent File . name Ġ== Ġ" lib ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis ĠM PS Ġplugin Ġseems Ġto Ġuse Ġsome Ġold Ġway Ġof Ġpackaging Ġa Ġplugin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġdescriptor Ġdecl ares Ġ' com . intellij ' Ġas Ġthe ĠID , Ġbut Ġit 's Ġactually Ġ' com . intellij . modules . mps '. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . add Plugin ( Plugin Module Owner ( origin . local Module Path ( file ), Ġ" com . intellij . modules . mps ", Ġ" MP S ĠWork bench ", Ġset Of ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! file . name Without Extension . endsWith ("- src ") Ġ&& Ġ! file . name Without Extension . endsWith ("- generator ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibrary Module Owner Ġ= ĠLibrary Module Owner ( origin . local Module Path ( file ), Ġowner Ġas ? ĠPlugin Module Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibrary Modules : ĠMutable Map < String , ĠFound Module > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar Content Visitor Ġ= Ġ{ Ġstream : ĠInputStream , Ġentry : ĠZip Entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( entry . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" META - INF / module . xml " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Modules ( stream , Ġlibrary Module Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" META - INF / plugin . xml " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . add Plugin ( Plugin Module Owner . from Plugin Folder ( origin . local Module Path ( file ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( entry . name . substring After Last ('.', Ġ""). lowercase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ms d ", Ġ" mpl ", Ġ" dev kit " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Modules ( stream , Ġlibrary Module Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc And Generator Names : ĠSet < String > Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( file . name Without Extension Ġ+ Ġ"- src ." Ġ+ Ġfile . extension ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( file . name Without Extension Ġ+ Ġ"- generator ." Ġ+ Ġfile . extension ) Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. 1 0 ). map Ġ{ Ġfile . name Without Extension Ġ+ Ġ"- $ it - generator ." Ġ+ Ġfile . extension Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc And Generator J ars Ġ= Ġsrc And Generator Names . map Ġ{ Ġfile . parent File . resolve ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . exists () Ġ&& Ġit . isFile Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip Util . iterate ( file , Ġjar Content Visitor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( src Or Generator Jar Ġin Ġsrc And Generator J ars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip Util . iterate ( src Or Generator Jar , Ġjar Content Visitor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( owner Ġis ĠPlugin Module Owner Ġ&& Ġlibrary Module Owner . modules . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner . libraries Ġ+= Ġlibrary Module Owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( modules . isNotEmpty ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip Util . iterate ( file ) Ġ{ Ġstream : ĠInputStream , Ġentry : ĠZip Entry Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( entry . name . substring After Last ('.', Ġ""). lowercase ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" mps " Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmodule : ĠFound Module ? Ġ= Ġnull Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġparent Path : ĠString Ġ= Ġentry . name . substring Before Last ("/", Ġ"") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( module Ġ== Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Ġ= Ġmodules [ parent Path ] Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Path Ġ== Ġ"") Ġbreak Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Path Ġ= Ġparent Path . substring Before Last ("/", Ġ"") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies From Model ( stream , Ġmodule ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" v mo ptions " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . name Without Extension Ġ== Ġ" mps " Ġ|| Ġfile . name Without Extension Ġ== Ġ" mps 6 4 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . mps Home Ġ= Ġfile . parent File . parent File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Settings Dir Ġ= ĠFile ( file , Ġ". mps ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Project Dir Ġ= Ġproject Settings Dir . exists () Ġ&& Ġproject Settings Dir . isDirectory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Project Dir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . projects Ġ+= ĠFound Project ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodules Xml File Ġ= ĠFile ( project Settings Dir , Ġ" modules . xml ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( modules Xml File . exists () Ġ&& Ġmodules Xml File . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Files Ġ= Ġread Project Modules File ( modules Xml File , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! is Module File Ignored ( it , Ġfile , Ġfile Filter ) Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" MP S Ġproject Ġfound Ġin Ġ$ file . ĠLoading Ġonly Ġmodules Ġthat Ġare Ġpart Ġof Ġthe Ġproject :") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Files . forEach Ġ{ Ġprintln (" ĠĠĠ Ġ$ it ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Files . forEach Ġ{ Ġmodule File Ġ-> Ġcollect Modules ( module File , Ġowner , Ġorigin , Ġfile Filter ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplugin Xml Ġ= ĠFile ( File ( file , Ġ" META - INF "), Ġ" plugin . xml ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Plugin Dir Ġ= Ġplugin Xml . exists () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplugin Owner Ġ= Ġif Ġ( is Plugin Dir ) ĠPlugin Module Owner . from Plugin Folder ( origin . local Module Path ( file )) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( plugin Owner Ġ!= Ġnull ) Ġmodules . add Plugin ( plugin Owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Folders Ġ= Ġif Ġ( plugin Owner Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( file . list Files () Ġ?: ĠarrayOf ()). asList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplugin Owner . getModule Jar Folders () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Folders . forEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollect Modules ( child , Ġplugin Owner Ġ?: Ġowner , Ġorigin , Ġfile Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Ignored ( file : ĠFile , Ġfile Filter : Ġ( File )-> Boolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! file Filter ( file ) Ġ|| ĠFile ( file , Ġ". mps build - ignore "). exists () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Module File Ignored ( file : ĠFile , Ġproject Dir _: ĠFile , Ġfile Filter : Ġ( File )-> Boolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Dir Ġ= Ġproject Dir _. canonical File ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent File : ĠFile ? Ġ= Ġfile . canonical File ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current File Ġ!= Ġnull Ġ&& Ġcurrent File Ġ!= Ġproject Dir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Ignored ( current File , Ġfile Filter )) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent File Ġ= Ġcurrent File . parent File ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Project Modules File ( modules Xml File : ĠFile , Ġproject Dir : ĠFile ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġxml Ġ= Ġread Xml File ( modules Xml File ) ĊĠĠĠĠĠĠĠ Ġval Ġmodule Elements Ġ= Ġxml . documentElement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Tag (" component ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . find Tag (" project Modules ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . child Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . filter Ġ{ Ġit . tagName Ġ== Ġ" module Path " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠlistOf () ĊĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= Ġmodule Elements . map Ġ{ Ġit . getAttribute (" path "). replace ("\ $ PROJECT _ DIR \ $", Ġproject Dir . absolute Path ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpaths . map Ġ{ ĠFile ( it ) Ġ}. filter Ġ{ Ġit . exists () Ġ&& Ġit . isFile Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Modules ( file : ĠInputStream , Ġowner : ĠModule Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġload Modules ( read Xml File ( file ). documentElement , Ġowner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtype Map Ġ= Ġmap Of (" language " Ġto ĠModule Type . Language , Ġ" solution " Ġto ĠModule Type . Solution , Ġ" dev - kit " Ġto ĠModule Type . Dev kit , Ġ" dev kit " Ġto ĠModule Type . Dev kit , Ġ" generator " Ġto ĠModule Type . Generator ) ĊĠĠĠ Ġprivate Ġfun Ġload Modules ( xml : ĠElement , Ġowner : ĠModule Owner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( xml . tagName Ġ== Ġ" module ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠDeployment Descriptor ( xml ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . add Module ( owner . get OrCreate Module ( descriptor )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtype Map [ xml . tagName ] Ġ?: Ġthrow ĠRuntimeException (" Unknown Ġmodule Ġtype : Ġ${ xml . tagName }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModule Type . Solution Ġ-> ĠSolution Descriptor ( xml ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModule Type . Language Ġ-> ĠLanguage Descriptor ( xml ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModule Type . Generator Ġ-> ĠGenerator Descriptor ( xml , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModule Type . Dev kit Ġ-> ĠDev kit Descriptor ( xml ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . add Module ( owner . get OrCreate Module ( descriptor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġis ĠLanguage Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( generator Ġin Ġdescriptor . generators ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules . add Module ( owner . get OrCreate Module ( generator )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdependencies From Models ( module : ĠFound Module , Ġfile : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ. mp sr , Ġ. model , Ġ. mp b ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . extension Ġ== Ġ" mps ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileInputStream ( file ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies From Model ( it , Ġmodule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . list Files ()?. forEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependencies From Models ( module , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDev K its Ġdon 't Ġappear Ġas Ġa Ġdependency Ġin Ġthe Ġmodule . ĠThe Ġmodule Ġonly Ġreferences Ġlanguages . ĊĠĠĠĠ Ġ* ĠThat 's Ġwhy Ġwe Ġalso Ġhave Ġto Ġextract Ġdependencies Ġfrom Ġthe Ġmodels . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdependencies From Model ( xml Stream : ĠInputStream , Ġmodule : ĠFound Module ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġxml Ġ= Ġread Xml File ( xml Stream ) ĊĠĠĠĠĠĠĠ Ġval Ġdoc : ĠElement Ġ= Ġxml . documentElement ĊĠĠĠĠĠĠĠ Ġval Ġlanguages Ġ= Ġdoc . find Tag (" languages ") ĊĠĠĠĠĠĠĠ Ġif Ġ( languages Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( lang Or Dev kit Ġin Ġlanguages . child Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( lang Or Dev kit . tagName ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" use " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġlang Or Dev kit . getAttribute (" id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . add Language Or Dev kit Used In Models ( Module Id And Name ( Module Id ( id ), Ġlang Or Dev kit . getAttribute (" name "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" dev kit " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= Ġlang Or Dev kit . getAttribute (" ref ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ref . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . add Language Or Dev kit Used In Models ( Module Id And Name . fromString ( ref )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġregistry Ġ= Ġdoc . find Tag (" registry ") Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( registry Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjet brains . mps . lang . s model Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs model Lang Ġ= Ġregistry . child Elements (). find Ġ{ Ġit . getAttribute (" id ") Ġ== Ġ" 7 8 6 6 9 7 8 e - a 0 f 0 - 4 cc 7 - 8 1 bc - 4 d 2 1 3 d 9 3 7 5 e 1 " Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( s model Lang Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Reference Expression Ġ= Ġs model Lang . child Elements (). find Ġ{ Ġit . getAttribute (" id ") Ġ== Ġ" 4 0 4 0 5 8 8 4 2 9 9 6 9 0 2 1 6 8 1 " Ġ} Ġ?: Ġreturn @ run Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconcept Index Ġ= Ġmodule Reference Expression . getAttribute (" index ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Id Property Ġ= Ġmodule Reference Expression . child Elements (). find Ġ{ Ġit . getAttribute (" id ") Ġ== Ġ" 4 0 4 0 5 8 8 4 2 9 9 6 9 0 2 1 6 8 3 " Ġ} Ġ?: Ġreturn @ run Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Index Ġ= Ġmodule Id Property . getAttribute (" index ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisit MP S Nodes ( doc ) Ġ{ Ġmp s Node Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mps Node . getAttribute (" concept ") Ġ!= Ġconcept Index ) Ġreturn @ visit MP S Nodes Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġmp s Node . child Elements (). find Ġ{ Ġit . tagName Ġ== Ġ" property " Ġ&& Ġit . getAttribute (" role ") Ġ== Ġproperty Index Ġ} Ġ?: Ġreturn @ visit MP S Nodes Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodule Id Ġ= Ġproperty . getAttribute (" value ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Id . isEmpty ()) Ġreturn @ visit MP S Nodes Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . add Dependency ( Module Dependency ( Module Id ( module Id ), ĠDependency Type . Model , Ġtrue )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġvisit MP S Nodes ( parent : ĠElement , Ġvisitor : Ġ( Element )-> Unit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parent . tagName Ġ== Ġ" node ") Ġvisitor ( parent ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Element Ġin Ġparent . child Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit MP S Nodes ( child Element , Ġvisitor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }