Browse Source

Fixed performance bugs in issue search:

- Avoid excessive file name normalization by changing IProject.FileName from string to class FileName.
- Dispose CSharpSemanticHighlighter to fix memory leak and avoid excessive number of ParseInformationUpdated listeners.
newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
c1787fbd2d
  1. 2
      src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleCommandLineTests.cs
  2. 2
      src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleExeSelectedTestFixture.cs
  3. 6
      src/AddIns/Analysis/UnitTesting/Test/Service/TestFrameworkDescriptorTests.cs
  4. 3
      src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs
  5. 2
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs
  6. 3
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs
  7. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs
  8. 8
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/SearchForIssuesCommand.cs
  9. 3
      src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlSymbolSearch.cs
  10. 10
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  11. 8
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs
  12. 3
      src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs
  13. 12
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs
  14. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs
  15. 9
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs
  16. 2
      src/Main/Base/Project/Parser/ProjectContentContainer.cs
  17. 6
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs
  18. 2
      src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs
  19. 3
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs
  20. 2
      src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs
  21. 6
      src/Main/Base/Project/Src/Project/AbstractProject.cs
  22. 2
      src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs
  23. 2
      src/Main/Base/Project/Src/Project/IProject.cs
  24. 5
      src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs
  25. 2
      src/Main/Base/Project/Src/Project/MSBuildFileProject.cs
  26. 3
      src/Main/Base/Project/Src/Project/MissingProject.cs
  27. 5
      src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs
  28. 2
      src/Main/Base/Project/Src/Project/Solution/Solution.cs
  29. 4
      src/Main/Base/Project/Src/Project/UnknownProject.cs
  30. 2
      src/Main/Base/Project/Src/Services/ProjectBinding/ProjectBindingService.cs
  31. 8
      src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs
  32. 6
      src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs
  33. 6
      src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs
  34. 7
      src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs
  35. 3
      src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs
  36. 9
      src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs
  37. 2
      src/Main/Base/Test/Utils/ProjectHelper.cs
  38. 3
      src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs
  39. 2
      src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs
  40. 3
      src/Main/Base/Test/WebReferences/WebReferenceTests.cs
  41. 5
      src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs
  42. 3
      src/Main/SharpDevelop/Parser/ParserService.cs

2
src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleCommandLineTests.cs

