/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠMar cin ĠBu k ow ie ck i . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġio . vac uum . utils Ċ Ċ import Ġcom . go ide . Go Parser Definition Ċ import Ġcom . go ide . psi . Go Assignment Statement Ċ import Ġcom . go ide . psi . Go Binary Expr Ċ import Ġcom . go ide . psi . Go Block Ċ import Ġcom . go ide . psi . Go Call Expr Ċ import Ġcom . go ide . psi . Go Conditional Expr Ċ import Ġcom . go ide . psi . Go Else Statement Ċ import Ġcom . go ide . psi . Go Expr Switch Statement Ċ import Ġcom . go ide . psi . Go Expression Ċ import Ġcom . go ide . psi . Go File Ċ import Ġcom . go ide . psi . Go For Statement Ċ import Ġcom . go ide . psi . Go Function Declaration Ċ import Ġcom . go ide . psi . Go Function Or Method Declaration Ċ import Ġcom . go ide . psi . Go If Statement Ċ import Ġcom . go ide . psi . Go Import Spec Ċ import Ġcom . go ide . psi . Go Parent heses Expr Ċ import Ġcom . go ide . psi . Go Simple Statement Ċ import Ġcom . go ide . psi . Go Statement Ċ import Ġcom . go ide . psi . Go Switch Statement Ċ import Ġcom . go ide . psi . Go Type Declaration Ċ import Ġcom . go ide . psi . Go Unary Expr Ċ import Ġcom . go ide . psi . impl . Go Element Factory Ċ import Ġcom . go ide . psi . impl . Go Type Util Ċ import Ġcom . intellij . openapi . editor . Caret Model Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . file Editor . File Editor Manager Ċ import Ġcom . intellij . openapi . file Editor . Text Editor Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġcom . intellij . psi . Smart Pointer Manager Ċ import Ġcom . intellij . psi . Smart Psi Element Pointer Ċ import Ġcom . intellij . psi . util . elementType Ċ import Ġcom . intellij . psi . util . next Leaf s Ċ Ċ /** Ċ Ġ* Ġ@ author ĠMar cin ĠBu k ow ie ck i Ċ Ġ*/ Ċ object ĠV ac uum Psi Utils Ġ{ ĊĊĠĠĠ Ġfun Ġall Strings ( args : ĠList < Go Expression >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGo Type Util . get Types Of Expressions ( args ). stream (). all Match Ġ{ Ġi Ġ-> ĠGo Type Util . isString ( i , Ġnull ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Binary Expr ( binary Expr : ĠGo Binary Expr , Ġleft : ĠPsi Element , Ġright : ĠPsi Element ): ĠGo Binary Expr Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Child Ġ= Ġbinary Expr . firstChild ĊĠĠĠĠĠĠĠ Ġfirst Child . replace ( left ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Child Ġ= Ġbinary Expr . last Child ĊĠĠĠĠĠĠĠ Ġif Ġ( last Child Ġ== Ġfirst Child ) Ġreturn Ġbinary Expr ĊĠĠĠĠĠĠĠ Ġlast Child . replace ( right ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinary Expr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Imported ( context : ĠPsi Element , Ġpath : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Import ( context , Ġpath ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Import ( context : ĠPsi Element , Ġpath : ĠString ): ĠGo Import Spec ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontaining File Ġ= Ġcontext . containing File Ġas ? ĠGo File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġcontaining File . imports . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . alias Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . path Ġ== Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . alias Ġ== Ġpath Ġ&& Ġit . path Ġ== Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Struct ( name : ĠString , Ġcontext : ĠPsi Element ): ĠGo Type Declaration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdummy File Ġ= ĠGo Element Factory . create File FromText ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . project , Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Ġfoo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ$ name Ġstruct Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdummy File . children . filter Is Instance < Go Type Declaration >(). first () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Call ( stmt : ĠGo Simple Statement , Ġexpected : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġstmt . left Hand Expr List ?. let Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( list . firstChild Ġas ? ĠGo Call Expr )?. let Ġ{ Ġcall Expr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcall Expr . expression . last Child ?. text Ġ== Ġexpected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis TypeOf ( stmt : ĠGo Simple Statement , Ġexpected : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġstmt . left Hand Expr List ?. let Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( list . firstChild Ġas ? ĠGo Call Expr )?. let Ġ{ Ġcall Expr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( call Expr . expression . firstChild Ġas ? ĠGo Expression )?. let Ġ{ Ġref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġref Types Ġ= ĠGo Type Util . get Types Of Expressions ( listOf ( ref )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ref Types . size Ġ== Ġ 1 Ġ&& Ġref Types [ 0 ] Ġ!= Ġnull Ġ&& Ġref Types [ 0 ]. text Ġ== Ġexpected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetLast Statement ( block : ĠGo Block ): ĠGo Statement ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġblock . children . reversed (). first OrNull Ġ{ Ġch Ġ-> Ġch Ġis ĠGo Statement Ġ} Ġas ? ĠGo Statement ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġsmart Ġpointer Ġfor Ġgiven Ġ[ Psi Element ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T Ġ: ĠPsi Element > ĠT . to Smart Pointer (): ĠSmart Psi Element Pointer < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSmart Pointer Manager . create Pointer ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġgiven Ġexpression Ġis Ġfrom Ġright Ġside ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Right ( binary Expr : ĠGo Binary Expr , Ġgiven : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binary Expr . right Ġ== Ġgiven ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġright Expr : ĠGo Expression ? Ġ= Ġbinary Expr . right ĊĠĠĠĠĠĠĠ Ġwhile Ġ( right Expr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Expr Ġ== Ġgiven ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Expr Ġis ĠGo Parent heses Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Expr Ġ= Ġright Expr . unwrap Parent heses () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtract Ġright Ġexpression Ġfrom Ġbinary Ġexpression ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Right Expr ( binary Expr : ĠGo Binary Expr ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binary Expr . right Ġ! is ĠGo Parent heses Expr ) Ġreturn Ġbinary Expr . right ĊĠĠĠĠĠĠĠ Ġvar Ġleft Expr : ĠGo Expression ? Ġ= Ġbinary Expr . right ĊĠĠĠĠĠĠĠ Ġwhile Ġ( left Expr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Expr Ġis ĠGo Parent heses Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Expr Ġ= Ġleft Expr . unwrap Parent heses () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleft Expr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtract Ġleft Ġexpression Ġfrom Ġbinary Ġexpression ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Left Expr ( binary Expr : ĠGo Binary Expr ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binary Expr . left Ġ! is ĠGo Parent heses Expr ) Ġreturn Ġbinary Expr . left ĊĠĠĠĠĠĠĠ Ġvar Ġleft Expr : ĠGo Expression ? Ġ= Ġbinary Expr . left ĊĠĠĠĠĠĠĠ Ġwhile Ġ( left Expr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Expr Ġis ĠGo Parent heses Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Expr Ġ= Ġleft Expr . unwrap Parent heses () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġleft Expr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT ries Ġto Ġfind Ġgiven Ġparent Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠPsi Element > Ġfind Parent ( given : ĠPsi Element , Ġto Find : ĠClass < out ĠPsi Element >): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( to Find . is Instance ( given )) Ġreturn Ġgiven Ġas ĠT ĊĠĠĠĠĠĠĠ Ġvar Ġparent Ġ= Ġgiven . parent ĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( to Find . is Instance ( parent )) Ġreturn Ġparent Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġparent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġunit Test Exists ( go Function Declaration : ĠGo Function Or Method Declaration ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget UnitTest Function ( go Function Declaration ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget UnitTest Function ( go Function Declaration : ĠGo Function Or Method Declaration ?): ĠGo Function Or Method Declaration ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( go Function Declaration Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġfunction Name Ġ= Ġgo Function Declaration . name Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcontaining File Ġ= Ġgo Function Declaration . containing File . virtual File ĊĠĠĠĠĠĠĠ Ġval Ġpossible File Ġ= Ġcontaining File . name Without Extension Ġ+ ĠV ac uum Nam ings . test File Suffix ĊĠĠĠĠĠĠĠ Ġval Ġvirtual File Ġ= Ġcontaining File . parent . find Child ( possible File ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġgo File Ġ= ĠPsi Manager . getInstance ( go Function Declaration . project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find File ( virtual File ) Ġas ? ĠGo File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġgo File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. functions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġfn Ġ-> Ġfn . name Ġ!= Ġnull Ġ&& Ġfn . name Ġin ĠV ac uum Nam ings . get Possible UnitTest Names ( function Name ) Ġ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// FIX ME Ġget Ġall Ġchildren Ġwithout Ġwh ites p aces Ġto Ġcompare Ġif Ġa Ġblock / branch Ġis Ġsame ĊĠĠĠ Ġfun ĠgetText Without Spaces ( given : ĠPsi Element ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġgiven . next Leaf s . iterator () ĊĠĠĠĠĠĠĠ Ġvar Ġacc Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġgiven . last Child . node ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ! is ĠPsi WhiteSpace ) Ġacc += next . text ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġacc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġunwrap Parent hesis Expr ( given : ĠPsi Element ): ĠPsi Element Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( given Ġis ĠGo Parent heses Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgiven . unwrap Parent heses () Ġ?: Ġgiven ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgiven ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwrap With Function ( project : ĠProject , Ġexpressions : ĠList < Go Statement >): ĠGo Function Declaration ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexpressions Text Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ( expression Ġin Ġexpressions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions Text Ġ= Ġexpressions Text Ġ+ Ġexpression . text Ġ+ Ġ"\ n " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠGo Element Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. createElement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" package Ġa ; Ġfunc Ġ_ () Ġ{\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions Text Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGo Function Declaration :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisIn verted ( conditional Expr : ĠGo Conditional Expr ): ĠPair < Boolean , ĠPsi Element ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparent Ġ= Ġconditional Expr . parent ĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull Ġ&& Ġparent Ġis ĠGo Parent heses Expr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( false , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠGo Unary Expr Ġ&& Ġparent . not Ġ!= Ġnull Ġ&& Ġparent . not ?. text Ġ== Ġ" !") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( true , Ġparent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( false , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Condition ( element : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparent : ĠPsi Element ? Ġ= Ġelement . parent ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠGo If Statement ) Ġreturn Ġparent . condition ?. unwrap Parent heses () Ġ== Ġelement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Empty Else Expression ( project : ĠProject ): ĠGo Else Statement ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGo Element Factory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. createElement ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" package Ġa ; Ġfunc Ġ_ () Ġ{ Ġif Ġa Ġ{ Ġ} Ġelse Ġ{} Ġ} ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGo If Statement :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ?. else Statement ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Caret ( project : ĠProject ): ĠCare t Model ? Ġ{ ĊĠĠĠĠĠĠĠ ĠFile Editor Manager . getInstance ( project ). selected Editor ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠText Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . editor . caret Model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Default ( switch Statement : ĠGo Expr Switch Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( switch Statement . expr Case Clause List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġswitch Statement . expr Case Clause List . last (). default ?. text Ġ== Ġ" default " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Inner ( fd : ĠGo Function Or Method Declaration ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparent : ĠPsi Element ? Ġ= Ġfd . parent ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠGo Function Or Method Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Nested ( switch Statement : ĠGo Switch Statement ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġparent : ĠPsi Element ? Ġ= Ġswitch Statement . parent ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠGo Function Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠGo Switch Statement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Comment Line Start ( go Block : ĠGo Block ?): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( go Block Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġgo Block . children . find Ġ{ Ġe Ġ-> Ġe . elementType Ġ== ĠGo Parser Definition . Lazy . LINE _ COMMENT Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Document ( element : ĠPsi Element ): ĠDocument ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPsi Document Manager . getInstance ( element . project ). getDocument ( element . containing File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty ( go Function Declaration : ĠGo Function Or Method Declaration ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgo Function Declaration . block ?. children ?. none Ġ{ Ġe Ġ-> Ġe Ġ! is ĠPsi WhiteSpace Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . text Ġ!= Ġ" {" Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . text Ġ!= Ġ" }" Ġ} Ġ?: Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty ( go Block : ĠGo Block ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgo Block . children . none Ġ{ Ġe Ġ-> Ġe Ġ! is ĠPsi WhiteSpace Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . text Ġ!= Ġ" {" Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . text Ġ!= Ġ" }" Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget N esting Level With Function ( psi Element : ĠPsi Element ): ĠPair < Int , ĠGo Function Or Method Declaration ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfound Function : ĠGo Function Or Method Declaration ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġnesting Level Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġparent Ġ= Ġpsi Element . parent ĊĠĠĠĠĠĠĠ Ġwhile Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( parent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGo Function Or Method Declaration Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Function Ġ= Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnesting Level ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGo If Statement Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnesting Level ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGo Switch Statement Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnesting Level ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGo For Statement Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnesting Level ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġparent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( nest ing Level Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( 0 , Ġfound Function ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( nest ing Level , Ġfound Function ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġextract Unary ( assignment Statement : ĠGo Assignment Statement ?): ĠGo Unary Expr ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( assignment Statement Ġ== Ġnull Ġ|| Ġassignment Statement . expression List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġassignment Statement . expression List [ 0 ] Ġas ? ĠGo Unary Expr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Indent ed ( expression : ĠPsi Element ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġexpression . prev Sibling Ġis ĠPsi WhiteSpace ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains Import ( go File : ĠGo File , Ġimport Path : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġgo File . imports . any Ġ{ Ġimp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimp . path Ġ== Ġimport Path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