Browse Source

Cache the solution snapshot.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
36d81d4545
  1. 2
      src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs
  2. 30
      src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
  3. 7
      src/Main/Base/Project/Src/Services/ParserService/SharpDevelopSolutionSnapshot.cs

2
src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs

@ -50,6 +50,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -50,6 +50,7 @@ namespace ICSharpCode.SharpDevelop.Parser
lock (lockObj) {
if (!disposed)
projectContent = projectContent.UpdateProjectContent(oldFile, newFile);
ParserService.InvalidateCurrentSolutionSnapshot();
}
}
@ -180,6 +181,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -180,6 +181,7 @@ namespace ICSharpCode.SharpDevelop.Parser
lock (lockObj) {
projectContent = projectContent.RemoveAssemblyReferences(this.references).AddAssemblyReferences(newReferences);
this.references = newReferences.ToArray();
ParserService.InvalidateCurrentSolutionSnapshot();
}
}, progressMonitor.CancellationToken);
}

30
src/Main/Base/Project/Src/Services/ParserService/ParserService.cs

@ -52,13 +52,35 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -52,13 +52,35 @@ namespace ICSharpCode.SharpDevelop.Parser
return GetCurrentSolutionSnapshot().GetCompilation(solution != null ? solution.FindProjectContainingFile(fileName) : null);
}
// Use a WeakReference for caching the solution snapshot - it can require
// lots of memory and may not be invalidated soon enough if the user
// is only browsing code.
volatile static WeakReference<SharpDevelopSolutionSnapshot> currentSolutionSnapshot;
/// <summary>
/// Gets a snapshot of the current compilations. This method is useful when a consistent snapshot
/// across multiple compilations is needed.
/// Gets a snapshot of the current compilations
/// This method is useful when a consistent snapshot across multiple compilations is needed.
/// </summary>
public static SharpDevelopSolutionSnapshot GetCurrentSolutionSnapshot()
{
return new SharpDevelopSolutionSnapshot();
var weakRef = currentSolutionSnapshot;
SharpDevelopSolutionSnapshot result;
if (weakRef == null || !weakRef.TryGetTarget(out result)) {
// create new snapshot if we don't have one cached
result = new SharpDevelopSolutionSnapshot(ProjectService.OpenSolution);
currentSolutionSnapshot = new WeakReference<SharpDevelopSolutionSnapshot>(result);
}
return result;
}
/// <summary>
/// Invalidates the current solution snapshot, causing
/// the next <see cref="GetCurrentSolutionSnapshot()"/> call to create a new one.
/// This method needs to be called whenever IProject.ProjectContent changes.
/// </summary>
public static void InvalidateCurrentSolutionSnapshot()
{
currentSolutionSnapshot = null;
}
[Obsolete("Use project.ProjectContent instead")]
@ -901,6 +923,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -901,6 +923,7 @@ namespace ICSharpCode.SharpDevelop.Parser
//foreach (IProject project in ProjectService.OpenSolution.Projects) {
// RegisterProjectContentForAddedProject(project);
//}
InvalidateCurrentSolutionSnapshot();
}
internal static void OnSolutionClosed()
@ -910,6 +933,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -910,6 +933,7 @@ namespace ICSharpCode.SharpDevelop.Parser
//projectContents.Clear();
}
ClearAllFileEntries();
InvalidateCurrentSolutionSnapshot();
}
static void ClearAllFileEntries()

7
src/Main/Base/Project/Src/Services/ParserService/SharpDevelopSolutionSnapshot.cs

@ -15,14 +15,9 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -15,14 +15,9 @@ namespace ICSharpCode.SharpDevelop.Parser
Dictionary<IProject, IProjectContent> projectContentSnapshots = new Dictionary<IProject, IProjectContent>();
Lazy<ICompilation> dummyCompilation;
public SharpDevelopSolutionSnapshot()
: this(ProjectService.OpenSolution)
{
dummyCompilation = new Lazy<ICompilation>(() => new SimpleCompilation(this, MinimalCorlib.Instance));
}
public SharpDevelopSolutionSnapshot(Solution solution)
{
dummyCompilation = new Lazy<ICompilation>(() => new SimpleCompilation(this, MinimalCorlib.Instance));
if (solution != null) {
foreach (IProject project in solution.Projects) {
var pc = project.ProjectContent;

Loading…
Cancel
Save