package gw.plugin.ij.util; import com.intellij.injected.editor.VirtualFileWindow; import com.intellij.lang.injection.InjectedLanguageManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.PsiManager; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class InjectionUtil { @Nullable public static PsiLanguageInjectionHost getInjectionHost(@NotNull PsiElement element) { PsiFile psiFile = element.getContainingFile(); psiFile = psiFile.getOriginalFile(); psiFile = InjectedElementEditor.getOriginalFile(psiFile.getOriginalFile()); // Fast final PsiLanguageInjectionHost host = InjectedLanguageManager.getInstance(psiFile.getProject()).getInjectionHost(psiFile); if (host != null) { return host; } // Slow final VirtualFile file = psiFile.getVirtualFile(); if (file instanceof VirtualFileWindow) { final VirtualFileWindow window = (VirtualFileWindow) file; final PsiFile psiFileHost = PsiManager.getInstance(psiFile.getProject()).findFile(window.getDelegate()); final int startOffset = window.getDocumentWindow().getHostRanges()[0].getStartOffset(); final PsiElement hostElement = psiFileHost.findElementAt(startOffset); return PsiTreeUtil.getParentOfType(hostElement, PsiLanguageInjectionHost.class); } return null; } }