Browse Source

Implemented FindFile / IsFileInProject cache.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2124 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
911d2c3a18
  1. 30
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  2. 13
      src/Main/Base/Project/Src/Project/Items/ProjectItem.cs
  3. 1
      src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  4. 4
      src/Main/ICSharpCode.SharpDevelop.Sda/Src/SharpDevelopHost.cs
  5. 3
      src/Main/StartUp/Project/Dialogs/SplashScreen.cs
  6. 1
      src/Main/StartUp/Project/SharpDevelopMain.cs

30
src/Main/Base/Project/Src/Project/AbstractProject.cs

@ -362,6 +362,15 @@ namespace ICSharpCode.SharpDevelop.Project
return FindFile(fileName) != null; return FindFile(fileName) != null;
} }
Dictionary<string, FileProjectItem> findFileCache;
internal protected void ClearFindFileCache()
{
lock (SyncRoot) {
findFileCache = null;
}
}
/// <summary> /// <summary>
/// Returns the project item for a specific file; or null if the file is not found in the project. /// Returns the project item for a specific file; or null if the file is not found in the project.
/// This member is thread-safe. /// This member is thread-safe.
@ -370,12 +379,21 @@ namespace ICSharpCode.SharpDevelop.Project
public FileProjectItem FindFile(string fileName) public FileProjectItem FindFile(string fileName)
{ {
lock (SyncRoot) { lock (SyncRoot) {
return Linq.Find(Linq.OfType<FileProjectItem>(this.Items), if (findFileCache == null) {
delegate(FileProjectItem item) { findFileCache = new Dictionary<string, FileProjectItem>(StringComparer.InvariantCultureIgnoreCase);
return FileUtility.IsEqualFileName(item.FileName, fileName); foreach (ProjectItem item in this.Items) {
}); FileProjectItem fileItem = item as FileProjectItem;
// return this.Items.OfType<FileProjectItem>().Find( if (fileItem != null) {
// item => FileUtility.IsEqualFileName(item.FileName, outputFileName)); findFileCache[item.FileName] = fileItem;
}
}
}
try {
fileName = Path.GetFullPath(fileName);
} catch {}
FileProjectItem outputItem;
findFileCache.TryGetValue(fileName, out outputItem);
return outputItem;
} }
} }

13
src/Main/Base/Project/Src/Project/Items/ProjectItem.cs

@ -95,6 +95,10 @@ namespace ICSharpCode.SharpDevelop.Project
internal BuildItem BuildItem { internal BuildItem BuildItem {
get { return buildItem; } get { return buildItem; }
set { set {
if (project is AbstractProject) {
((AbstractProject)project).ClearFindFileCache();
}
if (value != null) { if (value != null) {
virtualMetadata = null; virtualMetadata = null;
virtualItemType = default(ItemType); virtualItemType = default(ItemType);
@ -143,6 +147,10 @@ namespace ICSharpCode.SharpDevelop.Project
} }
set { set {
lock (SyncRoot) { lock (SyncRoot) {
if (project is AbstractProject) {
((AbstractProject)project).ClearFindFileCache();
}
if (buildItem != null) if (buildItem != null)
buildItem.Include = MSBuildInternals.Escape(value); buildItem.Include = MSBuildInternals.Escape(value);
else else
@ -371,6 +379,11 @@ namespace ICSharpCode.SharpDevelop.Project
if (fileName == null) { if (fileName == null) {
lock (SyncRoot) { lock (SyncRoot) {
fileName = Path.Combine(project.Directory, this.Include); fileName = Path.Combine(project.Directory, this.Include);
try {
if (Path.IsPathRooted(fileName)) {
fileName = Path.GetFullPath(fileName);
}
} catch {}
fileNameCache = fileName; fileNameCache = fileName;
} }
} }

1
src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs

@ -713,6 +713,7 @@ namespace ICSharpCode.SharpDevelop.Project
items.Add(CreateProjectItem(item)); items.Add(CreateProjectItem(item));
} }
} }
ClearFindFileCache();
} }
void IProjectItemListProvider.AddProjectItem(ProjectItem item) void IProjectItemListProvider.AddProjectItem(ProjectItem item)

4
src/Main/ICSharpCode.SharpDevelop.Sda/Src/SharpDevelopHost.cs

@ -284,13 +284,13 @@ namespace ICSharpCode.SharpDevelop.Sda
} }
/// <summary> /// <summary>
/// Event before the workbench has been unloaded. /// Event before the workbench starts running.
/// </summary> /// </summary>
[SuppressMessage("Microsoft.Naming", "CA1713:EventsShouldNotHaveBeforeOrAfterPrefix")] [SuppressMessage("Microsoft.Naming", "CA1713:EventsShouldNotHaveBeforeOrAfterPrefix")]
public event EventHandler BeforeRunWorkbench; public event EventHandler BeforeRunWorkbench;
/// <summary> /// <summary>
/// Event after the workbench has been unloaded. Occurs on the thread /// Event after the workbench has been unloaded.
/// </summary> /// </summary>
public event EventHandler WorkbenchClosed; public event EventHandler WorkbenchClosed;

3
src/Main/StartUp/Project/Dialogs/SplashScreen.cs

@ -25,6 +25,9 @@ namespace ICSharpCode.SharpDevelop
get { get {
return splashScreen; return splashScreen;
} }
set {
splashScreen = value;
}
} }
public SplashScreenForm() public SplashScreenForm()

1
src/Main/StartUp/Project/SharpDevelopMain.cs

@ -131,6 +131,7 @@ namespace ICSharpCode.SharpDevelop
host.BeforeRunWorkbench += delegate { host.BeforeRunWorkbench += delegate {
if (SplashScreenForm.SplashScreen != null) { if (SplashScreenForm.SplashScreen != null) {
SplashScreenForm.SplashScreen.BeginInvoke(new MethodInvoker(SplashScreenForm.SplashScreen.Dispose)); SplashScreenForm.SplashScreen.BeginInvoke(new MethodInvoker(SplashScreenForm.SplashScreen.Dispose));
SplashScreenForm.SplashScreen = null;
} }
}; };

Loading…
Cancel
Save