// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . code Insight . navigation . actions Ċ Ċ import Ġcom . intellij . code Insight . Code Insight Action Handler Ċ import Ġcom . intellij . code Insight . Code Insight Bundle Ċ import Ġcom . intellij . code Insight . Target Element Util Ċ import Ġcom . intellij . code Insight . hint . Hint Manager Ċ import Ġcom . intellij . code Insight . navigation . Navigation Util Ċ import Ġcom . intellij . code Insight . navigation . actions . G oto Declaration Action .* Ċ import Ġcom . intellij . feature Statistics . Feature Usage Tracker Ċ import Ġcom . intellij . ide . util . Default Psi Element Cell Renderer Ċ import Ġcom . intellij . openapi . action System . ex . Action Util Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . project . D umb Service Ċ import Ġcom . intellij . openapi . project . Index Not Ready Exception Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . search . Psi Element Processor Ċ import Ġcom . intellij . util . containers . toArray Ċ Ċ /** Ċ Ġ* ĠGo ĠTo ĠDeclaration ĠHandler Ġwhich Ġdoesn 't Ġinvoke ĠShow ĠUs ages Ġif Ġthere Ġare Ġno Ġdeclarations Ġto Ġgo Ċ Ġ*/ Ċ object ĠG oto Declaration Only Handler Ġ: ĠCode Insight Action Handler Ġ{ ĊĊĠ Ġoverride Ġfun Ġstart In Write Action (): ĠBoolean Ġ= Ġfalse ĊĊĠ Ġoverride Ġfun Ġinvoke ( project : ĠProject , Ġeditor : ĠEditor , Ġfile : ĠPsi File ) Ġ{ ĊĠĠĠ ĠFeature Usage Tracker . getInstance (). trigger Feature Used (" navigation . goto . declaration . only ") ĊĠĠĠ Ġval Ġd umb Service Ġ= ĠD umb Service . getInstance ( project ) ĊĠĠĠ Ġd umb Service . run With Alternative Resolve Enabled < RuntimeException > Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġeditor . caret Model . offset ĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= ĠAction Util . under Modal Progress ( project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Res olving ĠReference ...") Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠfindAll Target Elements ( project , Ġeditor , Ġoffset ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( elements . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġsimplest Ġcase ĊĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġelements [ 0 ] ĊĠĠĠĠĠĠĠĠĠ Ġval Ġnav Element Ġ= ĠTarget Element Util . getInstance (). get G oto Declaration Target ( element , Ġelement . navigation Element ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( nav Element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgoto Target Element ( nav Element , Ġeditor , Ġfile ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġmeans Ġeither Ġthere Ġis Ġreally Ġnow here Ġto Ġgo Ġor Ġweird ĠTarget Element Util Ġdidn 't Ġreturn Ġanything ĊĠĠĠĠĠĠĠĠĠ Ġval Ġreference Ġ= ĠTarget Element Util . find Reference ( editor , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġexecuted Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtargets Ġ= ĠAction Util . under Modal Progress ( project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Res olving ĠReference ...") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTarget Element Util . getInstance (). getTarget Candidates ( reference ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( targets . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoose Amb iguous Target ( editor , Ġfile , Ġtargets . toArray ( Psi Element . EMPTY _ ARRAY )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecuted Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// disable Ġ' no Ġdeclaration Ġfound ' Ġnotification Ġfor Ġkeywords ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! executed Ġ&& Ġ! is Keyword Under Caret ( project , Ġfile , Ġoffset )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHint Manager . getInstance (). show Error Hint ( editor , Ġ" Cannot Ġfind Ġdeclaration Ġto Ġgo Ġto ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġchoose Amb iguous Target ( editor , Ġfile , Ġelements ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( e : ĠIndex Not Ready Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġd umb Service . show D umb Mode Notification (" Navigation Ġis Ġnot Ġavailable Ġhere Ġduring Ġindex Ġupdate ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġchoose Amb iguous Target ( editor : ĠEditor , Ġfile : ĠPsi File , Ġelements : ĠArray < Psi Element >) Ġ{ ĊĠĠĠ Ġif Ġ(! editor . component . is Showing ) Ġreturn ĊĠĠĠ Ġchoose Amb iguous Target ( editor , ĠCode Insight Bundle . message (" declaration . navigation . title "), Ġelements ) Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠ Ġgoto Target Element ( element , Ġeditor , Ġfile ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġchoose Amb iguous Target ( editor : ĠEditor , Ġtitle : ĠString , Ġelements : ĠArray < Psi Element >, Ġprocessor : Ġ( Psi Element ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġrequire ( elements . isNotEmpty ()) ĊĠĠĠ Ġif Ġ( elements . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġval Ġelement Ġ= Ġelements [ 0 ] ĊĠĠĠĠĠ Ġprocessor ( element ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġpsi Element Processor Ġ= ĠPsi Element Processor < Psi Element > Ġ{ ĊĠĠĠĠĠ Ġprocessor ( it ) ĊĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ ĠNavigation Util . get Psi Element Popup ( elements , ĠDefault Psi Element Cell Renderer (), Ġtitle , Ġpsi Element Processor ). show In Best Position For ( editor ) ĊĠ Ġ} Ċ } Ċ