summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2007-08-05 15:29:28 (GMT)
committerGuido van Rossum <guido@python.org>2007-08-05 15:29:28 (GMT)
commit33d2689fc900a814f0a7d2f846abe0c34024ae17 (patch)
tree1ecddf8b9e18933d1fd90d5eda510908ec71695b /Lib/idlelib
parent77553ab531c6a98c3d06b7ba4158b06ed0af8c69 (diff)
downloadcpython-33d2689fc900a814f0a7d2f846abe0c34024ae17.zip
cpython-33d2689fc900a814f0a7d2f846abe0c34024ae17.tar.gz
cpython-33d2689fc900a814f0a7d2f846abe0c34024ae17.tar.bz2
Merged revisions 56492-56752 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk ........ r56497 | kurt.kaiser | 2007-07-22 14:55:16 -0700 (Sun, 22 Jul 2007) | 4 lines In the case of syntax errors, in py3k format_exception_only() was including line number and position in the final line of the exception notification, duplicating info in previous lines. ........ r56501 | kurt.kaiser | 2007-07-22 19:35:50 -0700 (Sun, 22 Jul 2007) | 2 lines Hum, needed a newline in the last change. ........ r56536 | kurt.kaiser | 2007-07-24 19:06:48 -0700 (Tue, 24 Jul 2007) | 5 lines Not all instantiations of SyntaxError set the args attribute. e.g. symtable.c Modify format_exception_only() to get SyntaxError attributes directly instead of unpacking 'args'. ........ r56537 | kurt.kaiser | 2007-07-24 19:13:03 -0700 (Tue, 24 Jul 2007) | 3 lines Update doctest strings: traceback.py no longer prints redundant location information in the last line of the exception display. ........ r56627 | kurt.kaiser | 2007-07-29 21:06:57 -0700 (Sun, 29 Jul 2007) | 2 lines Interactive interpreter emulator (code.py) failing to print exceptions. ........ r56628 | kurt.kaiser | 2007-07-29 21:41:02 -0700 (Sun, 29 Jul 2007) | 2 lines Eliminate extra lines before and after tracebacks. ........ r56638 | kurt.kaiser | 2007-07-31 19:36:45 -0700 (Tue, 31 Jul 2007) | 3 lines Refactor syntax error display in shell and edit windows; move colorize_syntax_error() to EditorWindow; update to py3k. ........ r56685 | neal.norwitz | 2007-08-02 22:20:23 -0700 (Thu, 02 Aug 2007) | 10 lines Remove several h/w and o/s specific modules that are undocumented, obsolete, and/or not widely used: linuxaudiodev.c, sunaudiodev.c Lib/plat-sunos5/SUNAUDIODEV.py Lib/audiodev.py Tools/audiopy/audiopy Move Lib/toaiff.py to Demo. See PEP 3108 for most of the details. ........ r56686 | neal.norwitz | 2007-08-02 22:21:48 -0700 (Thu, 02 Aug 2007) | 4 lines Missed one module that should have been removed since it relied on audiodev which was removed. ........ r56748 | neal.norwitz | 2007-08-04 19:19:04 -0700 (Sat, 04 Aug 2007) | 1 line Make from X import * outside module scope an error. ........ r56750 | neal.norwitz | 2007-08-04 19:35:01 -0700 (Sat, 04 Aug 2007) | 1 line Use READONLY consistently instead of RO ........
Diffstat (limited to 'Lib/idlelib')
-rw-r--r--Lib/idlelib/EditorWindow.py16
-rw-r--r--Lib/idlelib/PyShell.py53
-rw-r--r--Lib/idlelib/ScriptBinding.py52
-rw-r--r--Lib/idlelib/run.py4
4 files changed, 53 insertions, 72 deletions
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index 501ae0f..a43929d 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -1,6 +1,7 @@
import sys
import os
import re
+import string
import imp
from itertools import count
from Tkinter import *
@@ -602,6 +603,19 @@ class EditorWindow(object):
theme = idleConf.GetOption('main','Theme','name')
self.text.config(idleConf.GetHighlight(theme, "normal"))
+ IDENTCHARS = string.ascii_letters + string.digits + "_"
+
+ def colorize_syntax_error(self, text, pos):
+ text.tag_add("ERROR", pos)
+ char = text.get(pos)
+ if char and char in self.IDENTCHARS:
+ text.tag_add("ERROR", pos + " wordstart", pos)
+ if '\n' == text.get(pos): # error at line end
+ text.mark_set("insert", pos)
+ else:
+ text.mark_set("insert", pos + "+1c")
+ text.see(pos)
+
def ResetFont(self):
"Update the text widgets' font if it is changed"
# Called from configDialog.py
@@ -1004,6 +1018,8 @@ class EditorWindow(object):
"n" * newtabwidth)
text.configure(tabs=pixels)
+### begin autoindent code ### (configuration was moved to beginning of class)
+
# If ispythonsource and guess are true, guess a good value for
# indentwidth based on file content (if possible), and if
# indentwidth != tabwidth set usetabs false.
diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py
index 567994e..70c36fc 100644
--- a/Lib/idlelib/PyShell.py
+++ b/Lib/idlelib/PyShell.py
@@ -3,7 +3,6 @@
import os
import os.path
import sys
-import string
import getopt
import re
import socket
@@ -35,7 +34,6 @@ from . import Debugger
from . import RemoteDebugger
from . import macosxSupport
-IDENTCHARS = string.ascii_letters + string.digits + "_"
LOCALHOST = '127.0.0.1'
try:
@@ -624,47 +622,30 @@ class ModifiedInterpreter(InteractiveInterpreter):
\n""" % (filename,))
def showsyntaxerror(self, filename=None):
- """Extend base class method: Add Colorizing
+ """Override Interactive Interpreter method: Use Colorizing
Color the offending position instead of printing it and pointing at it
with a caret.
"""
- text = self.tkconsole.text
- stuff = self.unpackerror()
- if stuff:
- msg, lineno, offset, line = stuff
- if lineno == 1:
- pos = "iomark + %d chars" % (offset-1)
- else:
- pos = "iomark linestart + %d lines + %d chars" % \
- (lineno-1, offset-1)
- text.tag_add("ERROR", pos)
- text.see(pos)
- char = text.get(pos)
- if char and char in IDENTCHARS:
- text.tag_add("ERROR", pos + " wordstart", pos)
- self.tkconsole.resetoutput()
- self.write("SyntaxError: %s\n" % str(msg))
- else:
- self.tkconsole.resetoutput()
- InteractiveInterpreter.showsyntaxerror(self, filename)
- self.tkconsole.showprompt()
-
- def unpackerror(self):
+ tkconsole = self.tkconsole
+ text = tkconsole.text
+ text.tag_remove("ERROR", "1.0", "end")
type, value, tb = sys.exc_info()
- ok = type is SyntaxError
- if ok:
- try:
- msg, (dummy_filename, lineno, offset, line) = value
- if not offset:
- offset = 0
- except:
- ok = 0
- if ok:
- return msg, lineno, offset, line
+ msg = value.msg or "<no detail available>"
+ lineno = value.lineno or 1
+ offset = value.offset or 0
+ if offset == 0:
+ lineno += 1 #mark end of offending line
+ if lineno == 1:
+ pos = "iomark + %d chars" % (offset-1)
else:
- return None
+ pos = "iomark linestart + %d lines + %d chars" % \
+ (lineno-1, offset-1)
+ tkconsole.colorize_syntax_error(text, pos)
+ tkconsole.resetoutput()
+ self.write("SyntaxError: %s\n" % msg)
+ tkconsole.showprompt()
def showtraceback(self):
"Extend base class method to reset output properly"
diff --git a/Lib/idlelib/ScriptBinding.py b/Lib/idlelib/ScriptBinding.py
index 485de34..47eadb2 100644
--- a/Lib/idlelib/ScriptBinding.py
+++ b/Lib/idlelib/ScriptBinding.py
@@ -23,12 +23,11 @@ import string
import tabnanny
import tokenize
import tkMessageBox
+from .EditorWindow import EditorWindow
from . import PyShell
from .configHandler import idleConf
-IDENTCHARS = string.ascii_letters + string.digits + "_"
-
indent_message = """Error: Inconsistent indentation detected!
1) Your indentation is outright incorrect (easy to fix), OR
@@ -83,7 +82,7 @@ class ScriptBinding:
self.shell = shell = self.flist.open_shell()
saved_stream = shell.get_warning_stream()
shell.set_warning_stream(shell.stderr)
- f = open(filename, 'r')
+ f = file(filename, 'r')
source = f.read()
f.close()
if '\r' in source:
@@ -91,40 +90,25 @@ class ScriptBinding:
source = re.sub(r"\r", "\n", source)
if source and source[-1] != '\n':
source = source + '\n'
- text = self.editwin.text
+ editwin = self.editwin
+ text = editwin.text
text.tag_remove("ERROR", "1.0", "end")
try:
- try:
- # If successful, return the compiled code
- return compile(source, filename, "exec")
- except (SyntaxError, OverflowError) as err:
- try:
- msg, (errorfilename, lineno, offset, line) = err.args
- if not errorfilename:
- err.args = msg, (filename, lineno, offset, line)
- err.filename = filename
- self.colorize_syntax_error(msg, lineno, offset)
- except:
- msg = str(err)
- self.errorbox("Syntax error",
- "There's an error in your program:\n" + msg)
- return False
+ # If successful, return the compiled code
+ return compile(source, filename, "exec")
+ except (SyntaxError, OverflowError) as value:
+ msg = value.msg or "<no detail available>"
+ lineno = value.lineno or 1
+ offset = value.offset or 0
+ if offset == 0:
+ lineno += 1 #mark end of offending line
+ pos = "0.0 + %d lines + %d chars" % (lineno-1, offset-1)
+ editwin.colorize_syntax_error(text, pos)
+ self.errorbox("SyntaxError", "%-20s" % msg)
+ return False
finally:
shell.set_warning_stream(saved_stream)
- def colorize_syntax_error(self, msg, lineno, offset):
- text = self.editwin.text
- pos = "0.0 + %d lines + %d chars" % (lineno-1, offset-1)
- text.tag_add("ERROR", pos)
- char = text.get(pos)
- if char and char in IDENTCHARS:
- text.tag_add("ERROR", pos + " wordstart", pos)
- if '\n' == text.get(pos): # error at line end
- text.mark_set("insert", pos)
- else:
- text.mark_set("insert", pos + "+1c")
- text.see(pos)
-
def run_module_event(self, event):
"""Run the module after setting up the environment.
@@ -199,10 +183,10 @@ class ScriptBinding:
icon=tkMessageBox.QUESTION,
type=tkMessageBox.OKCANCEL,
default=tkMessageBox.OK,
- master=self.editwin.text)
+ parent=self.editwin.text)
return mb.show()
def errorbox(self, title, message):
# XXX This should really be a function of EditorWindow...
- tkMessageBox.showerror(title, message, master=self.editwin.text)
+ tkMessageBox.showerror(title, message, parent=self.editwin.text)
self.editwin.text.focus_set()
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index 614875a..c1bc8eb 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -149,14 +149,14 @@ def print_exception():
typ, val, tb = excinfo = sys.exc_info()
sys.last_type, sys.last_value, sys.last_traceback = excinfo
tbe = traceback.extract_tb(tb)
- print('\nTraceback (most recent call last):', file=efile)
+ print('Traceback (most recent call last):', file=efile)
exclude = ("run.py", "rpc.py", "threading.py", "Queue.py",
"RemoteDebugger.py", "bdb.py")
cleanup_traceback(tbe, exclude)
traceback.print_list(tbe, file=efile)
lines = traceback.format_exception_only(typ, val)
for line in lines:
- print(line, end=' ', file=efile)
+ print(line, end='', file=efile)
def cleanup_traceback(tb, exclude):
"Remove excluded traces from beginning/end of tb; get cached lines"