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 @@ @@ -678,7 +678,7 @@
<Compile Include="Src\Bookmarks\ClassMemberBookmark.cs" />
<Compile Include="Src\Services\RefactoringService\RefactoringService.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\Project\Items\ImportProjectItem.cs" />
<EmbeddedResource Include="Resources\CodeCompletionOptionPanel.xfrm" />

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

@ -275,11 +275,10 @@ namespace ICSharpCode.SharpDevelop @@ -275,11 +275,10 @@ namespace ICSharpCode.SharpDevelop
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();
ITextBuffer content = finder.Create(fileName);
if (content != null)
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; @@ -14,38 +14,8 @@ using ICSharpCode.SharpDevelop.Gui;
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>
/// Can be used to create ParseableFileContentEntry for ProjectItems.
/// Can be used to create ITextBuffer for ProjectItems.
/// This class is thread-safe.
/// </summary>
public class ParseableFileContentFinder
@ -55,9 +25,19 @@ namespace ICSharpCode.SharpDevelop.Project @@ -55,9 +25,19 @@ namespace ICSharpCode.SharpDevelop.Project
/// <summary>
/// Retrieves the file contents for the specified project items.
/// </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 @@ -249,7 +249,7 @@ namespace ICSharpCode.SharpDevelop.Refactoring
progressMonitor.TaskName = StringParser.Parse("${res:SharpDevelop.Refactoring.FindingReferences}");
foreach (ProjectItem item in files) {
var entry = finder.Create(FileName.Create(item.FileName));
FileName itemFileName = FileName.Create(item.FileName);
if (progressMonitor != null) {
progressMonitor.Progress += 1.0 / files.Count;
@ -257,9 +257,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -257,9 +257,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return null;
}
ITextBuffer content = entry.GetContent();
ITextBuffer content = finder.Create(itemFileName);
if (content != null) {
AddReferences(references, ownerClass, member, entry.FileName, content.Text);
AddReferences(references, ownerClass, member, itemFileName, content.Text);
}
}

Loading…
Cancel
Save