// Ġ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 . psi . impl . search Ċ Ċ import Ġcom . intellij . lang . Language Ċ import Ġcom . intellij . lang . injection . Inject ed Language Manager Ċ import Ġcom . intellij . model . search . impl . Language Info Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . util . Pair Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . openapi . util . component 1 Ċ import Ġcom . intellij . openapi . util . component 2 Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . util . Smart List Ċ import Ġcom . intellij . util . text . String Searcher Ċ import Ġg nu . tro ve . TH ash Set Ċ Ċ internal Ġclass ĠInjection Aware Occurrence Processor ( ĊĠ Ġprivate Ġval Ġprogress : ĠProgress Indicator , ĊĠ Ġprivate Ġval Ġprocessors : ĠRequest Processors , ĊĠ Ġprivate Ġval Ġmanager : ĠInject ed Language Manager , ĊĠ Ġprivate Ġval Ġsearch er : ĠString Searcher Ċ ) Ġ: ĠOcc urrence Processor Ġ{ ĊĊĠ Ġprivate Ġval Ġprocessed Injection s Ġ= ĠT HashSet < Psi Element >() ĊĊĠ Ġoverride Ġfun Ġinvoke ( occ urrence : ĠLeaf Occurrence ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ( processors . injection Processors . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġprocess Host ( occ urrence ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠTODO Ġfind Ġinjection s Ġof Ġneeded Ġlanguages Ġonly , Ġneeded Ġlanguages Ġare Ġthe Ġkey Ġset Ġof Ġlanguage Injection Processors Ġmap ĊĠĠĠ Ġval Ġinjected : ĠPsi Element ? Ġ= Ġfind Injection At Offset ( occ urrence ) ĊĠĠĠ Ġif Ġ( inject ed Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġprocess Host ( occ urrence ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ(! processed Injection s . add ( inject ed )) Ġ{ ĊĠĠĠĠĠ Ġ// ĠThe Ġsame Ġinjection Ġmight Ġcontain Ġseveral Ġoccurrences Ġat Ġdifferent Ġoffsets , Ġwe Ġdon 't Ġknow Ġabout Ġthem Ġbefore hand . ĊĠĠĠĠĠ Ġ// ĠSince Ġ` Low Level Search Util . getText Occ urrences In Scope ` Ġis Ġused ĊĠĠĠĠĠ Ġ// Ġits Ġpossible Ġto Ġend Ġup Ġin Ġthe Ġsituation Ġwhen ĠN Ġoccurrences Ġin Ġa Ġsingle Ġinjection Ġare Ġprocessed ĠN Ġtimes Ġeach . ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġinjection Processors : ĠCollection < Occurrence Processor > Ġ= Ġget Language Processors ( inject ed . language ) ĊĠĠĠ Ġif Ġ( injection Processors . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġoffsets Ġ= ĠLow Level Search Util . getText Occ urrences In Scope ( inject ed , Ġsearch er ) ĊĠĠĠ Ġval Ġpattern Length Ġ= Ġsearch er . pattern Length ĊĠĠĠ Ġreturn Ġprocess Offsets ( inject ed , Ġoffsets , Ġpattern Length , Ġprogress , Ġinjection Processors . compound ( progress )) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Language Processors ( injection Language : ĠLanguage ): ĠCollection < Occurrence Processor > Ġ{ ĊĠĠĠ Ġval Ġinjection Processors Ġ= Ġprocessors . injection Processors ĊĠĠĠ Ġval Ġresult Ġ= ĠSmart List < Occurrence Processor >() ĊĠĠĠ Ġfor Ġ(( language Info , Ġprocessors ) Ġin Ġinjection Processors ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( language Info Ġ== ĠLanguage Info . No Language Ġ|| ĊĠĠĠĠĠĠĠĠĠ Ġlanguage Info Ġis ĠLanguage Info . In Language Ġ&& Ġlanguage Info . matcher . matches Language ( injection Language )) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Ġ+= Ġprocessors ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind Injection At Offset ( occ urrence : ĠLeaf Occurrence ): ĠPsi Element ? Ġ{ ĊĠĠĠ Ġfor Ġ(( current Element , Ġcurrent Offset ) Ġin Ġoccurrence . elements Up ()) Ġ{ ĊĠĠĠĠĠ Ġprogress . check Canceled () ĊĠĠĠĠĠ Ġval Ġinjected Files : ĠList < Pair < Psi Element , ĠText Range >> Ġ= Ġmanager . get Inject ed Psi Files ( current Element ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠ Ġfor Ġ(( inject ed , Ġrange ) Ġin Ġinjected Files ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( range . contains Range ( current Offset , Ġcurrent Offset Ġ+ Ġsearch er . pattern Length )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġinjected ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġprocess Host ( occ urrence : ĠLeaf Occurrence ): ĠBoolean Ġ{ ĊĠĠĠ Ġ// ĠFeed Ġhost Ġelement Ġinto Ġthe Ġprocessors Ġwhich Ġdoesn 't Ġwant Ġinjection s . ĊĠĠĠ Ġreturn Ġprocessors . host Processors . run Processors ( progress , Ġoccurrence ) ĊĠ Ġ} Ċ } Ċ