@ -23,7 +23,7 @@ namespace UnitTesting.Tests.NUnit @@ -23,7 +23,7 @@ namespace UnitTesting.Tests.NUnit
public void SetUp()
{
project = new MockCSharpProject();
project.FileName = @"C:\Projects\MyTests\MyTests.csproj";
project.FileName = FileName.Create(@"C:\Projects\MyTests\MyTests.csproj");
project.AssemblyName = "MyTests";
project.OutputType = OutputType.Library;
project.SetProperty("OutputPath", null);

2
src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleExeSelectedTestFixture.cs

@ -125,7 +125,7 @@ namespace UnitTesting.Tests.NUnit @@ -125,7 +125,7 @@ namespace UnitTesting.Tests.NUnit
[Test]
public void NotMSBuildBasedProject()
{
MissingProject project = new MissingProject(@"C:\Projects\Test.proj", "Test");
MissingProject project = new MissingProject(FileName.Create(@"C:\Projects\Test.proj"), "Test");
ITestProject testProject = new NUnitTestProject(project);
NUnitConsoleApplication app = new NUnitConsoleApplication(new[] { testProject });

6
src/AddIns/Analysis/UnitTesting/Test/Service/TestFrameworkDescriptorTests.cs

@ -35,7 +35,7 @@ namespace UnitTesting.Tests.Service @@ -35,7 +35,7 @@ namespace UnitTesting.Tests.Service
MockCSharpProject CreateCSharpProjectNotSupportedByTestFramework()
{
var project = new MockCSharpProject();
project.FileName = @"d:\projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
fakeTestFramework = MockRepository.GenerateStrictMock<ITestFramework>();
fakeTestFramework.Stub(f => f.IsTestProject(project)).Return(false);
return project;
@ -52,7 +52,7 @@ namespace UnitTesting.Tests.Service @@ -52,7 +52,7 @@ namespace UnitTesting.Tests.Service
MockCSharpProject CreateVisualBasicProjectSupportedByTestFramework()
{
MockCSharpProject project = CreateCSharpProjectSupportedByTestFramework();
project.FileName = @"d:\projects\MyProject\MyProject.vbproj";
project.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.vbproj");
return project;
}
@ -167,7 +167,7 @@ namespace UnitTesting.Tests.Service @@ -167,7 +167,7 @@ namespace UnitTesting.Tests.Service
{
CreateTestFrameworkDescriptorToSupportProjectFileExtensions(".csproj");
MockCSharpProject project = CreateCSharpProjectSupportedByTestFramework();
project.FileName = @"d:\projects\MyProject\MyProject.CSPROJ";
project.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.CSPROJ");
bool supported = descriptor.IsSupportedProject(project);

3
src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.Core;
using ICSharpCode.NRefactory.TypeSystem;
using ICSharpCode.NRefactory.TypeSystem.Implementation;
using ICSharpCode.NRefactory.CSharp;
@ -26,7 +27,7 @@ namespace UnitTesting.Tests.Utils @@ -26,7 +27,7 @@ namespace UnitTesting.Tests.Utils
ProjectName = name,
Platform = "x86",
TargetFramework = TargetFramework.Net40Client,
OutputProjectFileName = "c:\\projects\\" + name + "\\" + name + ".csproj"
OutputProjectFileName = FileName.Create("c:\\projects\\" + name + "\\" + name + ".csproj")
})
{
OutputType = OutputType.Library;

2
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs

@ -26,7 +26,7 @@ namespace CSharpBinding @@ -26,7 +26,7 @@ namespace CSharpBinding
/// <summary>
/// Semantic highlighting for C#.
/// </summary>
public class CSharpSemanticHighlighter : DepthFirstAstVisitor, IHighlighter, IDisposable
public class CSharpSemanticHighlighter : DepthFirstAstVisitor, IHighlighter
{
readonly IDocument document;
readonly HighlightingColor defaultTextColor;

3
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs

@ -117,6 +117,9 @@ namespace CSharpBinding @@ -117,6 +117,9 @@ namespace CSharpBinding
var defaultTextColor = highlighter != null ? highlighter.DefaultTextColor : null;
results.Add(new Reference(region, result, offset, length, builder, defaultTextColor));
}, cancellationToken);
if (highlighter != null) {
highlighter.Dispose();
}
if (results.Count > 0)
callback(new SearchedFile(fileName, results));
}

4
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs

@ -153,6 +153,10 @@ namespace CSharpBinding.Parser @@ -153,6 +153,10 @@ namespace CSharpBinding.Parser
var defaultTextColor = highlighter != null ? highlighter.DefaultTextColor : null;
callback(new Reference(region, result, offset, length, builder, defaultTextColor));
}, cancellationToken);
if (highlighter != null) {
highlighter.Dispose();
}
}
static readonly Lazy<IAssemblyReference[]> defaultReferences = new Lazy<IAssemblyReference[]>(

8
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/SearchForIssuesCommand.cs

@ -168,6 +168,9 @@ namespace CSharpBinding.Refactoring @@ -168,6 +168,9 @@ namespace CSharpBinding.Refactoring
results.Add(SearchResultMatch.Create(document, issue.Start, issue.End, highlighter));
}
}
if (highlighter != null) {
highlighter.Dispose();
}
if (results.Count > 0)
return new SearchedFile(fileName, results);
else
@ -243,8 +246,9 @@ namespace CSharpBinding.Refactoring @@ -243,8 +246,9 @@ namespace CSharpBinding.Refactoring
}
}
if (allIssues.Count > 0) {
var highlighter = SD.EditorControlService.CreateHighlighter(document);
return allIssues.Select(issue => SearchResultMatch.Create(document, issue.Start, issue.End, highlighter));
using (var highlighter = SD.EditorControlService.CreateHighlighter(document)) {
return allIssues.Select(issue => SearchResultMatch.Create(document, issue.Start, issue.End, highlighter)).ToList();
}
} else {
return Enumerable.Empty<SearchResultMatch>();
}

3
src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlSymbolSearch.cs

@ -104,6 +104,9 @@ namespace ICSharpCode.XamlBinding @@ -104,6 +104,9 @@ namespace ICSharpCode.XamlBinding
}
offset = textSource.IndexOf(entity.Name, offset + length, textSource.TextLength - offset - length, StringComparison.OrdinalIgnoreCase);
} while (offset > 0);
if (highlighter != null) {
highlighter.Dispose();
}
callback(new SearchedFile(fileName, results));
}
}

