Browse Source

IOException when trying to read a file from the parser thread that is exclusively locked (e. g. sdps); removed ParseableFileContentEntry

pull/1/head
Siegfried Pammer 15 years ago
parent
commit
a3b88d4262
  1. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  2. 3
      src/Main/Base/Project/Src/Services/ParserService/ParseProjectContent.cs
  3. 46
      src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentFinder.cs
  4. 6
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs

2
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -678,7 +678,7 @@
<Compile Include="Src\Bookmarks\ClassMemberBookmark.cs" /> <Compile Include="Src\Bookmarks\ClassMemberBookmark.cs" />
<Compile Include="Src\Services\RefactoringService\RefactoringService.cs" /> <Compile Include="Src\Services\RefactoringService\RefactoringService.cs" />
<Compile Include="Src\Services\RefactoringService\Reference.cs" /> <Compile Include="Src\Services\RefactoringService\Reference.cs" />
<Compile Include="Src\Services\ProjectService\ParseableFileContentEnumerator.cs" /> <Compile Include="Src\Services\ProjectService\ParseableFileContentFinder.cs" />
<Compile Include="Src\Services\ParserService\ParseProjectContent.cs" /> <Compile Include="Src\Services\ParserService\ParseProjectContent.cs" />
<Compile Include="Src\Project\Items\ImportProjectItem.cs" /> <Compile Include="Src\Project\Items\ImportProjectItem.cs" />
<EmbeddedResource Include="Resources\CodeCompletionOptionPanel.xfrm" /> <EmbeddedResource Include="Resources\CodeCompletionOptionPanel.xfrm" />

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

@ -275,11 +275,10 @@ namespace ICSharpCode.SharpDevelop
Parallel.ForEach( Parallel.ForEach(
fileContents, fileContents,
fileName => { fileName => {
ParseableFileContentEntry entry = finder.Create(fileName);
// Don't read files we don't have a parser for. // 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. // This avoids loading huge files (e.g. sdps) when we have no intention of parsing them.
if (ParserService.GetParser(fileName) != null) { if (ParserService.GetParser(fileName) != null) {
ITextBuffer content = entry.GetContent(); ITextBuffer content = finder.Create(fileName);
if (content != null) if (content != null)
ParserService.ParseFile(this, fileName, content); ParserService.ParseFile(this, fileName, content);
} }

46
src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentEnumerator.cs → src/Main/Base/Project/Src/Services/ProjectService/ParseableFileContentFinder.cs

@ -14,38 +14,8 @@ using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Project namespace ICSharpCode.SharpDevelop.Project
{ {
public class ParseableFileContentEntry
{
public FileName FileName { get; private set; }
ITextBuffer openContent;
public ITextBuffer GetContent()
{
if (openContent != null)
return openContent;
try {
return new StringTextBuffer(ICSharpCode.AvalonEdit.Utils.FileReader.ReadFileContent(FileName, ParserService.DefaultFileEncoding));
} catch (IOException) {
return null;
} catch (UnauthorizedAccessException) {
return null;
}
}
internal ParseableFileContentEntry(FileName fileName, FileName[] viewContentFileNamesCollection)
{
this.FileName = fileName;
foreach (FileName name in viewContentFileNamesCollection) {
if (FileUtility.IsEqualFileName(name, this.FileName)) {
openContent = WorkbenchSingleton.SafeThreadFunction(ParserService.GetParseableFileContent, this.FileName.ToString());
break;
}
}
}
}
/// <summary> /// <summary>
/// Can be used to create ParseableFileContentEntry for ProjectItems. /// Can be used to create ITextBuffer for ProjectItems.
/// This class is thread-safe. /// This class is thread-safe.
/// </summary> /// </summary>
public class ParseableFileContentFinder public class ParseableFileContentFinder
@ -55,9 +25,19 @@ namespace ICSharpCode.SharpDevelop.Project
/// <summary> /// <summary>
/// Retrieves the file contents for the specified project items. /// Retrieves the file contents for the specified project items.
/// </summary> /// </summary>
public ParseableFileContentEntry Create(FileName fileName) public ITextBuffer Create(FileName fileName)
{ {
return new ParseableFileContentEntry(fileName, viewContentFileNamesCollection); foreach (FileName name in viewContentFileNamesCollection) {
if (FileUtility.IsEqualFileName(name, fileName))
return WorkbenchSingleton.SafeThreadFunction(ParserService.GetParseableFileContent, fileName.ToString());
}
try {
return new StringTextBuffer(ICSharpCode.AvalonEdit.Utils.FileReader.ReadFileContent(fileName, ParserService.DefaultFileEncoding));
} catch (IOException) {
return null;
} catch (UnauthorizedAccessException) {
return null;
}
} }
} }
} }

6
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringService.cs

@ -249,7 +249,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
progressMonitor.TaskName = StringParser.Parse("${res:SharpDevelop.Refactoring.FindingReferences}"); progressMonitor.TaskName = StringParser.Parse("${res:SharpDevelop.Refactoring.FindingReferences}");
foreach (ProjectItem item in files) { foreach (ProjectItem item in files) {
var entry = finder.Create(FileName.Create(item.FileName)); FileName itemFileName = FileName.Create(item.FileName);
if (progressMonitor != null) { if (progressMonitor != null) {
progressMonitor.Progress += 1.0 / files.Count; progressMonitor.Progress += 1.0 / files.Count;
@ -257,9 +257,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return null; return null;
} }
ITextBuffer content = entry.GetContent(); ITextBuffer content = finder.Create(itemFileName);
if (content != null) { if (content != null) {
AddReferences(references, ownerClass, member, entry.FileName, content.Text); AddReferences(references, ownerClass, member, itemFileName, content.Text);
} }
} }

Loading…
Cancel
Save