mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Implement get variable for console variables view.
This commit is contained in:
@@ -31,7 +31,7 @@ class InterpreterInterface(BaseInterpreterInterface):
|
||||
self.interpreter = PyDevFrontEnd()
|
||||
self._input_error_printed = False
|
||||
self.notification_succeeded = False
|
||||
self.notification_tries = 0;
|
||||
self.notification_tries = 0
|
||||
self.notification_max_tries = 3
|
||||
|
||||
self.notify_about_magic()
|
||||
@@ -101,11 +101,9 @@ class InterpreterInterface(BaseInterpreterInterface):
|
||||
traceback.print_exc()
|
||||
return []
|
||||
|
||||
|
||||
def close(self):
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def ipython_editor(self, file, line):
|
||||
server = self.get_server()
|
||||
|
||||
|
||||
@@ -3,10 +3,14 @@ try:
|
||||
except ImportError:
|
||||
from pydevconsole_code_for_ironpython import InteractiveConsole
|
||||
|
||||
from code import compile_command
|
||||
from code import InteractiveInterpreter
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
from pydevd_constants import USE_LIB_COPY
|
||||
from pydevd_utils import *
|
||||
|
||||
if USE_LIB_COPY:
|
||||
import _pydev_threading as threading
|
||||
@@ -18,6 +22,12 @@ import fix_getpass
|
||||
fix_getpass.fixGetpass()
|
||||
|
||||
import pydevd_xml
|
||||
import pydevd_vars
|
||||
|
||||
try:
|
||||
from pydevd_exec import Exec
|
||||
except:
|
||||
from pydevd_exec2 import Exec
|
||||
|
||||
try:
|
||||
if USE_LIB_COPY:
|
||||
@@ -171,6 +181,21 @@ class InterpreterInterface(BaseInterpreterInterface):
|
||||
xml += "</xml>"
|
||||
|
||||
return xml
|
||||
|
||||
def getVariable(self, attributes):
|
||||
xml = "<xml>"
|
||||
valDict = pydevd_vars.resolveVar(self.namespace, attributes)
|
||||
if valDict is None:
|
||||
valDict = {}
|
||||
|
||||
keys = valDict.keys()
|
||||
|
||||
for k in keys:
|
||||
xml += pydevd_vars.varToXML(valDict[k], to_string(k))
|
||||
|
||||
xml += "</xml>"
|
||||
|
||||
return xml
|
||||
|
||||
def close(self):
|
||||
sys.exit(0)
|
||||
@@ -274,6 +299,7 @@ def start_server(host, port, interpreter):
|
||||
server.register_function(interpreter.execLine)
|
||||
server.register_function(interpreter.getCompletions)
|
||||
server.register_function(interpreter.getFrame)
|
||||
server.register_function(interpreter.getVariable)
|
||||
server.register_function(interpreter.getDescription)
|
||||
server.register_function(interpreter.close)
|
||||
server.register_function(interpreter.interrupt)
|
||||
@@ -332,7 +358,7 @@ def get_completions(text, token, globals, locals):
|
||||
|
||||
return interpreterInterface.getCompletions(text, token)
|
||||
|
||||
def get_frame(globals, locals):
|
||||
def get_frame():
|
||||
return interpreterInterface.getFrame()
|
||||
|
||||
def exec_expression(expression, globals, locals):
|
||||
@@ -363,6 +389,65 @@ def read_line(s):
|
||||
|
||||
return ret
|
||||
|
||||
# Debugger integration
|
||||
|
||||
class ConsoleWriter(InteractiveInterpreter):
|
||||
skip = 0
|
||||
|
||||
def __init__(self, locals=None):
|
||||
InteractiveInterpreter.__init__(self, locals)
|
||||
|
||||
def write(self, data):
|
||||
#if (data.find("global_vars") == -1 and data.find("pydevd") == -1):
|
||||
if self.skip > 0:
|
||||
self.skip -= 1
|
||||
else:
|
||||
if data == "Traceback (most recent call last):\n":
|
||||
self.skip = 1
|
||||
sys.stderr.write(data)
|
||||
|
||||
def consoleExec(thread_id, frame_id, expression):
|
||||
"""returns 'False' in case expression is partialy correct
|
||||
"""
|
||||
frame = pydevd_vars.findFrame(thread_id, frame_id)
|
||||
|
||||
expression = str(expression.replace('@LINE@', '\n'))
|
||||
|
||||
#Not using frame.f_globals because of https://sourceforge.net/tracker2/?func=detail&aid=2541355&group_id=85796&atid=577329
|
||||
#(Names not resolved in generator expression in method)
|
||||
#See message: http://mail.python.org/pipermail/python-list/2009-January/526522.html
|
||||
updated_globals = {}
|
||||
updated_globals.update(frame.f_globals)
|
||||
updated_globals.update(frame.f_locals) #locals later because it has precedence over the actual globals
|
||||
|
||||
if IPYTHON:
|
||||
return exec_expression(expression, updated_globals, frame.f_locals)
|
||||
|
||||
interpreter = ConsoleWriter()
|
||||
|
||||
try:
|
||||
code = compile_command(expression)
|
||||
except (OverflowError, SyntaxError, ValueError):
|
||||
# Case 1
|
||||
interpreter.showsyntaxerror()
|
||||
return False
|
||||
|
||||
if code is None:
|
||||
# Case 2
|
||||
return True
|
||||
|
||||
#Case 3
|
||||
|
||||
try:
|
||||
Exec(code, updated_globals, frame.f_locals)
|
||||
|
||||
except SystemExit:
|
||||
raise
|
||||
except:
|
||||
interpreter.showtraceback()
|
||||
|
||||
return False
|
||||
|
||||
#=======================================================================================================================
|
||||
# main
|
||||
#=======================================================================================================================
|
||||
|
||||
@@ -905,7 +905,7 @@ class InternalConsoleExec(InternalThreadCommand):
|
||||
thread.start_new_thread = thread._original_start_new_thread #don't trace new threads created by console command
|
||||
thread.start_new = thread._original_start_new_thread
|
||||
|
||||
result = pydevd_vars.consoleExec(self.thread_id, self.frame_id, self.expression)
|
||||
result = pydevconsole.consoleExec(self.thread_id, self.frame_id, self.expression)
|
||||
xml = "<xml>"
|
||||
xml += pydevd_vars.varToXML(result, "")
|
||||
xml += "</xml>"
|
||||
|
||||
@@ -5,9 +5,7 @@ import pickle
|
||||
from django_frame import DjangoTemplateFrame
|
||||
from pydevd_constants import * #@UnusedWildImport
|
||||
from types import * #@UnusedWildImport
|
||||
from code import compile_command
|
||||
from code import InteractiveInterpreter
|
||||
import pydevconsole
|
||||
|
||||
from pydevd_xml import *
|
||||
|
||||
try:
|
||||
@@ -54,9 +52,6 @@ if USE_PSYCO_OPTIMIZATION:
|
||||
if hasattr(sys, 'exc_clear'): #jython does not have it
|
||||
sys.exc_clear() #don't keep the traceback -- clients don't want to see it
|
||||
|
||||
|
||||
|
||||
|
||||
def iterFrames(initialFrame):
|
||||
"""NO-YIELD VERSION: Iterates through all the frames starting at the specified frame (which will be the first returned item)"""
|
||||
#cannot use yield
|
||||
@@ -161,6 +156,7 @@ def resolveCompoundVariable(thread_id, frame_id, scope, attrs):
|
||||
return {}
|
||||
|
||||
attrList = attrs.split('\t')
|
||||
|
||||
if scope == "GLOBAL":
|
||||
var = frame.f_globals
|
||||
del attrList[0] # globals are special, and they get a single dummy unused attribute
|
||||
@@ -181,6 +177,22 @@ def resolveCompoundVariable(thread_id, frame_id, scope, attrs):
|
||||
return resolver.getDictionary(var)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
def resolveVar(var, attrs):
|
||||
attrList = attrs.split('\t')
|
||||
|
||||
for k in attrList:
|
||||
type, _typeName, resolver = getType(var)
|
||||
|
||||
var = resolver.resolve(var, k)
|
||||
|
||||
try:
|
||||
type, _typeName, resolver = getType(var)
|
||||
return resolver.getDictionary(var)
|
||||
except:
|
||||
traceback.print_exc()
|
||||
|
||||
|
||||
def evaluateExpression(thread_id, frame_id, expression, doExec):
|
||||
"""returns the result of the evaluated expression
|
||||
@@ -241,64 +253,6 @@ def evaluateExpression(thread_id, frame_id, expression, doExec):
|
||||
del updated_globals
|
||||
del frame
|
||||
|
||||
class ConsoleWriter(InteractiveInterpreter):
|
||||
skip = 0
|
||||
|
||||
def __init__(self, locals=None):
|
||||
InteractiveInterpreter.__init__(self, locals)
|
||||
|
||||
def write(self, data):
|
||||
#if (data.find("global_vars") == -1 and data.find("pydevd") == -1):
|
||||
if self.skip > 0:
|
||||
self.skip -= 1
|
||||
else:
|
||||
if data == "Traceback (most recent call last):\n":
|
||||
self.skip = 1
|
||||
sys.stderr.write(data)
|
||||
|
||||
def consoleExec(thread_id, frame_id, expression):
|
||||
"""returns 'False' in case expression is partialy correct
|
||||
"""
|
||||
frame = findFrame(thread_id, frame_id)
|
||||
|
||||
expression = str(expression.replace('@LINE@', '\n'))
|
||||
|
||||
#Not using frame.f_globals because of https://sourceforge.net/tracker2/?func=detail&aid=2541355&group_id=85796&atid=577329
|
||||
#(Names not resolved in generator expression in method)
|
||||
#See message: http://mail.python.org/pipermail/python-list/2009-January/526522.html
|
||||
updated_globals = {}
|
||||
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:
|
||||
code = compile_command(expression)
|
||||
except (OverflowError, SyntaxError, ValueError):
|
||||
# Case 1
|
||||
interpreter.showsyntaxerror()
|
||||
return False
|
||||
|
||||
if code is None:
|
||||
# Case 2
|
||||
return True
|
||||
|
||||
#Case 3
|
||||
|
||||
try:
|
||||
Exec(code, updated_globals, frame.f_locals)
|
||||
|
||||
except SystemExit:
|
||||
raise
|
||||
except:
|
||||
interpreter.showtraceback()
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def changeAttrExpression(thread_id, frame_id, attr, expression):
|
||||
"""Changes some attribute in a given frame.
|
||||
@note: it will not (currently) work if we're not in the topmost frame (that's a python
|
||||
|
||||
Reference in New Issue
Block a user