/* Ċ Ġ* ĠCopyright Ġ 2 0 1 1 ĠHol ger ĠBrand l Ċ Ġ* Ċ Ġ* ĠThis Ġcode Ġis Ġlicensed Ġunder ĠBSD . ĠFor Ġdetails Ġsee Ċ Ġ* Ġhttp :// www . opensource . org / licenses / bsd - license . php Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . r . packages Ċ Ċ import Ġcom . intellij . openapi . diagnostic . Attachment Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . util . System Info Ċ import Ġcom . intellij . openapi . vfs . V fs Util Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . util . Cached Value Provider Ċ import Ġcom . intellij . psi . util . Cached Values Manager Ċ import Ġorg . jetbrains . r . R Plugin Util Ċ import Ġorg . jetbrains . r . classes . s 4 . extra . RS 4 Skeleton Util Ċ import Ġorg . jetbrains . r . packages . Library Summary . RL i brary Package Ċ import Ġorg . jetbrains . r . packages . Library Summary . RL i brary Package .* Ċ import Ġorg . jetbrains . r . packages . Library Summary . RL i brary Symbol Ċ import Ġorg . jetbrains . r . skeleton . RS keleton FileType Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . Path ĊĊ Ċ object ĠRS keleton Util Ġ{ ĊĠ Ġprivate Ġconst Ġval ĠCUR _ S KE LE TON _ VERSION Ġ= Ġ 1 3 ĊĠ Ġconst Ġval ĠS KE LE TON _ DIR _ NAME Ġ= Ġ" r _ s ke letons " ĊĠ Ġprivate Ġconst Ġval ĠMAX _ THREAD _ POOL _ SIZE Ġ= Ġ 4 ĊĠ Ġprivate Ġconst Ġval ĠFAILED _ SUFFIX Ġ= Ġ". failed " ĊĠ Ġprivate Ġconst Ġval ĠPR I ORITY _ PREFIX Ġ= Ġ" ## ĠPackage Ġpriority : Ġ" ĊĠ Ġprivate Ġconst Ġval ĠDEFAULT _ MAX _ BUCKET _ SIZE Ġ= Ġ 2 5 Ġ// Ġ 4 Ġthreads Ġconsume Ġa Ġtotal Ġof Ġ~ 1 GB Ġmemory ĊĊĠ Ġprivate Ġval ĠRAM _ SIZE _ HELPER Ġby Ġlazy Ġ{ ĠR Plugin Util . find File In R Helpers (" R / ram _ size . R ") Ġ} ĊĊĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger . getInstance ( RS keleton Util :: class . java ) ĊĊĠ Ġfun Ġcheck Version ( s ke letons DirectoryPath : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġs ke letons Directory Ġ= ĠFile ( s ke letons DirectoryPath ) ĊĠĠĠ Ġval Ġversion File Ġ= ĠFile ( s ke letons Directory , Ġ" s ke letons - version ") ĊĠĠĠ Ġif Ġ( version File . exists () Ġ&& Ġversion File . read Text () Ġ== ĠCUR _ S KE LE TON _ VERSION . toString ()) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġs ke letons Directory . delete Re cursively () ĊĠĠĠ Ġif Ġ(! s ke letons Directory . mkdir s ()) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! s ke letons Directory . exists ()) ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Can 't Ġcreate Ġs ke letons Ġdirectory ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġversion File . print Writer (). use Ġ{ ĊĠĠĠĠĠ Ġit . print ( CUR _ S KE LE TON _ VERSION ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhash ( library Path : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn ĠPath . of ( library Path ). join ToString ( separator Ġ= Ġ"", Ġpostfix Ġ= Ġ"- ${ library Path . hashCode () }") Ġ{ Ġit . toString (). sub Sequence ( 0 , Ġ 1 ) Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġinstalled Package ToS keleton Path ( s ke letons Directory : ĠString , Ġinstalled Package : ĠR Installed Package ): ĠPath Ġ{ ĊĠĠĠ Ġval Ġdir Name Ġ= Ġinstalled Package . name Ġ+ Ġ"-" Ġ+ Ġinstalled Package . version ĊĠĠĠ Ġreturn ĠPath . of ( s ke letons Directory , Ġdir Name , Ġhash ( installed Package . canonical Package Path ) Ġ+ Ġ"." Ġ+ ĠRS keleton FileType . EXTENSION ) ĊĠ Ġ} ĊĊĠ Ġfun Ġinstalled Package ToS keleton File ( s ke letons Directory : ĠString , Ġinstalled Package : ĠR Installed Package ): ĠVirtual File ? Ġ{ ĊĠĠĠ Ġval Ġskeleton Path Ġ= Ġinstalled Package ToS keleton Path ( s ke letons Directory , Ġinstalled Package ) ĊĠĠĠ Ġreturn ĠV fs Util . find File ( skeleton Path , Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġfun Ġskeleton File To R Package ( skeleton File : ĠPsi File ): ĠR Package ? Ġ= ĠR Package . get OrCreate R Package By Skeleton File ( skeleton File ) ĊĊĠ Ġfun Ġskeleton File To R Package ( skeleton File : ĠVirtual File ): ĠR Package ? Ġ{ ĊĠĠĠ Ġval Ġ( name , Ġversion ) Ġ= Ġskeleton File . parent . name . split ('- ', Ġlimit Ġ= Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If Ġ{ Ġit . size Ġ== Ġ 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠPair ( it [ 0 ], Ġit [ 1 ]) Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn ĠR Package ( name , Ġversion ) ĊĠ Ġ} ĊĊĠ Ġfun Ġget Priority From Skeleton File ( file : ĠFile ): ĠR Package Priority ? Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġpriority Ġ= Ġfile . inputStream (). use Ġ{ ĊĠĠĠĠĠĠĠ ĠparseFrom ( it ). priority ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ( priority ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPriority . NA Ġ-> ĠR Package Priority . NA ĊĠĠĠĠĠĠĠ ĠPriority . BASE Ġ-> ĠR Package Priority . BASE ĊĠĠĠĠĠĠĠ ĠPriority . RE COMM ENDED Ġ-> ĠR Package Priority . RE COMM ENDED ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠ ĠLOG . warn (" Failed Ġto Ġread Ġpackage Ġpriority Ġfrom Ġskeleton Ġfile Ġ$ file ", Ġe ) ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġis B anned ( packageName : ĠString ) Ġ= ĊĠĠĠ ĠpackageName Ġ== Ġ" tcl tk " Ġ&& ĠSystem Info . is Mac Ġ|| ĊĠĠĠ ĠpackageName Ġ== Ġ" translations " ĊĊĠ Ġprivate Ġconst Ġval Ġinvalid Package Format Ġ= Ġ" Invalid Ġpackage Ġsummary Ġformat " ĊĊĠ Ġfun ĠconvertTo Bin Format ( packageName : ĠString , Ġpackage Summary : ĠString ): ĠR Library Package Ġ{ ĊĠĠĠ Ġval Ġpackage Builder Ġ= ĠnewBuilder (). setName ( packageName ) ĊĠĠĠ Ġpackage Builder . setName ( packageName ) ĊĠĠĠ Ġval Ġlines : ĠList < String > Ġ= Ġpackage Summary . lines () ĊĠĠĠ Ġif Ġ( lines . isEmpty ()) Ġthrow ĠIOException (" Empty Ġsummary ") ĊĊĠĠĠ Ġval Ġpriority Ġ= Ġwhen Ġ( val Ġit Ġ= Ġlines [ 0 ]. trim ()) Ġ{ ĊĠĠĠĠĠ Ġ"", Ġ" NA " Ġ-> ĠPriority . NA ĊĠĠĠĠĠ Ġ" BASE " Ġ-> ĠPriority . BASE ĊĠĠĠĠĠ Ġ" RE COMM ENDED " Ġ-> ĠPriority . RE COMM ENDED ĊĠĠĠĠĠ Ġ" OPTIONAL " Ġ-> ĠPriority . OPTIONAL ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . error (" Unknown Ġpriority Ġfor Ġpackage Ġ$ packageName : Ġ$ it ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAttachment ("$ packageName . R Summary ", Ġpackage Summary )) ĊĠĠĠĠĠĠĠ ĠPriority . NA ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġpackage Builder . set Priority ( priority ) ĊĊĠĠĠ Ġval Ġsymbols Ġ= Ġlines . sub List ( 1 , Ġlines . size ) ĊĊĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( index Ġ< Ġsymbols . size ) Ġ{ ĊĠĠĠĠĠ Ġval Ġline Num Ġ= Ġindex Ġ+ Ġ 1 ĊĠĠĠĠĠ Ġval Ġline Ġ= Ġsymbols [ index ] ĊĠĠĠĠĠ Ġindex ++ ĊĊĠĠĠĠĠ Ġval Ġparts Ġ= Ġline . split ('\ u 0 0 0 1 ') ĊĊĠĠĠĠĠ Ġif Ġ( parts . size Ġ< Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Too Ġshort Ġline Ġ$ lineNum : Ġ" Ġ+ Ġline ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġparts [ 0 ] ĊĠĠĠĠĠ Ġval Ġexported Ġ= Ġparts [ 1 ] Ġ== Ġ" TRUE " ĊĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠR Library Symbol . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. setName ( methodName ) ĊĠĠĠĠĠĠĠ Ġ. set Exported ( exported ) ĊĊĠĠĠĠĠ Ġval Ġ( types , Ġtypes End Index ) Ġ= ĠRS 4 Skeleton Util . read Repeated Attribute ( parts , Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Expected Ġ$ it Ġtypes Ġin Ġline Ġ$ lineNum : Ġ$ line ") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( types . contains (" function ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( types End Index Ġ< Ġparts . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// No Ġ" function " Ġdescription Ġfor Ġexported Ġsymbols Ġlike Ġ` something Ġ<- Ġ. Primitive (" some _ primitive ") ` ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Representation Builder Ġ= ĠR Library Symbol . Function Representation . newBuilder () ĊĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Signature StartIndex Ġ= ĠRS 4 Skeleton Util . convert Function To Bin Format ( builder , Ġparts , Ġtypes , Ġtypes End Index , Ġline , Ġline Num ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= Ġparts [ function Signature StartIndex ] ĊĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġ" function Ġ(" ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! signature . startsWith ( prefix ) Ġ|| Ġ! signature . endsWith (" ) Ġ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Invalid Ġfunction Ġdescription Ġat Ġ$ lineNum : Ġ" Ġ+ Ġsignature ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġsignature . substring ( prefix . length , Ġsignature . length Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠ Ġfunction Representation Builder . parameters Ġ= Ġparameters ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( builder . type Ġ== ĠR Library Symbol . Type . FUNCTION Ġ&& Ġparts . size Ġ> Ġfunction Signature StartIndex Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextra Named Args Builder Ġ= ĠR Library Symbol . Function Representation . Extra Named Arguments . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Named Args Builder . addAll Arg Names ( parts [ function Signature StartIndex Ġ+ Ġ 1 ]. split ("; ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Named Args Builder . addAll Fun Arg Names ( parts [ function Signature StartIndex Ġ+ Ġ 2 ]. split ("; ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Representation Builder . extra Named Arguments Ġ= Ġextra Named Args Builder . build () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġbuilder . set Function Representation ( function Representation Builder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbuilder . type Ġ= ĠR Library Symbol . Type . PR IMIT IVE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( types . contains (" class Representation ") Ġ&& Ġparts . size Ġ> Ġtypes End Index ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRS 4 Skeleton Util . convert S 4 Class To Bin Format ( builder , ĠpackageName , Ġparts , Ġtypes End Index , Ġline , Ġline Num ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( types . contains (" data . frame ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . type Ġ= ĠR Library Symbol . Type . DATASET ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġpackage Builder . add Symbols ( builder . build ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġpackage Builder . build () ĊĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠR Package ( val Ġname : ĠString , Ġval Ġversion : ĠString ) Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġif Ġ[ file ] Ġtype Ġis ĠS keleton ĠFile ĠType , Ġreturns Ġpackage Ġand Ġversion Ġwhich Ġwas Ġused Ġfor Ġits Ġgeneration Ġor Ġnull Ġotherwise ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget OrCreate R Package By Skeleton File ( file : ĠPsi File ): ĠR Package ? Ġ{ ĊĠĠĠĠĠ Ġif Ġ( file . virtual File . fileType Ġ!= ĠRS keleton FileType ) Ġreturn Ġnull ĊĠĠĠĠĠ Ġreturn ĠCached Values Manager . get Cached Value ( file ) Ġ{ ĊĠĠĠĠĠĠĠ ĠCached Value Provider . Result ( RS keleton Util . skeleton File To R Package ( file . virtual File ), Ġfile ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }