package Ġorg . elixir _ lang Ċ Ċ import Ġcom . intellij . lang . documentation . Documentation Provider Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . elixir _ lang . j ps . sdk _ type . Elixir Ċ import Ġorg . elixir _ lang . psi .* Ċ import Ġorg . elixir _ lang . psi . impl . is Out erm ost Qual ifiable Alias Ċ import Ġorg . elixir _ lang . sdk . elixir . Type Ċ import Ġorg . intellij . markdown . fl av ours . g fm . GF M Fl avour Descriptor Ċ import Ġorg . intellij . markdown . html . Html Generator Ċ import Ġorg . intellij . markdown . parser . Markdown Parser Ċ import Ġorg . jetbrains . annotations . NotNull Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . util . stream . Collectors ĊĊ Ċ class ĠE lixir Documentation Provider Ġ: ĠDocumentation Provider Ġ{ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠHelp Arguments ( val ĠmoduleName : ĠString , Ġval Ġfunction Name : ĠString ? Ġ= Ġnull , Ġval Ġar ity : ĠInt ? Ġ= Ġnull ) ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Hover Doc ( element : ĠPsi Element , Ġoriginal Element : ĠPsi Element ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Doc ( element : ĠPsi Element , Ġoriginal Element : ĠPsi Element ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhelp Arguments Ġ= Ġget Help Arguments ( element ) ĊĠĠĠĠĠĠĠ Ġif Ġ( help Arguments Ġ== Ġnull Ġ|| Ġhelp Arguments . moduleName . isBlank ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsdk Path Ġ= ĠType . most Specific Sdk ( element )?. home Path . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( sdk Path . isBlank ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" Please Ġconfigure ĠE lixir ĠSDK Ġfirst "; ĊĊĠĠĠĠĠĠĠ Ġval Ġi ex Executable Ġ= ĠE lixir . get I Ex Executable ( sdk Path ). absolute Path ĊĠĠĠĠĠĠĠ Ġval Ġproject BasePath Ġ= Ġelement . project . basePath Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġfetch Documentation ( project BasePath , Ġi ex Executable , Ġhelp Arguments . moduleName , Ġhelp Arguments . function Name , Ġhelp Arguments . arity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Help Arguments ( element : ĠPsi Element ) Ġ: ĠHelp Arguments ? { ĊĠĠĠĠĠĠĠ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠQual ifiable Alias Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . is Out erm ost Qual ifiable Alias ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement . fully QualifiedName ()?. let Ġ{ ĠHelp Arguments ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġelement . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠE lixir Matched Qualified Alias ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparent . fully QualifiedName ()?. let Ġ{ ĠHelp Arguments ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lixir Un matched Qualified Parent heses Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHelp Arguments ( element . resolved ModuleName (), Ġelement . name , Ġelement . resolved Primary Ar ity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lixir Matched Qualified No Parent heses Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHelp Arguments ( element . resolved ModuleName (), Ġelement . name , Ġelement . resolved Primary Ar ity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lixir Matched Qualified No Arguments Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHelp Arguments ( element . resolved ModuleName (), Ġelement . name , Ġelement . resolved Primary Ar ity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lixir Un matched Qualified No Arguments Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHelp Arguments ( element . resolved ModuleName (), Ġelement . name , Ġelement . resolved Primary Ar ity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lixir Matched Unqualified Parent heses Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHelp Arguments ( element . resolved ModuleName (), Ġelement . name , Ġelement . resolved Primary Ar ity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lixir Un matched Unqualified Parent heses Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHelp Arguments ( element . resolved ModuleName (), Ġelement . name , Ġelement . resolved Primary Ar ity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lixir Matched Qualified Parent heses Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHelp Arguments ( element . resolved ModuleName (), Ġelement . name , Ġelement . resolved Primary Ar ity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠE lixir Matched Unqualified No Parent heses Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHelp Arguments ( element . resolved ModuleName (), Ġelement . name , Ġelement . resolved Primary Ar ity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġfetch Documentation ( project BasePath : ĠString , Ġi ex Executable Path : ĠString , ĠmoduleName : ĠString , Ġfunction Name : ĠString ?, Ġar ity : ĠInt ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhelp Argument Builder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( moduleName ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( function Name Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Argument Builder . append (" .$ function Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arity Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Argument Builder . append ("/ ${ arity }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstart Documentation Marker Ġ= Ġ" START _ DOCUMENT ATION " ĊĠĠĠĠĠĠĠ Ġval Ġend Documentation Marker Ġ= Ġ" END _ DOCUMENT ATION " ĊĊĠĠĠĠĠĠĠ Ġval Ġi ex Command Ġ= Ġ" import ĠI Ex . Helpers ;" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" IO . puts Ġ\"$ start Documentation Marker \"; " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" h Ġ$ help Argument Builder ;" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" IO . puts Ġ\"$ end Documentation Marker \"; " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" System . halt ;" ĊĊĠĠĠĠĠĠĠ Ġval Ġcmd Array Ġ= ĠarrayOf ( i ex Executable Path , Ġ"-- no - start ", Ġ"-- no - compile ", Ġ"- S ", Ġ" mix ", Ġ" run ", Ġ"- e ", Ġi ex Command ) ĊĠĠĠĠĠĠĠ Ġval Ġprocess Ġ= ĠRuntime . get Runtime (). exec ( cmd Array , Ġnull , ĠFile ( project BasePath )) ĊĊĠĠĠĠĠĠĠ Ġval Ġstd Input Ġ= ĠBufferedReader ( InputStream Reader ( process . inputStream )) ĊĊĠĠĠĠĠĠĠ Ġval Ġstd Input String Ġ= Ġstd Input . lines (). collect ( Collectors . join ing ("\ n ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġreg Ġ= ĠRegex ("$ start Documentation Marker ([ \\ s \\ S ]*) $ end Documentation Marker ") ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġreg . find ( std Input String ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( src . groups . size Ġ< Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġi ex Documentation Ġ= Ġsrc . groups [ 1 ]?. value . or Empty () ĊĠĠĠĠĠĠĠ Ġval Ġfl avour Ġ= ĠG FM Fl avour Descriptor () ĊĠĠĠĠĠĠĠ Ġval Ġparsed Tree Ġ= ĠMarkdown Parser ( fl avour ). build Markdown Tree FromString ( i ex Documentation ) ĊĠĠĠĠĠĠĠ Ġreturn ĠHtml Generator ( i ex Documentation , Ġparsed Tree , Ġfl avour , Ġfalse ). generate Html () ĊĠĠĠ Ġ} Ċ }