package Ġcom . intellij . styled Components Ċ Ċ import Ġcom . intellij . lang . injection . Multi Host Injector Ċ import Ġcom . intellij . lang . injection . Multi Host Registrar Ċ import Ġcom . intellij . lang . javascript . psi . JS Expression Ċ import Ġcom . intellij . lang . javascript . psi . J SL iteral Expression Ċ import Ġcom . intellij . openapi . util . Pair Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . patterns . Platform Patterns Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi Language Injection Host Ċ import Ġcom . intellij . psi . impl . source . tree . inject ed . Multi Host Registrar Impl Ċ import Ġcom . intellij . psi . impl . source . tree . inject ed . Place Ċ import Ġcom . intellij . psi . xml . Xml AttributeValue Ċ import Ġorg . jetbrains . plugins . less . LESS Language Ċ Ċ const Ġval ĠCOMPONENT _ PRO PS _ PREFIX Ġ= Ġ" div Ġ{" Ċ const Ġval ĠCOMPONENT _ PRO PS _ SUFFIX Ġ= Ġ" }" Ċ Ċ class ĠStyled Components Injector Ġ: ĠMulti Host Injector Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstyled Pattern Ġ= Ġwith Name Starting With ( listOf (" styled ")) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbuiltin Places : ĠList < Place Info > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Info ( tagged Template ( Platform Patterns . or ( styled Pattern , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform Patterns . psi Element ( JS Expression :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with First Child ( styled Pattern ))), ĠCOMPONENT _ PRO PS _ PREFIX , ĠCOMPONENT _ PRO PS _ SUFFIX ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Info ( jsx Attribute (" css "), ĠCOMPONENT _ PRO PS _ PREFIX , ĠCOMPONENT _ PRO PS _ SUFFIX ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Info ( tagged Template ( with Reference Name (" extend ")), ĠCOMPONENT _ PRO PS _ PREFIX , ĠCOMPONENT _ PRO PS _ SUFFIX ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Info ( tagged Template ( call Expression (). with Child ( with Reference Name (" attrs ")) ), ĠCOMPONENT _ PRO PS _ PREFIX , ĠCOMPONENT _ PRO PS _ SUFFIX ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Info ( tagged Template (" css "), ĠCOMPONENT _ PRO PS _ PREFIX , ĠCOMPONENT _ PRO PS _ SUFFIX ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Info ( tagged Template (" inject Global ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Info ( tagged Template (" create Global Style ")), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlace Info ( tagged Template (" keyframes "), Ġ"@ keyframes Ġfoo Ġ{ ", Ġ" }") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġelements To Inject In (): ĠMutable List < out ĠClass < out ĠPsi Element >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable ListOf ( J SL iteral Expression :: class . java , ĠXml AttributeValue :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Language sTo Inject ( regist rar : ĠMulti Host Registrar , Ġinjection Host : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( injection Host Ġ! is ĠPsi Language Injection Host ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcustom Injection s Ġ= ĠCustom Injection s Configuration . instance ( injection Host . project ) ĊĠĠĠĠĠĠĠ Ġval Ġaccepted Pattern Ġ= Ġbuiltin Places . find Ġ{ Ġ( element Pattern ) Ġ-> Ġelement Pattern . accept s ( injection Host ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcustom Injection s . get Injection Places (). find Ġ{ Ġ( element Pattern ) Ġ-> Ġelement Pattern . accept s ( injection Host ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( accepted Pattern Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Places Ġ= Ġget Injection Places ( injection Host ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( string Places . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregist rar . start Inject ing ( LESS Language . INSTANCE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Places . forEach Indexed Ġ{ Ġindex , Ġ( prefix , Ġrange , Ġsuffix ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthe Prefix Ġ= Ġif Ġ( index Ġ== Ġ 0 ) Ġaccepted Pattern . prefix Ġ+ Ġprefix . or Empty () Ġelse Ġprefix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthe Suffix Ġ= Ġif Ġ( index Ġ== Ġstring Places . size Ġ- Ġ 1 ) Ġsuffix . or Empty () Ġ+ Ġaccepted Pattern . suffix Ġelse Ġsuffix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregist rar . add Place ( the Prefix , Ġthe Suffix , Ġinjection Host , Ġrange ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregist rar . done Inject ing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġget Injection Result ( regist rar ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinjected File Ġ= Ġresult . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinjected File Ranges Ġ= Ġresult . first . map Ġ{ ĠText Range ( it . range . start Offset , Ġit . range . end Offset Ġ- Ġit . suffix . length ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inject ed File Ranges . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinjected File . put UserData ( IN JECT ED _ FILE _ RAN GES _ KEY , Ġinjected File Ranges ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Injection Result ( regist rar : ĠMulti Host Registrar ): ĠPair < Place , ĠPsi File >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġ( regist rar Ġas ĠMulti Host Registrar Impl ). result ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( result Ġ== Ġnull Ġ|| Ġresult . isEmpty ()) Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġresult [ result . size Ġ- Ġ 1 ] ĊĠĠĠ Ġ} Ċ } Ċ