diff --git a/python/helpers/pydev/pydev_console_utils.py b/python/helpers/pydev/pydev_console_utils.py index 06715581847a..e87774f5289c 100644 --- a/python/helpers/pydev/pydev_console_utils.py +++ b/python/helpers/pydev/pydev_console_utils.py @@ -136,6 +136,11 @@ class CodeFragment: def __init__(self, text, is_single_line=True): self.text = text self.is_single_line = is_single_line + + def append(self, code_fragment): + self.text = self.text + "\n" + code_fragment.text + if not code_fragment.is_single_line: + self.is_single_line = False #======================================================================================================================= # BaseInterpreterInterface @@ -145,7 +150,7 @@ class BaseInterpreterInterface: self.mainThread = mainThread self.interruptable = False self.exec_queue = _queue.Queue(0) - self.buffer = [] + self.buffer = None def needMoreForCode(self, source): if hasattr(self.interpreter, 'is_complete'): @@ -162,16 +167,15 @@ class BaseInterpreterInterface: # Case 3 return False - def needMore(self, buffer, line): - if not buffer: - buffer = [] - buffer.append(line) - source = "\n".join(buffer) + def needMore(self, code_fragment): + if self.buffer is None: + self.buffer = code_fragment + else: + self.buffer.append(code_fragment) - return self.needMoreForCode(source) + return self.needMoreForCode(code_fragment.text) - - def addExec(self, codeFragment): + def addExec(self, code_fragment): original_in = sys.stdin try: help = None @@ -210,7 +214,7 @@ class BaseInterpreterInterface: try: self.startExec() - more = self.doAddExec(codeFragment) + more = self.doAddExec(code_fragment) self.finishExec() finally: if help is not None: @@ -231,9 +235,7 @@ class BaseInterpreterInterface: traceback.print_exc() - #it's always false at this point - need_input = False - return more, need_input + return more def doAddExec(self, codeFragment): @@ -314,24 +316,22 @@ class BaseInterpreterInterface: return '' - def execLine(self, line): + def doExecCode(self, code, is_single_line): try: - more = self.needMore(self.buffer, line) - self.exec_queue.put(CodeFragment(line, True)) + code_fragment = CodeFragment(code, is_single_line) + more = self.needMore(code_fragment) + self.exec_queue.put(code_fragment) return more except: traceback.print_exc() return False + def execLine(self, line): + return self.doExecCode(line, True) + def execMultipleLines(self, lines): - try: - more = self.needMoreForCode(lines) - self.exec_queue.put(CodeFragment(lines, False)) - return more - except: - traceback.print_exc() - return False + return self.doExecCode(lines, False) def interrupt(self): diff --git a/python/helpers/pydev/pydevconsole.py b/python/helpers/pydev/pydevconsole.py index 3f41f58aed1e..5bac7550c86d 100644 --- a/python/helpers/pydev/pydevconsole.py +++ b/python/helpers/pydev/pydevconsole.py @@ -74,7 +74,7 @@ except ImportError: class Command: - def __init__(self, interpreter, code_fragment): + def __init__(self, interpreter, code_fragment, buffer): """ :type code_fragment: CodeFragment :type interpreter: InteractiveConsole @@ -82,12 +82,25 @@ class Command: self.interpreter = interpreter self.code_fragment = code_fragment self.more = None + self.buffer = buffer + + @staticmethod + def symbol_for_fragment(code_fragment): + if code_fragment.is_single_line: + symbol = 'single' + else: + symbol = 'exec' + return symbol def run(self): - if self.code_fragment.is_single_line: - self.more = self.interpreter.push(self.code_fragment.text) + if self.buffer is None: + text = self.code_fragment.text + symbol = self.symbol_for_fragment(self.code_fragment) else: - self.more = self.interpreter.runsource(self.code_fragment.text, '', 'exec') + text = self.buffer.text + symbol = self.symbol_for_fragment(self.buffer) + + self.more = self.interpreter.runsource(text, '', symbol) try: try: @@ -119,7 +132,7 @@ class InterpreterInterface(BaseInterpreterInterface): def doAddExec(self, codeFragment): - command = Command(self.interpreter, codeFragment) + command = Command(self.interpreter, codeFragment, self.buffer) command.run() return command.more @@ -155,10 +168,12 @@ def process_exec_queue(interpreter): except _queue.Empty: continue - if not interpreter.addExec(codeFragment): #TODO: think about locks here - interpreter.buffer = [] + more = interpreter.addExec(codeFragment) + + if not more: + interpreter.buffer = None except KeyboardInterrupt: - interpreter.buffer = [] + interpreter.buffer = None continue except SystemExit: raise @@ -311,7 +326,7 @@ def exec_code(code, globals, locals): interpreterInterface.interpreter.update(globals, locals) - res = interpreterInterface.needMore(None, code.text) + res = interpreterInterface.needMore(code) if res: return True