package Ġnl . dsl consult ancy . mps . analy ser Ċ Ċ import Ġnl . dsl consult ancy . mps . analy ser . util . Count ing Map Ċ import Ġnl . dsl consult ancy . mps . analy ser . util . as Csv Row Ċ import Ġnl . dsl consult ancy . mps . analy ser . util . combine Ċ import Ġnl . dsl consult ancy . mps . analy ser . util . csv Row Of Ċ import Ġnl . dsl consult ancy . mps . analy ser . xml .* Ċ Ċ /* Ċ Ġ* ĠCount ing Map Ġis Ġkey ed Ġwith Ġa Ġfully - qualified Ġname Ġof Ġa Ġconcept Ġor Ġa Ġfeature . Ċ Ġ* ĠWe Ġdon 't Ġkey Ġon ĠMeta Concept Xml Ġor ĠMeta Feature Xml Ġbecause Ġwe 're Ġcurrently Ġnot Ġ 1 0 0 % Ċ Ġ* Ġsure Ġthat Ġtheir Ġ. id 's Ġare Ġalways Ġthe Ġsame Ġfor Ġthe Ġsame ĠF Q name . Ċ Ġ*/ Ċ Ċ fun Ġusage ( mps Project On Disk : ĠM ps Project On Disk ): ĠCount ing Map < String > Ġ{ ĊĠĠĠ Ġval Ġpaths Model Files Ġ= Ġmp s Project On Disk . mps Files . filter Ġ{ Ġmp s FileType ( it ) Ġ== ĠM ps FileType . Model Ġ} ĊĠĠĠ Ġval Ġmodel Files Ġ= Ġpaths Model Files . map Ġ{ Ġmodel Xml From Disk ( it ) Ġ} ĊĊĠĠĠ Ġ// Ġprovide Ġ 0 Ġcounts Ġfor Ġall Ġconcepts Ġand Ġtheir Ġfeatures Ġfrom Ġown , Ġimported Ġlanguages , Ġnot Ġjust Ġ( non - 0 Ġcounts Ġfor ) Ġthe Ġused Ġones : ĊĠĠĠ Ġval Ġnames All Imported Languages Ġ= Ġmodel Files . flatMap Ġ{ Ġmf Ġ-> Ġmf . names Imported Languages () Ġ}. distinct () ĊĠĠĠ Ġval Ġnames Own Imported Languages Ġ= Ġmp s Project On Disk . languages . map Ġ{ Ġit . name Ġ}. intersect ( names All Imported Languages ) ĊĠĠĠ Ġval Ġown Imported Languages Ġ= Ġnames Own Imported Languages . flatMap Ġ{ Ġn Ġ-> Ġmp s Project On Disk . languages . filter Ġ{ Ġl Ġ-> Ġl . name Ġ== Ġn Ġ} Ġ} ĊĠĠĠ Ġval Ġall Structure Of Own Imported Languages Ġ= Ġown Imported Languages . flatMap Ġ{ Ġl Ġ-> ĊĠĠĠĠĠĠĠ Ġl . structure (). concepts (). flatMap Ġ{ Ġconcept Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfq Prefix Ġ= Ġ"${ l . name }.${ concept . name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( concept . features . map Ġ{ Ġf Ġ-> Ġ"$ fq Prefix # ${ f . name }" Ġ}) Ġ+ Ġfq Prefix ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. map Ġ{ Ġit Ġto Ġ 0 Ġ}. toMap () ĊĊĠĠĠ Ġ// ĠFIXME Ġ Ġthis Ġis Ġnot Ġso Ġhelpful Ġfor Ġlanguages Ġthat Ġare Ġnot Ġpart Ġof Ġthe Ġproject ! ĊĊĠĠĠ Ġreturn Ġmodel Files ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġusage ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. reduce Ġ{ Ġl , Ġr Ġ-> Ġl . combine ( r ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. combine ( all Structure Of Own Imported Languages ) Ċ } Ċ Ċ private Ġfun Ġusage ( model Xml : ĠModel Xml ): ĠCount ing Map < String > Ġ{ ĊĠĠĠ Ġval Ġmeta Concept s Ġ= Ġmodel Xml . meta Concept s () ĊĠĠĠ Ġval Ġall Nodes Ġ= Ġmodel Xml . nodes . flatMap Ġ{ Ġit . all Nodes () Ġ} ĊĠĠĠ Ġval Ġresult Ġ= Ġhash Map Of < String , ĠInt >() ĊĊĠĠĠ Ġ// Ġcount Ġoccurrences Ġof Ġconcepts : ĊĠĠĠ Ġall Nodes . map Ġ{ Ġit . concept Ġ} ĊĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ. each Count () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġmeta Concept s . by Index ( key ). name . without Structure Path Fragment () Ġto Ġvalue Ġ}. toMap ( result ) ĊĊĠĠĠ Ġ// Ġcount Ġoccurrences Ġof Ġfeatures Ġ( i . e ., Ġthe Ġrole Ġthat Ġa Ġnode Ġplays ): ĊĠĠĠ ĠlistOf ( all Nodes . map NotNull Ġ{ Ġit . role Ġ}) ĊĠĠĠĠĠĠĠ Ġ. flatten () ĊĠĠĠĠĠĠĠ Ġ. grouping By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ. each Count () ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeature ByIndex Ġ= Ġmeta Concept s . feature ByIndex ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ feature ByIndex . second . name . without Structure Path Fragment ()} # ${ feature ByIndex . first . name }" Ġto Ġvalue ĊĠĠĠĠĠĠĠ Ġ}. toMap ( result ) ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun ĠString . without Structure Path Fragment (): ĠString Ġ= Ġthis . replace (". structure ", Ġ"") Ċ Ċ fun ĠCount ing Map < String >. as Csv Lines ( mps Project On Disk : ĠM ps Project On Disk ): ĠIterable < String > Ġ= ĊĠĠĠ ĠlistOf ( csv Row Of (" concept (# feature )", Ġ"\" number Ġof Ġusage s \"" )) Ġ+ ĊĠĠĠĠĠĠĠ Ġentries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . key Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . as Row ( mps Project On Disk . languages ). as Csv Row () Ġ} ĊĊ Ċ private Ġfun ĠMap . Entry < String , ĠInt >. as Row ( languages : ĠList < Language >): ĠIterable < String > Ġ{ ĊĠĠĠ Ġval Ġparts Ġ= Ġkey . split ('# ') ĊĠĠĠ Ġval Ġindex Ġ= Ġparts [ 0 ]. lastIndexOf ('.') ĊĠĠĠ Ġval Ġlanguage Name Ġ= Ġparts [ 0 ]. substring ( 0 , Ġindex ) ĊĠĠĠ Ġval Ġelement Name Ġ= Ġparts [ 0 ]. substring ( index Ġ+ Ġ 1 ) ĊĠĠĠ Ġval Ġelements Ġ= Ġlanguages ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġl Ġ-> Ġl . name Ġ== Ġlanguage Name Ġ} ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġl Ġ-> Ġl . structure (). concepts (). filter Ġ{ Ġe Ġ-> Ġe . name Ġ== Ġelement Name Ġ} Ġ} ĊĠĠĠ Ġif Ġ( elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( key , Ġvalue . toString (), Ġ"? ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġthing Ġ= Ġif Ġ( parts . size Ġ== Ġ 1 ) Ġelements . first () Ġelse Ġelements . first (). features . find Ġ{ Ġf Ġ-> Ġf . name Ġ== Ġparts [ 1 ]} !! ĊĠĠĠ Ġreturn ĠlistOf ( key , Ġvalue . toString (), Ġthing . deprecated . toString ()) Ċ } ĊĊ