From a443e0355da18f73c25796db331d07d8a2677922 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Thu, 17 Nov 2011 10:32:41 +0100 Subject: [PATCH 1/2] IPython-specific parsing if only IPython is running (PY-4496). --- .../python/console/PyConsoleUtil.java | 28 +++- .../python/console/PydevConsoleRunner.java | 2 +- .../python/console/PythonConsoleView.java | 20 ++- .../parsing/PyConsoleParsingContext.java | 122 +++++++++++------- .../python/psi/PyFileElementType.java | 2 +- 5 files changed, 118 insertions(+), 56 deletions(-) diff --git a/python/src/com/jetbrains/python/console/PyConsoleUtil.java b/python/src/com/jetbrains/python/console/PyConsoleUtil.java index 065bd997d310..2046a794ef18 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleUtil.java +++ b/python/src/com/jetbrains/python/console/PyConsoleUtil.java @@ -3,6 +3,8 @@ package com.jetbrains.python.console; import com.intellij.execution.console.LanguageConsoleImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.vfs.VirtualFile; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; @@ -10,12 +12,12 @@ import org.jetbrains.annotations.NotNull; * @author traff */ public class PyConsoleUtil { - public static final String ORDINARY_PROMPT = ">>> "; - public static final String INPUT_PROMPT = ">? "; - public static final String INDENT_PROMPT = "... "; - static final String HELP_PROMPT = "help> "; - public static final String EXECUTING_PROMPT = ""; - + public static final String ORDINARY_PROMPT = ">>> "; + public static final String INPUT_PROMPT = ">? "; + public static final String INDENT_PROMPT = "... "; + static final String HELP_PROMPT = "help> "; + public static final String EXECUTING_PROMPT = ""; + private static final String IPYTHON_PAGING_PROMPT = "---Return to continue, q to quit---"; static final String[] PROMPTS = new String[]{ @@ -26,6 +28,7 @@ public class PyConsoleUtil { }; public static final String DOUBLE_QUOTE_MULTILINE = "\"\"\""; public static final String SINGLE_QUOTE_MULTILINE = "'''"; + static final Key IPYTHON = Key.create("ipython"); private PyConsoleUtil() { } @@ -89,6 +92,10 @@ public class PyConsoleUtil { return isMultilineStarts(line, DOUBLE_QUOTE_MULTILINE); } + public static boolean detectIPythonImported(@NotNull String text) { + return text.contains("<---->"); + } + public static boolean detectSourcePrinting(@NotNull String text) { return text.contains("Source:"); } @@ -100,5 +107,12 @@ public class PyConsoleUtil { public static boolean detectIPythonEnd(@NotNull String text) { return text.contains("<---->"); } - + + public static boolean isIPythonDetected(VirtualFile file) { + if (file == null) { + return false; + } + Boolean detected = file.getUserData(IPYTHON); + return detected != null && detected.booleanValue(); + } } diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java index 2a9de07e94d6..2120abf72b38 100644 --- a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java +++ b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java @@ -42,6 +42,7 @@ import com.jetbrains.python.PythonHelpersLocator; import com.jetbrains.python.console.completion.PydevConsoleElement; import com.jetbrains.python.console.pydev.ConsoleCommunication; import com.jetbrains.python.console.pydev.PydevConsoleCommunication; +import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.run.PythonCommandLineState; import com.jetbrains.python.run.PythonTracebackFilter; import com.jetbrains.python.sdk.PythonSdkFlavor; @@ -429,7 +430,6 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory { final PyParser parser = new PyParser() { @Override protected ParsingContext createParsingContext(PsiBuilder builder, LanguageLevel languageLevel, StatementParsing.FUTURE futureFlag) { - return new PyConsoleParsingContext(builder, languageLevel, futureFlag); + return new PyConsoleParsingContext(builder, languageLevel, futureFlag, psi); } }; return parser.parse(this, builder).getFirstChildNode(); From d16b390f88fff8b634f522b9e32970300701d3c6 Mon Sep 17 00:00:00 2001 From: Dmitry Trofimov Date: Thu, 17 Nov 2011 14:48:55 +0100 Subject: [PATCH 2/2] IPython console embedded to debug console (PY-4504). --- python/helpers/pydev/pydevd_vars.py | 7 +- .../console/PyConsoleProcessHandler.java | 2 +- ...r.java => PyConsoleSourceHighlighter.java} | 6 +- .../python/console/PyConsoleUtil.java | 10 +- .../python/console/PydevConsoleRunner.java | 25 ++-- .../python/console/PythonConsoleView.java | 42 ++++--- .../PythonDebugLanguageConsoleView.java | 10 +- .../parsing/PyConsoleParsingContext.java | 107 +++++++----------- .../python/psi/PyFileElementType.java | 2 +- 9 files changed, 108 insertions(+), 103 deletions(-) rename python/src/com/jetbrains/python/console/{ConsoleSourceHighlighter.java => PyConsoleSourceHighlighter.java} (90%) diff --git a/python/helpers/pydev/pydevd_vars.py b/python/helpers/pydev/pydevd_vars.py index 166e517aa791..103f300eef20 100644 --- a/python/helpers/pydev/pydevd_vars.py +++ b/python/helpers/pydev/pydevd_vars.py @@ -7,6 +7,7 @@ from pydevd_constants import * #@UnusedWildImport from types import * #@UnusedWildImport from code import compile_command from code import InteractiveInterpreter +from console import pydevconsole try: from StringIO import StringIO @@ -464,6 +465,9 @@ def consoleExec(thread_id, frame_id, expression): updated_globals.update(frame.f_globals) updated_globals.update(frame.f_locals) #locals later because it has precedence over the actual globals + if pydevconsole.IPYTHON: + return pydevconsole.exec_expression(expression, updated_globals, frame.f_locals) + interpreter = ConsoleWriter() try: @@ -477,7 +481,8 @@ def consoleExec(thread_id, frame_id, expression): # Case 2 return True - # Case 3 + #Case 3 + try: Exec(code, updated_globals, frame.f_locals) diff --git a/python/src/com/jetbrains/python/console/PyConsoleProcessHandler.java b/python/src/com/jetbrains/python/console/PyConsoleProcessHandler.java index 6a17cd1ff54c..9eb494998f0a 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleProcessHandler.java +++ b/python/src/com/jetbrains/python/console/PyConsoleProcessHandler.java @@ -29,7 +29,7 @@ public class PyConsoleProcessHandler extends PythonProcessHandler { protected void textAvailable(final String text, final Key attributes) { final String string = PyConsoleUtil.processPrompts(getConsole(), StringUtil.convertLineSeparators(text)); - myConsoleView.printText(string, attributes); + myConsoleView.print(string, attributes); } @Override diff --git a/python/src/com/jetbrains/python/console/ConsoleSourceHighlighter.java b/python/src/com/jetbrains/python/console/PyConsoleSourceHighlighter.java similarity index 90% rename from python/src/com/jetbrains/python/console/ConsoleSourceHighlighter.java rename to python/src/com/jetbrains/python/console/PyConsoleSourceHighlighter.java index 4d4adf0ce518..9be9edb8e49c 100644 --- a/python/src/com/jetbrains/python/console/ConsoleSourceHighlighter.java +++ b/python/src/com/jetbrains/python/console/PyConsoleSourceHighlighter.java @@ -12,7 +12,7 @@ import com.jetbrains.python.highlighting.PyHighlighter; /** * @author traff */ -class ConsoleSourceHighlighter { +class PyConsoleSourceHighlighter { private final Lexer myLexer; private final EditorColorsScheme myScheme; @@ -21,7 +21,7 @@ class ConsoleSourceHighlighter { private int myLexerState; private PythonConsoleView myPythonConsoleView; - ConsoleSourceHighlighter(PythonConsoleView pythonConsoleView, EditorColorsScheme scheme, PyHighlighter pyHighlighter) { + PyConsoleSourceHighlighter(PythonConsoleView pythonConsoleView, EditorColorsScheme scheme, PyHighlighter pyHighlighter) { myPythonConsoleView = pythonConsoleView; myScheme = scheme; myPyHighlighter = pyHighlighter; @@ -32,7 +32,7 @@ class ConsoleSourceHighlighter { myLexer.start(text, 0, text.length(), getLexerState()); while (hasNext()) { Pair pair = next(); - myPythonConsoleView.print(pair.first, pair.second); + myPythonConsoleView.printText(pair.first, pair.second); } } diff --git a/python/src/com/jetbrains/python/console/PyConsoleUtil.java b/python/src/com/jetbrains/python/console/PyConsoleUtil.java index 2046a794ef18..8e43a7b410ac 100644 --- a/python/src/com/jetbrains/python/console/PyConsoleUtil.java +++ b/python/src/com/jetbrains/python/console/PyConsoleUtil.java @@ -1,6 +1,8 @@ package com.jetbrains.python.console; import com.intellij.execution.console.LanguageConsoleImpl; +import com.intellij.execution.process.ProcessOutputTypes; +import com.intellij.execution.ui.ConsoleViewContentType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Key; @@ -92,8 +94,8 @@ public class PyConsoleUtil { return isMultilineStarts(line, DOUBLE_QUOTE_MULTILINE); } - public static boolean detectIPythonImported(@NotNull String text) { - return text.contains("<---->"); + public static boolean detectIPythonImported(@NotNull String text, final ConsoleViewContentType outputType) { + return text.contains("PyDev console: using IPython 0.1") && outputType == ConsoleViewContentType.ERROR_OUTPUT; } public static boolean detectSourcePrinting(@NotNull String text) { @@ -101,11 +103,11 @@ public class PyConsoleUtil { } public static boolean detectIPythonStart(@NotNull String text) { - return text.contains("<---->"); + return text.contains("IPython-->"); } public static boolean detectIPythonEnd(@NotNull String text) { - return text.contains("<---->"); + return text.contains("<--IPython"); } public static boolean isIPythonDetected(VirtualFile file) { diff --git a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java index 2120abf72b38..cdf33031ac89 100644 --- a/python/src/com/jetbrains/python/console/PydevConsoleRunner.java +++ b/python/src/com/jetbrains/python/console/PydevConsoleRunner.java @@ -33,7 +33,9 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.tree.FileElement; +import com.intellij.testFramework.LightVirtualFile; import com.intellij.util.ArrayUtil; import com.intellij.util.IJSwingUtilities; import com.intellij.util.net.NetUtils; @@ -242,7 +244,7 @@ public class PydevConsoleRunner extends AbstractConsoleRunnerWithHistory { public ASTNode parseContents(ASTNode chameleon) { final FileElement node = (FileElement)chameleon; final LanguageLevel languageLevel = getLanguageLevel(node.getPsi()); - if (PydevConsoleRunner.isInPydevConsole(node)) { + if (PydevConsoleRunner.isIPythonConsole(node)) { return parseConsoleCode(node, languageLevel); } final PsiElement psi = node.getPsi();