package Ġde . item is . mps . gradle . generate Ċ Ċ import Ġde . item is . mps . gradle . Base Plugin Extensions Ċ import Ġde . item is . mps . gradle . args From Base Extension Ċ import Ġde . item is . mps . gradle . validate Default Jvm Ċ import Ġorg . gradle . api . Gradle Exception Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . tasks . Copy Ċ import Ġorg . gradle . api . tasks . Java Exec Ċ import Ġorg . gradle . kotlin . dsl . support . zip To Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . util . zip . Zip InputStream ĊĊ Ċ open Ġclass ĠGenerate Plugin Extensions : ĠBase Plugin Extensions () Ġ{ ĊĠĠĠ Ġvar Ġmodels : ĠList < String > Ġ= Ġempty List () Ċ } Ċ Ċ open Ġclass ĠGenerate M ps Project Plugin Ġ: ĠPlugin < Project > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproject . run Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġextensions . create (" generate ", ĠGenerate Plugin Extensions :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmp s Location Ġ= Ġextension . mps Location Ġ?: ĠFile ( project . build Dir , Ġ" mps ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Evaluate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmp s Version Ġ= Ġextension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. mps Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. resolved Configuration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Level Module Dependencies . find Ġ{ Ġit . module Group Ġ== Ġ" com . jetbrains " Ġ&& Ġit . moduleName Ġ== Ġ" mps " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . module Version Ġ?: Ġthrow ĠGradle Exception (" MP S Ġconfiguration Ġdoesn 't Ġcontain ĠM PS ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdep Ġ= Ġproject . dependencies . create (" de . item is . mps : execute - generators :$ mps Version +") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgen Config Ġ= Ġconfigurations . det ached Configuration ( dep ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġargs From Base Extension ( extension ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . addAll ( extension . models . map Ġ{ Ġ"-- model =$ it " Ġ}. as Sequence ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolve M ps Ġ= Ġtasks . create (" resolve M ps For Generation ", ĠCopy :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( extension . mps Config . resolve (). map Ġ{ Ġzip Tree ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSome Ġ 2 0 1 9 . 2 Ġsrc Ġj ars Ġcause ĠM PS Ġstartup Ġto Ġfail Ġwith Ġan Ġexception Ġduring Ġindexing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbecause Ġof Ġthe Ġwrong Ġspecification Ġin Ġmodule . xml Ġ-> Ġwe Ġremove Ġthose Ġbroken Ġparts Ġas Ġa Ġworkaround . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIn ĠM PS Ġ 2 0 1 9 . 3 Ġthose Ġsrc Ġj ars Ġare Ġalready Ġremoved . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodels Tag Reg Ex Ġ= ĠRegex ("< models > .* </ models >", ĠRegex Option . DOT _ MATCH ES _ ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreplace Tag Ġ= Ġ"< models /> " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Matching ( listOf (" **/ runtime s /*. feedback .* - src . jar ", Ġ" **/ runtime s /*. messages . api - src . jar ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZip InputStream ( open ()). use Ġ{ Ġz is Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Entries Ġ= ĠArrayList < Pair < String , ĠByteArray >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Entry Ġ= Ġz is . next Entry Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz is . copy To ( output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠbyteArray Ġ: ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Entry . name . contains (". ms d ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbyteArray Ġ= ĠoutputStream . toString (). replace ( models Tag Reg Ex , Ġreplace Tag ). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbyteArray Ġ= ĠoutputStream . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Entries . add ( Pair ( next Entry . name , ĠbyteArray )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip To ( File ( mps Location , Ġthis . path ), Ġresult Entries . as Sequence ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexclude () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto ( mps Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġproblem Ġher Ġis Ġis Ġthat Ġfor Ġsome Ġreason Ġthe ĠApplication Info Ġisn 't Ġinitial ised Ġproperly . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThat Ġcauses ĠPlugin Manager Core . BUILD _ NUMBER Ġto Ġbe Ġnull . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠIn Ġthis Ġcase Ġthe ĠPlugin Manager Core Ġres ort s Ġto ĠBuild Number . current Version () Ġwhich Ġfinally ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġcalls Ġinto ĠBuild Number . from File (). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġbehaviour Ġallows Ġus Ġto Ġplace Ġa Ġbuild . txt Ġin Ġthe Ġroot Ġof Ġthe Ġhome Ġpath Ġ( see ĠPath Manager . get Home Path ()). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġfile Ġis Ġthen Ġused Ġto Ġload Ġthe Ġbuild Ġnumber . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠTODO : ĠSince ĠM PS Ġ 2 0 1 8 . 2 Ġa Ġnewer Ġversion Ġof Ġthe Ġplatform Ġallows Ġto Ġget Ġa Ġsimilar Ġbehaviour Ġvia Ġsetting Ġidea . plugins . compatible . build Ġproperty . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfake Ġ= Ġtasks . create (" fake Build Number ", ĠFake Build Number Task :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp s Dir Ġ= Ġmp s Location ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( resolve M ps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtasks . create (" generate ", ĠJava Exec :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( fake ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs ( args ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extension . java Exec Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecutable ( extension . java Exec !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Default Jvm () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Ġ= Ġ" build " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" Gener ates Ġmodels Ġin Ġthe Ġproject " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath ( file Tree ( File ( mps Location , Ġ"/ lib ")). include (" ** /*. jar ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġonly Ġminimal Ġnumber Ġof Ġplugins Ġj ars Ġthat Ġare Ġrequired Ġby Ġthe Ġgenerate Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( to Ġavoid Ġconflicts Ġwith Ġplugin Ġclass loader Ġif Ġcustom Ġconfigured Ġplugins Ġare Ġloaded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgit 4 idea : Ġhas Ġto Ġbe Ġon Ġclasspath Ġas Ġbundled Ġplugin Ġto Ġbe Ġloaded Ġ( since Ġ 2 0 1 9 . 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath ( file Tree ( File ( mps Location , Ġ"/ plugins ")). include (" git 4 idea /**/*. jar ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasspath ( gen Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ= Ġextension . debug ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Ġ= Ġ" de . item is . mps . gradle . generate . Main Kt " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }