рдореИрдВ рд╡реЗрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, PHP рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдФрд░ рдХреЛрд╣рдирд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдкрдиреА рд░рд╛рдп рдореЗрдВ, PhpStorm рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдЬрдм рдмрдбрд╝реА рдФрд░ рдмрд╣реБрдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдореИрдВ рд╣рдореЗрд╢рд╛ рдЙрджрд╛рд╕ рд░рд╣рддрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реВрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреЗрдбрд╝ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ (рдирд┐рдпрдВрддреНрд░рдХ рдпрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ) рдХреА рдЦреЛрдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред Ctrl + Shift + N, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдореЗрд╢рд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕реЗ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддрд╛рдХрд┐ рдореИрдВ Kokhanovsky View :: factory () рдХреЛ рд╕реАрдзреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд┐рдП рдЧрдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдирд╛рдо рд╕реЗ рдКрдкрд░ Ctrl + B (рдпрд╛ Ctrl + Click) рджрдмрд╛рдХрд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░ рд╕рдХреВрдБ:

рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ PhpStorm рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдореЗрд░реЗ рдХрд╛рдо рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдПрдЧрд╛ рдФрд░ рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдЧрд╛ред
рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рддреИрдпрд╛рд░реА
рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
-
рдЗрдВрдЯреЗрд▓реАрдЬ рдЖрдИрдбрд┐рдпрд╛ рдХрдореНрдпреБрдирд┐рдЯреА рдПрдбрд┐рд╢рди рдпрд╛ рдЕрд▓реНрдЯреАрдореЗрдЯред
-
JDK (рдЖрдкрдХреЛ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ PhpStorm рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдкреНрд▓рдЧрдЗрди рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЬрд╛рд╡рд╛ 1.6 рдерд╛);
рдЪреВрдВрдХрд┐ IDEA
рдкреНрд▓рдЧрдЗрдиреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк
Intellij IDEA рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдПрдХ рдкреНрд░рддрд┐ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ :)
рдЙрдкрдХрд░рдг рд╕реЗрдЯрдЕрдк:
рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛ рдПрд╕рдбреАрдХреЗ рдФрд░ рдЗрдВрдЯреЗрд▓реАрдЬ рдЖрдИрдбреАрдИрдП рдкреНрд▓рдЧрд┐рди рдПрд╕рдбреАрдХреЗ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- IntelliJ IDEA рд▓реЙрдиреНрдЪ
- рдореЗрдиреВ рдЖрдЗрдЯрдо рдЦреЛрд▓реЗрдВ рдлрд╝рд╛рдЗрд▓ | рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛
- рдПрд╕рдбреАрдХреЗ рдЯреИрдм рдЪреБрдиреЗрдВ, рдкреНрд▓рд╕ рд╕рд╛рдЗрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдЬреЗрдбрдбреАрдХреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЪреБрдиреЗрдВ
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреИрдм рдЪреБрдиреЗрдВ
- рдирдП рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдлрд┐рд░ IntelliJ IDEA рдкреНрд▓рдЧ рдЗрди рдПрд╕рдбреАрдХреЗ рдФрд░ рдЦреБрд▓рдиреЗ рд╡рд╛рд▓реЗ рдореЗрдиреВ рдореЗрдВ - PhpStorm рдХреЗ рд▓рд┐рдП рдкрде рдЪреБрдиреЗрдВ (рдпрд╣ IntelliJ IDEA рдХреЗ рд▓рд┐рдП рднреА рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рд╣рдо PhstStorm рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЛ рдбреАрдмрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ)

рдЖрдкрдХреЛ рдПрдХ рд░рди / рдбреАрдмрдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк PhpStorm рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЛ рдбреАрдмрдЧ рдХрд░ рд╕рдХреЗрдВред
рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
рдлрд╝рд╛рдЗрд▓ | рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛: "рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдмрдирд╛рдПрдВ" рдЪреБрдиреЗрдВ, рдПрдХ рдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ, рдкреНрд▓рдЧрдЗрди рдореЙрдбреНрдпреВрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЙрд╕ рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдерд╛, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдВред
Pathos рдХреЙрдкреАрд░рд╛рдЗрдЯ рдХреЛ plugin.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ (рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдХреБрдЫ рднреА рдирд╣реАрдВ!)
<name>KohanaStorm</name> <description>KohanaStorm framework integration for PhpStorm<br/> Authors: zenden2k@gmail.com </description> <version>0.1</version> <vendor url="http://zenden.ws/" email="zenden2k@gmail.com">zenden.ws</vendor> <idea-version since-build="8000"/>
рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЛ рди рдХреЗрд╡рд▓ IDEA рдХреЗ рддрд╣рдд рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ PhpStorm рдореЗрдВ рднреА рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВред xml:
<depends>com.intellij.modules.platform</depends>
рдореВрд▓ рдмрд╛рддреЗрдВ
рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП, IntelliJ IDEA рдПрдХ PSI рдЯреНрд░реА рдмрдирд╛рддрд╛ рд╣реИред
рдПрдХ рдкреАрдПрд╕рдЖрдИ (рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдЗрдВрдЯрд░рдлреЗрд╕) рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреА рд╣реИред PsiFile рд╕рднреА PSI рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЕрднрд┐рднрд╛рд╡рдХ рд╡рд░реНрдЧ рд╣реИ, рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЛ PsiFile рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PsiJavaFile рд╡рд░реНрдЧ рдПрдХ рдЬрд╛рд╡рд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, XmlFile рд╡рд░реНрдЧ рдПрдХ XML рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред PSI рдЯреНрд░реА рдХреЛ PSI рд╡реНрдпреВрдЕрд░ рдЯреВрд▓ (рдЯреВрд▓реНрд╕ -> View PSI рд╕реНрдЯреНрд░рдХреНрдЪрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдкреНрд▓рдЧрдЗрди рд╡рд┐рдХрд╛рд╕
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХрдВрдЯреНрд░реЛрд▓рд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ Ctrl + B (рдпрд╛ Ctrl + рдХреНрд▓рд┐рдХ) рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ :: рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реАрдзреЗ ('template_name')ред

рдпреЛрдЬрдирд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ?
рд▓рд┐рдВрдХ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА 3 рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
PsiReference - рдПрдХ рд╡рд╕реНрддреБ рдЬреЛ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ рд╡рд╣ рдПрдХ рд▓рд┐рдВрдХ рд╣реИред рдЗрд╕рдореЗрдВ рдореВрд▓ рддрддреНрд╡ рдореЗрдВ рд╕реНрдерд╛рди рдкрд░ рдбреЗрдЯрд╛ (рдкрд╛рда рдореЗрдВ рд╕реНрдерд┐рддрд┐) рдФрд░ рдбреЗрдЯрд╛ (рд▓рд┐рдВрдХ рдкрд╛рда) рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдмрд╛рдж рдореЗрдВ "рд▓рд┐рдВрдХ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ"ред рд▓рд┐рдВрдХ рд╕реНрд╡рдпрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рдЙрд╕рдХрд╛ рд╕рдВрдХрд▓реНрдк () рд╡рд┐рдзрд┐ рдЙрд╕ рддрддреНрд╡ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡рд╣ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
PsiReferenceProvider - рдПрдХ рд╡рд░реНрдЧ рдЬреЛ PSI рдкреЗрдбрд╝ рдХреЗ рдПрдХ рддрддреНрд╡ рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдВрдХ рдкрд╛рддрд╛ рд╣реИред рдпрд╣ PsiReference рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИред
PsiReferenceContributor - рдПрдХ рд╡рд░реНрдЧ рдЬреЛ PSI рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдорд╛рд░реЗ PsiReferenceProvider рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдЧрд╛ред
1. рдПрдХ рд╕рдВрджрд░реНрдн рд╡рд░реНрдЧ MyReference рдмрдирд╛рдПрдВ рдЬреЛ PsiReference рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИ
public class MyReference implements PsiReference { @Override public String toString() { } public PsiElement getElement() { } public TextRange getRangeInElement() { return textRange; } public PsiElement handleElementRename(String newElementName) } public PsiElement bindToElement(PsiElement element) throws IncorrectOperationException { } public boolean isReferenceTo(PsiElement element) { return resolve() == element; } public Object[] getVariants() { return new Object[0]; } public boolean isSoft() { return false; } @Nullable public PsiElement resolve() { } @Override public String getCanonicalText() { } }
рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рд╕рдВрдХрд▓реНрдк () рд╡рд┐рдзрд┐ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рдореЗрдВ, рд╣рдореЗрдВ рдЙрди рддрддреНрд╡реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдВрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо php рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрд╕рдХреЗ рдКрдкрд░ рд╕реНрдерд┐рдд psi- рдкреЗрдбрд╝ рдпрд╛ рднрд╛рд╖рд╛ рдореЙрдбрд▓ рдХрд╛ рдХреЛрдИ рднреА рддрддреНрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд░реНрдЧ, рд╡рд┐рдзрд┐, рдЪрд░, рдЖрджрд┐ред
2. PsiReferenceProvider рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдПрдХ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ рдФрд░ getReferencesByElement рдореЗрдердб рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:
public class MyPsiReferenceProvider extends PsiReferenceProvider { @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull final ProcessingContext context) { } }
GetReferencesByElement рд╡рд┐рдзрд┐ рд▓рд┐рдВрдХ (
PsiReference ) рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рд▓реМрдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ
PsiElement рддрддреНрд╡ рдореЗрдВ
рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИ ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрдИ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдВрдХ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд textRange (рдЖрд░рдВрднрд┐рдХ рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ psi рддрддреНрд╡ рдХреЗ рдкрд╛рда рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдВрдХ рдХреЗ рдЕрдВрдд рд╕реВрдЪрдХрд╛рдВрдХ) рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ JetBrains рдиреЗ рднрд╛рд╖рд╛ API (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, PHP) рдореЗрдВ рдкреНрд▓рдЧ-рдЗрди рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдЦреЛрд▓реА рдереАред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд░рд┐рдлреНрд▓реЗрдХреНрд╢рди рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрдпрд╛ред рд╣рдо рддрддреНрд╡ рд╡рд╕реНрддреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ? рдпрд╣ StringLiteralExpressionImpl рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull final ProcessingContext context) { Project project = element.getProject(); PropertiesComponent properties = PropertiesComponent.getInstance(project); String kohanaAppDir = properties.getValue("kohanaAppPath", "application/"); VirtualFile appDir = project.getBaseDir().findFileByRelativePath(kohanaAppDir); if (appDir == null) { return PsiReference.EMPTY_ARRAY; } String className = element.getClass().getName(); Class elementClass = element.getClass();
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рди рдХреЗрд╡рд▓ рдПрдХ PHP рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдкрдХрдбрд╝реЗ рдЧрдП рдереЗ, рдмрд▓реНрдХрд┐ рджреЗрдЦреЗрдВ :: factory () рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ, рд╣рдо рдлрд┐рд░ рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдЬрд╛рджреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
public static boolean isViewFactoryCall(PsiElement element) { PsiElement prevEl = element.getParent(); String elClassName; if (prevEl != null) { elClassName = prevEl.getClass().getName(); } prevEl = prevEl.getParent(); if (prevEl != null) { elClassName = prevEl.getClass().getName(); if (elClassName.endsWith("MethodReferenceImpl")) { try { Method phpPsiElementGetName = prevEl.getClass().getMethod("getName"); String name = (String) phpPsiElementGetName.invoke(prevEl); if (name.toLowerCase().equals("factory")) { Method getClassReference = prevEl.getClass().getMethod("getClassReference"); Object classRef = getClassReference.invoke(prevEl); PrintElementClassDescription(classRef); String phpClassName = (String) phpPsiElementGetName.invoke(classRef); if (phpClassName.toLowerCase().equals("view")) { return true; } } } catch (Exception ex) { } } } return false; }
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЪрд┐рддреНрд░:

рдпрд╣ рдХреЛрдб рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рддрддреНрд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдореЗрдердб рдХреЙрд▓ (рдореЗрдерд┐рдбреЗрдлрд░реЗрдВрд╕) рд╣реИ, рдЬрд┐рд╕реЗ "рдлрд╝реИрдХреНрдЯрд░реА" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ "рд╡реНрдпреВ" рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред
3. PsiReferenceContributor рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:
@Override public void registerReferenceProviders(PsiReferenceRegistrar registrar) { registrar.registerReferenceProvider(StandardPatterns.instanceOf(PsiElement.class), provider); }
рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдЬреЛ рдХреБрдЫ рднреА рдХрд░рддреА рд╣реИ рд╡рд╣ рд╣рдорд╛рд░реЗ PsiReferenceProvider рдХреЛ рдПрдХ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреА рд╣реИ, рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ PsiElement рдХреЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ (рдЙрдкрд╡рд░реНрдЧ) рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рддрддреНрд╡, рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ XML рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдореВрд▓реНрдп, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реЛрдЧрд╛:
registrar.registerReferenceProvider(StandardPatterns.instanceOf(XmlAttributeValue.class), provider);
рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ JetBrains рдиреЗ рднрд╛рд╖рд╛ API (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, PHP) рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рдЦреЛрд▓реА рд╣реИ, рд╣рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЗрд╕ рддрддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдмрд┐рд▓реНрдХреБрд▓ рд╕рднреА PsiElement рддрддреНрд╡реЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреА рд╣реЛрдЧреАред
4. plugin.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ:
<extensions defaultExtensionNs="com.intellij"> <psi.referenceContributor implementation="MyPsiReferenceContributor"/> </extensions>
рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдкреГрд╖реНрда рдмрдирд╛рдПрдБ

Phpstorm рдореЗрдВ рджреЛ рддрд░рд╣ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрддреА рд╣реИрдВ- рдкреНрд░реЛрдЬреЗрдХреНрдЯ-рд░рд┐рд▓реЗрдЯреЗрдб рдФрд░ рдЧреНрд▓реЛрдмрд▓ред рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧ рдкреГрд╖реНрда рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрд╣рдирд╕реНрдЯреЙрд░реНрдорд╕реИрдЯрд┐рдВрдЧреНрд╕рдкреЗрдЬ рдкреЗрдЬ рдмрдирд╛рдПрдВ рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред GetDisplayName рд╡рд┐рдзрд┐ рдХреЛ рдЯреИрдм рдХрд╛ рдирд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ PhpStorm рд╕реЗрдЯрд┐рдВрдЧ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред CreateComponent рдкрджреНрдзрддрд┐ рдХреЛ рд╣рдорд╛рд░рд╛ рдлрд╝реЙрд░реНрдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдореЗрдВ рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред
public class KohanaStormSettingsPage implements Configurable { private JTextField appPathTextField; private JCheckBox enableKohanaStorm; private JTextField secretKeyTextField; Project project; public KohanaStormSettingsPage(Project project) { this.project = project; } @Nls @Override public String getDisplayName() { return "KohanaStorm"; } @Override public JComponent createComponent() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout (panel, BoxLayout.Y_AXIS)); JPanel panel1 = new JPanel(); panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS)); enableKohanaStorm = new JCheckBox("Enable Kohana Storm for this project"); ... PropertiesComponent properties = PropertiesComponent.getInstance(project); appPathTextField.setText(properties.getValue("kohanaAppPath", DefaultSettings.kohanaAppPath)); return panel; } @Override public void apply() throws ConfigurationException { PropertiesComponent properties = PropertiesComponent.getInstance(project); properties.setValue("kohanaAppPath", appPathTextField.getText()); properties.setValue("enableKohanaStorm", String.valueOf(enableKohanaStorm.isSelected()) ); properties.setValue("kohanaStormSecretKey", secretKeyTextField.getText()); } @Override public boolean isModified() { return true; } @Override public String getHelpTopic() { return null; } @Override public void disposeUIResources() { } @Override public void reset() { } }
рд╣рдо plugin.xml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдкрдиреА рд╕реЗрдЯрд┐рдВрдЧ рдкреЗрдЬ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ:
<extensions defaultExtensionNs="com.intellij"> <psi.referenceContributor implementation="MyPsiReferenceContributor"/> <projectConfigurable implementation="KohanaStormSettingsPage"></projectConfigurable > </extensions>
(рдпрджрд┐ рд╣рдорд╛рд░реА рд╕реЗрдЯрд┐рдВрдЧ рдкреГрд╖реНрда рд╡реИрд╢реНрд╡рд┐рдХ рдереА, рддреЛ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рднрдВрдбрд╛рд░рдг
рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЯреНрд░рд┐рдХреА рддрд░реАрдХрд╛ рд╣реИ PropertiesComponent рдХреНрд▓рд╛рд╕ рдФрд░ setValue рдФрд░ getValue рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ
рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╡рд┐рдзрд┐ рд╡рд░реНрдгрд┐рдд рд╣реИред
рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрдирд╛
рдкреНрд▓рдЧрдЗрди рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
рдирд┐рд░реНрдорд╛рдг -> рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рддреИрдпрд╛рд░ рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рд░ рдирд╛рдордХ рдПрдХ рдлрд╛рдЗрд▓ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдЬрд┐рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдк рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ phpstorm рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдлрд╝рд╛рдЗрд▓-> рд╕реЗрдЯрд┐рдВрдЧреНрд╕-> рдкреНрд▓рдЧрдЗрдиреНрд╕-> рдбрд┐рд╕реНрдХ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ)
рдбрд╛рдЙрдирд▓реЛрдб рдкреНрд▓рдЧрдЗрди рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб