Author: lluis
Date: 2006-01-13 12:54:58 -0500 (Fri, 13 Jan 2006)
New Revision: 55528

Modified:
   trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog
   
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/AssemblyCodeCompletionDatabase.cs
   
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs
   
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/FileEntry.cs
Log:
2006-01-13 Lluis Sanchez Gual  <[EMAIL PROTECTED]>   

        * MonoDevelop.Projects.Parser/AssemblyCodeCompletionDatabase.cs:
        Properly handle errors found when parsing an assembly. When there
        is an error, make sure the assembly is reparsed the next time MD starts.
        * MonoDevelop.Projects.Parser/FileEntry.cs: Added DisableParse
        property.
        * MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs: In Write(),
        close the file in case of error. Also flush the binary writer
        before writing the index offset.



Modified: trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog
===================================================================
--- trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog   2006-01-13 
17:54:31 UTC (rev 55527)
+++ trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog   2006-01-13 
17:54:58 UTC (rev 55528)
@@ -1,3 +1,14 @@
+2006-01-13 Lluis Sanchez Gual  <[EMAIL PROTECTED]>   
+
+       * MonoDevelop.Projects.Parser/AssemblyCodeCompletionDatabase.cs:
+       Properly handle errors found when parsing an assembly. When there
+       is an error, make sure the assembly is reparsed the next time MD starts.
+       * MonoDevelop.Projects.Parser/FileEntry.cs: Added DisableParse
+       property.
+       * MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs: In Write(),
+       close the file in case of error. Also flush the binary writer
+       before writing the index offset.
+
 2006-01-10 Mart Roosmaa  <[EMAIL PROTECTED]>
 
        * MonoDevelop.Projects/Combine.cs: Updated an using statement.

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/AssemblyCodeCompletionDatabase.cs
===================================================================
--- 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/AssemblyCodeCompletionDatabase.cs
       2006-01-13 17:54:31 UTC (rev 55527)
+++ 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/AssemblyCodeCompletionDatabase.cs
       2006-01-13 17:54:58 UTC (rev 55528)
@@ -117,6 +117,18 @@
                                        ainfo.Load (fileName, false);
                                        UpdateClassInformation (ainfo.Classes, 
fileName);
                                }
