[Pydev-cvs] org.python.pydev/src/org/python/pydev/parser PyParser.java,1.3,1.4
Brought to you by:
fabioz
From: Aleksandar T. <at...@us...> - 2004-03-26 23:02:13
|
Update of /cvsroot/pydev/org.python.pydev/src/org/python/pydev/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16474/src/org/python/pydev/parser Modified Files: PyParser.java Log Message: Better parser scheduling. Now parser will reparse: - 2 seconds after the last typing - immediately after a newline Index: PyParser.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/parser/PyParser.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** PyParser.java 31 Dec 2003 19:35:31 -0000 1.3 --- PyParser.java 26 Mar 2004 22:51:12 -0000 1.4 *************** *** 80,85 **** documentListener = new IDocumentListener() { public void documentChanged(DocumentEvent event) { ! if (parseOnThread == true) ! parsingThread.documentChanged(); else reparseDocument(); --- 80,90 ---- documentListener = new IDocumentListener() { public void documentChanged(DocumentEvent event) { ! if (parseOnThread == true) { ! if (event.getText().indexOf("\n") == -1) ! // carriage return in changed text means parse now, anything else means parse later ! parsingThread.parseLater(); ! else ! parsingThread.parseNow(); ! } else reparseDocument(); *************** *** 91,95 **** parsingThread.start(); if (parseOnThread == true) ! parsingThread.documentChanged(); else reparseDocument(); --- 96,100 ---- parsingThread.start(); if (parseOnThread == true) ! parsingThread.parseNow(); else reparseDocument(); *************** *** 174,185 **** /** ! * Utility thread that reparses document on regular intervals ! * it waits for document to get changed ! * after each reparse, thread waits a bit to avoid flicker */ class ParsingThread extends Thread { PyParser parser; - boolean docChanged = false; boolean stayingAlive = true; ParsingThread(PyParser parser) { --- 179,198 ---- /** ! * Utility thread that reparses document as needed. ! * ! * Current algorithm is: ! * - if parseLater is called, parse 10 main loops later ! * - if parseNow is called, parse immediately */ class ParsingThread extends Thread { PyParser parser; boolean stayingAlive = true; + boolean parseNow = false; + /* counter how to parse. + * 0 means do not parse, > 0 means wait this many loops in main thread + */ + int parseLater = 0; + + final static int PARSE_LATER_INTERVAL = 20; // 20 = 2 seconds ParsingThread(PyParser parser) { *************** *** 187,201 **** } public synchronized void waitForChange() throws InterruptedException { ! if (docChanged == false) wait(); - docChanged = false; } ! public synchronized void documentChanged() { ! docChanged = true; notify(); } public synchronized void diePlease() { stayingAlive = false; --- 200,227 ---- } + /** + * + * @throws InterruptedException + */ public synchronized void waitForChange() throws InterruptedException { ! if (!parseNow && parseLater == 0) wait(); } ! public synchronized void parseNow() { ! parseNow = true; ! notify(); ! } ! ! public synchronized void parseLater() { ! parseLater = PARSE_LATER_INTERVAL; // delay of 1 second notify(); } + public synchronized void doNotParse() { + parseLater = 0; + parseNow = false; + } + public synchronized void diePlease() { stayingAlive = false; *************** *** 207,218 **** try { while (stayingAlive) { ! waitForChange(); ! sleep(2000); // sleep a bit, to avoid flicker ! synchronized(this) { ! docChanged = false; ! } ! if (stayingAlive == true) { // could have been woken up by diePlease() ! parser.reparseDocument(); } } } catch (InterruptedException e) { --- 233,246 ---- try { while (stayingAlive) { ! parseLater--; ! if (parseLater == 1) ! parseNow(); ! if (parseNow) { ! doNotParse(); ! if (stayingAlive) ! parser.reparseDocument(); } + sleep(100); // sleep a bit, to avoid flicker + waitForChange(); } } catch (InterruptedException e) { |