10
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -134,6 +134,8 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -134,6 +134,8 @@ namespace ICSharpCode.AvalonEdit.AddIn
void UpdateSyntaxHighlighting(FileName fileName)
{
var oldHighlighter = primaryTextEditor.GetService<IHighlighter>();
var highlighting = HighlightingManager.Instance.GetDefinitionByExtension(Path.GetExtension(fileName));
var highlighter = SD.EditorControlService.CreateHighlighter(document);
@ -148,6 +150,11 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -148,6 +150,11 @@ namespace ICSharpCode.AvalonEdit.AddIn
secondaryTextEditor.TextArea.TextView.LineTransformers.Insert(0, new HighlightingColorizer(highlighter));
secondaryTextEditor.UpdateCustomizedHighlighting();
}
// Dispose the old highlighter; necessary to avoid memory leaks as
// semantic highlighters might attach to global parser events.
if (oldHighlighter != null) {
oldHighlighter.Dispose();
}
}
public void Redraw(ISegment segment, DispatcherPriority priority)
@ -263,6 +270,9 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -263,6 +270,9 @@ namespace ICSharpCode.AvalonEdit.AddIn
foreach (var d in textEditor.TextArea.LeftMargins.OfType<IDisposable>())
d.Dispose();
textEditor.TextArea.GetRequiredService<EnhancedScrollBar>().Dispose();
var highlighter = textEditor.TextArea.GetService<IHighlighter>();
if (highlighter != null)
highlighter.Dispose();
textEditor.Dispose();
}

8
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs

@ -126,6 +126,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -126,6 +126,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
readonly IHighlightingDefinition highlightingDefinition;
readonly IEnumerable<CustomizedHighlightingColor> customizations;
[ObsoleteAttribute("Use a normal HighlightingColorizer with a CustomizingHighlighter instead")]
public CustomizableHighlightingColorizer(IHighlightingDefinition highlightingDefinition, IEnumerable<CustomizedHighlightingColor> customizations)
: base(highlightingDefinition)
{
@ -152,7 +153,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -152,7 +153,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
return new CustomizingHighlighter(textView, customizations, highlightingDefinition, base.CreateHighlighter(textView, document));
}
internal sealed class CustomizingHighlighter : IHighlighter
internal sealed class CustomizingHighlighter : IHighlighter, IDisposable
{
readonly TextView textView;
readonly IEnumerable<CustomizedHighlightingColor> customizations;
@ -296,6 +297,11 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -296,6 +297,11 @@ namespace ICSharpCode.AvalonEdit.AddIn
{
baseHighlighter.EndHighlighting();
}
public void Dispose()
{
baseHighlighter.Dispose();
}
}
internal static HighlightingColor CustomizeColor(HighlightingColor color, IEnumerable<CustomizedHighlightingColor> customizations)

3
src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs

@ -218,6 +218,9 @@ namespace SearchAndReplace @@ -218,6 +218,9 @@ namespace SearchAndReplace
var defaultTextColor = highlighter != null ? highlighter.DefaultTextColor : null;
results.Add(new AvalonEditSearchResultMatch(fileName, start, end, result.Offset, result.Length, builder, defaultTextColor, result));
}
if (highlighter != null) {
highlighter.Dispose();
}
if (results.Count > 0)
return new SearchedFile(fileName, results);
else

12
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs

@ -29,6 +29,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting @@ -29,6 +29,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting
readonly CompressingTreeList<bool> isValid = new CompressingTreeList<bool>((a, b) => a == b);
readonly IDocument document;
readonly IHighlightingDefinition definition;
readonly WeakLineTracker weakLineTracker;
bool isHighlighting;
/// <summary>
@ -49,7 +50,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting @@ -49,7 +50,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting
throw new ArgumentNullException("definition");
this.document = document;
this.definition = definition;
WeakLineTracker.Register(document, this);
weakLineTracker = WeakLineTracker.Register(document, this);
InvalidateHighlighting();
}
@ -67,6 +68,15 @@ namespace ICSharpCode.AvalonEdit.Highlighting @@ -67,6 +68,15 @@ namespace ICSharpCode.AvalonEdit.Highlighting
InvalidateHighlighting();
}
/// <summary>
/// Disposes the document highlighter.
/// </summary>
public void Dispose()
{
if (weakLineTracker != null)
weakLineTracker.Deregister();
}
void ILineTracker.BeforeRemoveLine(DocumentLine line)
{
CheckIsHighlighting();

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs

@ -24,7 +24,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting @@ -24,7 +24,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting
/// <summary>
/// Creates a new HighlightingColorizer instance.
/// </summary>
/// <param name="ruleSet">The root highlighting rule set.</param>
/// <param name="definition">The highlighting definition.</param>
public HighlightingColorizer(IHighlightingDefinition definition)
{
if (definition == null)

9
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs

@ -11,7 +11,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting @@ -11,7 +11,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting
/// Represents a highlighted document.
/// </summary>
/// <remarks>This interface is used by the <see cref="HighlightingColorizer"/> to register the highlighter as a TextView service.</remarks>
public interface IHighlighter
public interface IHighlighter : IDisposable
{
/// <summary>
/// Gets the underlying text document.
@ -183,6 +183,13 @@ namespace ICSharpCode.AvalonEdit.Highlighting @@ -183,6 +183,13 @@ namespace ICSharpCode.AvalonEdit.Highlighting
}
return null;
}
public void Dispose()
{
foreach (var h in nestedHighlighters) {
h.Dispose();
}
}
}
/// <summary>

2
src/Main/Base/Project/Parser/ProjectContentContainer.cs

@ -55,7 +55,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -55,7 +55,7 @@ namespace ICSharpCode.SharpDevelop.Parser
this.project = project;
this.projectContent = initialProjectContent.SetAssemblyName(project.AssemblyName).SetLocation(project.OutputAssemblyFullPath);
this.cacheFileName = GetCacheFileName(FileName.Create(project.FileName));
this.cacheFileName = GetCacheFileName(project.FileName);
ProjectService.ProjectItemAdded += OnProjectItemAdded;
ProjectService.ProjectItemRemoved += OnProjectItemRemoved;

6
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs

@ -28,7 +28,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -28,7 +28,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
MessageService.ShowError("No project has been created, there is nothing to add.");
return;
}
AddExitingProjectToSolution.AddProject(solutionFolderNode, npdlg.NewProjectLocation);
AddExitingProjectToSolution.AddProject(solutionFolderNode, FileName.Create(npdlg.NewProjectLocation));
ProjectService.SaveSolution();
}
}
@ -64,7 +64,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -64,7 +64,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
public class AddExitingProjectToSolution : AbstractMenuCommand
{
public static void AddProject(ISolutionFolderNode solutionFolderNode, string fileName)
public static void AddProject(ISolutionFolderNode solutionFolderNode, FileName fileName)
{
if (solutionFolderNode == null)
throw new ArgumentNullException("solutionFolderNode");
@ -97,7 +97,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands @@ -97,7 +97,7 @@ namespace ICSharpCode.SharpDevelop.Project.Commands
fdiag.InitialDirectory = AddNewProjectToSolution.GetInitialDirectorySuggestion(solutionFolderNode);
if (fdiag.ShowDialog(ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.MainWin32Window) == DialogResult.OK) {
foreach (string fileName in fdiag.FileNames) {
AddProject(solutionFolderNode, fileName);
AddProject(solutionFolderNode, FileName.Create(fileName));
}
ProjectService.SaveSolution();
}

2
src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs

@ -220,7 +220,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -220,7 +220,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
}
project.FileName = newFileName;
project.FileName = FileName.Create(newFileName);
project.Name = newName;
ProjectService.SaveSolution();
}

3
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs

@ -6,6 +6,7 @@ using System.Collections.Generic; @@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
namespace ICSharpCode.SharpDevelop.Internal.Templates
@ -35,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -35,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
get { return createdProjects.AsReadOnly(); }
}
public string OutputProjectFileName { get; set; }
public FileName OutputProjectFileName { get; set; }
public string Platform { get; set; }
public string ProjectName { get; set; }
public string SolutionName { get; set; }

2
src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs

@ -323,7 +323,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -323,7 +323,7 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
}
}
projectCreateInformation.OutputProjectFileName = projectLocation;
projectCreateInformation.OutputProjectFileName = FileName.Create(projectLocation);
projectCreateInformation.RootNamespace = standardNamespace.ToString();
projectCreateInformation.ProjectName = newProjectName;
if (!string.IsNullOrEmpty(defaultPlatform))

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

@ -86,7 +86,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -86,7 +86,7 @@ namespace ICSharpCode.SharpDevelop.Project
#endregion
#region Filename / Directory
volatile string fileName;
volatile FileName fileName;
string cachedDirectoryName;
protected IProjectChangeWatcher watcher;
@ -97,9 +97,9 @@ namespace ICSharpCode.SharpDevelop.Project @@ -97,9 +97,9 @@ namespace ICSharpCode.SharpDevelop.Project
/// Only the getter is thread-safe.
/// </summary>
[ReadOnly(true)]
public string FileName {
public FileName FileName {
get {
return fileName ?? "";
return fileName;
}
set {
if (value == null)

2
src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.SharpDevelop.Project.Converter @@ -39,7 +39,7 @@ namespace ICSharpCode.SharpDevelop.Project.Converter
if (descriptor == null || descriptor.Binding == null)
throw new InvalidOperationException("Cannot get Language Binding for " + TargetLanguageName);
info.OutputProjectFileName = FileUtility.NormalizePath(Path.Combine(targetProjectDirectory, info.ProjectName + descriptor.ProjectFileExtension));
info.OutputProjectFileName = FileName.Create(Path.Combine(targetProjectDirectory, info.ProjectName + descriptor.ProjectFileExtension));
return descriptor.Binding.CreateProject(info);
}

2
src/Main/Base/Project/Src/Project/IProject.cs

@ -69,7 +69,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -69,7 +69,7 @@ namespace ICSharpCode.SharpDevelop.Project
///
/// Only the getter is thread-safe.
/// </summary>
string FileName {
FileName FileName {
get;
set;
}

5
src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs

@ -16,8 +16,9 @@ namespace ICSharpCode.SharpDevelop.Project @@ -16,8 +16,9 @@ namespace ICSharpCode.SharpDevelop.Project
[Browsable(false)]
public IProject ReferencedProject {
get {
// must be thread-safe because it's used by LoadSolutionProjectsThread
return ProjectService.GetProject(this.FileName);
// must be thread-safe because it's used by LoadSolutionProjectsThread,
// and by IAssemblyReference.Resolve()
return ProjectService.GetProject(Core.FileName.Create(this.FileName));
}
}

2
src/Main/Base/Project/Src/Project/MSBuildFileProject.cs

@ -13,7 +13,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -13,7 +13,7 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary>
public class MSBuildFileProject : AbstractProject
{
public MSBuildFileProject(string fileName, string title)
public MSBuildFileProject(FileName fileName, string title)
{
Name = title;
FileName = fileName;

3
src/Main/Base/Project/Src/Project/MissingProject.cs

@ -2,12 +2,13 @@ @@ -2,12 +2,13 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project
{
public class MissingProject : AbstractProject
{
public MissingProject(string fileName, string title)
public MissingProject(FileName fileName, string title)
{
Name = title;
FileName = fileName;

5
src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Project
{
@ -12,7 +13,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -12,7 +13,7 @@ namespace ICSharpCode.SharpDevelop.Project
public class ProjectLoadInformation
{
public Solution ParentSolution { get; private set; }
public string FileName { get; private set; }
public FileName FileName { get; private set; }
public string Configuration { get; internal set; }
public string Platform { get; internal set; }
public string ProjectName { get; private set; }
@ -44,7 +45,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -44,7 +45,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
public ProjectLoadInformation(Solution parentSolution, string fileName, string projectName)
public ProjectLoadInformation(Solution parentSolution, FileName fileName, string projectName)
{
if (parentSolution == null)
throw new ArgumentNullException("parentSolution");

2
src/Main/Base/Project/Src/Project/Solution/Solution.cs

@ -544,7 +544,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -544,7 +544,7 @@ namespace ICSharpCode.SharpDevelop.Project
SolutionFolder newFolder = SolutionFolder.ReadFolder(sr, title, location, guid);
newSolution.AddFolder(newFolder);
} else {
ProjectLoadInformation loadInfo = new ProjectLoadInformation(newSolution, location, title);
ProjectLoadInformation loadInfo = new ProjectLoadInformation(newSolution, Core.FileName.Create(location), title);
loadInfo.TypeGuid = projectGuid;
loadInfo.Guid = guid;
projectsToLoad.Add(loadInfo);

4
src/Main/Base/Project/Src/Project/UnknownProject.cs

@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -27,7 +27,7 @@ namespace ICSharpCode.SharpDevelop.Project
MessageService.ShowError("Error loading " + this.FileName + ":\n" + warningText);
}
public UnknownProject(string fileName, string title, string warningText, bool displayWarningToUser)
public UnknownProject(FileName fileName, string title, string warningText, bool displayWarningToUser)
: this(fileName, title)
{
this.warningText = warningText;
@ -36,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -36,7 +36,7 @@ namespace ICSharpCode.SharpDevelop.Project
}
}
public UnknownProject(string fileName, string title)
public UnknownProject(FileName fileName, string title)
{
Name = title;
FileName = fileName;

2
src/Main/Base/Project/Src/Services/ProjectBinding/ProjectBindingService.cs

@ -89,7 +89,7 @@ namespace ICSharpCode.SharpDevelop @@ -89,7 +89,7 @@ namespace ICSharpCode.SharpDevelop
if (loadInformation == null)
throw new ArgumentNullException("loadInformation");
string location = FileUtility.NormalizePath(loadInformation.FileName);
var location = loadInformation.FileName;
string title = loadInformation.ProjectName;
IProgressMonitor progressMonitor = loadInformation.ProgressMonitor;

8
src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs

@ -52,13 +52,13 @@ namespace ICSharpCode.SharpDevelop.Project @@ -52,13 +52,13 @@ namespace ICSharpCode.SharpDevelop.Project
/// <summary>
/// Gets an open project by the name of the project file.
/// </summary>
public static IProject GetProject(string projectFilename)
public static IProject GetProject(FileName projectFilename)
{
Solution sln = openSolution;
if (sln == null)
return null;
foreach (IProject project in sln.Projects) {
if (FileUtility.IsEqualFileName(project.FileName, projectFilename)) {
if (project.FileName == projectFilename) {
return project;
}
}
@ -376,7 +376,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -376,7 +376,7 @@ namespace ICSharpCode.SharpDevelop.Project
"${res:Global.IgnoreButtonText}");
if (res == 0) {
// Add project to solution
Commands.AddExitingProjectToSolution.AddProject((ISolutionFolderNode)ProjectBrowserPad.Instance.SolutionNode, fileName);
Commands.AddExitingProjectToSolution.AddProject((ISolutionFolderNode)ProjectBrowserPad.Instance.SolutionNode, FileName.Create(fileName));
SaveSolution();
return;
} else if (res == 1) {
@ -402,7 +402,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -402,7 +402,7 @@ namespace ICSharpCode.SharpDevelop.Project
IProjectBinding binding = ProjectBindingService.GetBindingPerProjectFile(fileName);
IProject project;
if (binding != null) {
project = ProjectBindingService.LoadProject(new ProjectLoadInformation(solution, fileName, solution.Name));
project = ProjectBindingService.LoadProject(new ProjectLoadInformation(solution, FileName.Create(fileName), solution.Name));
if (project is UnknownProject) {
if (((UnknownProject)project).WarningDisplayedToUser == false) {
((UnknownProject)project).ShowWarningMessageBox();

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

@ -347,6 +347,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -347,6 +347,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
IHighlighter highlighter = null;
foreach (Reference r in list) {
if (document == null || fileName != r.FileName) {
if (highlighter != null) {
highlighter.Dispose();
}
fileName = r.FileName;
buffer = SD.FileService.GetFileContent(r.FileName);
document = new ReadOnlyDocument(buffer, r.FileName);
@ -361,6 +364,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring @@ -361,6 +364,9 @@ namespace ICSharpCode.SharpDevelop.Refactoring
SearchResultMatch res = new SearchResultMatch(fileName, start, end, startOffset, endOffset - startOffset, builder, defaultTextColor);
results.Add(res);
}
if (highlighter != null) {
highlighter.Dispose();
}
SearchResultsPad.Instance.ShowSearchResults(title, results);
SearchResultsPad.Instance.BringToFront();
}

6
src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs

@ -88,7 +88,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -88,7 +88,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void CreateDirectoryNode_ProjectHasServiceReferencesItemAndDirectoryMatchesServiceReferencesPath_CreatesServiceReferencesFolderNode()
{
CreateProject();
project.FileName = @"d:\projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
ServiceReferencesProjectItem projectItem = AddWCFMetadataProjectItemToProject();
projectItem.Include = @"Service References\";
@ -103,7 +103,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -103,7 +103,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void CreateDirectoryNode_FileProjectItemThatEndsWithForwardSlash_DirectoryNodeCreatedWithForwardSlashRemoved()
{
CreateProject();
project.FileName = @"d:\projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
FileProjectItem projectItem = CreateFileProjectItem(@"MyFolder/");
DirectoryNode node = DirectoryNodeFactory.CreateDirectoryNode(projectItem, FileNodeStatus.None);
@ -115,7 +115,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -115,7 +115,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void CreateDirectoryNode_FileProjectItemThatEndsWithBackSlash_DirectoryNodeCreatedWithBackSlashRemoved()
{
CreateProject();
project.FileName = @"d:\projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
FileProjectItem projectItem = CreateFileProjectItem(@"MyFolder\");
DirectoryNode node = DirectoryNodeFactory.CreateDirectoryNode(projectItem, FileNodeStatus.None);

7
src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs

@ -6,6 +6,7 @@ using System.CodeDom.Compiler; @@ -6,6 +6,7 @@ using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Tests.WebReferences;
@ -335,7 +336,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -335,7 +336,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void AddAppConfigFile_ProjectHasNoAppConfig_ProjectItemAddedToProjectForAppConfig()
{
CreateProjectWithMSBuildProject();
msbuildProject.FileName = @"d:\projects\MyProject\myproject.csproj";
msbuildProject.FileName = FileName.Create(@"d:\projects\MyProject\myproject.csproj");
project.AddAppConfigFile();
@ -391,7 +392,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -391,7 +392,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void GetAppConfigFileName_ProjectHasNoAppConfig_DefaultAppConfigFileNameReturned()
{
CreateProjectWithMSBuildProject();
msbuildProject.FileName = @"d:\projects\MyProject\myproject.csproj";
msbuildProject.FileName = FileName.Create(@"d:\projects\MyProject\myproject.csproj");
string fileName = project.GetAppConfigFileName();
@ -402,7 +403,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -402,7 +403,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void GetAppConfigFileName_ProjectHasAppConfigInSubFolder_AppConfigFileNameReturned()
{
CreateProjectWithMSBuildProject();
msbuildProject.FileName = @"d:\projects\MyProject\myproject.csproj";
msbuildProject.FileName = FileName.Create(@"d:\projects\MyProject\myproject.csproj");
AddFileToMSBuildProject(@"SubFolder\app.config");
string fileName = project.GetAppConfigFileName();

3
src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using Gui.Pads.ProjectBrowser.TreeNodes;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Tests.WebReferences;
using NUnit.Framework;
@ -41,7 +42,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -41,7 +42,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void Directory_ProjectItemHasServiceReferenceDirectory_ReturnsFullPathToServiceReferencesDirectory()
{
CreateServiceReferenceProjectItem();
project.FileName = @"d:\projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"d:\projects\MyProject\MyProject.csproj");
projectItem.Include = @"Service References\";
CreateFolderNode();

9
src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.SharpDevelop.Tests.WebReferences;
using NUnit.Framework;
@ -36,7 +37,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -36,7 +37,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void Directory_ProjectItemIncludePathEndsWithForwardSlash_ReturnsFullPathOfServiceReferencesFolder()
{
CreateProjectItem();
project.FileName = @"C:\Projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"C:\Projects\MyProject\MyProject.csproj");
projectItem.Include = @"Service References\";
string directory = projectItem.Directory;
@ -48,7 +49,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -48,7 +49,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void IsServiceReferencesFolder_FolderMatchesServiceReferencesFolder_ReturnsTrue()
{
CreateProjectItem();
project.FileName = @"C:\Projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"C:\Projects\MyProject\MyProject.csproj");
projectItem.Include = @"Service References\";
string folder = @"C:\Projects\MyProject\Service References";
@ -61,7 +62,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -61,7 +62,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void IsServiceReferencesFolder_FolderDoesNotMatcheServiceReferencesFolder_ReturnsFalse()
{
CreateProjectItem();
project.FileName = @"C:\Projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"C:\Projects\MyProject\MyProject.csproj");
projectItem.Include = @"Service References\";
string folder = @"d:\projects\MyProject\Test";
@ -74,7 +75,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences @@ -74,7 +75,7 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences
public void IsServiceReferencesFolder_FolderMatchesServiceReferencesFolderButWithDifferentCase_ReturnsTrue()
{
CreateProjectItem();
project.FileName = @"C:\Projects\MyProject\MyProject.csproj";
project.FileName = FileName.Create(@"C:\Projects\MyProject\MyProject.csproj");
projectItem.Include = @"Service References\";
string folder = @"c:\projects\myproject\service references";

2
src/Main/Base/Test/Utils/ProjectHelper.cs

@ -17,7 +17,7 @@ namespace ICSharpCode.SharpDevelop.Tests.Utils @@ -17,7 +17,7 @@ namespace ICSharpCode.SharpDevelop.Tests.Utils
public ProjectHelper(string fileName)
{
Project.Stub(p => p.FileName).Return(fileName);
Project.Stub(p => p.FileName).Return(FileName.Create(fileName));
Project
.Stub(p => p.Items)

3
src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using ICSharpCode.Core;
using NUnit.Framework;
using System;
using System.IO;
@ -24,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences @@ -24,7 +25,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences
public void SetUpFixture()
{
MSBuildBasedProject project = WebReferenceTestHelper.CreateTestProject("C#");
project.FileName = Path.Combine(projectDirectory, "foo.csproj");
project.FileName = FileName.Create(Path.Combine(projectDirectory, "foo.csproj"));
project.AppDesignerFolder = "Properties";
WebReferencesProjectItem webReferencesItem = new WebReferencesProjectItem(project);

2
src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs

@ -30,7 +30,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences @@ -30,7 +30,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences
: base(new ProjectCreateInformation {
Solution = new Solution(new MockProjectChangeWatcher()),
ProjectName = "TestProject",
OutputProjectFileName = "c:\\temp\\TestProject.csproj"
OutputProjectFileName = FileName.Create("c:\\temp\\TestProject.csproj")
})
{
this.languageName = languageName;

3
src/Main/Base/Test/WebReferences/WebReferenceTests.cs

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
@ -39,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences @@ -39,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences
public void SetUpFixture()
{
project = WebReferenceTestHelper.CreateTestProject("C#");
project.FileName = "C:\\projects\\test\\foo.csproj";
project.FileName = FileName.Create("C:\\projects\\test\\foo.csproj");
protocol = new DiscoveryClientProtocol();
DiscoveryDocumentReference discoveryRef = new DiscoveryDocumentReference();

5
src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using NUnit.Framework;
@ -30,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences @@ -30,7 +31,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences
public void IsWebReferencesFolder_FolderMatchesWebReferencesProjectItemFolder_ReturnsTrue()
{
CreateProject();
project.FileName = @"C:\projects\test\foo.csproj";
project.FileName = FileName.Create(@"C:\projects\test\foo.csproj");
AddWebReferencesToProject(@"Web References\");
bool result = WebReferencesProjectItem.IsWebReferencesFolder(project, @"C:\projects\test\Web References");
@ -42,7 +43,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences @@ -42,7 +43,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences
public void IsWebReferencesFolder_FolderDoesNotMatchWebReferencesProjectItemFolder_ReturnsFalse()
{
CreateProject();
project.FileName = @"C:\projects\test\foo.csproj";
project.FileName = FileName.Create(@"C:\projects\test\foo.csproj");
AddWebReferencesToProject(@"Web References\");
bool result = WebReferencesProjectItem.IsWebReferencesFolder(project, @"C:\projects\test\foo");

3
src/Main/SharpDevelop/Parser/ParserService.cs

@ -45,8 +45,7 @@ namespace ICSharpCode.SharpDevelop.Parser @@ -45,8 +45,7 @@ namespace ICSharpCode.SharpDevelop.Parser
string addition;
if (e.OldUnresolvedFile == null) {
addition = " (new)";
} else
if (e.NewUnresolvedFile == null) {
} else if (e.NewUnresolvedFile == null) {
addition = " (removed)";
} else {
addition = " (updated)";

Loading…
Cancel
Save