+                       } catch (Exception ex) {
+                               FileEntry e = GetFile (fileName);
+                               e.LastParseTime = DateTime.MinValue;
+                               if (e.ParseErrorRetries > 0) {
+                                       if (--e.ParseErrorRetries == 0) {
+                                               e.DisableParse = true;
+                                       }
+                               }
+                               else
+                                       e.ParseErrorRetries = 3;
+                               monitor.ReportError ("Error parsing assembly: " 
+ fileName, ex);
+                               throw;
                        } finally {
                                monitor.EndTask ();
                                if (parentMonitor == null) monitor.Dispose ();

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs
===================================================================
--- 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs
       2006-01-13 17:54:31 UTC (rev 55527)
+++ 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs
       2006-01-13 17:54:58 UTC (rev 55528)
@@ -183,74 +183,84 @@
                                BinaryFormatter bf = new BinaryFormatter ();
                                BinaryWriter bw = new BinaryWriter (dfile);
                                
-                               // The headers are the first thing to write, so 
they can be read
-                               // without deserializing the whole file.
-                               bf.Serialize (dfile, headers);
-                               
-                               // The position of the index will be written 
here
-                               long indexOffsetPos = dfile.Position;
-                               bw.Write ((long)0);
-                               
-                               MemoryStream buffer = new MemoryStream ();
-                               BinaryWriter bufWriter = new BinaryWriter 
(buffer);
-                               
-                               // Write all class data
-                               foreach (FileEntry fe in files.Values) 
-                               {
-                                       ClassEntry ce = fe.FirstClass;
-                                       while (ce != null)
+                               try {
+                                       // The headers are the first thing to 
write, so they can be read
+                                       // without deserializing the whole file.
+                                       bf.Serialize (dfile, headers);
+                                       
+                                       // The position of the index will be 
written here
+                                       long indexOffsetPos = dfile.Position;
+                                       bw.Write ((long)0);
+                                       
+                                       MemoryStream buffer = new MemoryStream 
();
+                                       BinaryWriter bufWriter = new 
BinaryWriter (buffer);
+                                       
+                                       // Write all class data
+                                       foreach (FileEntry fe in files.Values) 
                                        {
-                                               IClass c = ce.Class;
-                                               byte[] data;
-                                               int len;
-                                               
-                                               if (c == null) {
-                                                       // Copy the data from 
the source file
-                                                       if (datareader == null) 
{
-                                                               datafile = new 
FileStream (dataFile, FileMode.Open, FileAccess.Read, FileShare.Read);
-                                                               datareader = 
new BinaryReader (datafile);
+                                               ClassEntry ce = fe.FirstClass;
+                                               while (ce != null)
+                                               {
+                                                       IClass c = ce.Class;
+                                                       byte[] data;
+                                                       int len;
+                                                       
+                                                       if (c == null) {
+                                                               // Copy the 
data from the source file
+                                                               if (datareader 
== null) {
+                                                                       
datafile = new FileStream (dataFile, FileMode.Open, FileAccess.Read, 
FileShare.Read);
+                                                                       
datareader = new BinaryReader (datafile);
+                                                               }
+                                                               
datafile.Position = ce.Position;
+                                                               len = 
datareader.ReadInt32 ();
+                                                               data = new 
byte[len];
+                                                               datafile.Read 
(data, 0, len);
                                                        }
-                                                       datafile.Position = 
ce.Position;
-                                                       len = 
datareader.ReadInt32 ();
-                                                       data = new byte[len];
-                                                       datafile.Read (data, 0, 
len);
+                                                       else {
+                                                               buffer.Position 
= 0;
+                                                               
PersistentClass.WriteTo (c, bufWriter, parserDatabase.DefaultNameEncoder);
+                                                               data = 
buffer.GetBuffer ();
+                                                               len = 
(int)buffer.Position;
+                                                       }
+                                                       
+                                                       ce.Position = 
dfile.Position;
+                                                       bw.Write (len);
+                                                       bw.Write (data, 0, len);
+                                                       ce = ce.NextInFile;
                                                }
-                                               else {
-                                                       buffer.Position = 0;
-                                                       PersistentClass.WriteTo 
(c, bufWriter, parserDatabase.DefaultNameEncoder);
-                                                       data = buffer.GetBuffer 
();
-                                                       len = 
(int)buffer.Position;
-                                               }
+                                       }
+                                       
+                                       bw.Flush ();
+                                       
+                                       // Write the index
+                                       long indexOffset = dfile.Position;
+                                       
+                                       Queue dataQueue = new Queue ();
+                                       dataQueue.Enqueue (references);
+                                       dataQueue.Enqueue (rootNamespace);
+                                       dataQueue.Enqueue (files);
+                                       SerializeData (dataQueue);
+                                       bf.Serialize (dfile, dataQueue.ToArray 
());
+                                       
+                                       dfile.Position = indexOffsetPos;
+                                       bw.Write (indexOffset);
+                                       
+                                       bw.Close ();
+                                       dfile.Close ();
+                                       dfile = null;
+                                       
+                                       CloseReader ();
+                                       
+                                       if (File.Exists (dataFile))
+                                               File.Delete (dataFile);
                                                
-                                               ce.Position = dfile.Position;
-                                               bw.Write (len);
-                                               bw.Write (data, 0, len);
-                                               ce = ce.NextInFile;
-                                       }
+                                       File.Move (tmpDataFile, dataFile);
+                               } catch {
+                                       if (dfile != null)
+                                               dfile.Close ();
+                                       if (File.Exists (tmpDataFile))
+                                               File.Delete (tmpDataFile);
                                }
-                               
-                               // Write the index
-                               long indexOffset = dfile.Position;
-                               
-                               Queue dataQueue = new Queue ();
-                               dataQueue.Enqueue (references);
-                               dataQueue.Enqueue (rootNamespace);
-                               dataQueue.Enqueue (files);
-                               SerializeData (dataQueue);
-                               bf.Serialize (dfile, dataQueue.ToArray ());
-                               
-                               dfile.Position = indexOffsetPos;
-                               bw.Write (indexOffset);
-                               
-                               bw.Close ();
-                               dfile.Close ();
-                               
-                               CloseReader ();
-                               
-                               if (File.Exists (dataFile))
-                                       File.Delete (dataFile);
-                                       
-                               File.Move (tmpDataFile, dataFile);
                        }
                }
                
@@ -381,7 +391,7 @@
                                {
                                        if (!File.Exists (file.FileName)) 
continue;
                                        FileInfo fi = new FileInfo 
(file.FileName);
-                                       if (fi.LastWriteTime > 
file.LastParseTime || file.ParseErrorRetries > 0) 
+                                       if ((fi.LastWriteTime > 
file.LastParseTime || file.ParseErrorRetries > 0) && !file.DisableParse) 
                                                QueueParseJob (file);
                                }
                        }

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/FileEntry.cs
===================================================================
--- 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/FileEntry.cs
    2006-01-13 17:54:31 UTC (rev 55527)
+++ 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/FileEntry.cs
    2006-01-13 17:54:58 UTC (rev 55528)
@@ -42,6 +42,9 @@
                ClassEntry firstClass;
                int parseErrorRetries;
                
+               [NonSerialized]
+               bool disableParse;
+               
                public FileEntry (string path)
                {
                        filePath = path;
@@ -53,6 +56,11 @@
                        get { return filePath; }
                }
                
+               public bool DisableParse {
+                       get { return disableParse; }
+                       set { disableParse = value; }
+               }
+               
                public DateTime LastParseTime
                {
                        get { return parseTime; }

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to