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) {
|