diff --git a/src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleCommandLineTests.cs b/src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleCommandLineTests.cs index b447be0bfe..9ea19fbeb0 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleCommandLineTests.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleCommandLineTests.cs @@ -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); diff --git a/src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleExeSelectedTestFixture.cs b/src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleExeSelectedTestFixture.cs index 798d195be4..ec5efc8e6b 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleExeSelectedTestFixture.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/NUnit/NUnitConsoleExeSelectedTestFixture.cs @@ -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 }); diff --git a/src/AddIns/Analysis/UnitTesting/Test/Service/TestFrameworkDescriptorTests.cs b/src/AddIns/Analysis/UnitTesting/Test/Service/TestFrameworkDescriptorTests.cs index c744c096ec..5653ac4c43 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Service/TestFrameworkDescriptorTests.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Service/TestFrameworkDescriptorTests.cs @@ -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(); fakeTestFramework.Stub(f => f.IsTestProject(project)).Return(false); return project; @@ -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 { 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); diff --git a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs index e076d2d762..3e53382507 100644 --- a/src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs +++ b/src/AddIns/Analysis/UnitTesting/Test/Utils/MockCSharpProject.cs @@ -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 ProjectName = name, Platform = "x86", TargetFramework = TargetFramework.Net40Client, - OutputProjectFileName = "c:\\projects\\" + name + "\\" + name + ".csproj" + OutputProjectFileName = FileName.Create("c:\\projects\\" + name + "\\" + name + ".csproj") }) { OutputType = OutputType.Library; diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs index bcfe44d06c..ff70ebc12e 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpSemanticHighlighter.cs @@ -26,7 +26,7 @@ namespace CSharpBinding /// /// Semantic highlighting for C#. /// - public class CSharpSemanticHighlighter : DepthFirstAstVisitor, IHighlighter, IDisposable + public class CSharpSemanticHighlighter : DepthFirstAstVisitor, IHighlighter { readonly IDocument document; readonly HighlightingColor defaultTextColor; diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs index 8dafa88a93..da02599a73 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/CSharpSymbolSearch.cs @@ -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)); } diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs index 214e7d5e9f..4c565fa075 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Parser/Parser.cs @@ -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 defaultReferences = new Lazy( diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/SearchForIssuesCommand.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/SearchForIssuesCommand.cs index 8efd1dd0fd..e0cb71a1db 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/SearchForIssuesCommand.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/SearchForIssuesCommand.cs @@ -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 } } 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(); } diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlSymbolSearch.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlSymbolSearch.cs index 7779f3f8de..44701f868f 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlSymbolSearch.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlSymbolSearch.cs @@ -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)); } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index 1ed8bc559f..88459214a9 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -134,6 +134,8 @@ namespace ICSharpCode.AvalonEdit.AddIn void UpdateSyntaxHighlighting(FileName fileName) { + var oldHighlighter = primaryTextEditor.GetService(); + var highlighting = HighlightingManager.Instance.GetDefinitionByExtension(Path.GetExtension(fileName)); var highlighter = SD.EditorControlService.CreateHighlighter(document); @@ -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 foreach (var d in textEditor.TextArea.LeftMargins.OfType()) d.Dispose(); textEditor.TextArea.GetRequiredService().Dispose(); + var highlighter = textEditor.TextArea.GetService(); + if (highlighter != null) + highlighter.Dispose(); textEditor.Dispose(); } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs index 828411176e..e07166ad6d 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CustomizableHighlightingColorizer.cs @@ -126,6 +126,7 @@ namespace ICSharpCode.AvalonEdit.AddIn readonly IHighlightingDefinition highlightingDefinition; readonly IEnumerable customizations; + [ObsoleteAttribute("Use a normal HighlightingColorizer with a CustomizingHighlighter instead")] public CustomizableHighlightingColorizer(IHighlightingDefinition highlightingDefinition, IEnumerable customizations) : base(highlightingDefinition) { @@ -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 customizations; @@ -296,6 +297,11 @@ namespace ICSharpCode.AvalonEdit.AddIn { baseHighlighter.EndHighlighting(); } + + public void Dispose() + { + baseHighlighter.Dispose(); + } } internal static HighlightingColor CustomizeColor(HighlightingColor color, IEnumerable customizations) diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs index 025af9bf6b..da6afa5622 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchManager.cs @@ -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 diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs index c2e3c63ff1..ecdbf4d3f9 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/DocumentHighlighter.cs @@ -29,6 +29,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting readonly CompressingTreeList isValid = new CompressingTreeList((a, b) => a == b); readonly IDocument document; readonly IHighlightingDefinition definition; + readonly WeakLineTracker weakLineTracker; bool isHighlighting; /// @@ -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 InvalidateHighlighting(); } + /// + /// Disposes the document highlighter. + /// + public void Dispose() + { + if (weakLineTracker != null) + weakLineTracker.Deregister(); + } + void ILineTracker.BeforeRemoveLine(DocumentLine line) { CheckIsHighlighting(); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs index 0e78b46eaf..ff8223de13 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/HighlightingColorizer.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// /// Creates a new HighlightingColorizer instance. /// - /// The root highlighting rule set. + /// The highlighting definition. public HighlightingColorizer(IHighlightingDefinition definition) { if (definition == null) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs index 858a9abdad..70c37ef26a 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Highlighting/IHighlighter.cs @@ -11,7 +11,7 @@ namespace ICSharpCode.AvalonEdit.Highlighting /// Represents a highlighted document. /// /// This interface is used by the to register the highlighter as a TextView service. - public interface IHighlighter + public interface IHighlighter : IDisposable { /// /// Gets the underlying text document. @@ -183,6 +183,13 @@ namespace ICSharpCode.AvalonEdit.Highlighting } return null; } + + public void Dispose() + { + foreach (var h in nestedHighlighters) { + h.Dispose(); + } + } } /// diff --git a/src/Main/Base/Project/Parser/ProjectContentContainer.cs b/src/Main/Base/Project/Parser/ProjectContentContainer.cs index e8d4b9538d..85672926ee 100644 --- a/src/Main/Base/Project/Parser/ProjectContentContainer.cs +++ b/src/Main/Base/Project/Parser/ProjectContentContainer.cs @@ -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; diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs index 15ed121078..291da236d1 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/Commands/SolutionNodeCommands.cs @@ -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 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 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(); } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs index db91a95e95..23e496e46a 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs @@ -220,7 +220,7 @@ namespace ICSharpCode.SharpDevelop.Project } } } - project.FileName = newFileName; + project.FileName = FileName.Create(newFileName); project.Name = newName; ProjectService.SaveSolution(); } diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs index d9a992236d..853339116e 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectCreateInformation.cs @@ -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 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; } diff --git a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs index 230399cf8c..af2d18b7c4 100644 --- a/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs +++ b/src/Main/Base/Project/Src/Internal/Templates/Project/ProjectDescriptor.cs @@ -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)) diff --git a/src/Main/Base/Project/Src/Project/AbstractProject.cs b/src/Main/Base/Project/Src/Project/AbstractProject.cs index a5717538a4..3c290adb61 100644 --- a/src/Main/Base/Project/Src/Project/AbstractProject.cs +++ b/src/Main/Base/Project/Src/Project/AbstractProject.cs @@ -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 /// Only the getter is thread-safe. /// [ReadOnly(true)] - public string FileName { + public FileName FileName { get { - return fileName ?? ""; + return fileName; } set { if (value == null) diff --git a/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs b/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs index c5ab5e58bc..0fd443bbee 100644 --- a/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs +++ b/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs @@ -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); } diff --git a/src/Main/Base/Project/Src/Project/IProject.cs b/src/Main/Base/Project/Src/Project/IProject.cs index 85d99cdf82..d4e748a79e 100644 --- a/src/Main/Base/Project/Src/Project/IProject.cs +++ b/src/Main/Base/Project/Src/Project/IProject.cs @@ -69,7 +69,7 @@ namespace ICSharpCode.SharpDevelop.Project /// /// Only the getter is thread-safe. /// - string FileName { + FileName FileName { get; set; } diff --git a/src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs index 02ac994d5c..eb536a4a38 100644 --- a/src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/ProjectReferenceProjectItem.cs @@ -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)); } } diff --git a/src/Main/Base/Project/Src/Project/MSBuildFileProject.cs b/src/Main/Base/Project/Src/Project/MSBuildFileProject.cs index 8885890d30..3270124b35 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildFileProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildFileProject.cs @@ -13,7 +13,7 @@ namespace ICSharpCode.SharpDevelop.Project /// public class MSBuildFileProject : AbstractProject { - public MSBuildFileProject(string fileName, string title) + public MSBuildFileProject(FileName fileName, string title) { Name = title; FileName = fileName; diff --git a/src/Main/Base/Project/Src/Project/MissingProject.cs b/src/Main/Base/Project/Src/Project/MissingProject.cs index 1e7bf5f76c..089b219a6b 100644 --- a/src/Main/Base/Project/Src/Project/MissingProject.cs +++ b/src/Main/Base/Project/Src/Project/MissingProject.cs @@ -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; diff --git a/src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs b/src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs index e4f1de8a1a..2790352fc5 100644 --- a/src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs +++ b/src/Main/Base/Project/Src/Project/ProjectLoadInformation.cs @@ -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 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 } } - public ProjectLoadInformation(Solution parentSolution, string fileName, string projectName) + public ProjectLoadInformation(Solution parentSolution, FileName fileName, string projectName) { if (parentSolution == null) throw new ArgumentNullException("parentSolution"); diff --git a/src/Main/Base/Project/Src/Project/Solution/Solution.cs b/src/Main/Base/Project/Src/Project/Solution/Solution.cs index 82b9c5ea23..2c4b29f5ed 100644 --- a/src/Main/Base/Project/Src/Project/Solution/Solution.cs +++ b/src/Main/Base/Project/Src/Project/Solution/Solution.cs @@ -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); diff --git a/src/Main/Base/Project/Src/Project/UnknownProject.cs b/src/Main/Base/Project/Src/Project/UnknownProject.cs index ddb1f71da8..4f56b4abcc 100644 --- a/src/Main/Base/Project/Src/Project/UnknownProject.cs +++ b/src/Main/Base/Project/Src/Project/UnknownProject.cs @@ -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 } } - public UnknownProject(string fileName, string title) + public UnknownProject(FileName fileName, string title) { Name = title; FileName = fileName; diff --git a/src/Main/Base/Project/Src/Services/ProjectBinding/ProjectBindingService.cs b/src/Main/Base/Project/Src/Services/ProjectBinding/ProjectBindingService.cs index 96fba9c10b..722bd31013 100644 --- a/src/Main/Base/Project/Src/Services/ProjectBinding/ProjectBindingService.cs +++ b/src/Main/Base/Project/Src/Services/ProjectBinding/ProjectBindingService.cs @@ -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; diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs index adbbfc93e2..bcba4f591a 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs @@ -52,13 +52,13 @@ namespace ICSharpCode.SharpDevelop.Project /// /// Gets an open project by the name of the project file. /// - 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 "${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 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(); diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs index 8430d239a5..40c23dd6db 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/FindReferencesAndRenameHelper.cs @@ -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 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(); } diff --git a/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs b/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs index c97ab25586..2c407f2f97 100644 --- a/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs +++ b/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs @@ -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 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 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); diff --git a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs index 2c2f1f2a54..80926a0d1b 100644 --- a/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ProjectWithServiceReferencesTests.cs @@ -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 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 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 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(); diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs index 61f38d8f45..0be3418839 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferencesFolderNodeTests.cs @@ -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 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(); diff --git a/src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs b/src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs index f630fea88e..008ad56783 100644 --- a/src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs +++ b/src/Main/Base/Test/ServiceReferences/ServiceReferencesProjectItemTests.cs @@ -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 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 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 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 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"; diff --git a/src/Main/Base/Test/Utils/ProjectHelper.cs b/src/Main/Base/Test/Utils/ProjectHelper.cs index e6c5eb4e13..bb3b3bc78e 100644 --- a/src/Main/Base/Test/Utils/ProjectHelper.cs +++ b/src/Main/Base/Test/Utils/ProjectHelper.cs @@ -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) diff --git a/src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs b/src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs index 43c12b2f72..74b6974522 100644 --- a/src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs +++ b/src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs @@ -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 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); diff --git a/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs b/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs index 23b40be391..100abc4675 100644 --- a/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs +++ b/src/Main/Base/Test/WebReferences/WebReferenceTestHelper.cs @@ -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; diff --git a/src/Main/Base/Test/WebReferences/WebReferenceTests.cs b/src/Main/Base/Test/WebReferences/WebReferenceTests.cs index cde4b601a3..5b72d94713 100644 --- a/src/Main/Base/Test/WebReferences/WebReferenceTests.cs +++ b/src/Main/Base/Test/WebReferences/WebReferenceTests.cs @@ -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 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(); diff --git a/src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs b/src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs index 74f5367067..d6ee5865ac 100644 --- a/src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs +++ b/src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs @@ -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 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 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"); diff --git a/src/Main/SharpDevelop/Parser/ParserService.cs b/src/Main/SharpDevelop/Parser/ParserService.cs index 6ea97deaee..7018a65673 100644 --- a/src/Main/SharpDevelop/Parser/ParserService.cs +++ b/src/Main/SharpDevelop/Parser/ParserService.cs @@ -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)";