рд╡реЗрдмрд╕реНрдЯреЙрд░реНрдо рдкреНрд▓рдЧрдЗрди рдФрд░ рдСрдЯреЛ-рдРрдб-рдСрди

рдореИрдВ рдЖрдИрдбреАрдП рдЖрдИрдбреАрдИ рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдЧреБрдо рдСрдЯреЛ-рдРрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, WebStorm рдпрд╛ PhpStrom рдХреЗ рд▓рд┐рдПред

рд╣рдореЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореЛрд░реНрдЪреЗ рдкрд░ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реАред рдФрд░ рдЬрдм рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдкрде рдХреЛ рд╣рд╛рдереЛрдВ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрде рдХрд╛ рдСрдЯреЛ-рдкреВрд░рд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред


рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЖрдЗрдбрд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░ рджреА рдФрд░ zenden2k habrayuzer рджреНрд╡рд╛рд░рд╛ рд▓реЗрдЦ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ kohana рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереАред рдореЗрд░реЗ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬрд░реВрд░ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд▓рд┐рдВрдХ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрд╛ рдерд╛ред
рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрддреЗ рд╕рдордп, рдореИрдВ рдЖрдЗрдбрд┐рдпрд╛ рдХрдореНрдпреБрдирд┐рдЯреА рдПрдбрд┐рд╢рди рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ PSI рд╕рдВрд░рдЪрдирд╛ рдХреА рдХрдореА рдХреА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛ рдЬреЛ рд▓рд┐рдВрдХ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрддреНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореБрдЭреЗ рдЖрдЗрдбрд┐рдпрд╛ рдЕрд▓реНрдЯреАрдореЗрдЯ рдИрдПрдкреА рд▓рдЧрд╛рдирд╛ рдерд╛ред Idea UT рдореЗрдВ, рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧ-рдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдлрд┐рд░ PSI рд╡реНрдпреВрдЕрд░ (рдЙрдкрдХрд░рдг -> View PSI рд╕рдВрд░рдЪрдирд╛) рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП PSI рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
рдЫрд╡рд┐

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЪреВрдВрдХрд┐ JetBrains рдиреЗ PHP рдФрд░ JS рдХреЗ рд▓рд┐рдП рдУрдкрдиреИрдкреА рдХреЛ рд░реЛрд▓ рдХрд┐рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ PSI JSLiteralExpression рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдореЗрд░рд╛ PsiReferenceContributor рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рд╢реБрд░реВ рд╣реБрдЖ:
RequirejsPsiReferenceContributor.java
package requirejs; import com.intellij.lang.javascript.psi.JSLiteralExpression; import com.intellij.patterns.StandardPatterns; import com.intellij.psi.PsiReferenceContributor; import com.intellij.psi.PsiReferenceRegistrar; public class RequirejsPsiReferenceContributor extends PsiReferenceContributor { @Override public void registerReferenceProviders(PsiReferenceRegistrar psiReferenceRegistrar) { RequirejsPsiReferenceProvider provider = new RequirejsPsiReferenceProvider(); psiReferenceRegistrar.registerReferenceProvider(StandardPatterns.instanceOf(JSLiteralExpression.class), provider); } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, PsiElement.class рдХреЗ рдмрдЬрд╛рдп, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА JSLiteralExpression.class рдХрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддрд╛рдХрд┐ рдореБрдЭреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рди рдХрд░рдирд╛ рдкрдбрд╝реЗред
рд▓реЗрдХрд┐рди рдУрдкрдиреИрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд░ рдЬрд╛рдПрдВ, рд╡рд╣рд╛рдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЪреБрдиреЗрдВред рд╣рдо рдХреЗрдВрджреНрд░реАрдп рдХреЙрд▓рдо рдХреЗ рдКрдкрд░ + рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╛рд╡рд╛ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЦреЛрд▓реЗ рдЧрдП рдлрд╝рд╛рдЗрд▓ рдЪрдпрди рд╡рд┐рдВрдбреЛ рдореЗрдВ "/path_to_webstrom/plugins/JavaScriptLanguage/lib/javascript-openapi.jar" рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ:
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
рдЫрд╡рд┐

рдлрд┐рд░ рд╣рдо рдореЙрдбреНрдпреВрд▓ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдирд┐рд░реНрднрд░рддрд╛ рдЯреИрдм рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдФрд░ рд╡рд╣рд╛рдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рдУрдкрдиреИрдкреА рдХреЗ рдЦрд┐рд▓рд╛рдл, рдмрд╢рд░реНрддреЗ рдХрд┐ рд╕реНрдХреЛрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ
рдЫрд╡рд┐

рдЗрди рдЬреЛрдбрд╝рддреЛрдбрд╝реЛрдВ рдХреЗ рдмрд╛рдж, IDE рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдирд╛рдо рдХреЛ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдУрдкрдиреИрдкреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

PsiReferenceProvider рдХреЛ рдмрджрд▓рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реБрдП, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рд╛:
RequirejsPsiReferenceProvider.java
 package requirejs; import com.intellij.ide.util.PropertiesComponent; import com.intellij.lang.javascript.psi.JSCallExpression; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReferenceProvider; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; public class RequirejsPsiReferenceProvider extends PsiReferenceProvider { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { Project project = psiElement.getProject(); PropertiesComponent properties = PropertiesComponent.getInstance(project); String webDirPrefString = properties.getValue("web_dir", "webfront/web"); VirtualFile webDir = project.getBaseDir().findFileByRelativePath(webDirPrefString); if (webDir == null) { return PsiReference.EMPTY_ARRAY; } try { String path = psiElement.getText(); if (isRequireCall(psiElement)) { PsiReference ref = new RequirejsReference(psiElement, new TextRange(1, path.length() - 1), project, webDir); return new PsiReference[] {ref}; } } catch (Exception ignored) {} return new PsiReference[0]; } public static boolean isRequireCall(PsiElement element) { PsiElement prevEl = element.getParent(); if (prevEl != null) { prevEl = prevEl.getParent(); } if (prevEl != null) { if (prevEl instanceof JSCallExpression) { try { if (prevEl.getChildren().length > 1) { if (prevEl.getChildren()[0].getText().toLowerCase().equals("require")) { return true; } } } catch (Exception ignored) {} } } return false; } } 

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдФрд░ рдпрд╣рд╛рдБ рдореБрдЭреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд▓рдЧ рдорд┐рд▓рд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рдореБрдЭреЗ "рд╕рдВрд╕рд╛рдзрди рд░реВрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереА, рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдкрде рд▓реЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ zenden2k рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреГрд╖реНрда рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛ред
рд╣рдореЗрдВ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдерд╛ред рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдлрд╝рд╛рдЗрд▓ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдлрд╝рд╛рдЗрдирд▓рдмреАрдмреЗрд▓рд░реЗрдЯрд┐рд╡рдкреИрде рдкрджреНрдзрддрд┐ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкрде рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддреА рд╣реИ рдФрд░ рдпрд╣ рджреЗрдЦрддреА рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рджрд┐рдП рдЧрдП рдкрде рдкрд░ рдореМрдЬреВрдж рд╣реИ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдЙрд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓рдлрд╝рд╛рдЗрд▓ рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рддреЛ рдЖрдкрдХреЛ PsiElement рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд▓реЗрдирд╛ рдерд╛, рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛ рдХрд╛рдЯ рджреЗрдирд╛, рд▓рд╛рдкрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЬрд╛рдВрдЪрдирд╛ рдХрд┐ рдХреНрдпрд╛ рдРрд╕реА рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рд╣реИред рдпрджрд┐ рдпрд╣ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдмрд╕ PsiElement рдХреА рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдВрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВред рд╕рдВрдХрд▓реНрдк рд╡рд┐рдзрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ
  @Nullable @Override public PsiElement resolve() { String path = element.getText(); path = path.replace("'", "").replace("\"", ""); if (path.startsWith("tpl!")) { path = path.replace("tpl!", ""); } else { path = path.concat(".js"); } if (path.startsWith("./")) { path = path.replaceFirst( ".", element .getContainingFile() .getVirtualFile() .getParent() .getPath() .replace(webDir.getPath(), "") ); } VirtualFile targetFile = webDir.findFileByRelativePath(path); if (targetFile != null) { return PsiManager.getInstance(project).findFile(targetFile); } return null; } 

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рдЧрдИ рдФрд░ рдСрдЯреЛ-рдкреВрд░реНрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред

рд╡рд┐рдЪрд╛рд░ рдореЗрдВ, рд╕реНрд╡рдд: рдкреВрд░реНрдгрддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╕рд░рд▓ рдПрдХ PsiReference рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ getVariants рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЙрдиреНрдирдд рдПрдХ FulltionContributor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдХрдВрдкреНрд▓реАрд╢рдирдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдмрд╕ рдЧрдпрд╛ред
рд╕реНрд╡рддрдГ-рдкреВрд░реНрдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рд╡рд╛рдкрд╕ рдХрд░рдиреА рд╣реЛрдЧреАред рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, рд▓реЛрдХреЛрдкреНрд▓реАрдореЗрдВрдЯ рдпрд╛ рд╕рд╛рдЗрд▓реАрдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд╣реЛ рд╕рдХрддреА рд╣реИред
рд╢реБрд░реБрдЖрдд рдореЗрдВ рдореИрдВрдиреЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдПрдХ рдЖрд╢реНрдЪрд░реНрдп рдореБрдЭреЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рдЕрдВрддрд┐рдо рд░реЗрдЦрд╛ рдХреЛ рдкреВрд░реА рд╕реНрд▓реИрд╢ рдХреЗ рдмрд╛рдж рд╕реНрд▓реИрд╢ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рд╕реНрд▓реИрд╢ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдСрдЯреЛ-рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдорд╛рдирддрд╛ рд╣реИред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрд░реЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓ рдкрд╛рдИ рд╣реИ рдХрд┐ рд╕реНрд▓реИрд╢ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реНрд╡рдд: рдкреВрд░реНрдг рдХрд░рдиреЗ рдпрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрде рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ред
рдореВрд▓реНрдп рдХреЗ рд╕рдореНрдорд┐рд▓рди рдХреЛ рд╕реНрд╡рдпрдВ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ InsertHandler рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рд╣реИрдВрдбрд▓ рдЗрдирд░рдЯреЗрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдмрд▓реНрдХрд┐ рдПрдХ рд▓реБрдХрдЕрдк рдХреНрд▓реАрдпрд░реЗрдВрдЯ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдореЗрдВ InsertHandler рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд▓реБрдХрдЕрдк рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрд╕ рддрд░рд╣ рдмрдврд╝рд╛рдпрд╛:
RequirejsLookupElement.java
 package requirejs; import com.intellij.codeInsight.completion.InsertHandler; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; public class RequirejsLookupElement extends LookupElement { String path; PsiElement element; private InsertHandler<LookupElement> insertHandler = null; public RequirejsLookupElement(String path, InsertHandler<LookupElement> insertHandler, PsiElement element) { this.path = path; this.insertHandler = insertHandler; this.element = element; } public void handleInsert(InsertionContext context) { if (this.insertHandler != null) { this.insertHandler.handleInsert(context, this); } } @NotNull @Override public String getLookupString() { return path; } } 

InsertHandler рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
RequirejsInsertHandler.java
 package requirejs; import com.intellij.codeInsight.completion.InsertHandler; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.LookupElement; public class RequirejsInsertHandler implements InsertHandler { private static final RequirejsInsertHandler instance = new RequirejsInsertHandler(); @Override public void handleInsert(InsertionContext insertionContext, LookupElement lookupElement) { if (lookupElement instanceof RequirejsLookupElement) { insertionContext.getDocument().replaceString( ((RequirejsLookupElement) lookupElement).element.getTextOffset() + 1, insertionContext.getTailOffset(), ((RequirejsLookupElement) lookupElement).path ); } } public static RequirejsInsertHandler getInstance() { return instance; } } 

рд╣реИрдВрдбрд▓ рдЗрдирдПрдХреНрдЯрд░ рд╡рд┐рдзрд┐ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо PsiElement рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реБрдХрдЕрдк рдИрд▓рдореЗрдВрдЯ рд▓реЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЪрдпрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛, PsiElement рд╕реЗ рд╣рдо рдлрд╛рдЗрд▓ рдореЗрдВ рдЗрд╕рдХреА рд▓реЛрдХреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓реБрдХрдЕрдкрдореЗрдВрдЯ.рдкрд╛рде рд╕реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреА рдкреВрд░реА рд▓рдВрдмрд╛рдИ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рджреВрд╕рд░рд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ред

рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕рднреА рдорд┐рд▓рд╛рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдХреА, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд▓реБрдХрдЕрдкрдореЗрдВрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ред
рдпрд╣рд╛рдБ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдХреА рдкреВрд░реА рд╕реВрдЪреА рд╣реИ:
RequirejsReference.java
 package requirejs; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.newvfs.impl.VirtualDirectoryImpl; import com.intellij.openapi.vfs.newvfs.impl.VirtualFileImpl; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiManager; import com.intellij.psi.PsiReference; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; public class RequirejsReference implements PsiReference { PsiElement element; TextRange textRange; Project project; VirtualFile webDir; public RequirejsReference(PsiElement element, TextRange textRange, Project project, VirtualFile webDir) { this.element = element; this.textRange = textRange; this.project = project; this.webDir = webDir; } @Override public PsiElement getElement() { return this.element; } @Nullable @Override public PsiElement resolve() { String path = element.getText(); path = path.replace("'", "").replace("\"", ""); if (path.startsWith("tpl!")) { path = path.replace("tpl!", ""); } else { path = path.concat(".js"); } if (path.startsWith("./")) { path = path.replaceFirst( ".", element .getContainingFile() .getVirtualFile() .getParent() .getPath() .replace(webDir.getPath(), "") ); } VirtualFile targetFile = webDir.findFileByRelativePath(path); if (targetFile != null) { return PsiManager.getInstance(project).findFile(targetFile); } return null; } @Override public String toString() { return getCanonicalText(); } @Override public boolean isSoft() { return false; } @NotNull @Override public Object[] getVariants() { ArrayList<String> files = filterFiles(this.element); ArrayList<LookupElement> completionResultSet = new ArrayList<LookupElement>(); for (int i = 0; i < files.size(); i++) { completionResultSet.add( new RequirejsLookupElement( files.get(i), RequirejsInsertHandler.getInstance(), this.element ) ); } return completionResultSet.toArray(); } protected ArrayList<String> getAllFilesInDirectory(VirtualFile directory) { ArrayList<String> files = new ArrayList<String>(); VirtualFile[] childrens = directory.getChildren(); if (childrens.length != 0) { for (int i = 0; i < childrens.length; i++) { if (childrens[i] instanceof VirtualDirectoryImpl) { files.addAll(getAllFilesInDirectory(childrens[i])); } else if (childrens[i] instanceof VirtualFileImpl) { files.add(childrens[i].getPath().replace(webDir.getPath() + "/", "")); } } } return files; } protected ArrayList<String> filterFiles (PsiElement element) { String value = element.getText().replace("'", "").replace("\"", "").replace("IntellijIdeaRulezzz ", ""); Boolean tpl = value.startsWith("tpl!"); String valuePath = value.replaceFirst("tpl!", ""); ArrayList<String> allFiles = getAllFilesInDirectory(webDir); ArrayList<String> trueFiles = new ArrayList<String>(); String file; for (int i = 0; i < allFiles.size(); i++) { file = allFiles.get(i); if (file.startsWith(valuePath)) { if (tpl && file.endsWith(".html")) { trueFiles.add("tpl!" + file); } else if (file.endsWith(".js")) { trueFiles.add(file.replace(".js", "")); } } } return trueFiles; } @Override public boolean isReferenceTo(PsiElement psiElement) { return false; } @Override public PsiElement bindToElement(@NotNull PsiElement psiElement) throws IncorrectOperationException { throw new IncorrectOperationException(); } @Override public PsiElement handleElementRename(String s) throws IncorrectOperationException { throw new IncorrectOperationException(); } @Override public TextRange getRangeInElement() { return textRange; } @NotNull @Override public String getCanonicalText() { return element.getText(); } } 

рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓ рдЦреЛрдЬ рд╡рд┐рдзрд┐ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкрджреНрдзрддрд┐ рдкрд░ рднреА рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП html рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдмрд╛рдХреА рдХреЗ рд▓рд┐рдП, js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреЗрд╕реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдЯреЗрдореНрдкрд▓реЗрдЯ tpl рдХреЗ рд╕рд╛рде рдбрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ!, рдЙрдкрд╕рд░реНрдЧ рдФрд░ js рдлрд╛рдЗрд▓реЗрдВ рдмрд┐рдирд╛ js рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИрдВред

UPD :
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, VISTALL рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рд▓реБрдХрдЕрдкрдореЗрдВрдЯ рд╡рдВрд╢ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рдХрдХреНрд╖рд╛ рдмрдирд╛рдирд╛ рд╢рд╛рдирджрд╛рд░ рдерд╛ред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЖрдк LookupElementBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╣реЗрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХрд┐рд╕ PsiElement рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред
LookupElementBuilder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдХреЛ рдмрджрд▓рд╛ :: getVariants рд╡рд┐рдзрд┐, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: рд╕рдВрджрд░реНрдн :: getVariants
  @NotNull @Override public Object[] getVariants() { ArrayList<String> files = filterFiles(element); ArrayList<LookupElement> completionResultSet = new ArrayList<LookupElement>(); for (int i = 0; i < files.size(); i++) { completionResultSet.add( LookupElementBuilder .create(element, files.get(i)) .withInsertHandler( RequirejsInsertHandler.getInstance() ) ); } return completionResultSet.toArray(); } 

рдЙрддреНрдкрдиреНрди рд▓реБрдХрдЕрдкрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХрд┐рд╕ PsiElement рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдпрд╣ рдмрдирд╛рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, PsiElement рдХреЛ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХреЛ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдСрдЯреЛ-рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдХреЛ рднреА рдмрджрд▓ рджрд┐рдпрд╛ред InInthHandler :: handleInsert рдЗрд╕ рддрд░рд╣ рд╕реЗ:
рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ:
  @Override public void handleInsert(InsertionContext insertionContext, LookupElement lookupElement) { insertionContext.getDocument().replaceString( lookupElement.getPsiElement().getTextOffset() + 1, insertionContext.getTailOffset(), lookupElement.getLookupString() ); } 

рдЗрд╕рдореЗрдВ рд╕реЗ, рдореИрдВрдиреЗ PsiElement рдФрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реБрдХрдЕрдк рдИрд▓рдореЗрдВрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред
рдЗрди рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, NeedjsLookupElement рд╡рд░реНрдЧ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

UPD 2 :
рдкреНрд▓рдЧрдЗрди рдереЛрдбрд╝рд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ github рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: github.com/Fedott/WebStormRequireJsPlivein
рдПрдХ рд╣реА рдкреНрд▓рдЧрдЗрди рдЕрдм рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЬреЗрдЯрдмреНрд░реЗрдиреНрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ: plugins.jetbrains.com/plugin/7337
рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рдХреЛ рдЧрд┐рддреБрдм рдпрд╛ рдпрд╣рд╛рдБ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╡рд╣ рд╕рдм рд╣реИред
рдкреНрд░рд╢реНрди рдпрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдореБрдЭреЗ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

Source: https://habr.com/ru/post/In189168/


All Articles