/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . jetbrains . python . breadcrumbs Ċ Ċ import Ġcom . intellij . openapi . file Editor . File Editor Manager Ċ import Ġcom . intellij . openapi . file Editor . Text Editor Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi WhiteSpace Ċ import Ġcom . intellij . psi . impl . source . tree . Leaf Element Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . ui . breadcrumbs . Breadcrumb s Provider Ċ import Ġcom . jetbrains . python . Py Token Types Ċ import Ġcom . jetbrains . python . Python Language Ċ import Ġcom . jetbrains . python . psi .* Ċ Ċ class ĠPy Breadcrumb s Info Provider Ġ: ĠB readcrumb s Provider Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval ĠL ANGU AGES Ġ= ĠarrayOf ( Python Language . getInstance ()) ĊĠĠĠ Ġprivate Ġval ĠHEL PER S Ġ= ĠlistOf < Helper < *> >( ĊĠĠĠĠĠ ĠLambda Helper , ĊĠĠĠĠĠ ĠSimple Helper ( Py Try Part :: class . java , Ġ" try "), ĊĠĠĠĠĠ ĠExcept Helper , ĊĠĠĠĠĠ ĠSimple Helper ( Py Finally Part :: class . java , Ġ" finally "), ĊĠĠĠĠĠ ĠSimple Helper ( Py Else Part :: class . java , Ġ" else "), ĊĠĠĠĠĠ ĠIf Helper , ĊĠĠĠĠĠ ĠFor Helper , ĊĠĠĠĠĠ ĠWhile Helper , ĊĠĠĠĠĠ ĠWith Helper , ĊĠĠĠĠĠ ĠClass Helper , ĊĠĠĠĠĠ ĠFunction Helper , ĊĠĠĠĠĠ ĠKey Value Helper ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Languages (): ĠArray < Python Language > Ġ= ĠL ANGU AGES ĊĊĠ Ġoverride Ġfun Ġaccept Element ( e : ĠPsi Element ): ĠBoolean Ġ= Ġget Helper ( e ) Ġ!= Ġnull ĊĊĠ Ġoverride Ġfun ĠgetParent ( e : ĠPsi Element ): ĠPsi Element ? Ġ{ ĊĠĠĠ Ġval Ġdefault Ġ= Ġe . parent ĊĊĠĠĠ Ġval Ġcurrent Offset Ġ= Ġcurrent Offset ( e ) Ġ?: Ġreturn Ġdefault ĊĠĠĠ Ġif Ġ(! is Element To Move Backward ( e , Ġcurrent Offset )) Ġreturn Ġdefault ĊĊĠĠĠ Ġval Ġnon WhiteSpace Ġ= Ġmove Backward ( e , Ġcurrent Offset ) Ġ?: Ġreturn Ġdefault ĊĊĠĠĠ Ġval Ġpsi File Ġ= Ġe . containing File Ġ?: Ġreturn Ġdefault ĊĠĠĠ Ġval Ġdocument Ġ= ĠPsi Document Manager . getInstance ( e . project ). getDocument ( psi File ) Ġ?: Ġreturn Ġdefault ĊĠĠĠ Ġval Ġsame Line Ġ= Ġdocument . get LineNumber ( non WhiteSpace . text Offset ) Ġ== Ġdocument . get LineNumber ( current Offset ) ĊĊĠĠĠ Ġreturn Ġif Ġ( same Line ) Ġnon WhiteSpace . parent Ġelse Ġdefault ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Element Info ( e : ĠPsi Element ): ĠString Ġ= Ġget Helper ( e ) !!. element Info ( e Ġas ĠPy Element ) ĊĠ Ġoverride Ġfun Ġget Element Tooltip ( e : ĠPsi Element ): ĠString Ġ= Ġget Helper ( e ) !!. element Tooltip ( e Ġas ĠPy Element ) ĊĊĠ Ġprivate Ġfun Ġget Helper ( e : ĠPsi Element ): ĠHelper < in ĠPy Element >? Ġ{ ĊĠĠĠ Ġif Ġ( e Ġ! is ĠPy Element ) Ġreturn Ġnull ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġreturn ĠHEL PER S . first OrNull Ġ{ Ġit . type . is Instance ( e ) Ġ} Ġas ĠHelper < in ĠPy Element >? ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcurrent Offset ( e : ĠPsi Element ): ĠInt ? Ġ{ ĊĠĠĠ Ġval Ġvirtual File Ġ= Ġe . containing File ?. virtual File Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġselected Editor Ġ= ĠFile Editor Manager . getInstance ( e . project ). getSelected Editor ( virtual File ) Ġas ? ĠText Editor Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġreturn Ġselected Editor . editor . caret Model . offset ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis Element To Move Backward ( e : ĠPsi Element , Ġcurrent Offset : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( e Ġis ĠPsi WhiteSpace ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ( e Ġ! is ĠLeaf Element Ġ|| Ġe . start Offset Ġ< Ġcurrent Offset ) Ġreturn Ġfalse ĊĊĠĠĠ Ġval Ġelement Type Ġ= Ġe . elementType ĊĠĠĠ Ġreturn Ġelement Type Ġ== ĠPy Token Types . COMMA Ġ|| Ġelement Type Ġin ĠPy Token Types . CLOSE _ BR ACES ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmove Backward ( e : ĠPsi Element , Ġcurrent Offset : ĠInt ): ĠPsi Element ? Ġ{ ĊĠĠĠ Ġvar Ġresult Ġ= ĠPsi Tree Util . prev Leaf ( e ) ĊĠĠĠ Ġwhile Ġ( result Ġ!= Ġnull Ġ&& Ġis Element To Move Backward ( result , Ġcurrent Offset )) Ġ{ ĊĠĠĠĠĠ Ġresult Ġ= ĠPsi Tree Util . prev Leaf ( result ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġabstract Ġclass ĠHelper < T Ġ: ĠPy Element >( val Ġtype : ĠClass < T >) Ġ{ ĊĠĠĠ Ġfun Ġelement Info ( e : ĠT ): ĠString Ġ= Ġget Truncated Presentation ( e , Ġ 3 2 ) ĊĠĠĠ Ġfun Ġelement Tooltip ( e : ĠT ): ĠString Ġ= Ġget Truncated Presentation ( e , Ġ 9 6 ) ĊĊĠĠĠ Ġabstract Ġfun Ġget Presentation ( e : ĠT ): ĠString ĊĊĠĠĠ Ġprivate Ġfun Ġget Truncated Presentation ( e : ĠT , ĠmaxLength : ĠInt ) Ġ= ĠString Util . short en Text With El lipsis ( get Presentation ( e ), ĠmaxLength , Ġ 0 , Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠSimple Helper < T Ġ: ĠPy Element >( type : ĠClass < T >, Ġval Ġrepresentation : ĠString ) Ġ: ĠHelper < T >( type ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠT ) Ġ= Ġrepresentation ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠLambda Helper Ġ: ĠHelper < Py Lambda Expression >( Py Lambda Expression :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy Lambda Expression ) Ġ= Ġ" lambda Ġ${ e . parameter List . get Present able Text ( false )}" ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠExcept Helper Ġ: ĠHelper < Py Except Part >( Py Except Part :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy Except Part ): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġexcept Class Ġ= Ġe . except Class Ġ?: Ġreturn Ġ" except " ĊĠĠĠĠĠ Ġval Ġtarget Ġ= Ġe . target Ġ?: Ġreturn Ġ" except Ġ${ except Class . text }" ĊĊĠĠĠĠĠ Ġreturn Ġ" except Ġ${ except Class . text } Ġas Ġ${ target . text }" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠIf Helper Ġ: ĠHelper < Py If Part >( Py If Part :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy If Part ): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( e . is El if ) Ġ" elif " Ġelse Ġ" if " ĊĠĠĠĠĠ Ġval Ġcondition Ġ= Ġe . condition Ġ?: Ġreturn Ġprefix ĊĊĠĠĠĠĠ Ġreturn Ġ"$ prefix Ġ${ condition . text }" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠFor Helper Ġ: ĠHelper < Py For Part >( Py For Part :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy For Part ): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġparent Ġ= Ġe . parent ĊĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( parent Ġis ĠPy For Statement Ġ&& Ġparent . is Async ) Ġ" async Ġfor " Ġelse Ġ" for " ĊĊĠĠĠĠĠ Ġval Ġtarget Ġ= Ġe . target Ġ?: Ġreturn Ġprefix ĊĠĠĠĠĠ Ġval Ġsource Ġ= Ġe . source Ġ?: Ġreturn Ġprefix ĊĊĠĠĠĠĠ Ġreturn Ġ"$ prefix Ġ${ target . text } Ġin Ġ${ source . text }" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠWhile Helper Ġ: ĠHelper < Py While Part >( Py While Part :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy While Part ): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġcondition Ġ= Ġe . condition Ġ?: Ġreturn Ġ" while " ĊĊĠĠĠĠĠ Ġreturn Ġ" while Ġ${ condition . text }" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠWith Helper Ġ: ĠHelper < Py With Statement >( Py With Statement :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy With Statement ): ĠString Ġ{ ĊĠĠĠĠĠ Ġval ĠgetItem Presentation Ġ= Ġfun ( item : ĠPy With Item ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġitem . expression Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġitem . target Ġ?: Ġreturn Ġexpression . text ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ expression . text } Ġas Ġ${ target . text }" ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( e . is Async ) Ġ" async Ġwith Ġ" Ġelse Ġ" with Ġ" ĊĊĠĠĠĠĠ Ġreturn Ġe . with Items ĊĠĠĠĠĠĠĠ Ġ. or Empty () ĊĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠ Ġ. map ( getItem Presentation ) ĊĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠ Ġ. join ToString ( prefix Ġ= Ġprefix ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠClass Helper Ġ: ĠHelper < Py Class >( Py Class :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy Class ) Ġ= Ġe . name Ġ?: Ġ" class " ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠFunction Helper Ġ: ĠHelper < Py Function >( Py Function :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy Function ): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( e . is Async ) Ġ" async Ġ" Ġelse Ġ"" ĊĠĠĠĠĠ Ġval Ġname Ġ= Ġe . name Ġ?: Ġreturn Ġ" function " ĊĊĠĠĠĠĠ Ġreturn Ġ"$ prefix $ name ()" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġobject ĠKey Value Helper Ġ: ĠHelper < Py KeyValue Expression >( Py KeyValue Expression :: class . java ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Presentation ( e : ĠPy KeyValue Expression ): ĠString Ġ= Ġe . key . text Ġ?: Ġ" key " ĊĠ Ġ} Ċ } ĊĊ