package Ġcom . source plusplus . marker . jvm Ċ Ċ import Ġcom . intellij . ide . util . Psi Navigation Support Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Java Psi Facade Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . search . Filename Index . get Files ByName Ċ import Ġcom . intellij . psi . search . Global Search Scope . all Scope Ċ import Ġcom . intellij . util . Psi Navigate Util Ċ import Ġcom . source plusplus . marker . source . JV MM ark er Utils Ċ import Ġcom . source plusplus . protocol . artifact . Artifact QualifiedName Ċ import Ġcom . source plusplus . protocol . artifact . Artifact Type Ċ import Ġcom . source plusplus . protocol . artifact . exception . Live StackTrace Element Ċ import Ġcom . source plusplus . protocol . artifact . exception . source As Filename Ċ import Ġcom . source plusplus . protocol . artifact . exception . source As LineNumber Ċ import Ġio . vertx . core . Promise Ċ import Ġio . vertx . core . Vert x Ċ import Ġio . vertx . kotlin . coroutines . await Ċ import Ġio . vertx . kotlin . coroutines . dispatcher Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . jetbrains . u ast . U Method Ċ import Ġorg . jetbrains . u ast . to U Element Ċ import Ġorg . slf 4 j . LoggerFactory Ċ Ċ /** Ċ Ġ* Ġtodo : Ġdescription . Ċ Ġ* Ċ Ġ* Ġ@ since Ġ 0 . 1 . 0 Ċ Ġ* Ġ@ author Ġ[ Brand on ĠF erg erson ]( mailto : b fer g erson @ apache . org ) Ċ Ġ*/ Ċ object ĠArtifact Navigator Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Artifact Navigator :: class . java ) ĊĊĠĠĠ Ġ// todo : Ġremove Ġmethod Ġfrom Ġmethod Ġnames Ġand Ġsupport Ġnavig ating Ġto Ġclasses ? ĊĊĠĠĠ Ġfun Ġnavigate To ( vertx : ĠVert x , Ġproject : ĠProject , Ġelement : ĠLive StackTrace Element ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Files Ġ= Ġget Files ByName ( project , Ġelement . source As Filename () !! , Ġall Scope ( project )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Files . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġfound Files [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument : ĠDocument Ġ= ĠPsi Document Manager . getInstance ( file . project ). getDocument ( file ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġdocument . getLine Start Offset ( element . source As LineNumber () !! Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Navigation Support . getInstance (). create Navig atable ( project , Ġfile . virtual File , Ġoffset ). navigate ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigate To ( vertx : ĠVert x , Ġproject : ĠProject , Ġartifact QualifiedName : ĠArtifact QualifiedName ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( artifact QualifiedName . type Ġ== ĠArtifact Type . ENDPOINT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( vertx . dispatcher ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartifact Psi Ġ= ĠArtifact Search . find Artifact ( vertx , Ġartifact QualifiedName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( artifact Psi Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Navigate Util . navigate ( artifact Psi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Could Ġnot Ġfind Ġartifact : Ġ{}", Ġartifact QualifiedName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate To Method ( project , Ġartifact QualifiedName . identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnavigate To Method ( project : ĠProject , Ġartifact QualifiedName : ĠString ): ĠPsi Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass QualifiedName Ġ= ĠJ V MM ark er Utils . get Qualified ClassName ( artifact QualifiedName ) ĊĠĠĠĠĠĠĠ Ġval Ġpsi Class Ġ= ĠJava Psi Facade . getInstance ( project ). find Class ( class QualifiedName , Ġall Scope ( project )) ĊĠĠĠĠĠĠĠ Ġfor Ġ( the Method Ġin Ġpsi Class !!. methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu Method Ġ= Ġthe Method . to U Element () Ġas ĠU Method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualified Name Ġ= ĠJ V MM ark er Utils . getFull y QualifiedName ( u Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qualified Name Ġ== Ġartifact QualifiedName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Navigate Util . navigate ( the Method ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJ V MM ark er Utils . getName Identifier ( the Method ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Failed Ġto Ġfind : Ġ$ artifact QualifiedName ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġcan Navigate To ( project : ĠProject , Ġartifact QualifiedName : ĠArtifact QualifiedName ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpromise Ġ= ĠPromise . promise < Boolean >() ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke Later Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpromise . complete ( can Navigate To Method ( project , Ġartifact QualifiedName . identifier )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpromise . future (). await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcan Navigate To Method ( project : ĠProject , Ġartifact QualifiedName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass QualifiedName Ġ= ĠJ V MM ark er Utils . get Qualified ClassName ( artifact QualifiedName ) ĊĠĠĠĠĠĠĠ Ġval Ġpsi Class Ġ= ĠJava Psi Facade . getInstance ( project ). find Class ( class QualifiedName , Ġall Scope ( project )) ĊĠĠĠĠĠĠĠ Ġfor Ġ( the Method Ġin Ġpsi Class !!. methods ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu Method Ġ= Ġthe Method . to U Element () Ġas ĠU Method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqualified Name Ġ= ĠJ V MM ark er Utils . getFull y QualifiedName ( u Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qualified Name Ġ== Ġartifact QualifiedName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