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 @@ -362,6 +362,15 @@ namespace ICSharpCode.SharpDevelop.Project
return FindFile(fileName) != null;
}
Dictionary<string, FileProjectItem> findFileCache;
internal protected void ClearFindFileCache()
{
lock (SyncRoot) {
findFileCache = null;
}
}
/// <summary>
/// Returns the project item for a specific file; or null if the file is not found in the project.
/// This member is thread-safe.
@ -370,12 +379,21 @@ namespace ICSharpCode.SharpDevelop.Project @@ -370,12 +379,21 @@ namespace ICSharpCode.SharpDevelop.Project
public FileProjectItem FindFile(string fileName)
{
lock (SyncRoot) {
return Linq.Find(Linq.OfType<FileProjectItem>(this.Items),
delegate(FileProjectItem item) {
return FileUtility.IsEqualFileName(item.FileName, fileName);
});
// return this.Items.OfType<FileProjectItem>().Find(
// item => FileUtility.IsEqualFileName(item.FileName, outputFileName));
if (findFileCache == null) {
findFileCache = new Dictionary<string, FileProjectItem>(StringComparer.InvariantCultureIgnoreCase);
foreach (ProjectItem item in this.Items) {
FileProjectItem fileItem = item as FileProjectItem;
if (fileItem != null) {
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 @@ -95,6 +95,10 @@ namespace ICSharpCode.SharpDevelop.Project
internal BuildItem BuildItem {
get { return buildItem; }
set {
if (project is AbstractProject) {
((AbstractProject)project).ClearFindFileCache();
}
if (value != null) {
virtualMetadata = null;
virtualItemType = default(ItemType);
@ -143,6 +147,10 @@ namespace ICSharpCode.SharpDevelop.Project @@ -143,6 +147,10 @@ namespace ICSharpCode.SharpDevelop.Project
}
set {
lock (SyncRoot) {
if (project is AbstractProject) {
((AbstractProject)project).ClearFindFileCache();
}
if (buildItem != null)
buildItem.Include = MSBuildInternals.Escape(value);
else
@ -371,6 +379,11 @@ namespace ICSharpCode.SharpDevelop.Project @@ -371,6 +379,11 @@ namespace ICSharpCode.SharpDevelop.Project
if (fileName == null) {
lock (SyncRoot) {
fileName = Path.Combine(project.Directory, this.Include);
try {
if (Path.IsPathRooted(fileName)) {
fileName = Path.GetFullPath(fileName);
}
} catch {}
fileNameCache = fileName;
}
}

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

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

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

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

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

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

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

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

Loading…
Cancel
Save