From cd0fbe430d661e385718431ce6123de179b4896a Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 29 Jan 2010 15:37:16 +0000 Subject: [PATCH] Fixed SD2-1642: NotImplementedException when converting project from C# to VB git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5460 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/Project/VBNetToCSharpConverter.cs | 8 +-- .../Src/Project/CSharpToVBNetConverter.cs | 6 +- .../Project/Converter/LanguageConverter.cs | 13 ----- .../Src/Project/MSBuildBasedProject.cs | 58 +++++++++---------- .../Project/Src/Project/MSBuildInternals.cs | 4 ++ 5 files changed, 39 insertions(+), 50 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/VBNetToCSharpConverter.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/VBNetToCSharpConverter.cs index 219cf99cd9..e2f7873e60 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/VBNetToCSharpConverter.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/VBNetToCSharpConverter.cs @@ -61,11 +61,11 @@ namespace CSharpBinding // (we replace existing NoWarn entries because VB and C# error codes don't match) project.SetProperty("NoWarn", "1591"); - FixProperty(project, "DefineConstants", - v => v.Replace(',', ';')); + project.ChangeProperty("DefineConstants", + v => v.Replace(',', ';')); - FixProperty(project, "ProjectTypeGuids", - v => v.Replace(ProjectTypeGuids.VBNet, ProjectTypeGuids.CSharp, StringComparison.OrdinalIgnoreCase)); + project.ChangeProperty("ProjectTypeGuids", + v => v.Replace(ProjectTypeGuids.VBNet, ProjectTypeGuids.CSharp, StringComparison.OrdinalIgnoreCase)); } protected override void ConvertAst(CompilationUnit compilationUnit, List specials, FileProjectItem sourceItem) diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/CSharpToVBNetConverter.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/CSharpToVBNetConverter.cs index d919c4ca9e..abc93b753e 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/CSharpToVBNetConverter.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/CSharpToVBNetConverter.cs @@ -60,9 +60,9 @@ namespace VBNetBinding { VBNetProject vbProject = (VBNetProject)targetProject; base.CopyProperties(sourceProject, targetProject); - FixProperty(vbProject, "DefineConstants", v => v.Replace(';', ',')); - FixProperty(vbProject, "ProjectTypeGuids", - v => v.Replace(ProjectTypeGuids.CSharp, ProjectTypeGuids.VBNet, StringComparison.OrdinalIgnoreCase)); + vbProject.ChangeProperty("DefineConstants", v => v.Replace(';', ',')); + vbProject.ChangeProperty("ProjectTypeGuids", + v => v.Replace(ProjectTypeGuids.CSharp, ProjectTypeGuids.VBNet, StringComparison.OrdinalIgnoreCase)); // determine the StartupObject startupObject = vbProject.GetEvaluatedProperty("StartupObject"); diff --git a/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs b/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs index 725470960b..3e95698184 100644 --- a/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs +++ b/src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs @@ -94,19 +94,6 @@ namespace ICSharpCode.SharpDevelop.Project.Converter } } - /// - /// Changes all instances of a property in the by applying a method to its value. - /// - protected void FixProperty(MSBuildBasedProject project, string propertyName, Converter method) - { - lock (project.SyncRoot) { - throw new NotImplementedException(); - /*foreach (MSBuild.BuildProperty p in project.GetAllProperties(propertyName)) { - p.Value = method(p.Value); - }*/ - } - } - protected virtual void FixExtensionOfExtraProperties(FileProjectItem item, string sourceExtension, string targetExtension) { List> replacements = new List>(); diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index 9f82c4caa3..cc21b107d3 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -76,7 +76,7 @@ namespace ICSharpCode.SharpDevelop.Project /// public ProjectRootElement MSBuildProjectFile { get { - if (projectFile == null) + if (projectFile == null) throw new ObjectDisposedException("MSBuildBasedProject"); return projectFile; } @@ -88,7 +88,7 @@ namespace ICSharpCode.SharpDevelop.Project /// public ProjectRootElement MSBuildUserProjectFile { get { - if (projectFile == null) + if (projectFile == null) throw new ObjectDisposedException("MSBuildBasedProject"); return userProjectFile; } @@ -97,8 +97,7 @@ namespace ICSharpCode.SharpDevelop.Project public override int MinimumSolutionVersion { get { lock (SyncRoot) { - if (string.IsNullOrEmpty(projectFile.ToolsVersion) || projectFile.ToolsVersion == "2.0") - { + if (string.IsNullOrEmpty(projectFile.ToolsVersion) || projectFile.ToolsVersion == "2.0") { return Solution.SolutionVersionVS2005; } else if (projectFile.ToolsVersion == "3.0" || projectFile.ToolsVersion == "3.5") { return Solution.SolutionVersionVS2008; @@ -519,7 +518,7 @@ namespace ICSharpCode.SharpDevelop.Project static ProjectPropertyElement GetAnyUnevaluatedProperty(ProjectRootElement project, string configuration, string platform, string propertyName) { foreach (var g in project.PropertyGroups) { - var property = g.Properties.FirstOrDefault(p => p.Name == propertyName); + var property = g.Properties.FirstOrDefault(p => MSBuildInternals.PropertyNameComparer.Equals(p.Name, propertyName)); if (property == null) continue; string gConfiguration, gPlatform; @@ -535,33 +534,32 @@ namespace ICSharpCode.SharpDevelop.Project return null; } - /* /// /// Get all instances of the specified property. /// - /// Warning: you need to lock(project.SyncRoot) around calls to GetAllProperties - /// until you no longer need to access the BuildProperty objects! + /// Warning: you need to lock(project.SyncRoot) around calls to GetAllUnevaluatedProperties + /// until you no longer need to access the ProjectPropertyElement objects! /// - public IList GetAllProperties(string propertyName) + IEnumerable GetAllUnevaluatedProperties() { - List l = new List(); - foreach (MSBuild.BuildPropertyGroup g in project.PropertyGroups) { - if (g.IsImported) continue; - MSBuild.BuildProperty property = MSBuildInternals.GetProperty(g, propertyName); - if (property != null) { - l.Add(property); - } - } - foreach (MSBuild.BuildPropertyGroup g in userProject.PropertyGroups) { - if (g.IsImported) continue; - MSBuild.BuildProperty property = MSBuildInternals.GetProperty(g, propertyName); - if (property != null) { - l.Add(property); + return projectFile.Properties.Concat(userProjectFile.Properties); + } + + /// + /// Changes all instances of a property in the by applying a method to its unevaluated value. + /// + /// The method will be called within a lock (project.SyncRoot) block. + /// + public void ChangeProperty(string propertyName, Func method) + { + lock (this.SyncRoot) { + foreach (ProjectPropertyElement p in GetAllUnevaluatedProperties()) { + if (MSBuildInternals.PropertyNameComparer.Equals(p.Name, propertyName)) { + p.Value = method(p.Value); + } } } - return l; } - */ #endregion #region SetProperty @@ -581,12 +579,12 @@ namespace ICSharpCode.SharpDevelop.Project PropertyStorageLocations FindExistingPropertyInAllConfigurations(string propertyName) { foreach (var g in projectFile.PropertyGroups) { - if (g.Properties.Any(p => p.Name == propertyName)) { + if (g.Properties.Any(p => MSBuildInternals.PropertyNameComparer.Equals(p.Name == propertyName))) { return MSBuildInternals.GetLocationFromCondition(g.Condition); } } foreach (var g in userProjectFile.PropertyGroups) { - if (g.Properties.Any(p => p.Name == propertyName)) { + if (g.Properties.Any(p => MSBuildInternals.PropertyNameComparer.Equals(p.Name == propertyName))) { return MSBuildInternals.GetLocationFromCondition(g.Condition) | PropertyStorageLocations.UserFile; } @@ -824,7 +822,7 @@ namespace ICSharpCode.SharpDevelop.Project foreach (var propertyGroup in targetProject.PropertyGroups) { if (propertyGroup.Condition == groupCondition) { foreach (var property in propertyGroup.Properties.ToList()) { - if (property.Name == propertyName) { + if (MSBuildInternals.PropertyNameComparer.Equals(property.Name, propertyName)) { property.Value = newValue; return; } @@ -857,7 +855,7 @@ namespace ICSharpCode.SharpDevelop.Project foreach (var propertyGroup in project.PropertyGroups.ToList()) { bool propertyRemoved = false; foreach (var property in propertyGroup.Properties.ToList()) { - if (property.Name == propertyName) { + if (MSBuildInternals.PropertyNameComparer.Equals(property.Name, propertyName)) { propertyGroup.RemoveChild(property); propertyRemoved = true; } @@ -1288,11 +1286,11 @@ namespace ICSharpCode.SharpDevelop.Project { foreach (var g in project.PropertyGroups) { if (string.IsNullOrEmpty(g.Condition)) { - var prop = g.Properties.FirstOrDefault(p => p.Name == "Configuration"); + var prop = g.Properties.FirstOrDefault(p => MSBuildInternals.PropertyNameComparer.Equals(p.Name, "Configuration")); if (prop != null && !string.IsNullOrEmpty(prop.Value)) { configurationNames.Add(prop.Value); } - prop = g.Properties.FirstOrDefault(p => p.Name == "Platform"); + prop = g.Properties.FirstOrDefault(p => MSBuildInternals.PropertyNameComparer.Equals(p.Name, "Platform")); if (prop != null && !string.IsNullOrEmpty(prop.Value)) { platformNames.Add(prop.Value); } diff --git a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs index 825a7857bc..92e8bec8ce 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildInternals.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildInternals.cs @@ -31,6 +31,10 @@ namespace ICSharpCode.SharpDevelop.Project /// public readonly static object SolutionProjectCollectionLock = new object(); + // TODO: I think MSBuild actually uses OrdinalIgnoreCase. SharpDevelop 3.x just used string.operator ==, so I'm keeping + // that setting until all code is ported to use PropertyNameComparer and we've verified what MSBuild is actually using. + public readonly static StringComparer PropertyNameComparer = StringComparer.Ordinal; + internal static void UnloadProject(MSBuild.Evaluation.ProjectCollection projectCollection, MSBuild.Evaluation.Project project) { lock (SolutionProjectCollectionLock) {