summaryrefslogtreecommitdiff
path: root/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java')
-rw-r--r--platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java53
1 files changed, 47 insertions, 6 deletions
diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java
index fdc434d8d11a..647ace567d5d 100644
--- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java
+++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/injected/InjectedLanguageUtil.java
@@ -24,7 +24,6 @@ import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.editor.Caret;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
-import com.intellij.openapi.editor.SelectionModel;
import com.intellij.openapi.editor.impl.EditorImpl;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
@@ -38,6 +37,7 @@ import com.intellij.psi.impl.PsiParameterizedCachedValue;
import com.intellij.psi.impl.source.DummyHolder;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.*;
+import com.intellij.testFramework.LightVirtualFile;
import com.intellij.util.containers.ConcurrentList;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -93,7 +93,12 @@ public class InjectedLanguageUtil {
public static Place getShreds(@NotNull FileViewProvider viewProvider) {
if (!(viewProvider instanceof InjectedFileViewProvider)) return null;
InjectedFileViewProvider myFileViewProvider = (InjectedFileViewProvider)viewProvider;
- return ((DocumentWindowImpl)myFileViewProvider.getDocument()).getShreds();
+ return getShreds(myFileViewProvider.getDocument());
+ }
+
+ @NotNull
+ public static Place getShreds(@NotNull DocumentWindow document) {
+ return ((DocumentWindowImpl)document).getShreds();
}
public static void enumerate(@NotNull DocumentWindow documentWindow,
@@ -162,6 +167,13 @@ public class InjectedLanguageUtil {
return getEditorForInjectedLanguageNoCommit(editor, file, offset);
}
+ public static Editor getEditorForInjectedLanguageNoCommit(@Nullable Editor editor, @Nullable Caret caret, @Nullable PsiFile file) {
+ if (editor == null || file == null || editor instanceof EditorWindow || caret == null) return editor;
+
+ PsiFile injectedFile = findInjectedPsiNoCommit(file, caret.getOffset());
+ return getInjectedEditorForInjectedFile(editor, caret, injectedFile);
+ }
+
public static Caret getCaretForInjectedLanguageNoCommit(@Nullable Caret caret, @Nullable PsiFile file) {
if (caret == null || file == null || caret instanceof InjectedCaret) return caret;
@@ -212,17 +224,21 @@ public class InjectedLanguageUtil {
@NotNull
public static Editor getInjectedEditorForInjectedFile(@NotNull Editor hostEditor, @Nullable final PsiFile injectedFile) {
+ return getInjectedEditorForInjectedFile(hostEditor, hostEditor.getCaretModel().getCurrentCaret(), injectedFile);
+ }
+
+ @NotNull
+ public static Editor getInjectedEditorForInjectedFile(@NotNull Editor hostEditor, @NotNull Caret hostCaret, @Nullable final PsiFile injectedFile) {
if (injectedFile == null || hostEditor instanceof EditorWindow || hostEditor.isDisposed()) return hostEditor;
Project project = hostEditor.getProject();
if (project == null) project = injectedFile.getProject();
Document document = PsiDocumentManager.getInstance(project).getDocument(injectedFile);
if (!(document instanceof DocumentWindowImpl)) return hostEditor;
DocumentWindowImpl documentWindow = (DocumentWindowImpl)document;
- SelectionModel selectionModel = hostEditor.getSelectionModel();
- if (selectionModel.hasSelection()) {
- int selstart = selectionModel.getSelectionStart();
+ if (hostCaret.hasSelection()) {
+ int selstart = hostCaret.getSelectionStart();
if (selstart != -1) {
- int selend = Math.max(selstart, selectionModel.getSelectionEnd());
+ int selend = Math.max(selstart, hostCaret.getSelectionEnd());
if (!documentWindow.containsRange(selstart, selend)) {
// selection spreads out the injected editor range
return hostEditor;
@@ -573,4 +589,29 @@ public class InjectedLanguageUtil {
});
return ref.get();
}
+
+ @Nullable
+ public static PsiLanguageInjectionHost findInjectionHost(@Nullable PsiElement psi) {
+ if (psi == null) return null;
+ PsiFile containingFile = psi.getContainingFile().getOriginalFile(); // * formatting
+ PsiElement fileContext = containingFile.getContext(); // * quick-edit-handler
+ if (fileContext instanceof PsiLanguageInjectionHost) return (PsiLanguageInjectionHost)fileContext;
+ Place shreds = getShreds(containingFile.getViewProvider()); // * injection-registrar
+ if (shreds == null) {
+ VirtualFile virtualFile = PsiUtilCore.getVirtualFile(containingFile);
+ if (virtualFile instanceof LightVirtualFile) {
+ virtualFile = ((LightVirtualFile)virtualFile).getOriginalFile(); // * dynamic files-from-text
+ }
+ if (virtualFile instanceof VirtualFileWindow) {
+ shreds = getShreds(((VirtualFileWindow)virtualFile).getDocumentWindow());
+ }
+ }
+ return shreds != null ? shreds.getHostPointer().getElement() : null;
+ }
+
+ @Nullable
+ public static PsiLanguageInjectionHost findInjectionHost(@Nullable VirtualFile virtualFile) {
+ return virtualFile instanceof VirtualFileWindow ?
+ getShreds(((VirtualFileWindow)virtualFile).getDocumentWindow()).getHostPointer().getElement() : null;
+ }
}