| package org.intellij.plugins.xsltDebugger.impl; |
| |
| import com.intellij.openapi.editor.Document; |
| import com.intellij.openapi.fileTypes.FileType; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.psi.PsiDocumentManager; |
| import com.intellij.psi.PsiElement; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.PsiFileFactory; |
| import com.intellij.util.LocalTimeCounter; |
| import com.intellij.xdebugger.XSourcePosition; |
| import com.intellij.xdebugger.evaluation.EvaluationMode; |
| import com.intellij.xdebugger.evaluation.XDebuggerEditorsProvider; |
| import org.intellij.lang.xpath.XPathFileType; |
| import org.intellij.lang.xpath.xslt.impl.XsltChecker; |
| import org.intellij.plugins.xsltDebugger.BreakpointContext; |
| import org.intellij.plugins.xsltDebugger.rt.engine.Debugger; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| public class XsltDebuggerEditorsProvider extends XDebuggerEditorsProvider { |
| |
| private final XPathFileType myFileType; |
| |
| public XsltDebuggerEditorsProvider(XsltChecker.LanguageLevel level) { |
| myFileType = level == XsltChecker.LanguageLevel.V2 ? XPathFileType.XPATH2 : XPathFileType.XPATH; |
| } |
| |
| @NotNull |
| @Override |
| public FileType getFileType() { |
| return myFileType; |
| } |
| |
| @NotNull |
| @Override |
| public Document createDocument(@NotNull Project project, |
| @NotNull String text, |
| @Nullable XSourcePosition sourcePosition, |
| @NotNull EvaluationMode mode) { |
| final PsiFile psiFile = PsiFileFactory.getInstance(project) |
| .createFileFromText("XPathExpr." + myFileType.getDefaultExtension(), myFileType, text, LocalTimeCounter.currentTime(), true); |
| |
| if (sourcePosition instanceof XsltSourcePosition && ((XsltSourcePosition)sourcePosition).getLocation() instanceof Debugger.StyleFrame) { |
| final Debugger.Locatable location = ((XsltSourcePosition)sourcePosition).getLocation(); |
| final EvalContextProvider context = new EvalContextProvider(((Debugger.StyleFrame)location).getVariables()); |
| context.attachTo(psiFile); |
| } else { |
| final PsiElement contextElement = XsltBreakpointHandler.findContextElement(project, sourcePosition); |
| if (contextElement != null) { |
| final BreakpointContext context = new BreakpointContext(contextElement); |
| context.attachTo(psiFile); |
| } |
| } |
| |
| final Document document = PsiDocumentManager.getInstance(project).getDocument(psiFile); |
| assert document != null; |
| return document; |
| } |
| } |