// Ġ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 Ġorg . jetbrains . idea . dev kit . util Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Smart Pointer Manager Ċ import Ġcom . intellij . psi . search . Psi Search Helper Ċ import Ġcom . intellij . psi . search . Usage Search Context Ċ import Ġcom . intellij . psi . util . Class Util Ċ import Ġcom . intellij . psi . xml . Xml Tag Ċ import Ġcom . intellij . util . Smart List Ċ import Ġcom . intellij . util . xml . Dom Util Ċ import Ġorg . jetbrains . idea . dev kit . dom . Extension Ċ import Ġorg . jetbrains . idea . dev kit . dom . Extension Point Ċ Ċ fun Ġlocate Extensions By Psi Class ( psi Class : ĠPsi Class ): ĠList < Extension Candidate > Ġ{ ĊĠ Ġreturn Ġfind Extensions By ClassName ( psi Class . project , ĠClass Util . get JVM ClassName ( psi Class ) Ġ?: Ġreturn Ġempty List ()) Ċ } Ċ Ċ fun Ġlocate Extensions By Extension Point ( extension Point : ĠExtension Point ): ĠList < Extension Candidate > Ġ{ ĊĠ Ġreturn ĠExtension By Extension Point Locator ( extension Point . xml Tag . project , Ġextension Point , Ġnull ). find Candidates () Ċ } Ċ Ċ fun Ġlocate Extensions By Extension Point And Id ( extension Point : ĠExtension Point , Ġextension Id : ĠString ): ĠExtension Locator Ġ{ ĊĠ Ġreturn ĠExtension By Extension Point Locator ( extension Point . xml Tag . project , Ġextension Point , Ġextension Id ) Ċ } Ċ Ċ private Ġfun Ġprocess Extension Declarations ( name : ĠString , Ġproject : ĠProject , Ġstrict Match : ĠBoolean , Ġcallback : Ġ( Extension , ĠXml Tag ) Ġ-> ĠBoolean ) Ġ{ ĊĠ Ġval Ġscope Ġ= ĠPlugin Related Loc ators Utils . getC andidates Scope ( project ) ĊĠ ĠPsi Search Helper . getInstance ( project ). process Elements With Word ( ĊĠĠĠ Ġ{ Ġelement , Ġoffset In Element Ġ-> ĊĠĠĠĠĠ Ġif Ġ( element Ġ! is ĠXml Tag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ process Elements With Word Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġelement At Offset Ġ= Ġelement . findElement At ( offset In Element ) ĊĠĠĠĠĠ Ġif Ġ( elementAt Offset Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ process Elements With Word Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġfound Text Ġ= Ġelement At Offset . text ĊĠĠĠĠĠ Ġif Ġ(! strict Match Ġ&& Ġ! StringUtil . contains ( found Text , Ġname )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ process Elements With Word Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( strict Match Ġ&& Ġ! StringUtil . equals ( found Text , Ġname )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn @ process Elements With Word Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġval Ġdom Ġ= ĠDom Util . get Dom Element ( element ) Ġas ? ĠExtension Ġ?: Ġreturn @ process Elements With Word Ġtrue ĊĠĠĠĠĠ Ġcallback ( dom , Ġelement ) ĊĠĠĠ Ġ}, Ġscope , Ġname , ĠUsage Search Context . IN _ FOREIGN _ L ANGU AGES , Ġtrue Ġ/* Ġcase - sensitive Ġ*/) Ċ } Ċ Ċ private Ġfun Ġfind Extensions By ClassName ( project : ĠProject , ĠclassName : ĠString ): ĠList < Extension Candidate > Ġ{ ĊĠ Ġval Ġresult Ġ= ĠSmart List < Extension Candidate >() ĊĠ Ġval Ġsmart Pointer Manager Ġby Ġlazy Ġ{ ĠSmart Pointer Manager . getInstance ( project ) Ġ} ĊĠ Ġprocess Extensions By ClassName ( project , ĠclassName ) Ġ{ Ġtag , Ġ_ Ġ-> ĊĠĠĠ Ġresult . add ( Extension Candidate ( smart Pointer Manager . create Smart Psi Element Pointer ( tag ))) ĊĠĠĠ Ġtrue ĊĠ Ġ} ĊĠ Ġreturn Ġresult Ċ } Ċ Ċ internal Ġinline Ġfun Ġprocess Extensions By ClassName ( project : ĠProject , ĠclassName : ĠString , Ġcross inline Ġprocessor : Ġ( Xml Tag , ĠExtension Point ) Ġ-> ĠBoolean ) Ġ{ ĊĠ Ġprocess Extension Declarations ( className , Ġproject , Ġtrue ) Ġ{ Ġextension , Ġtag Ġ-> ĊĠĠĠ Ġextension . extension Point ?. let Ġ{ Ġprocessor ( tag , Ġit ) Ġ} Ġ?: Ġtrue ĊĠ Ġ} Ċ } Ċ Ċ internal Ġclass ĠExtension By Extension Point Locator ( private Ġval Ġproject : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension Point : ĠExtension Point , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġextension Id : ĠString ?) Ġ: ĠExtension Locator () Ġ{ ĊĠ Ġprivate Ġval Ġpoint QualifiedName Ġ= Ġextension Point . effective QualifiedName ĊĊĠ Ġprivate Ġfun Ġprocess Candidates ( processor : Ġ( Xml Tag ) Ġ-> ĠBoolean ) Ġ{ ĊĠĠĠ Ġ// ĠWe Ġmust Ġsearch Ġfor Ġthe Ġlast Ġpart Ġof ĠEP Ġname , Ġbecause Ġfor Ġinstance Ġ' com . intellij . console . fold ing ' Ġextension ĊĠĠĠ Ġ// Ġmay Ġbe Ġdeclared Ġas Ġ< extensions Ġdefault Extension Ns =" com ">< intellij . console . fold ing Ġ... ĊĠĠĠ Ġval Ġep Name To Search Ġ= ĠString Util . substring After Last ( point QualifiedName , Ġ". ") Ġ?: Ġreturn ĊĠĠĠ Ġprocess Extension Declarations ( ep Name To Search , Ġproject , Ġfalse Ġ/* Ġnot Ġstrict Ġmatch Ġ*/) Ġ{ Ġextension , Ġtag Ġ-> ĊĠĠĠĠĠ Ġval Ġep Ġ= Ġextension . extension Point Ġ?: Ġreturn @ process Extension Declarations Ġtrue ĊĠĠĠĠĠ Ġif Ġ( ep . effective QualifiedName Ġ== Ġpoint QualifiedName Ġ&& Ġ( extension Id Ġ== Ġnull Ġ|| Ġextension Id Ġ== Ġextension . id . stringValue )) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġstop Ġafter Ġthe Ġfirst Ġfound Ġcandidate Ġif ĠID Ġis Ġspecified ĊĠĠĠĠĠĠĠ Ġprocessor ( tag ) Ġ&& Ġextension Id Ġ== Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġfind Candidates (): ĠList < Extension Candidate > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= ĠSmart List < Extension Candidate >() ĊĠĠĠ Ġval Ġsmart Pointer Manager Ġby Ġlazy Ġ{ ĠSmart Pointer Manager . getInstance ( project ) Ġ} ĊĠĠĠ Ġprocess Candidates Ġ{ ĊĠĠĠĠĠ Ġresult . add ( Extension Candidate ( smart Pointer Manager . create Smart Psi Element Pointer ( it ))) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠExtension Locator Ġ{ ĊĠ Ġabstract Ġfun Ġfind Candidates (): ĠList < Extension Candidate > Ċ }