/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . fir Ċ Ċ import Ġorg . jetbrains . kotlin . Kt Psi Source Element Ċ import Ġorg . jetbrains . kotlin . Kt Source Element Ċ import Ġorg . jetbrains . kotlin . diagnostics . Diagnostic Utils . getLine And Column In Psi File Ċ import Ġorg . jetbrains . kotlin . incremental . components . Lookup Tracker Ċ import Ġorg . jetbrains . kotlin . incremental . components . Position Ċ import Ġorg . jetbrains . kotlin . incremental . components . Scope Kind Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . utils . Smart List Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ class ĠIncrement al Pass Through Lookup Tracker Component ( ĊĠĠĠ Ġprivate Ġval Ġlookup Tracker : ĠLookup Tracker , ĊĠĠĠ Ġprivate Ġval Ġsource To FilePath : Ġ( Kt Source Element ) Ġ-> ĠString ? Ċ ) Ġ: ĠF ir Lookup Tracker Component () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġrequires Position Ġ= Ġlookup Tracker . requires Position ĊĠĠĠ Ġprivate Ġval Ġsource To FilePath s Cache Ġ= ĠConcurrent HashMap < Kt Source Element , ĠString >() ĊĊĠĠĠ Ġoverride Ġfun Ġrecord Lookup ( name : ĠName , Ġin Scopes : ĠList < String >, Ġsource : ĠK t Source Element ?, Ġfile Source : ĠK t Source Element ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( file Source Ġ!= Ġnull Ġ|| Ġsource Ġis ĠK t Psi Source Element ) Ġ// Ġfinding Ġfile Ġfor Ġa Ġsource Ġonly Ġpossible Ġfor ĠP SI , Ġhere Ġit Ġmeans ĊĠĠĠĠĠĠĠ Ġ// Ġthat Ġwe Ġallow Ġnull Ġfor Ġfile Ġsource Ġonly Ġfor ĠP SI - only Ġ" sources ", Ġcurrently Ġ- Ġjava Ġones ĊĠĠĠĠĠĠĠ Ġval Ġdefined Source Ġ= Ġfile Source Ġ?: Ġsource Ġ?: Ġthrow ĠAssertionError (" Cannot Ġrecord Ġlookup Ġfor Ġ\"$ name \" Ġwithout Ġa Ġsource ") ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġsource To FilePath s Cache . get Or Put ( defined Source ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource To FilePath ( defined Source ) Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthe Ġlookup Ġby Ġnon - file Ġsource Ġmostly Ġdoesn 't Ġwork Ġfor Ġthe ĠLT , Ġso Ġwe Ġcannot Ġaff ord Ġnull Ġfile Ġsources Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġif Ġ( requires Position Ġ&& Ġsource Ġ!= Ġnull Ġ&& Ġsource Ġis ĠK t Psi Source Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Line And Column In Psi File ( source . psi . containing File , Ġsource . psi . text Range ). let Ġ{ ĠPosition ( it . line , Ġit . column ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠPosition . NO _ POSITION ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( scope Ġin Ġin Scopes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Tracker . record ( path , Ġposition , Ġscope , ĠScope Kind . PACKAGE , Ġname . asString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrecord Lookup ( name : ĠName , Ġin Scope : ĠString , Ġsource : ĠK t Source Element ?, Ġfile Source : ĠK t Source Element ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrecord Lookup ( name , ĠSmart List ( in Scope ), Ġsource , Ġfile Source ) ĊĠĠĠ Ġ} Ċ } Ċ