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