refactoring, CustomTemplateCallback#getContext() should work through injection
[idea/community.git] / platform / lang-impl / src / com / intellij / codeInsight / template / CustomTemplateCallback.java
index feaac8aded4c4c9e05e3dd3d419d7659edb8fc2c..90a937834fde6d95999e7119d56f47844dad15d3 100644 (file)
@@ -18,12 +18,14 @@ package com.intellij.codeInsight.template;
 import com.intellij.codeInsight.template.impl.TemplateImpl;
 import com.intellij.codeInsight.template.impl.TemplateManagerImpl;
 import com.intellij.codeInsight.template.impl.TemplateSettings;
+import com.intellij.lang.injection.InjectedLanguageManager;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.fileTypes.FileType;
 import com.intellij.openapi.project.Project;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.PsiFileFactory;
+import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
 import com.intellij.util.LocalTimeCounter;
 import com.intellij.util.containers.HashMap;
 import org.jetbrains.annotations.NotNull;
@@ -61,8 +63,7 @@ public class CustomTemplateCallback {
 
   @Nullable
   public PsiElement getContext() {
-    int offset = myStartOffset;
-    return myFile.findElementAt(offset > 0 ? offset - 1 : offset);
+    return getContext(myFile, myStartOffset > 0 ? myStartOffset - 1 : myStartOffset);
   }
 
   public void fixInitialState() {
@@ -229,4 +230,18 @@ public class CustomTemplateCallback {
     int caretAt = myEditor.getCaretModel().getOffset();
     myEditor.getDocument().deleteString(caretAt - key.length(), caretAt);
   }
+
+  public static PsiElement getContext(PsiFile file, int offset) {
+    PsiElement element = null;
+    if (!InjectedLanguageManager.getInstance(file.getProject()).isInjectedFragment(file)) {
+      element = InjectedLanguageUtil.findInjectedElementNoCommit(file, offset);
+    }
+    if (element == null) {
+      element = file.findElementAt(offset > 0 ? offset - 1 : offset);
+      if (element == null) {
+        element = file;
+      }
+    }
+    return element;
+  }
 }