package Ġidea . plugin . copy paste Ċ Ċ import Ġcom . intellij . lang . AST Node Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . An Action Ċ import Ġcom . intellij . openapi . action System . Common Data Keys Ċ import Ġcom . intellij . openapi . ui . Messages Ċ import Ġcom . intellij . psi . Psi File Factory Ċ import Ġcom . intellij . psi . tree . Token Set Ċ Ċ /** Ċ Ġ* ĠClass Ġimplements Ġlogic Ġof Ġshowing Ġmessages Ġwith Ġbuilt Ġabstract Ġsyntax Ġtree Ġof Ġselected Ġcode Ċ Ġ*/ Ċ class ĠAST Info Message Action Ġ: ĠAn Action () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmessage Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġval Ġin sign ificant Node Types Ġ= Ġhash Set Of (" WHITE _ SPACE ", Ġ" ERROR _ ELEMENT ") ĊĊĠĠĠ Ġoverride Ġfun ĠactionPerformed ( an ActionEvent : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġenvironment ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Project Ġ= Ġan ActionEvent . project ĊĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġan ActionEvent . getData ( Common Data Keys . EDITOR ) ĊĠĠĠĠĠĠĠ Ġval Ġpsi File Ġ= Ġan ActionEvent . getData ( Common Data Keys . P SI _ FILE ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġ// ĠExtract Ġselected Ġcode ĊĠĠĠĠĠĠĠ Ġval Ġselected Code Ġ= Ġeditor ?. selection Model ?. selected Text Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġpsi Selected File Ġ= ĠPsi File Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getInstance ( current Project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create File FromText ( psi File . language , Ġselected Code ) ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġabstract Ġsyntax Ġtree ĊĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġrecursive AST Walk ing ( psi Selected File . node ) ĊĠĠĠĠĠĠĠ Ġ// ĠShow Ġmessage ĊĠĠĠĠĠĠĠ ĠMessages . showMessageDialog ( current Project , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Abstract Ġsyntax Ġtree ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMessages . get Information Icon () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRecursive Ġtra ver sing Ġtree Ġof ĠAST Nodes ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrent Ġstores Ġcurrent Ġnode Ġin ĠAST ĊĠĠĠĠ Ġ* Ġ@ param Ġdepth Ġis Ġused Ġfor Ġcorrect Ġprinting Ġnested ĠAST Ġnodes ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrecursive AST Walk ing ( current : ĠAST Node , Ġdepth : ĠInt Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent NodeType Ġ= Ġcurrent . elementType . toString () ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġpretty Ġprefix Ġif Ġnecessary ĊĠĠĠĠĠĠĠ Ġif Ġ( current NodeType Ġ! in Ġin sign ificant Node Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ+= Ġ' |' Ġ+ Ġ" -------- ". repeat ( depth ) Ġ+ Ġ"> $ current NodeType \ n " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠRe cursively Ġvisit Ġchildren ĊĠĠĠĠĠĠĠ Ġvar Ġadditional Depth Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġcurrent . getChildren ( Token Set . ANY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdditional Ġnesting Ġfor Ġblocks Ġwithin Ġcur ly Ġbr aces ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild NodeType Ġ= Ġchild . elementType . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child NodeType Ġ== Ġ" L BRACE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Depth ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecursive AST Walk ing ( child , Ġdepth Ġ+ Ġadditional Depth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child NodeType Ġ== Ġ" R BRACE ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Depth -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }