import Ġcom . intellij . ide . highlighter . Java FileType Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . extensions . Extension Point Name Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . project . impl . Project ManagerImpl Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . impl . Psi File Factory Impl Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġmetrics .* Ċ import Ġjava . io . File ĊĊ Ċ class ĠMetrics Calculator Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġproject : ĠProject Ġ= ĠProject ManagerImpl . getInstance (). open Projects [ 0 ] ĊĠĠĠ Ġprivate Ġval Ġep Name Ġ: ĠExtension Point Name < Metric > Ġ= ĠExtension Point Name . create (" my . plugin . metrics Extension Point "); ĊĠĠĠ Ġprivate Ġval Ġmetrics File Ġ= ĠFile ("${ Global Storage . out _ path }/ label Studio Files / metrics . tsv ") ĊĊĠĠĠ Ġfun Ġcalculate For Code Piece ( code Piece : ĠCode Piece , Ġextension Point : ĠExtension Point Name < Metric > Ġ= Ġep Name ): ĠMutable Map < String , ĠFloat ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan 't Ġextract Ġit Ġfrom Ġdisk Ġsince Ġit Ġcan Ġbe Ġchanged Ġpiece , Ġso Ġwe Ġcreate Ġnew Ġfile ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġpsi File : ĠPsi File ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi File Ġ= ĠPsi File Factory . getInstance ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create File FromText (" d umb . java ", ĠJava FileType . INSTANCE , Ġcode Piece . full Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmetrics Ġ= Ġmutable Map Of < String , ĠFloat ?> () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( extension Ġin Ġextension Point . extension List ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics [ extension . name ] Ġ= Ġextension . calculate ( psi File , Ġcode Piece ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmetrics ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate For File ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ( file . name ) ĊĠĠĠĠĠĠĠ Ġval Ġcode Pieces : ĠList < Code Piece > Ġ= ĠJson . decode FromString ( file . read Text ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( code Piece Ġin Ġcode Pieces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Next Ġcode piece ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( code Piece . offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( Ġcode Piece . code Piece End ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( code Piece . full Code . sub Sequence ( code Piece . code Piece Start , Ġcode Piece . code Piece End ) Ġ== Ġcode Piece . code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmetrics Ġ= Ġcalculate For Code Piece ( code Piece ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics File . append Text ("${ code Piece . path }\ t ${ code Piece . hash }\ t ${ code Piece . offset }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , value ) Ġin Ġmetrics ) Ġ{ Ġ// ĠWe Ġrely Ġon Ġmap Ġand Ġextensions Ġorder Ġpre servation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics File . append Text ("\ t $ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics File . append Text ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcalculate () Ġ{ ĊĠĠĠĠĠĠĠ Ġmetrics File . delete () ĊĠĠĠĠĠĠĠ Ġval Ġmetric Names Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( extension Ġin Ġep Name . extension List ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetric Names . add ( extension . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmetrics File . append Text (" path \ th ash \ to ffset \ t ") ĊĠĠĠĠĠĠĠ Ġmetrics File . append Text ( metric Names . join ToString ( separator Ġ= Ġ"\ t ") Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠ ĠFile ("${ Global Storage . out _ path }/ maps "). walk (). filter Ġ{ Ġit . isFile Ġ}. forEach Ġ{ Ġcalculate For File ( it ) Ġ} ĊĠĠĠ Ġ} Ċ }