/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . k apt 3 . stubs Ċ Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . sun . tools . javac . tree . J CT ree Ċ import Ġorg . jetbrains . kotlin . k apt 3 . K apt Context For Stub Generation Ċ import Ġorg . jetbrains . kotlin . k apt 3 . base . stubs . K apt Stub Line Information Ċ import Ġorg . jetbrains . kotlin . k apt 3 . base . stubs . Kotlin Position Ċ import Ġorg . jetbrains . kotlin . k apt 3 . base . stubs . Line Info Map Ċ import Ġorg . jetbrains . kotlin . k apt 3 . base . stubs . get J av ac Signature Ċ import Ġorg . jetbrains . org . object web . asm . tree . Class Node Ċ import Ġorg . jetbrains . org . object web . asm . tree . Field Node Ċ import Ġorg . jetbrains . org . object web . asm . tree . Method Node Ċ import Ġjava . io .* Ċ Ċ class ĠK apt Line Mapping Collector ( private Ġval Ġk apt Context : ĠK apt Context For Stub Generation ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġline Info : ĠLine Info Map Ġ= Ġmutable Map Of () ĊĠĠĠ Ġprivate Ġval Ġsignature Info Ġ= Ġmutable Map Of < String , ĠString >() ĊĊĠĠĠ Ġprivate Ġval Ġfile Paths Ġ= Ġmutable Map Of < Psi File , ĠPair < String , ĠBoolean >>() ĊĊĠĠĠ Ġfun Ġregister Class ( clazz : ĠClass Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister ( clazz , Ġclazz . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Method ( clazz : ĠClass Node , Ġmethod : ĠMethod Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister ( method , Ġclazz . name Ġ+ Ġ"#" Ġ+ Ġmethod . name Ġ+ Ġmethod . desc ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Field ( clazz : ĠClass Node , Ġfield : ĠField Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister ( field , Ġclazz . name Ġ+ Ġ"#" Ġ+ Ġfield . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister Signature ( declaration : ĠJ CT ree . JC Method Decl , Ġmethod : ĠMethod Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsignature Info [ declaration . get J av ac Signature ()] Ġ= Ġmethod . name Ġ+ Ġmethod . desc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Position ( clazz : ĠClass Node ): ĠKotlin Position ? Ġ= Ġline Info [ clazz . name ] ĊĠĠĠ Ġfun Ġget Position ( clazz : ĠClass Node , Ġmethod : ĠMethod Node ): ĠKotlin Position ? Ġ= Ġline Info [ clazz . name Ġ+ Ġ"#" Ġ+ Ġmethod . name Ġ+ Ġmethod . desc ] ĊĠĠĠ Ġfun Ġget Position ( clazz : ĠClass Node , Ġfield : ĠField Node ): ĠKotlin Position ? Ġ= Ġline Info [ clazz . name Ġ+ Ġ"#" Ġ+ Ġfield . name ] ĊĊĠĠĠ Ġprivate Ġfun Ġregister ( asm Node : ĠAny , Ġfq Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi Element Ġ= Ġk apt Context . orig ins [ asm Node ]?. element Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġregister ( fq Name , Ġpsi Element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister ( fq Name : ĠString , Ġpsi Element : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontaining Virtual File Ġ= Ġpsi Element . containing File . virtual File ĊĠĠĠĠĠĠĠ Ġif Ġ( containing Virtual File Ġ== Ġnull Ġ|| ĠFile Document Manager . getInstance (). getDocument ( containing Virtual File ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Range Ġ= Ġpsi Element . text Range Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġ( path , Ġis Relative ) Ġ= Ġget FilePath Relative Preferred ( psi Element . containing File ) ĊĠĠĠĠĠĠĠ Ġline Info [ fq Name ] Ġ= ĠKotlin Position ( path , Ġis Relative , Ġtext Range . start Offset ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget FilePath Relative Preferred ( file : ĠPsi File ): ĠPair < String , ĠBoolean > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Paths . get Or Put ( file ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabsolute Path Ġ= Ġfile . virtual File . canonical Path Ġ?: Ġfile . virtual File . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabsolute File Ġ= ĠFile ( absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase File Ġ= Ġfile . project . basePath ?. let Ġ{ ĠFile ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( absolute File . exists () Ġ&& Ġbase File Ġ!= Ġnull Ġ&& Ġbase File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġabsolute File . relative To OrNull ( base File )?. path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( relative Path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ get Or Put ĠPair ( relative Path , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ get Or Put ĠPair ( absolute Path , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġserialize (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġos Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġo os Ġ= ĠObject OutputStream ( os ) ĊĊĠĠĠĠĠĠĠ Ġo os . writeInt ( K apt Stub Line Information . METADATA _ VERSION ) ĊĊĠĠĠĠĠĠĠ Ġo os . writeInt ( line Info . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( fq Name , Ġkotlin Position ) Ġin Ġline Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo os . write UTF ( fq Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo os . write UTF ( kotlin Position . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo os . write Boolean ( kotlin Position . is RelativePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo os . writeInt ( kotlin Position . pos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġo os . writeInt ( signature Info . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( javac Signature , Ġmethod Desc ) Ġin Ġsignature Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo os . write UTF ( javac Signature ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġo os . write UTF ( method Desc ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġo os . flush () ĊĠĠĠĠĠĠĠ Ġreturn Ġos . toByteArray () ĊĠĠĠ Ġ} Ċ }