[Python-3000-checkins] r56638 - python/branches/p3yk/Lib/idlelib/EditorWindow.py python/branches/p3yk/Lib/idlelib/PyShell.py python/branches/p3yk/Lib/idlelib/ScriptBinding.py
kurt.kaiser
python-3000-checkins at python.org
Wed Aug 1 04:36:47 CEST 2007
Author: kurt.kaiser
Date: Wed Aug 1 04:36:45 2007
New Revision: 56638
Modified:
python/branches/p3yk/Lib/idlelib/EditorWindow.py
python/branches/p3yk/Lib/idlelib/PyShell.py
python/branches/p3yk/Lib/idlelib/ScriptBinding.py
Log:
Refactor syntax error display in shell and edit windows; move
colorize_syntax_error() to EditorWindow; update to py3k.
Modified: python/branches/p3yk/Lib/idlelib/EditorWindow.py
==============================================================================
--- python/branches/p3yk/Lib/idlelib/EditorWindow.py (original)
+++ python/branches/p3yk/Lib/idlelib/EditorWindow.py Wed Aug 1 04:36:45 2007
@@ -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 @@
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 @@
"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.
Modified: python/branches/p3yk/Lib/idlelib/PyShell.py
==============================================================================
--- python/branches/p3yk/Lib/idlelib/PyShell.py (original)
+++ python/branches/p3yk/Lib/idlelib/PyShell.py Wed Aug 1 04:36:45 2007
@@ -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 RemoteDebugger
from . import macosxSupport
-IDENTCHARS = string.ascii_letters + string.digits + "_"
LOCALHOST = '127.0.0.1'
try:
@@ -624,47 +622,30 @@
\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"
Modified: python/branches/p3yk/Lib/idlelib/ScriptBinding.py
==============================================================================
--- python/branches/p3yk/Lib/idlelib/ScriptBinding.py (original)
+++ python/branches/p3yk/Lib/idlelib/ScriptBinding.py Wed Aug 1 04:36:45 2007
@@ -23,12 +23,11 @@
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 @@
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 @@
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 @@
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()
More information about the Python-3000-checkins
mailing list