Thread: [Pydev-cvs] org.python.pydev/src/org/python/pydev/parser PyParser.java,1.8,1.9
Brought to you by:
fabioz
From: Fabio Z. <fa...@us...> - 2004-07-22 16:15:02
|
Update of /cvsroot/pydev/org.python.pydev/src/org/python/pydev/parser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6070/src/org/python/pydev/parser Modified Files: PyParser.java Log Message: event.getText could return null on Ctrl+X Index: PyParser.java =================================================================== RCS file: /cvsroot/pydev/org.python.pydev/src/org/python/pydev/parser/PyParser.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** PyParser.java 2 Jul 2004 02:50:38 -0000 1.8 --- PyParser.java 22 Jul 2004 16:14:53 -0000 1.9 *************** *** 27,191 **** import org.python.pydev.editor.PyEdit; - /** ! * PyParser uses org.python.parser to parse the document ! * (lexical analysis) ! * It is attached to PyEdit (a view), and it listens to document changes ! * On every document change, the syntax tree is regenerated ! * The reparsing of the document is done on a ParsingThread * ! * Clients that need to know when new parse tree has been generated ! * should register as parseListeners. */ - public class PyParser { - - IDocument document; - PyEdit editorView; - SimpleNode root = null; // Document root - - IDocumentListener documentListener; // listens to changes in the document - ArrayList parserListeners; // listeners that get notified - - final static int PARSE_LATER_INTERVAL = 20; // 20 = 2 seconds ! boolean parseNow = false; // synchronized access by ParsingThread ! /* counter how to parse. ! * 0 means do not parse, > 0 means wait this many loops in main thread ! */ ! int parseLater = 0; // synchronized access by ParsingThread ! public PyParser(PyEdit editorView) { ! this.editorView = editorView; ! parserListeners = new ArrayList(); ! ParsingThread.getParsingThread().register(this); ! } ! public void parseNow() { ! parseNow = true; ! } ! ! public void parseLater() { ! parseNow = false; ! parseLater = PARSE_LATER_INTERVAL; // delay of 1 second ! } ! public void dispose() { ! // remove the listeners ! if (document != null) ! document.removeDocumentListener(documentListener); ! parserListeners.clear(); ! ParsingThread.getParsingThread().unregister(this); ! } ! ! public SimpleNode getRoot() { ! return root; ! } ! public void setDocument(IDocument document) { ! // Cleans up old listeners ! if (this.document != null) { ! document.removeDocumentListener(documentListener); ! } ! ! // Set up new listener ! this.document = document; ! if (document == null) { ! System.err.println("No document in PyParser::setDocument?"); ! return; ! } ! final PyParser parser = this; ! documentListener = new IDocumentListener() { ! public void documentChanged(DocumentEvent event) { ! if (event.getText().indexOf("\n") == -1) ! // carriage return in changed text means parse now, anything else means parse later ! parseLater(); ! else ! parseNow(); ! } ! public void documentAboutToBeChanged(DocumentEvent event) {} ! }; ! document.addDocumentListener(documentListener); ! // Reparse document on the initial set ! parseNow(); ! } ! /** stock listener implementation */ ! public void addParseListener(IParserListener listener) { ! Assert.isNotNull(listener); ! if (! parserListeners.contains(listener)) ! parserListeners.add(listener); ! } ! ! /** stock listener implementation */ ! public void removeParseListener(IParserListener listener) { ! Assert.isNotNull(listener); ! parserListeners.remove(listener); ! } ! /** ! * stock listener implementation ! * event is fired whenever we get a new root ! */ ! protected void fireParserChanged(SimpleNode root) { ! this.root = root; ! if (parserListeners.size() > 0) { ! ArrayList list= new ArrayList(parserListeners); ! Iterator e= list.iterator(); ! while (e.hasNext()) { ! IParserListener l= (IParserListener) e.next(); ! l.parserChanged(root); ! } ! } ! } ! ! /** ! * stock listener implementation ! * event is fired when parse fails ! */ ! protected void fireParserError(Throwable error) { ! if (parserListeners.size() > 0) { ! ArrayList list= new ArrayList(parserListeners); ! Iterator e= list.iterator(); ! while (e.hasNext()) { ! IParserListener l= (IParserListener) e.next(); ! l.parserError(error); ! } ! } ! } ! /** ! * Parses the document, generates error annotations ! */ ! void reparseDocument() { ! // create a stream with document's data ! StringReader inString = new StringReader(document.get()); ! ReaderCharStream in = new ReaderCharStream(inString); ! IParserHost host = new CompilerAPI(); ! ! PythonGrammar g1 = new PythonGrammar((CharStream)null, (IParserHost)null); ! ! PythonGrammar grammar = new PythonGrammar(in, host); ! ! IEditorInput input = editorView.getEditorInput(); ! if (input == null) ! return; ! IFile original= (input instanceof IFileEditorInput) ? ((IFileEditorInput) input).getFile() : null; ! try { ! SimpleNode newRoot = grammar.file_input(); // parses the file ! if (original != null) ! original.deleteMarkers(IMarker.PROBLEM, false, 1); ! fireParserChanged(newRoot); ! } catch (ParseException parseErr) { ! fireParserError(parseErr); ! } ! catch (TokenMgrError tokenErr) { ! fireParserError(tokenErr); ! }catch (Exception e) { ! System.err.println("Unexpected parse error"); ! e.printStackTrace(); ! } ! } } --- 27,197 ---- import org.python.pydev.editor.PyEdit; /** ! * PyParser uses org.python.parser to parse the document (lexical analysis) It ! * is attached to PyEdit (a view), and it listens to document changes On every ! * document change, the syntax tree is regenerated The reparsing of the document ! * is done on a ParsingThread * ! * Clients that need to know when new parse tree has been generated should ! * register as parseListeners. */ public class PyParser { ! IDocument document; ! PyEdit editorView; ! SimpleNode root = null; // Document root ! IDocumentListener documentListener; // listens to changes in the document ! ArrayList parserListeners; // listeners that get notified ! final static int PARSE_LATER_INTERVAL = 20; // 20 = 2 seconds ! boolean parseNow = false; // synchronized access by ParsingThread ! /* ! * counter how to parse. 0 means do not parse, > 0 means wait this many ! * loops in main thread ! */ ! int parseLater = 0; // synchronized access by ParsingThread ! ! public PyParser(PyEdit editorView) { ! this.editorView = editorView; ! parserListeners = new ArrayList(); ! ParsingThread.getParsingThread().register(this); ! } ! ! public void parseNow() { ! parseNow = true; ! } ! ! public void parseLater() { ! parseNow = false; ! parseLater = PARSE_LATER_INTERVAL; // delay of 1 second ! } ! ! public void dispose() { ! // remove the listeners ! if (document != null) ! document.removeDocumentListener(documentListener); ! parserListeners.clear(); ! ParsingThread.getParsingThread().unregister(this); ! } ! ! public SimpleNode getRoot() { ! return root; ! } ! ! public void setDocument(IDocument document) { ! // Cleans up old listeners ! if (this.document != null) { ! document.removeDocumentListener(documentListener); ! } ! ! // Set up new listener ! this.document = document; ! if (document == null) { ! System.err.println("No document in PyParser::setDocument?"); ! return; ! } ! final PyParser parser = this; ! documentListener = new IDocumentListener() { ! public void documentChanged(DocumentEvent event) { ! if (event == null || event.getText() == null || event.getText().indexOf("\n") == -1) { ! // carriage return in changed text means parse now, anything ! // else means parse later ! parseLater(); ! } else { ! parseNow(); ! } ! } ! ! public void documentAboutToBeChanged(DocumentEvent event) { ! } ! }; ! document.addDocumentListener(documentListener); ! // Reparse document on the initial set ! parseNow(); ! } ! ! /** stock listener implementation */ ! public void addParseListener(IParserListener listener) { ! Assert.isNotNull(listener); ! if (!parserListeners.contains(listener)) ! parserListeners.add(listener); ! } ! ! /** stock listener implementation */ ! public void removeParseListener(IParserListener listener) { ! Assert.isNotNull(listener); ! parserListeners.remove(listener); ! } ! ! /** ! * stock listener implementation event is fired whenever we get a new root ! */ ! protected void fireParserChanged(SimpleNode root) { ! this.root = root; ! if (parserListeners.size() > 0) { ! ArrayList list = new ArrayList(parserListeners); ! Iterator e = list.iterator(); ! while (e.hasNext()) { ! IParserListener l = (IParserListener) e.next(); ! l.parserChanged(root); ! } ! } ! } ! ! /** ! * stock listener implementation event is fired when parse fails ! */ ! protected void fireParserError(Throwable error) { ! if (parserListeners.size() > 0) { ! ArrayList list = new ArrayList(parserListeners); ! Iterator e = list.iterator(); ! while (e.hasNext()) { ! IParserListener l = (IParserListener) e.next(); ! l.parserError(error); ! } ! } ! } ! ! /** ! * Parses the document, generates error annotations ! */ ! void reparseDocument() { ! // create a stream with document's data ! StringReader inString = new StringReader(document.get()); ! ReaderCharStream in = new ReaderCharStream(inString); ! IParserHost host = new CompilerAPI(); ! ! PythonGrammar g1 = new PythonGrammar((CharStream) null, ! (IParserHost) null); ! ! PythonGrammar grammar = new PythonGrammar(in, host); ! ! IEditorInput input = editorView.getEditorInput(); ! if (input == null) ! return; ! IFile original = (input instanceof IFileEditorInput) ? ((IFileEditorInput) input) ! .getFile() ! : null; ! try { ! SimpleNode newRoot = grammar.file_input(); // parses the file ! if (original != null) ! original.deleteMarkers(IMarker.PROBLEM, false, 1); ! fireParserChanged(newRoot); ! } catch (ParseException parseErr) { ! fireParserError(parseErr); ! } catch (TokenMgrError tokenErr) { ! fireParserError(tokenErr); ! } catch (Exception e) { ! System.err.println("Unexpected parse error"); ! e.printStackTrace(); ! } ! } } *************** *** 195,277 **** * Singleton. * ! * Current algorithm is: ! * - if parseLater is called, parse 10 main loops later ! * - if parseNow is called, parse immediately */ class ParsingThread extends Thread { - - private static ParsingThread thread = null; - private static ArrayList parsers = new ArrayList(); // synchronized access only - - private boolean done = false; - - private ParsingThread() { - setName("Pydev parsing thread"); - } - - static public ParsingThread getParsingThread() { - synchronized(ParsingThread.class) { - if (thread == null) { - thread = new ParsingThread(); - thread.start(); - } - return thread; - } - } ! public void register(PyParser parser) { ! synchronized(parsers) { ! parsers.add(parser); ! } ! } ! ! public void unregister(PyParser parser) { ! synchronized(parsers) { ! parser.parseNow = false; ! parser.parseLater = 0; ! parsers.remove(parser); ! if (parsers.size() == 0) { ! done = true; ! thread = null; ! } ! } ! } ! ! public void run() { ! // wait for document change, and reparse ! try { ! while (!done) { ! ArrayList parseUs = new ArrayList(); ! ! // Populate the list of parsers waiting to be parsed ! synchronized(parsers) { ! Iterator i = parsers.iterator(); ! while (i.hasNext()) { ! PyParser p = (PyParser)i.next(); ! p.parseLater--; ! if (p.parseLater == 1) ! p.parseNow = true; ! if (p.parseNow) ! parseUs.add(p); ! } ! } ! ! // Now parse the queue ! Iterator i = parseUs.iterator(); ! while (i.hasNext()) { ! PyParser p = (PyParser)i.next(); ! if (p.parseNow) { ! p.parseNow = false; ! p.parseLater = 0; ! p.reparseDocument(); ! } ! } ! sleep(100); // sleep a bit, to avoid flicker ! } ! } catch (InterruptedException e) { ! } finally { ! if (thread == this) ! thread = null; ! } ! } ! } --- 201,285 ---- * Singleton. * ! * Current algorithm is: - if parseLater is called, parse 10 main loops later - ! * if parseNow is called, parse immediately */ + class ParsingThread extends Thread { ! private static ParsingThread thread = null; ! ! private static ArrayList parsers = new ArrayList(); // synchronized access ! // only ! ! private boolean done = false; ! ! private ParsingThread() { ! setName("Pydev parsing thread"); ! } ! ! static public ParsingThread getParsingThread() { ! synchronized (ParsingThread.class) { ! if (thread == null) { ! thread = new ParsingThread(); ! thread.start(); ! } ! return thread; ! } ! } ! ! public void register(PyParser parser) { ! synchronized (parsers) { ! parsers.add(parser); ! } ! } ! ! public void unregister(PyParser parser) { ! synchronized (parsers) { ! parser.parseNow = false; ! parser.parseLater = 0; ! parsers.remove(parser); ! if (parsers.size() == 0) { ! done = true; ! thread = null; ! } ! } ! } ! ! public void run() { ! // wait for document change, and reparse ! try { ! while (!done) { ! ArrayList parseUs = new ArrayList(); ! ! // Populate the list of parsers waiting to be parsed ! synchronized (parsers) { ! Iterator i = parsers.iterator(); ! while (i.hasNext()) { ! PyParser p = (PyParser) i.next(); ! p.parseLater--; ! if (p.parseLater == 1) ! p.parseNow = true; ! if (p.parseNow) ! parseUs.add(p); ! } ! } ! ! // Now parse the queue ! Iterator i = parseUs.iterator(); ! while (i.hasNext()) { ! PyParser p = (PyParser) i.next(); ! if (p.parseNow) { ! p.parseNow = false; ! p.parseLater = 0; ! p.reparseDocument(); ! } ! } ! sleep(100); // sleep a bit, to avoid flicker ! } ! } catch (InterruptedException e) { ! } finally { ! if (thread == this) ! thread = null; ! } ! } ! } \ No newline at end of file |