// Ġ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 Ġcom . intellij . ide . plugins Ċ Ċ import Ġcom . fasterxml . jackson . core . Json Factory Ċ import Ġcom . fasterxml . jackson . core . Json Generator Ċ import Ġcom . intellij . openapi . application . Path Manager . get Home Path Ċ import Ġcom . intellij . util . XmlElement Ċ import Ġcom . intellij . util . get Errors AsString Ċ import Ġcom . intellij . util . io . jackson . array Ċ import Ġcom . intellij . util . io . jackson . obj Ċ import Ġcom . intellij . util . read Xml As Model Ċ import Ġjava . io . String Writer Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . NoSuch File Exception Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util .* Ċ import Ġkotlin . io . path . div Ċ Ċ private Ġval Ġempty Path Ġby Ġlazy Ġ{ ĊĠ ĠPath . of ("/") Ċ } Ċ Ċ internal Ġval Ġhome Path Ġby Ġlazy Ġ{ ĊĠ ĠPath . of ( get Home Path ()) Ċ } Ċ Ċ @ Suppress (" Replace Java Static Method With Kotlin Analog ") Ċ private Ġval Ġmodule Skip List Ġ= Ġjava . util . Set . of ( ĊĠ Ġ" fleet ", ĊĠ Ġ" intellij . indexing . shared . ult imate . plugin . internal . generator ", ĊĠ Ġ" intellij . indexing . shared . ult imate . plugin . public ", ĊĠ Ġ" kotlin - ult imate . mobile - native . overrides ", ĊĠ Ġ" kotlin - ult imate . app code - with - mobile ", ĊĠ Ġ" intellij . java FX . community ", ĊĠ Ġ" intellij . light Edit ", ĊĠ Ġ" intellij . web storm ", ĊĠ Ġ" intellij . c wm . plugin ", Ġ/* Ġplatform / c wm - plugin / resources / META - INF / plugin . xml Ġdoesn 't Ġhave Ġ` id ` Ġ- Ġignore Ġfor Ġnow Ġ*/ Ċ ) Ċ Ċ class ĠPlugin Model Validator ( source Modules : ĠList < Module >) Ġ{ ĊĠ Ġinterface ĠModule Ġ{ ĊĠĠĠ Ġval Ġname : ĠString ĊĊĠĠĠ Ġval Ġsource Roots : ĠList < Path > ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġplugin Id To Info Ġ= ĠLinkedHashMap < String , ĠModule Info >() ĊĊĠ Ġprivate Ġval Ġ_ errors Ġ= Ġmutable ListOf < Throwable >() ĊĊĠ Ġval Ġerrors : ĠList < Throwable > ĊĠĠĠ Ġget () Ġ= Ġjava . util . List . copyOf (_ errors ) ĊĊĠ Ġval Ġerrors AsString : ĠCharSequence ĊĠĠĠ Ġget () Ġ= ĊĠĠĠĠĠ Ġif Ġ(_ errors . isEmpty ()) Ġ"" ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġget Errors AsString (_ errors , Ġinclude StackTrace Ġ= Ġfalse ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġ// Ġ 1 . Ġcollect Ġplugin Ġand Ġmodule Ġfile Ġinfo Ġset ĊĠĠĠ Ġval Ġsource ModuleName To FileInfo Ġ= Ġsource Modules . associate Ġ{ ĊĠĠĠĠĠ Ġit . name Ġto ĠModule Descriptor FileInfo ( it ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( module Ġin Ġsource Modules ) Ġ{ ĊĠĠĠĠĠ Ġval ĠmoduleName Ġ= Ġmodule . name ĊĠĠĠĠĠ Ġif Ġ( moduleName . startsWith (" fleet .") ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġmodule Skip List . contains ( moduleName )) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġfor Ġ( source Root Ġin Ġmodule . source Roots ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate FileInfo ( ĊĠĠĠĠĠĠĠĠĠ ĠmoduleName , ĊĠĠĠĠĠĠĠĠĠ Ġsource Root , ĊĠĠĠĠĠĠĠĠĠ Ġsource ModuleName To FileInfo [ moduleName ] !! ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠmoduleName To Info Ġ= ĠHashMap < String , ĠModule Info >() ĊĠĠĠ Ġ// Ġ 2 . Ġprocess Ġplugins Ġ- Ġprocess Ġcontent Ġto Ġcollect Ġmodules ĊĠĠĠ Ġfor Ġ(( source ModuleName , Ġmodule Meta Info ) Ġin Ġsource ModuleName To FileInfo ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġinterested Ġonly Ġin Ġplugins ĊĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġmodule Meta Info . plugin Descriptor Ġ?: Ġcontinue ĊĠĠĠĠĠ Ġval Ġdescriptor File Ġ= Ġmodule Meta Info . plugin Descriptor File Ġ?: Ġcontinue ĊĊĠĠĠĠĠ Ġval Ġid Ġ= Ġdescriptor . getChild (" id ") ?. content Ġ?: Ġdescriptor . getChild (" name ") ?. content ĊĠĠĠĠĠ Ġif Ġ( id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Plugin Ġid Ġis Ġnot Ġspecified ", ĊĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" descriptor File " Ġto Ġdescriptor File ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġmodule Info Ġ= ĠModule Info ( plugin Id Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ModuleName Ġ= Ġsource ModuleName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor File Ġ= Ġdescriptor File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġdescriptor . getAttribute Value (" package "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Ġ= Ġdescriptor ) ĊĠĠĠĠĠ Ġval Ġprev Ġ= Ġplugin Id To Info . put ( id , Ġmodule Info ) ĊĠĠĠĠĠ Ġif Ġ( prev Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠPlugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" D uplicated Ġplugin Ġid : Ġ$ id ", ĊĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" prev " Ġto Ġprev , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" current " Ġto Ġmodule Info , ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġdescriptor . getChild (" content ") ?. let Ġ{ Ġcontent Element Ġ-> ĊĠĠĠĠĠĠĠ Ġcheck Content ( content Ġ= Ġcontent Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferencing Module Info Ġ= Ġmodule Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ModuleName To FileInfo Ġ= Ġsource ModuleName To FileInfo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmoduleName To Info Ġ= ĠmoduleName To Info ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ 3 . Ġcheck Ġdependencies Ġ- Ġwe Ġare Ġaware Ġabout Ġall Ġmodules Ġnow ĊĠĠĠ Ġfor Ġ( plugin Info Ġin Ġplugin Id To Info . values ) Ġ{ ĊĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġplugin Info . descriptor ĊĊĠĠĠĠĠ Ġval Ġdependencies Elements Ġ= Ġdescriptor . getChildren (" dependencies ") ĊĠĠĠĠĠ Ġif Ġ( dependencies Elements . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" The Ġonly Ġ` dependencies ` Ġtag Ġis Ġexpected ", ĊĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" descriptor File " Ġto Ġplugin Info . descriptor File , ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( dependencies Elements . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Dependencies ( dependencies Elements . first (), Ġplugin Info , Ġplugin Info , ĠmoduleName To Info , Ġsource ModuleName To FileInfo ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġin Ġthe Ġend Ġafter Ġprocessing Ġcontent Ġand Ġdependencies ĊĠĠĠĠĠ Ġif Ġ( plugin Info . packageName Ġ== Ġnull Ġ&& Ġhas Content Or Dependencies In V 2 Format ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsome Ġplugins Ġcannot Ġbe Ġyet Ġfully Ġmigrated ĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠPlugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Plugin Ġ${ plugin Info . plugin Id } Ġis Ġnot Ġfully Ġmigrated : Ġpackage Ġis Ġnot Ġspecified ", ĊĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" plugin Id " Ġto Ġplugin Info . plugin Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" descriptor " Ġto Ġplugin Info . descriptor File , ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠSystem . err . println ( error . message ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( plugin Info . packageName Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdescriptor . children . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġit . name Ġ== Ġ" depends " Ġ&& Ġit . getAttribute Value (" optional ") Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġold Ġformat Ġshould Ġnot Ġbe Ġused Ġfor Ġa Ġplugin Ġwith Ġthe Ġspecified Ġpackage Ġprefix , Ġbut Ġ` depends ` Ġtag Ġis Ġused ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ĠPlease Ġuse Ġthe Ġnew Ġformat Ġ( see Ġhttps :// github . com / Jet Brains / intellij - community / blob / master / docs / plugin . md # the - dependencies - element )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" descriptor File " Ġto Ġplugin Info . descriptor File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" depends " Ġto Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġfor Ġ( content Module Info Ġin Ġplugin Info . content ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontent Module Info . descriptor . getChild (" dependencies ") ?. let Ġ{ Ġdependencies Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġcheck Dependencies ( dependencies , Ġcontent Module Info , Ġplugin Info , ĠmoduleName To Info , Ġsource ModuleName To FileInfo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontent Module Info . descriptor . getChild (" depends ") ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Old Ġformat Ġmust Ġbe Ġnot Ġused Ġfor Ġa Ġmodule Ġbut Ġ` depends ` Ġtag Ġis Ġused ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" descriptor File " Ġto Ġcontent Module Info . descriptor File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" depends " Ġto Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġgraph AsString (): ĠCharSequence Ġ{ ĊĠĠĠ Ġval Ġstring Writer Ġ= ĠString Writer () ĊĠĠĠ Ġval Ġwriter Ġ= ĠJson Factory (). create Generator ( string Writer ) ĊĠĠĠ Ġwriter . use Default PrettyPrinter () ĊĠĠĠ Ġwriter . use Ġ{ ĊĠĠĠĠĠ Ġwriter . obj Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġplugin Id To Info . entries . to Mutable List () ĊĠĠĠĠĠĠĠ Ġentries . sortBy Ġ{ Ġit . value . source ModuleName Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġentry . value ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . packageName Ġ== Ġnull Ġ&& Ġ! has Content Or Dependencies In V 2 Format ( item . descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġwriter . writeField Name ( item . source ModuleName ) ĊĠĠĠĠĠĠĠĠĠ Ġwrite Module Info ( writer , Ġitem ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġstring Writer . buffer ĊĠ Ġ} ĊĊĠ Ġfun Ġwrite Graph ( out File : ĠPath ) Ġ{ ĊĠĠĠ ĠPlugin Graph Writer ( plugin Id To Info ). write ( out File ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcheck Dependencies ( element : ĠXml Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferencing Module Info : ĠModule Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferencing Plugin Info : ĠModule Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmoduleName To Info : ĠMap < String , ĠModule Info >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ModuleName To FileInfo : ĠMap < String , ĠModule Descriptor FileInfo >) Ġ{ ĊĠĠĠ Ġif Ġ( refer encing Module Info . packageName Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠ Ġ"` dependencies ` Ġmust Ġbe Ġspecified Ġonly Ġfor Ġplugin Ġin Ġa Ġnew Ġformat : Ġpackage Ġprefix Ġis Ġnot Ġspecified ", ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" refer encing Descriptor File " Ġto Ġreferencing Module Info . descriptor File , ĊĠĠĠĠĠĠĠ Ġ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfor Ġ( child Ġin Ġelement . children ) Ġ{ ĊĠĠĠĠĠ Ġfun Ġget Error Info (): ĠMap < String , ĠAny ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" entry " Ġto Ġchild , ĊĠĠĠĠĠĠĠĠĠ Ġ" refer encing Descriptor File " Ġto Ġreferencing Module Info . descriptor File , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( child . name Ġ!= Ġ" module ") Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( child . name Ġ== Ġ" plugin ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġcheck Ġthat Ġthe Ġreferenced Ġplugin Ġexists ĊĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġchild . getAttribute Value (" id ") ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Id Ġis Ġnot Ġspecified Ġfor Ġdependency Ġon Ġplugin ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġ" com . intellij . modules . java ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Use Ġcom . intellij . java Ġid Ġinstead Ġof Ġcom . intellij . modules . java ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġ" com . intellij . modules . platform ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġneed Ġto Ġspecify Ġdependency Ġon Ġ$ id ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġreferencing Plugin Info . plugin Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Do Ġnot Ġadd Ġdependency Ġon Ġa Ġparent Ġplugin ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Ġ= Ġplugin Id To Info [ id ] ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! id . startsWith (" com . intellij . modules .") Ġ&& Ġdependency Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Plugin Ġnot Ġfound : Ġ$ id ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġref Ġ= ĠReference ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Plugin Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Info Ġ= Ġdependency Ġ?: ĠModule Info ( null , Ġid , Ġ"", Ġempty Path , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠXml Element ("", ĠCollections . empty Map (), ĠCollections . emptyList (), Ġnull )) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( refer encing Module Info . dependencies . contains ( ref )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Refer encing Ġmodule Ġdependencies Ġcontains Ġ$ id : Ġ$ id ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreferencing Module Info . dependencies . add ( ref ) ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( refer encing Module Info . is Plugin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unsupported Ġdependency Ġtype : Ġ${ child . name }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval ĠmoduleName Ġ= Ġchild . getAttribute Value (" name ") ĊĠĠĠĠĠ Ġif Ġ( moduleName Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Module Ġname Ġis Ġnot Ġspecified ", ĊĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( moduleName Ġ== Ġ" intellij . platform . commercial . verifier ") Ġ{ ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( child . attributes . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Unknown Ġattributes : Ġ${ child . attributes . entries . filter Ġ{ Ġit . key Ġ!= Ġ" name " Ġ}} ", ĊĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġmodule Info Ġ= ĠmoduleName To Info [ moduleName ] ĊĠĠĠĠĠ Ġif Ġ( module Info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodule Descriptor FileInfo Ġ= Ġsource ModuleName To FileInfo [ moduleName ] ĊĠĠĠĠĠĠĠ Ġif Ġ( module Descriptor FileInfo Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( module Descriptor FileInfo . plugin Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Dependency Ġon Ġplugin Ġmust Ġbe Ġspecified Ġusing Ġ` plugin ` Ġand Ġnot Ġ` module `", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfix Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChange Ġdependency Ġelement Ġto : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< plugin Ġid ="${ module Descriptor FileInfo . plugin Descriptor !!. getChild (" id ") ?. content }"/> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError (" Module Ġnot Ġfound : Ġ$ moduleName ", Ġget Error Info ())) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreferencing Module Info . dependencies . add ( Reference ( moduleName , Ġis Plugin Ġ= Ġfalse , Ġmodule Info )) ĊĊĠĠĠĠĠ Ġfor Ġ( depends Element Ġin Ġreferencing Module Info . descriptor . children ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( depends Element . name Ġ!= Ġ" depends ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( depends Element . getAttribute Value (" config - file ") ?. remove Prefix ("/ META - INF /") Ġ== Ġmodule Info . descriptor File . fileName . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module , Ġthat Ġused Ġas Ġdependency , Ġmust Ġbe Ġnot Ġspecified Ġin Ġ` depends `", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// Ġfor Ġplugin Ġtwo Ġvariants : ĊĠ Ġ// Ġ 1 ) Ġdepends Ġ+ Ġdependency Ġon Ġplugin Ġin Ġa Ġreferenced Ġdescriptor Ġ= Ġoptional Ġdescriptor . ĠIn Ġold Ġformat : Ġdepends Ġtag ĊĠ Ġ// Ġ 2 ) Ġno Ġdepends Ġ+ Ġno Ġdependency Ġon Ġplugin Ġin Ġa Ġreferenced Ġdescriptor Ġ= Ġdirectly Ġinjected Ġinto Ġplugin Ġ( separate Ġclass loader Ġis Ġnot Ġcreated ĊĠ Ġ// Ġduring Ġtransition Ġperiod ). ĠIn Ġold Ġformat : Ġxi : include Ġ( e . g . Ġ< xi : include Ġhref =" dockerfile - language . xml "/> ). ĊĠ Ġprivate Ġfun Ġcheck Content ( content : ĠXml Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferencing Module Info : ĠModule Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ModuleName To FileInfo : ĠMap < String , ĠModule Descriptor FileInfo >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmoduleName To Info : ĠMutable Map < String , ĠModule Info >) Ġ{ ĊĠĠĠ Ġfor Ġ( child Ġin Ġcontent . children ) Ġ{ ĊĠĠĠĠĠ Ġfun Ġget Error Info (): ĠMap < String , ĠAny > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" entry " Ġto Ġchild , ĊĠĠĠĠĠĠĠĠĠ Ġ" refer encing Descriptor File " Ġto Ġreferencing Module Info . descriptor File , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( child . name Ġ!= Ġ" module ") Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Unexpected Ġelement : Ġ$ child ", ĊĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval ĠmoduleName Ġ= Ġchild . getAttribute Value (" name ") ĊĠĠĠĠĠ Ġif Ġ( moduleName Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Module Ġname Ġis Ġnot Ġspecified ", ĊĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( child . attributes . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Unknown Ġattributes : Ġ${ child . attributes . entries . filter Ġ{ Ġit . key Ġ!= Ġ" name " Ġ}} ", ĊĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( moduleName Ġ== Ġ" intellij . platform . commercial . verifier ") Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" intellij . platform . commercial . verifier Ġis Ġnot Ġsupposed Ġto Ġbe Ġused Ġas Ġcontent Ġof Ġplugin ", ĊĠĠĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġignore Ġnull Ġ- Ġget Module Ġreports Ġerror ĊĠĠĠĠĠ Ġval Ġmodule Descriptor FileInfo Ġ= Ġget Module Descriptor FileInfo ( moduleName , Ġreferencing Module Info , Ġsource ModuleName To FileInfo ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠ Ġval Ġmodule Descriptor Ġ= Ġmodule Descriptor FileInfo . module Descriptor !! ĊĠĠĠĠĠ Ġval ĠpackageName Ġ= Ġmodule Descriptor . getAttribute Value (" package ") ĊĠĠĠĠĠ Ġif Ġ( packageName Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Module Ġpackage Ġis Ġnot Ġspecified ", ĊĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" descriptor File " Ġto Ġmodule Descriptor FileInfo . module Descriptor File !! , ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġmodule Info Ġ= ĠModule Info ( plugin Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠmoduleName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ModuleName Ġ= Ġmodule Descriptor FileInfo . source Module . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor File Ġ= Ġmodule Descriptor FileInfo . module Descriptor File !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= ĠpackageName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Ġ= Ġmodule Descriptor ) ĊĠĠĠĠĠ ĠmoduleName To Info [ moduleName ] Ġ= Ġmodule Info ĊĠĠĠĠĠ Ġreferencing Module Info . content . add ( module Info ) ĊĊĠĠĠĠĠ Ġ@ Suppress (" Gr az ie Inspection ") ĊĠĠĠĠĠ Ġ// Ġcheck Ġthat Ġnot Ġspecified Ġusing Ġ` depends ` Ġtag ĊĠĠĠĠĠ Ġfor Ġ( depends Element Ġin Ġreferencing Module Info . descriptor . children ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( depends Element . name Ġ!= Ġ" depends ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( depends Element . getAttribute Value (" config - file ") ?. remove Prefix ("/ META - INF /") Ġ== Ġmodule Info . descriptor File . fileName . toString ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Module Ġmust Ġbe Ġnot Ġspecified Ġin Ġ` depends `. ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Error Info () Ġ+ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" referenced Descriptor File " Ġto Ġmodule Info . descriptor File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġmodule Descriptor . getChild (" content ") ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠĠĠ Ġ" Module Ġcannot Ġdefine Ġcontent ", ĊĠĠĠĠĠĠĠĠĠ Ġget Error Info () Ġ+ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" referenced Descriptor File " Ġto Ġmodule Info . descriptor File ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Module Descriptor FileInfo ( moduleName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreferencing Module Info : ĠModule Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ModuleName To FileInfo : ĠMap < String , ĠModule Descriptor FileInfo >): ĠModule Descriptor FileInfo ? Ġ{ ĊĠĠĠ Ġvar Ġmodule Ġ= Ġsource ModuleName To FileInfo [ moduleName ] ĊĠĠĠ Ġif Ġ( module Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġmodule ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Error Info (): ĠMap < String , ĠPath > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" refer encing Descriptor File " Ġto Ġreferencing Module Info . descriptor File ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġprefix Ġ= Ġreferencing Module Info . source ModuleName Ġ+ Ġ"/" ĊĠĠĠ Ġif Ġ(! moduleName . startsWith ( prefix )) Ġ{ ĊĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠ Ġ" Cannot Ġfind Ġmodule Ġ$ moduleName ", ĊĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġslash Index Ġ= Ġprefix . length Ġ- Ġ 1 ĊĠĠĠ Ġval Ġcontaining ModuleName Ġ= ĠmoduleName . substring ( 0 , Ġslash Index ) ĊĠĠĠ Ġmodule Ġ= Ġsource ModuleName To FileInfo [ containing ModuleName ] ĊĠĠĠ Ġif Ġ( module Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠ Ġ" Cannot Ġfind Ġmodule Ġ$ containing ModuleName ", ĊĠĠĠĠĠĠĠ Ġget Error Info (), ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠfileName Ġ= Ġ"$ containing ModuleName .${ moduleName . substring ( slash Index Ġ+ Ġ 1 )}. xml " ĊĠĠĠ Ġval Ġresult Ġ= Ġload File In Module ( source Module Ġ= Ġmodule . source Module , ĠfileName Ġ= ĠfileName ) ĊĠĠĠ Ġif Ġ( result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Module Ġ${ module . source Module . name } Ġdoesn 't Ġhave Ġdescriptor Ġfile ", ĊĠĠĠĠĠĠĠ Ġparams Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" expected File " Ġto ĠfileName , ĊĠĠĠĠĠĠĠĠĠ Ġ" refer encing Descriptor File " Ġto Ġreferencing Module Info . descriptor File , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġfix Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCreate Ġfile Ġ$ fileName Ġin Ġ${ path To Short String ( module . source Module . source Roots . first ()) } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġcontent : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ< idea - plugin Ġpackage =" REPLACE _ BY _ MODULE _ PACKAGE "> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ</ idea - plugin > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġupdate FileInfo ( ĊĠĠĠ ĠmoduleName : ĠString , ĊĠĠĠ Ġsource Root : ĠPath , ĊĠĠĠ Ġfile Info : ĠModule Descriptor FileInfo , ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġmeta Inf Ġ= Ġsource Root Ġ/ Ġ" META - INF " ĊĠĠĠ Ġval Ġmodule Xml Ġ= Ġmeta Inf Ġ/ Ġ"$ moduleName . xml " ĊĠĠĠ Ġif Ġ( Files . exists ( module Xml )) Ġ{ ĊĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠ Ġ" Module Ġdescriptor Ġmust Ġbe Ġin Ġthe Ġroot Ġof Ġmodule Ġroot ", ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" module " Ġto ĠmoduleName , ĊĠĠĠĠĠĠĠĠĠ Ġ" module Descriptor " Ġto Ġmodule Xml , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġplugin Descriptor File Ġ= Ġmeta Inf Ġ/ Ġ" plugin . xml " ĊĠĠĠ Ġval Ġplugin Descriptor Ġ= Ġplugin Descriptor File . read Xml As Model () ĊĊĠĠĠ Ġval Ġmodule Descriptor File Ġ= Ġsource Root Ġ/ Ġ"$ moduleName . xml " ĊĠĠĠ Ġval Ġmodule Descriptor Ġ= Ġmodule Descriptor File . read Xml As Model () ĊĊĠĠĠ Ġif Ġ( plugin Descriptor Ġ== Ġnull Ġ&& Ġmodule Descriptor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( fileInfo . plugin Descriptor File Ġ!= Ġnull Ġ&& Ġplugin Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠ Ġ" D uplicated Ġplugin . xml ", ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" module " Ġto ĠmoduleName , ĊĠĠĠĠĠĠĠĠĠ Ġ" first Plugin Descriptor " Ġto Ġfile Info . plugin Descriptor File , ĊĠĠĠĠĠĠĠĠĠ Ġ" second Plugin Descriptor " Ġto Ġplugin Descriptor File , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( fileInfo . plugin Descriptor File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠ Ġ" Module Ġcannot Ġhave Ġboth Ġplugin . xml Ġand Ġmodule Ġdescriptor ", ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" module " Ġto ĠmoduleName , ĊĠĠĠĠĠĠĠĠĠ Ġ" plugin Descriptor " Ġto Ġfile Info . plugin Descriptor File , ĊĠĠĠĠĠĠĠĠĠ Ġ" module Descriptor " Ġto Ġmodule Descriptor File , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( fileInfo . module Descriptor File Ġ!= Ġnull Ġ&& Ġplugin Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ_ errors . add ( Plugin ValidationError ( ĊĠĠĠĠĠĠĠ Ġ" Module Ġcannot Ġhave Ġboth Ġplugin . xml Ġand Ġmodule Ġdescriptor ", ĊĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" module " Ġto ĠmoduleName , ĊĠĠĠĠĠĠĠĠĠ Ġ" plugin Descriptor " Ġto Ġplugin Descriptor File , ĊĠĠĠĠĠĠĠĠĠ Ġ" module Descriptor " Ġto Ġfile Info . module Descriptor File , ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( plugin Descriptor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġfile Info . module Descriptor File Ġ= Ġmodule Descriptor File ĊĠĠĠĠĠ Ġfile Info . module Descriptor Ġ= Ġmodule Descriptor ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġfile Info . plugin Descriptor File Ġ= Ġplugin Descriptor File ĊĠĠĠĠĠ Ġfile Info . plugin Descriptor Ġ= Ġplugin Descriptor ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ internal Ġdata Ġclass ĠModule Info ( ĊĠ Ġval Ġplugin Id : ĠString ?, ĊĠ Ġval Ġname : ĠString ?, ĊĠ Ġval Ġsource ModuleName : ĠString , ĊĠ Ġval Ġdescriptor File : ĠPath , ĊĠ Ġval ĠpackageName : ĠString ?, ĊĊĠ Ġval Ġdescriptor : ĠXml Element , Ċ ) Ġ{ ĊĠ Ġval Ġcontent Ġ= Ġmutable ListOf < Module Info >() ĊĠ Ġval Ġdependencies Ġ= Ġmutable ListOf < Reference >() ĊĊĠ Ġval Ġis Plugin : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġplugin Id Ġ!= Ġnull Ċ } Ċ Ċ internal Ġdata Ġclass ĠReference ( val Ġname : ĠString , Ġval Ġis Plugin : ĠBoolean , Ġval Ġmodule Info : ĠModule Info ) Ċ Ċ private Ġdata Ġclass ĠPlugin Info ( val Ġplugin Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource ModuleName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor : ĠXml Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor File : ĠPath ) Ċ Ċ private Ġclass ĠModule Descriptor FileInfo ( val Ġsource Module : ĠPlugin Model Validator . Module ) Ġ{ ĊĠ Ġvar Ġplugin Descriptor File : ĠPath ? Ġ= Ġnull ĊĠ Ġvar Ġmodule Descriptor File : ĠPath ? Ġ= Ġnull ĊĊĠ Ġvar Ġplugin Descriptor : ĠXml Element ? Ġ= Ġnull ĊĠ Ġvar Ġmodule Descriptor : ĠXml Element ? Ġ= Ġnull Ċ } Ċ Ċ private Ġfun Ġwrite Module Info ( writer : ĠJson Generator , Ġitem : ĠModule Info ) Ġ{ ĊĠ Ġwriter . obj Ġ{ ĊĠĠĠ Ġwriter . writeString Field (" name ", Ġitem . name Ġ?: Ġitem . source ModuleName ) ĊĠĠĠ Ġwriter . writeString Field (" package ", Ġitem . packageName ) ĊĠĠĠ Ġwriter . writeString Field (" descriptor ", Ġpath To Short String ( item . descriptor File )) ĊĠĠĠ Ġif Ġ(! item . content . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġwriter . array (" content ") Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġitem . content ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġwrite Module Info ( writer , Ġchild ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! item . dependencies . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġwriter . array (" dependencies ") Ġ{ ĊĠĠĠĠĠĠĠ Ġwrite Dependencies ( item . dependencies , Ġwriter ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġpath To Short String ( file : ĠPath ): ĠString Ġ{ ĊĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠ Ġfile Ġ=== Ġempty Path Ġ-> Ġ"" ĊĠĠĠ Ġhome Path . file System Ġ=== Ġfile . file System Ġ-> Ġhome Path . rel ativ ize ( file ). toString () ĊĠĠĠ Ġelse Ġ-> Ġfile . toString () ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġwrite Dependencies ( items : ĠList < Reference >, Ġwriter : ĠJson Generator ) Ġ{ ĊĠ Ġfor Ġ( entry Ġin Ġitems ) Ġ{ ĊĠĠĠ Ġwriter . obj Ġ{ ĊĠĠĠĠĠ Ġwriter . writeString Field ( if Ġ( entry . is Plugin ) Ġ" plugin " Ġelse Ġ" module ", Ġentry . name ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠPlugin ValidationError Ġprivate Ġconstructor ( message : ĠString ) Ġ: ĠRuntimeException ( message ) Ġ{ ĊĊĠ Ġconstructor ( ĊĠĠĠ Ġmessage : ĠString , ĊĠĠĠ Ġparams : ĠMap < String , ĠAny ?> Ġ= Ġmap Of (), ĊĠĠĠ Ġfix : ĠString ? Ġ= Ġnull , ĊĠ Ġ) Ġ: Ġthis ( ĊĠĠĠ Ġparams . entries . join ToString ( ĊĠĠĠĠĠ Ġprefix Ġ= Ġ"$ message Ġ(\ n Ġ Ġ", ĊĠĠĠĠĠ Ġseparator Ġ= Ġ", \ n Ġ Ġ", ĊĠĠĠĠĠ Ġpostfix Ġ= Ġ"\ n )" Ġ+ Ġ( fix ?. let Ġ{ Ġ"\ n \ n Pro posed Ġfix :\ n \ n " Ġ+ Ġfix . trim Indent () Ġ+ Ġ"\ n \ n " Ġ} Ġ?: Ġ"") ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġit . key Ġ+ Ġ"=" Ġ+ Ġparam Value ToString ( it . value ) ĊĠĠĠ Ġ} ĊĠ Ġ) Ċ } Ċ Ċ private Ġfun Ġparam Value ToString ( value : ĠAny ?): ĠString Ġ{ ĊĠ Ġreturn Ġwhen Ġ( value ) Ġ{ ĊĠĠĠ Ġis ĠPath Ġ-> Ġpath To Short String ( value ) ĊĠĠĠ Ġelse Ġ-> Ġvalue . toString () ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġload File In Module ( source Module : ĠPlugin Model Validator . Module , ĠfileName : ĠString ): ĠModule Descriptor FileInfo ? Ġ{ ĊĠ Ġfor Ġ( source Root Ġin Ġsource Module . source Roots ) Ġ{ ĊĠĠĠ Ġval Ġmodule Descriptor File Ġ= Ġsource Root Ġ/ ĠfileName ĊĠĠĠ Ġval Ġmodule Descriptor Ġ= Ġmodule Descriptor File . read Xml As Model () ĊĠĠĠ Ġif Ġ( module Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĠModule Descriptor FileInfo ( source Module ). also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . module Descriptor Ġ= Ġmodule Descriptor ĊĠĠĠĠĠĠĠ Ġit . module Descriptor File Ġ= Ġmodule Descriptor File ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġreturn Ġnull Ċ } Ċ Ċ private Ġfun ĠPath . read Xml As Model (): ĠXml Element ? Ġ{ ĊĠ Ġreturn Ġtry Ġ{ ĊĠĠĠ ĠFiles . new InputStream ( this ). use (:: read Xml As Model ) ĊĠ Ġ} ĊĠ Ġcatch Ġ( ignore : ĠNoSuch File Exception ) Ġ{ ĊĠĠĠ Ġnull ĊĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġhas Content Or Dependencies In V 2 Format ( descriptor : ĠXml Element ): ĠBoolean Ġ{ ĊĠ Ġreturn Ġdescriptor . children . any Ġ{ Ġit . name Ġ== Ġ" content " Ġ|| Ġit . name Ġ== Ġ" dependencies " Ġ} Ċ }