From 526c8bd679a48b6fe2cdf599760309e5dd43c10a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 24 Mar 2010 19:11:34 +0000 Subject: [PATCH] Fixed encoding autodetection in ChooseEncodingDisplayBinding to match that when normally opening a file. LoadSolutionProjectThread: Send progress report for the number of files parsed. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5637 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/AvalonEditDisplayBinding.cs | 2 +- .../Project/Src/Services/File/FileService.cs | 6 ++-- .../ParserService/ParseProjectContent.cs | 33 +++++++++++++------ .../ParseableFileContentEnumerator.cs | 16 ++++----- .../RefactoringService/RefactoringService.cs | 2 +- 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditDisplayBinding.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditDisplayBinding.cs index f3e6b1c7de..0326aeb3dd 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditDisplayBinding.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditDisplayBinding.cs @@ -55,7 +55,7 @@ namespace ICSharpCode.AvalonEdit.AddIn ChooseEncodingDialog dlg = new ChooseEncodingDialog(); dlg.Owner = WorkbenchSingleton.MainWindow; using (Stream stream = file.OpenRead()) { - using (StreamReader reader = FileReader.OpenStream(stream, Encoding.UTF8)) { + using (StreamReader reader = FileReader.OpenStream(stream, FileService.DefaultFileEncoding.GetEncoding())) { reader.Peek(); // force reader to auto-detect encoding dlg.Encoding = reader.CurrentEncoding; } diff --git a/src/Main/Base/Project/Src/Services/File/FileService.cs b/src/Main/Base/Project/Src/Services/File/FileService.cs index 4a22df20fe..eea754cce4 100644 --- a/src/Main/Base/Project/Src/Services/File/FileService.cs +++ b/src/Main/Base/Project/Src/Services/File/FileService.cs @@ -315,11 +315,11 @@ namespace ICSharpCode.SharpDevelop /// Gets a list of the names of the files that are open as primary files /// in view contents. /// - public static IList GetOpenFiles() + public static IList GetOpenFiles() { - List fileNames = new List(); + List fileNames = new List(); foreach (IViewContent content in WorkbenchSingleton.Workbench.ViewContentCollection) { - string contentName = content.PrimaryFileName; + FileName contentName = content.PrimaryFileName; if (contentName != null && !fileNames.Contains(contentName)) fileNames.Add(contentName); } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs index 4c36b88ce9..0e656341f3 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs @@ -9,12 +9,13 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; +using System.Threading.Tasks; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Project; -using System.Threading; namespace ICSharpCode.SharpDevelop { @@ -246,7 +247,6 @@ namespace ICSharpCode.SharpDevelop internal void Initialize2(IProgressMonitor progressMonitor) { if (!initializing) return; - //int progressStart = progressMonitor.WorkDone; try { IProjectContent[] referencedContents; lock (this.ReferencedContents) { @@ -261,20 +261,33 @@ namespace ICSharpCode.SharpDevelop } ParseableFileContentFinder finder = new ParseableFileContentFinder(); - var fileContents = + var fileContents = ( from p in project.Items.AsParallel().WithCancellation(progressMonitor.CancellationToken) where !ItemType.NonFileItemTypes.Contains(p.ItemType) && !String.IsNullOrEmpty(p.FileName) - select finder.Create(p); - fileContents.ForAll( - entry => { - ITextBuffer content = entry.GetContent(); - if (content != null) - ParserService.ParseFile(this, entry.FileName, content); + select FileName.Create(p.FileName) + ).ToList(); + + object progressLock = new object(); + double fileCountInverse = 1.0 / fileContents.Count; + Parallel.ForEach( + fileContents, + fileName => { + ParseableFileContentEntry entry = finder.Create(fileName); + // Don't read files we don't have a parser for. + // This avoids loading huge files (e.g. sdps) when we have no intention of parsing them. + if (ParserService.GetParser(fileName) != null) { + ITextBuffer content = entry.GetContent(); + if (content != null) + ParserService.ParseFile(this, fileName, content); + } + lock (progressLock) { + progressMonitor.Progress += fileCountInverse; + } } ); } finally { initializing = false; - //progressMonitor.WorkDone = progressStart + enumerator.ItemCount; + progressMonitor.Progress = 1; } } diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs b/src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs index ebefb6ac92..09604a664c 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs @@ -22,7 +22,7 @@ namespace ICSharpCode.SharpDevelop.Project { public class ParseableFileContentEntry { - public string FileName { get; private set; } + public FileName FileName { get; private set; } ITextBuffer openContent; public ITextBuffer GetContent() @@ -38,12 +38,12 @@ namespace ICSharpCode.SharpDevelop.Project } } - internal ParseableFileContentEntry(ProjectItem item, IList viewContentFileNamesCollection) + internal ParseableFileContentEntry(FileName fileName, FileName[] viewContentFileNamesCollection) { - this.FileName = item.FileName; - foreach (string name in viewContentFileNamesCollection) { + this.FileName = fileName; + foreach (FileName name in viewContentFileNamesCollection) { if (FileUtility.IsEqualFileName(name, this.FileName)) { - openContent = WorkbenchSingleton.SafeThreadFunction(ParserService.GetParseableFileContent, this.FileName); + openContent = WorkbenchSingleton.SafeThreadFunction(ParserService.GetParseableFileContent, this.FileName.ToString()); break; } } @@ -56,14 +56,14 @@ namespace ICSharpCode.SharpDevelop.Project /// public class ParseableFileContentFinder { - IList viewContentFileNamesCollection = WorkbenchSingleton.SafeThreadFunction(FileService.GetOpenFiles); + FileName[] viewContentFileNamesCollection = WorkbenchSingleton.SafeThreadFunction(FileService.GetOpenFiles).ToArray(); /// /// Retrieves the file contents for the specified project items. /// - public ParseableFileContentEntry Create(ProjectItem p) + public ParseableFileContentEntry Create(FileName fileName) { - return new ParseableFileContentEntry(p, viewContentFileNamesCollection); + return new ParseableFileContentEntry(fileName, viewContentFileNamesCollection); } } } diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs index 938d418644..9eedc19290 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs @@ -159,7 +159,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring progressMonitor.TaskName = StringParser.Parse("${res:SharpDevelop.Refactoring.FindingReferences}"); foreach (ProjectItem item in files) { - var entry = finder.Create(item); + var entry = finder.Create(FileName.Create(item.FileName)); if (progressMonitor != null) { progressMonitor.Progress += 1.0 / files.Count;