/* Ċ Ġ* Ġ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 . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġcom . intellij . psi . impl . source . tree . Leaf Psi Element Ċ import Ġcom . sun . tools . javac . parser . Tokens Ċ import Ġcom . sun . tools . javac . tree . D CT ree Ċ import Ġcom . sun . tools . javac . tree . Doc Comment Table Ċ import Ġcom . sun . tools . javac . tree . J CT ree Ċ import Ġcom . sun . tools . javac . tree . Tree Scanner Ċ import Ġorg . jetbrains . kotlin . descriptors . Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Property Accessor Descriptor Ċ import Ġorg . jetbrains . kotlin . k apt 3 . K apt Context For Stub Generation Ċ import Ġorg . jetbrains . kotlin . k doc . lexer . K Doc Tokens Ċ import Ġorg . jetbrains . kotlin . k doc . psi . api . K Doc Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . org . object web . asm . Op codes Ċ import Ġorg . jetbrains . org . object web . asm . tree . Field Node Ċ import Ġorg . jetbrains . org . object web . asm . tree . Method Node Ċ Ċ class ĠK Doc Comment Keeper ( private Ġval Ġk apt Context : ĠK apt Context For Stub Generation ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdoc Comment Table Ġ= ĠK apt Doc Comment Table () ĊĊĠĠĠ Ġfun Ġget Doc Table ( file : ĠJ CT ree . JC Compilation Unit ): ĠDoc Comment Table Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġdoc Comment Table . take If Ġ{ Ġit . map . isNotEmpty () Ġ} Ġ?: Ġreturn Ġdoc Comment Table ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnum Ġvalues Ġwith Ġdoc Ġcomments Ġare Ġrendered Ġincorrectly Ġin Ġjav ac Ġpretty Ġprint , ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġdelete Ġthe Ġcomments . ĊĠĠĠĠĠĠĠ Ġfile . accept ( object Ġ: ĠTree Scanner () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġremove Comments Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Var Def ( def : ĠJ CT ree . JC Variable Decl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! remove Comments Ġ&& Ġ( def . modifiers . flags Ġand ĠOp codes . ACC _ ENUM . to Long ()) Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . remove Comment ( def ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Comments Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Var Def ( def ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Comments Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Var Def ( def ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġscan ( tree : ĠJ CT ree ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( remove Comments Ġ&& Ġtree Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . remove Comment ( tree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . scan ( tree ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdoc Comment Table ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave K Doc Comment ( tree : ĠJ CT ree , Ġnode : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġk apt Context . orig ins [ node ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġpsi Element Ġ= Ġorigin . element Ġas ? ĠK t Declaration Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġorigin . descriptor ĊĠĠĠĠĠĠĠ Ġval Ġdoc Comment Ġ= Ġpsi Element . doc Comment Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġis ĠConstructor Descriptor Ġ&& Ġpsi Element Ġis ĠK t Class Or Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġwant Ġthe Ġclass Ġcomment Ġto Ġbe Ġduplicated Ġon Ġ< init >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠMethod Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġpsi Element Ġis ĠK t Property ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġdescriptor Ġis ĠProperty Accessor Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġk apt Context . binding Context [ Binding Context . BACK ING _ FIELD _ REQUIRED , Ġdescriptor . corre sponding Property ] Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġplace Ġthe Ġs ma e Ġdocumentation Ġon Ġbacking Ġfield Ġand Ġproperty Ġaccessors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠField Node Ġ&& Ġpsi Element Ġis ĠK t Object Declaration Ġ&& Ġdescriptor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġwrite ĠK Doc Ġon Ġobject Ġinstance Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdoc Comment Table . put Comment ( tree , ĠK Doc Comment ( escape Nested Comments ( extract Comment Text ( doc Comment )))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġescape Nested Comments ( text : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcomment Level Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Char Ġ= Ġtext [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġnext Char () Ġ= Ġtext . get OrNull ( index Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Char Ġ== Ġ'/' Ġ&& Ġnext Char () Ġ== Ġ'* ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Level ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ("/ Ġ* ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( current Char Ġ== Ġ'*' Ġ&& Ġnext Char () Ġ== Ġ'/') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Level Ġ= Ġmax Of ( 0 , Ġcomment Level Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ("* Ġ/ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . append ( current Char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Comment Text ( doc Comment : ĠK Doc ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdoc Comment . children . drop While Ġ{ Ġit Ġis ĠPsi WhiteSpace Ġ|| Ġit . is K Doc Start () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop Last While Ġ{ Ġit Ġis ĠPsi WhiteSpace Ġ|| Ġit . is K Doc End () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("") Ġ{ Ġit . text Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPsi Element . is K Doc Start () Ġ= Ġthis Ġis ĠLeaf Psi Element Ġ&& Ġelement Type Ġ== ĠK Doc Tokens . START ĊĠĠĠ Ġprivate Ġfun ĠPsi Element . is K Doc End () Ġ= Ġthis Ġis ĠLeaf Psi Element Ġ&& Ġelement Type Ġ== ĠK Doc Tokens . END Ċ } Ċ Ċ private Ġclass ĠK Doc Comment ( val Ġbody : ĠString ) Ġ: ĠTokens . Comment Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Source Pos ( index : ĠInt ) Ġ= Ġ- 1 ĊĠĠĠ Ġoverride Ġfun Ġget Style () Ġ= ĠTokens . Comment . Comment Style . J AV AD OC ĊĠĠĠ Ġoverride Ġfun ĠgetText () Ġ= Ġbody ĊĠĠĠ Ġoverride Ġfun Ġis Deprecated () Ġ= Ġfalse Ċ } Ċ Ċ private Ġclass ĠK apt Doc Comment Table ( map : ĠMap < J CT ree , ĠTokens . Comment > Ġ= Ġempty Map ()) Ġ: ĠDoc Comment Table Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtable Ġ= Ġmap . to Mutable Map () ĊĊĠĠĠ Ġval Ġmap : ĠMap < J CT ree , ĠTokens . Comment > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtable ĊĊĠĠĠ Ġoverride Ġfun Ġhas Comment ( tree : ĠJ CT ree ) Ġ= Ġtree Ġin Ġtable ĊĠĠĠ Ġoverride Ġfun Ġget Comment ( tree : ĠJ CT ree ) Ġ= Ġtable [ tree ] ĊĠĠĠ Ġoverride Ġfun Ġget Comment Text ( tree : ĠJ CT ree ) Ġ= Ġget Comment ( tree )?. text ĊĊĠĠĠ Ġoverride Ġfun Ġget Comment Tree ( tree : ĠJ CT ree ): ĠD CT ree . DC Doc Comment ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġput Comment ( tree : ĠJ CT ree , Ġc : ĠTokens . Comment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable [ tree ] Ġ= Ġc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Comment ( tree : ĠJ CT ree ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable . remove ( tree ) ĊĠĠĠ Ġ} Ċ }