diff options
Diffstat (limited to 'Lib/idlelib')
| -rw-r--r-- | Lib/idlelib/EditorWindow.py | 16 | ||||
| -rw-r--r-- | Lib/idlelib/PyShell.py | 53 | ||||
| -rw-r--r-- | Lib/idlelib/ScriptBinding.py | 52 | ||||
| -rw-r--r-- | Lib/idlelib/run.py | 4 | 
4 files changed, 53 insertions, 72 deletions
diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py index 501ae0f412..a43929dea6 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 567994e7b1..70c36fc8a4 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 485de34933..47eadb24d5 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 614875a86a..c1bc8eb72b 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"  | 
