Kaydet (Commit) 92b5ca37 authored tarafından Kurt B. Kaiser's avatar Kurt B. Kaiser

M ColorDelegator.py

M PyShell.py
M ScriptBinding.py

1. Update ScriptBinding.py to highlight a syntax error in the Edit window,
   and place the cursor on the error.  Add a syntax check to the
   Run Script event instead of waiting until the script tries to run and
   raises a syntax error in the shell, forcing the user to navigate back
   to the Edit window to fix it.
2. Modify tag_config's appropriately in PyShell.py and ColorDelegator.py
3. Some minor clean-up in ScriptBinding.py
üst 51cd8a2d
...@@ -63,6 +63,7 @@ class ColorDelegator(Delegator): ...@@ -63,6 +63,7 @@ class ColorDelegator(Delegator):
"SYNC": {'background':None,'foreground':None}, "SYNC": {'background':None,'foreground':None},
"TODO": {'background':None,'foreground':None}, "TODO": {'background':None,'foreground':None},
"BREAK": idleConf.GetHighlight(theme, "break"), "BREAK": idleConf.GetHighlight(theme, "break"),
"ERROR": idleConf.GetHighlight(theme, "error"),
# The following is used by ReplaceDialog: # The following is used by ReplaceDialog:
"hit": idleConf.GetHighlight(theme, "hit"), "hit": idleConf.GetHighlight(theme, "hit"),
} }
......
...@@ -261,7 +261,6 @@ class ModifiedColorDelegator(ColorDelegator): ...@@ -261,7 +261,6 @@ class ModifiedColorDelegator(ColorDelegator):
"stdout": idleConf.GetHighlight(theme, "stdout"), "stdout": idleConf.GetHighlight(theme, "stdout"),
"stderr": idleConf.GetHighlight(theme, "stderr"), "stderr": idleConf.GetHighlight(theme, "stderr"),
"console": idleConf.GetHighlight(theme, "console"), "console": idleConf.GetHighlight(theme, "console"),
"ERROR": idleConf.GetHighlight(theme, "error"),
None: idleConf.GetHighlight(theme, "normal"), None: idleConf.GetHighlight(theme, "normal"),
}) })
......
...@@ -3,13 +3,13 @@ ...@@ -3,13 +3,13 @@
This adds the following commands: This adds the following commands:
- Check module does a full syntax check of the current module. - Check module does a full syntax check of the current module.
It also runs the tabnanny to catch any inconsistent tabs. It also runs the tabnanny to catch any inconsistent tabs.
- Run module executes the module's code in the __main__ namespace. The window - Run module executes the module's code in the __main__ namespace. The window
must have been saved previously. The module is added to sys.modules, and is must have been saved previously. The module is added to sys.modules, and is
also added to the __main__ namespace. also added to the __main__ namespace.
XXX Redesign this interface (yet again) as follows: XXX GvR Redesign this interface (yet again) as follows:
- Present a dialog box for ``Run script'' - Present a dialog box for ``Run script''
...@@ -17,8 +17,14 @@ XXX Redesign this interface (yet again) as follows: ...@@ -17,8 +17,14 @@ XXX Redesign this interface (yet again) as follows:
""" """
import re
import string
import tabnanny
import tokenize
import tkMessageBox import tkMessageBox
IDENTCHARS = string.ascii_letters + string.digits + "_"
indent_message = """Error: Inconsistent indentation detected! indent_message = """Error: Inconsistent indentation detected!
This means that either: This means that either:
...@@ -32,13 +38,14 @@ To fix case 2, change all tabs to spaces by using Select All followed \ ...@@ -32,13 +38,14 @@ To fix case 2, change all tabs to spaces by using Select All followed \
by Untabify Region (both in the Edit menu).""" by Untabify Region (both in the Edit menu)."""
# XXX TBD Implement stop-execution KBK 11Jun02 # XXX 11Jun02 KBK TBD Implement stop-execution
class ScriptBinding: class ScriptBinding:
menudefs = [ menudefs = [
('run', [None, ('run', [None,
('Check module', '<<check-module>>'), ('Check Module', '<<check-module>>'),
('Run script', '<<run-script>>'), ]), ] ('Run Script', '<<run-script>>'), ]), ]
def __init__(self, editwin): def __init__(self, editwin):
self.editwin = editwin self.editwin = editwin
...@@ -53,12 +60,9 @@ class ScriptBinding: ...@@ -53,12 +60,9 @@ class ScriptBinding:
return return
if not self.tabnanny(filename): if not self.tabnanny(filename):
return return
if not self.checksyntax(filename): self.checksyntax(filename)
return
def tabnanny(self, filename): def tabnanny(self, filename):
import tabnanny
import tokenize
f = open(filename, 'r') f = open(filename, 'r')
try: try:
tabnanny.process_tokens(tokenize.generate_tokens(f.readline)) tabnanny.process_tokens(tokenize.generate_tokens(f.readline))
...@@ -77,31 +81,46 @@ class ScriptBinding: ...@@ -77,31 +81,46 @@ class ScriptBinding:
source = f.read() source = f.read()
f.close() f.close()
if '\r' in source: if '\r' in source:
import re
source = re.sub(r"\r\n", "\n", source) source = re.sub(r"\r\n", "\n", source)
if source and source[-1] != '\n': if source and source[-1] != '\n':
source = source + '\n' source = source + '\n'
try: try:
compile(source, filename, "exec") # If successful, return the compiled code
return compile(source, filename, "exec")
except (SyntaxError, OverflowError), err: except (SyntaxError, OverflowError), err:
try: try:
msg, (errorfilename, lineno, offset, line) = err msg, (errorfilename, lineno, offset, line) = err
if not errorfilename: if not errorfilename:
err.args = msg, (filename, lineno, offset, line) err.args = msg, (filename, lineno, offset, line)
err.filename = filename err.filename = filename
self.colorize_syntax_error(msg, lineno, offset)
except: except:
lineno = None
msg = "*** " + str(err) msg = "*** " + str(err)
if lineno:
self.editwin.gotoline(lineno)
self.errorbox("Syntax error", self.errorbox("Syntax error",
"There's an error in your program:\n" + msg) "There's an error in your program:\n" + msg)
return True return False
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_script_event(self, event): def run_script_event(self, event):
"Check syntax, if ok run the script in the shell top level"
filename = self.getfilename() filename = self.getfilename()
if not filename: if not filename:
return return
code = self.checksyntax(filename)
if not code:
return
flist = self.editwin.flist flist = self.editwin.flist
shell = flist.open_shell() shell = flist.open_shell()
interp = shell.interp interp = shell.interp
...@@ -116,11 +135,10 @@ class ScriptBinding: ...@@ -116,11 +135,10 @@ class ScriptBinding:
from os.path import basename as _basename from os.path import basename as _basename
if (not _sys.argv or if (not _sys.argv or
_basename(_sys.argv[0]) != _basename(_filename)): _basename(_sys.argv[0]) != _basename(_filename)):
# XXX 25 July 2002 KBK should this be sys.argv not _sys.argv?
_sys.argv = [_filename] _sys.argv = [_filename]
del _filename, _sys, _basename del _filename, _sys, _basename
\n""" % `filename`) \n""" % `filename`)
interp.execfile(filename) interp.runcode(code)
def getfilename(self): def getfilename(self):
# Logic to make sure we have a saved filename # Logic to make sure we have a saved filename
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment