Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: Rejected: [cdt-patch] Indexing show stopper parser patch



John Camelon/Ottawa/IBM wrote on 02/05/2004 10:49:32 AM:

> Adding this will cause the error handling necessary to build the
> Outline View on imperfect files to break.  

> IProblem support in CDT 2.0 shall address the logging and client
> control over handling particular errors.  

>
> Why is the Indexer using the result of parse() to determine whether
> or not everything it has received is OK?  


Strictly for debugging reasons - we log files that didn't get a clean parse. It has no bearing on what actually makes it into the index (which is everything that the parser sends the indexer's way). The addition of index error tasks for 2.0 (which will use IProblem) will allow the user to see exactly went wrong in the parse of a file.

>
> JohnC
> www.eclipse.org/cdt

>
> cdt-patch-admin@xxxxxxxxxxx wrote on 02/05/2004 05:11:31 AM:
>
> >
> > I've filed a PR for this 51232, but in a nutshell every now and then
> > the Parser's translationUnit call will throw an unexpected exception
> > (these cases to be investigated as a secondary activity) which then
> > causes all components which are expecting a binary return of parsed/
> > notparsed from the Parser.java->parse() to fail.  The indexer is
> > one of these components unfortunately and when this occurs the entire
> > index is considered empty.


This is not quite true. You can have a failed parse and still have lots of elements in your index. If you turn on the indexer tracing (debug/indexer) you can see the actual elements that get put into the index as well as the overall parse result.

> >
> > This patch wraps the translationUnit() call in parse() with an
> > exception blanket and "logs" these failures and turns them into
> > normall (well expected) parse failures.
> >
> > This is acutally a significant problem in several code bases I'm
> > looking at.  I'll hopefully generate some good test cases as well.
> >
> > ChangeLog
> > - Wrap the call to translationUnit() with an exception clause to
> >   ensure that we return sane parsed/notparsed values back to the
> >   users of the Parser.
> >
> > --- PATCH START ---
> > Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
> > ===================================================================
> > RCS
> > file: /home/tools/org.eclipse.cdt.
> core/parser/org/eclipse/cdt/internal/core/p
> > arser/Parser.java,v
> > retrieving revision 1.120.2.4
> > diff -u -r1.120.2.4 Parser.java
> > --- parser/org/eclipse/cdt/internal/core/parser/Parser.java   5 Nov 2003
> > 18:14:51 -0000   1.120.2.4
> > +++ parser/org/eclipse/cdt/internal/core/parser/Parser.java   5 Feb 2004
> > 11:55:47 -0000
> > @@ -136,7 +136,14 @@
> >      public boolean parse()
> >      {
> >          long startTime = System.currentTimeMillis();
> > -        translationUnit();
> > +        try {
> > +         translationUnit();
> > +        } catch(Exception ex) {
> > +           /* Critical error condition which should be logged */
> > +           ex.printStackTrace();
> > +           parsePassed = false;  
> > +        }
> > +        
> >          // For the debuglog to take place, you have to call
> >          // Util.setDebugging(true);
> >          // Or set debug to true in the core plugin preference
> > Index: search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java
> > ===================================================================
> > RCS
> > file: /home/tools/org.eclipse.cdt.
> core/search/org/eclipse/cdt/core/search/Bas
> > icSearchResultCollector.java,v
> > retrieving revision 1.8
> > diff -u -r1.8 BasicSearchResultCollector.java
> > --- search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java   23
> > Sep 2003 13:54:21 -0000   1.8
> > +++ search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java   5
> > Feb 2004 11:55:47 -0000
> > @@ -53,6 +53,14 @@
> >   * Window>Preferences>Java>Code Generation>Code and Comments
> >   */
> >  public class BasicSearchResultCollector implements
> ICSearchResultCollector {
> > +   IProgressMonitor fProgressMonitor = null;
> > +
> > +   public BasicSearchResultCollector() {
> > +   }
> > +  
> > +   public BasicSearchResultCollector(IProgressMonitor monitor) {
> > +      fProgressMonitor = monitor;
> > +   }
> >  
> >     public void aboutToStart() {
> >        results = new HashSet();
> > @@ -62,7 +70,7 @@
> >     }
> >    
> >     public IProgressMonitor getProgressMonitor() {
> > -      return null;
> > +      return fProgressMonitor;
> >     }
> >  
> >     public IMatch createMatch(Object fileResource, int start, int end,
> > ISourceElementCallbackDelegate node ) throws CoreException
> > Index:
> search/org/eclipse/cdt/internal/core/search/processing/JobManager.java
> > ===================================================================
> > RCS
> > file: /home/tools/org.eclipse.cdt.
> core/search/org/eclipse/cdt/internal/core/s
> > earch/processing/JobManager.java,v
> > retrieving revision 1.5.2.1
> > diff -u -r1.5.2.1 JobManager.java
> > --- search/org/eclipse/cdt/internal/core/search/processing/JobManager.java
> >    27 Oct 2003 20:44:57 -0000   1.5.2.1
> > +++ search/org/eclipse/cdt/internal/core/search/processing/JobManager.java
> >    5 Feb 2004 11:55:48 -0000
> > @@ -268,7 +268,14 @@
> >                          previousJob
> > = currentJob;
> >                       }
> >                       try {
> > -                        Thread.sleep
> > (50);
> > +                        //Wake up
> > less often if there is a long queue ahead
> > +                        if
> > (awaitingWork < 1000) {
> > +                        
> >    Thread.sleep(50);
> > +                        } else if
> > (awaitingWork < 5000) {
> > +                        
> >    Thread.sleep(500);
> > +                        } else {
> > +                        
> >    Thread.sleep(1000);
> > +                        }
> >                       } catch
> > (InterruptedException e) {
> >                       }
> >                    }
> >
> > --- PATCH END ---
> >  
> > Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
> > ===================================================================
> > RCS file: /home/tools/org.eclipse.cdt.
> > core/parser/org/eclipse/cdt/internal/core/parser/Parser.java,v
> > retrieving revision 1.120.2.4
> > diff -u -r1.120.2.4 Parser.java
> > --- parser/org/eclipse/cdt/internal/core/parser/Parser.java   5 Nov
> > 2003 18:14:51 -0000   1.120.2.4
> > +++ parser/org/eclipse/cdt/internal/core/parser/Parser.java   5 Feb
> > 2004 11:55:47 -0000
> > @@ -136,7 +136,14 @@
> >      public boolean parse()
> >      {
> >          long startTime = System.currentTimeMillis();
> > -        translationUnit();
> > +        try {
> > +         translationUnit();
> > +        } catch(Exception ex) {
> > +           /* Critical error condition which should be logged */
> > +           ex.printStackTrace();
> > +           parsePassed = false;  
> > +        }
> > +        
> >          // For the debuglog to take place, you have to call
> >          // Util.setDebugging(true);
> >          // Or set debug to true in the core plugin preference
> > Index: search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java
> > ===================================================================
> > RCS file: /home/tools/org.eclipse.cdt.
> > core/search/org/eclipse/cdt/core/search/BasicSearchResultCollector.java,v
> > retrieving revision 1.8
> > diff -u -r1.8 BasicSearchResultCollector.java
> > --- search/org/eclipse/cdt/core/search/BasicSearchResultCollector.
> > java   23 Sep 2003 13:54:21 -0000   1.8
> > +++ search/org/eclipse/cdt/core/search/BasicSearchResultCollector.
> > java   5 Feb 2004 11:55:47 -0000
> > @@ -53,6 +53,14 @@
> >   * Window>Preferences>Java>Code Generation>Code and Comments
> >   */
> >  public class BasicSearchResultCollector implements
> ICSearchResultCollector {
> > +   IProgressMonitor fProgressMonitor = null;
> > +
> > +   public BasicSearchResultCollector() {
> > +   }
> > +  
> > +   public BasicSearchResultCollector(IProgressMonitor monitor) {
> > +      fProgressMonitor = monitor;
> > +   }
> >  
> >     public void aboutToStart() {
> >        results = new HashSet();
> > @@ -62,7 +70,7 @@
> >     }
> >    
> >     public IProgressMonitor getProgressMonitor() {
> > -      return null;
> > +      return fProgressMonitor;
> >     }
> >  
> >     public IMatch createMatch(Object fileResource, int start, int
> > end, ISourceElementCallbackDelegate node ) throws CoreException
> > Index:
> search/org/eclipse/cdt/internal/core/search/processing/JobManager.java
> > ===================================================================
> > RCS file: /home/tools/org.eclipse.cdt.
> >
> core/search/org/eclipse/cdt/internal/core/search/processing/JobManager.java,v
> > retrieving revision 1.5.2.1
> > diff -u -r1.5.2.1 JobManager.java
> > ---
> > search/org/eclipse/cdt/internal/core/search/processing/JobManager.
> > java   27 Oct 2003 20:44:57 -0000   1.5.2.1
> > +++
> > search/org/eclipse/cdt/internal/core/search/processing/JobManager.
> > java   5 Feb 2004 11:55:48 -0000
> > @@ -268,7 +268,14 @@
> >                          previousJob = currentJob;
> >                       }
> >                       try {
> > -                        Thread.sleep(50);
> > +                        //Wake up less often if there is a long queue ahead
> > +                        if(awaitingWork < 1000) {
> > +                           Thread.sleep(50);
> > +                        } else if(awaitingWork < 5000) {
> > +                           Thread.sleep(500);
> > +                        } else {
> > +                           Thread.sleep(1000);
> > +                        }
> >                       } catch (InterruptedException e) {
> >                       }
> >                    }

Back to the top