Author: lluis
Date: 2006-07-25 07:37:47 -0400 (Tue, 25 Jul 2006)
New Revision: 62949

Modified:
   trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog
   
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs
   
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/DefaultParserService.cs
   
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/IParserService.cs
   
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/ProjectCodeCompletionDatabase.cs
   trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.mdp
   
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects/Combine.cs
Log:
2006-07-25 Lluis Sanchez Gual  <[EMAIL PROTECTED]>

        * MonoDevelop.Projects/Combine.cs: When disposing the combine, dispose
          all combine entries.
          
        * MonoDevelop.Projects.Parser/IParserService.cs:
        * MonoDevelop.Projects.Parser/DefaultParserService.cs: Added properties 
and
          events that give information about when the parser database is parsing
          code or assemblies.
        
        * MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs: Added a check 
when
          loading the database, which will avoid allocation huge arrays if the 
file
          format is corrupted.
        * MonoDevelop.Projects.Parser/ProjectCodeCompletionDatabase.cs: Fixed a 
bug
          which was causing some databases to be marked as modified, when they 
were not.



Modified: trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog
===================================================================
--- trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog   2006-07-25 
11:34:28 UTC (rev 62948)
+++ trunk/monodevelop/Core/src/MonoDevelop.Projects/ChangeLog   2006-07-25 
11:37:47 UTC (rev 62949)
@@ -1,3 +1,19 @@
+2006-07-25 Lluis Sanchez Gual  <[EMAIL PROTECTED]>
+
+       * MonoDevelop.Projects/Combine.cs: When disposing the combine, dispose
+         all combine entries.
+         
+       * MonoDevelop.Projects.Parser/IParserService.cs:
+       * MonoDevelop.Projects.Parser/DefaultParserService.cs: Added properties 
and
+         events that give information about when the parser database is parsing
+         code or assemblies.
+       
+       * MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs: Added a check 
when
+         loading the database, which will avoid allocation huge arrays if the 
file
+         format is corrupted.
+       * MonoDevelop.Projects.Parser/ProjectCodeCompletionDatabase.cs: Fixed a 
bug
+         which was causing some databases to be marked as modified, when they 
were not.
+
 2006-07-17 Lluis Sanchez Gual  <[EMAIL PROTECTED]>
 
        * MonoDevelop.Projects/DotNetProject.cs: Copy files with 
BuildAction.FileCopy.

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects/Combine.cs
===================================================================
--- 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects/Combine.cs 
    2006-07-25 11:34:28 UTC (rev 62948)
+++ 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects/Combine.cs 
    2006-07-25 11:37:47 UTC (rev 62949)
@@ -157,6 +157,13 @@
                        entrySavedHandler = new CombineEntryEventHandler 
(NotifyEntrySaved);
                }
                
+               public override void Dispose()
+               {
+                       base.Dispose ();
+                       foreach (CombineEntry e in Entries)
+                               e.Dispose ();
+               }
+               
                public override IConfiguration CreateConfiguration (string name)
                {
                        CombineConfiguration cc = new CombineConfiguration ();

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs
===================================================================
--- 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs
       2006-07-25 11:34:28 UTC (rev 62948)
+++ 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/CodeCompletionDatabase.cs
       2006-07-25 11:37:47 UTC (rev 62949)
@@ -59,6 +59,7 @@
                FileStream datafile;
                int currentGetTime = 0;
                bool modified;
+               bool disposed;
                
                string basePath;
                string dataFile;
@@ -76,6 +77,7 @@
                
                public virtual void Dispose ()
                {
+                       disposed = true;
                }
                
                public string DataFile
@@ -83,6 +85,15 @@
                        get { return dataFile; }
                }
                
+               public bool Modified {
+                       get { return modified; }
+                       set { modified = value; }
+               }
+               
+               public bool Disposed {
+                       get { return disposed; }
+               }
+               
                protected void SetLocation (string basePath, string name)
                {
                        dataFile = Path.Combine (basePath, name + ".pidb");
@@ -172,6 +183,7 @@
                        lock (rwlock)
                        {
                                if (!modified) return;
+                               
                                modified = false;
                                headers["Version"] = FORMAT_VERSION;
                                                        
@@ -213,12 +225,19 @@
                                                                }
                                                                
datafile.Position = ce.Position;
                                                                len = 
datareader.ReadInt32 ();
+                                                               
+                                                               // Sanity check 
to avoid allocating huge byte arrays if something
+                                                               // goes wrong 
when reading the file contents
+                                                               if (len > 
1024*1024*10 || len < 0)
+                                                                       throw 
new InvalidOperationException ("pidb file corrupted: " + dataFile);
+                                                                       
                                                                data = new 
byte[len];
                                                                datafile.Read 
(data, 0, len);
                                                        }
                                                        else {
                                                                buffer.Position 
= 0;
                                                                
PersistentClass.WriteTo (c, bufWriter, parserDatabase.DefaultNameEncoder);
+                                                               bufWriter.Flush 
();
                                                                data = 
buffer.GetBuffer ();
                                                                len = 
(int)buffer.Position;
                                                        }

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/DefaultParserService.cs
===================================================================
--- 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/DefaultParserService.cs
 2006-07-25 11:34:28 UTC (rev 62948)
+++ 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/DefaultParserService.cs
 2006-07-25 11:37:47 UTC (rev 62949)
@@ -334,6 +334,7 @@
                bool threadRunning;
                bool trackingFileChanges;
                IProgressMonitorFactory parseProgressMonitorFactory;
+               int parseStatus;
                
                // Only keeps track of explicitely loaded assemblies, not the 
ones
                // referenced by projects.
@@ -475,6 +476,9 @@
                        set { parseProgressMonitorFactory = value; }
                }
                
+               public bool IsParsing {
+                       get { return parseStatus > 0; }
+               }
                
                public bool TrackFileChanges {
                        get {
@@ -555,10 +559,13 @@
                
                internal IProgressMonitor GetParseProgressMonitor ()
                {
+                       IProgressMonitor mon;
                        if (parseProgressMonitorFactory != null)
-                               return 
parseProgressMonitorFactory.CreateProgressMonitor ();
+                               mon = 
parseProgressMonitorFactory.CreateProgressMonitor ();
                        else
-                               return new NullProgressMonitor ();
+                               mon = new NullProgressMonitor ();
+                       
+                       return new AggregatedProgressMonitor (mon, new 
InternalProgressMonitor (this));
                }
                        
                internal CodeCompletionDatabase GetDatabase (string uri)
@@ -735,7 +742,8 @@
                        }
                        if (db != null) {
                                db.Write ();
-                               db.Dispose ();
+                               if (!db.Disposed)
+                                       db.Dispose ();
                        }
                }
                
@@ -1018,6 +1026,25 @@
                        }
                }
                
+               internal void StartParseOperation ()
+               {
+                       if ((parseStatus++) == 0) {
+                               if (ParseOperationStarted != null)
+                                       ParseOperationStarted (this, 
EventArgs.Empty);
+                       }
+               }
+               
+               internal void EndParseOperation ()
+               {
+                       if (parseStatus == 0)
+                               return;
+
+                       if (--parseStatus == 0) {
+                               if (ParseOperationFinished != null)
+                                       ParseOperationFinished (this, 
EventArgs.Empty);
+                       }
+               }
+               
                public IParseInformation UpdateFile (string fileName, string 
fileContent)
                {
                        Project project = null;
@@ -1586,6 +1613,8 @@
                public event ParseInformationEventHandler 
ParseInformationChanged;
                public event ClassInformationEventHandler 
ClassInformationChanged;
                public event AssemblyInformationEventHandler 
AssemblyInformationChanged;
+               public event EventHandler ParseOperationStarted;
+               public event EventHandler ParseOperationFinished;
        }
        
        [Serializable]
@@ -1691,8 +1720,25 @@
                        PutBaseClassesOnStack(topLevelClass);
                        baseTypeQueue.Enqueue("System.Object");
                }
-       }       
+       }
        
+       class InternalProgressMonitor: NullProgressMonitor
+       {
+               ParserDatabase db;
+               
+               public InternalProgressMonitor (ParserDatabase db)
+               {
+                       this.db = db;
+                       db.StartParseOperation ();
+               }
+               
+               public override void Dispose ()
+               {
+                       base.Dispose ();
+                       db.EndParseOperation ();
+               }
+       }
+       
        public class ClassUpdateInformation
        {
                ClassCollection added = new ClassCollection ();

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/IParserService.cs
===================================================================
--- 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/IParserService.cs
       2006-07-25 11:34:28 UTC (rev 62948)
+++ 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/IParserService.cs
       2006-07-25 11:37:47 UTC (rev 62949)
@@ -57,12 +57,16 @@
                IParseInformation UpdateFile (Project project, string fileName, 
string fileContent);
                
                bool TrackFileChanges { get; set; }
+               bool IsParsing { get; }
                
                IProgressMonitorFactory ParseProgressMonitorFactory { get; set; 
}
 
                event ParseInformationEventHandler ParseInformationChanged;
                event ClassInformationEventHandler ClassInformationChanged;
                event AssemblyInformationEventHandler 
AssemblyInformationChanged;
+
+               event EventHandler ParseOperationStarted;
+               event EventHandler ParseOperationFinished;
        }
        
        public interface IFileParserContext: IParserContext

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/ProjectCodeCompletionDatabase.cs
===================================================================
--- 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/ProjectCodeCompletionDatabase.cs
        2006-07-25 11:34:28 UTC (rev 62948)
+++ 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.Parser/ProjectCodeCompletionDatabase.cs
        2006-07-25 11:37:47 UTC (rev 62949)
@@ -51,6 +51,12 @@
                        SetLocation (project.BaseDirectory, project.Name);
                        
                        this.project = project;
+                       
+                       // Store the project target runtime
+                       DotNetProject prj = project as DotNetProject;
+                       if (prj != null)
+                               lastVersion = prj.ClrVersion;
+                       
                        Read ();
                        
                        UpdateFromProject ();
@@ -68,6 +74,7 @@
                
                public override void Dispose ()
                {
+                       base.Dispose ();
                        project.FileChangedInProject -= new 
ProjectFileEventHandler (OnFileChanged);
                        project.FileAddedToProject -= new 
ProjectFileEventHandler (OnFileAdded);
                        project.FileRemovedFromProject -= new 
ProjectFileEventHandler (OnFileRemoved);
@@ -157,7 +164,8 @@
                        keys.AddRange (references);
                        foreach (ReferenceEntry re in keys)
                        {
-                               if (!fs.Contains (re.Uri))
+                               // Don't delete corlib references. They are 
implicit to projects, but not to pidbs.
+                               if (!fs.Contains (re.Uri) && !IsCorlibReference 
(re))
                                        RemoveReference (re.Uri);
                        }
                        UpdateCorlibReference ();
@@ -174,11 +182,11 @@
                        
                        if (prj.ClrVersion == lastVersion)
                                return false;
-                       
+
                        // Look for an existing mscorlib reference
                        string currentRefUri = null;
                        foreach (ReferenceEntry re in References) {
-                               if (re.Uri.StartsWith ("Assembly:mscorlib")) {
+                               if (IsCorlibReference (re)) {
                                        currentRefUri = re.Uri;
                                        break;
                                }
@@ -202,6 +210,11 @@
                        return false;
                }
                
+               bool IsCorlibReference (ReferenceEntry re)
+               {
+                       return re.Uri.StartsWith ("Assembly:mscorlib");
+               }
+               
                string[] GetReferenceKeys (ProjectReference pr)
                {
                        switch (pr.ReferenceType) {

Modified: 
trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.mdp
===================================================================
--- trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.mdp    
2006-07-25 11:34:28 UTC (rev 62948)
+++ trunk/monodevelop/Core/src/MonoDevelop.Projects/MonoDevelop.Projects.mdp    
2006-07-25 11:37:47 UTC (rev 62949)
@@ -14,9 +14,6 @@
     </Configuration>
   </Configurations>
   <DeployTargets />
-  <DeploymentInformation strategy="File">
-    <excludeFiles />
-  </DeploymentInformation>
   <Contents>
     <File name="./AssemblyInfo.cs" subtype="Code" buildaction="Compile" />
     <File name="./MonoDevelop.Projects.Ambience/AbstractAmbience.cs" 
subtype="Code" buildaction="Compile" />
@@ -242,4 +239,7 @@
     <ProjectReference type="Gac" localcopy="True" refto="System.Drawing, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
     <ProjectReference type="Gac" localcopy="True" refto="Mono.Posix, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
   </References>
+  <DeploymentInformation strategy="File">
+    <excludeFiles />
+  </DeploymentInformation>
 </Project>
\ No newline at end of file

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

Reply via email to