Browse Source

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
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
cd0fbe430d
  1. 4
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Project/VBNetToCSharpConverter.cs
  2. 4
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/CSharpToVBNetConverter.cs
  3. 13
      src/Main/Base/Project/Src/Project/Converter/LanguageConverter.cs
  4. 50
      src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs
  5. 4
      src/Main/Base/Project/Src/Project/MSBuildInternals.cs

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

@ -61,10 +61,10 @@ namespace CSharpBinding @@ -61,10 +61,10 @@ namespace CSharpBinding
// (we replace existing NoWarn entries because VB and C# error codes don't match)
project.SetProperty("NoWarn", "1591");
FixProperty(project, "DefineConstants",
project.ChangeProperty("DefineConstants",
v => v.Replace(',', ';'));
FixProperty(project, "ProjectTypeGuids",
project.ChangeProperty("ProjectTypeGuids",
v => v.Replace(ProjectTypeGuids.VBNet, ProjectTypeGuids.CSharp, StringComparison.OrdinalIgnoreCase));
}

4
src/AddIns/BackendBindings/VBNetBinding/Project/Src/Project/CSharpToVBNetConverter.cs

@ -60,8 +60,8 @@ namespace VBNetBinding @@ -60,8 +60,8 @@ namespace VBNetBinding
{
VBNetProject vbProject = (VBNetProject)targetProject;
base.CopyProperties(sourceProject, targetProject);
FixProperty(vbProject, "DefineConstants", v => v.Replace(';', ','));
FixProperty(vbProject, "ProjectTypeGuids",
vbProject.ChangeProperty("DefineConstants", v => v.Replace(';', ','));
vbProject.ChangeProperty("ProjectTypeGuids",
v => v.Replace(ProjectTypeGuids.CSharp, ProjectTypeGuids.VBNet, StringComparison.OrdinalIgnoreCase));
// determine the StartupObject

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

@ -94,19 +94,6 @@ namespace ICSharpCode.SharpDevelop.Project.Converter @@ -94,19 +94,6 @@ namespace ICSharpCode.SharpDevelop.Project.Converter
}
}
/// <summary>
/// Changes all instances of a property in the <paramref name="project"/> by applying a method to its value.
/// </summary>
protected void FixProperty(MSBuildBasedProject project, string propertyName, Converter<string, string> 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<KeyValuePair<string, string>> replacements = new List<KeyValuePair<string, string>>();

50
src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs

@ -97,8 +97,7 @@ namespace ICSharpCode.SharpDevelop.Project @@ -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 @@ -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 @@ -535,33 +534,32 @@ namespace ICSharpCode.SharpDevelop.Project
return null;
}
/*
/// <summary>
/// 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!
/// </summary>
public IList<MSBuild.BuildProperty> GetAllProperties(string propertyName)
IEnumerable<ProjectPropertyElement> GetAllUnevaluatedProperties()
{
List<MSBuild.BuildProperty> l = new List<MSBuild.BuildProperty>();
foreach (MSBuild.BuildPropertyGroup g in project.PropertyGroups) {
if (g.IsImported) continue;
MSBuild.BuildProperty property = MSBuildInternals.GetProperty(g, propertyName);
if (property != null) {
l.Add(property);
return projectFile.Properties.Concat(userProjectFile.Properties);
}
/// <summary>
/// Changes all instances of a property in the <paramref name="project"/> by applying a method to its unevaluated value.
///
/// The method will be called within a <code>lock (project.SyncRoot)</code> block.
/// </summary>
public void ChangeProperty(string propertyName, Func<string, string> method)
{
lock (this.SyncRoot) {
foreach (ProjectPropertyElement p in GetAllUnevaluatedProperties()) {
if (MSBuildInternals.PropertyNameComparer.Equals(p.Name, propertyName)) {
p.Value = method(p.Value);
}
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 l;
}
*/
#endregion
#region SetProperty
@ -581,12 +579,12 @@ namespace ICSharpCode.SharpDevelop.Project @@ -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 @@ -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 @@ -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 @@ -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);
}

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

@ -31,6 +31,10 @@ namespace ICSharpCode.SharpDevelop.Project @@ -31,6 +31,10 @@ namespace ICSharpCode.SharpDevelop.Project
/// </summary>
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) {

Loading…
Cancel
Save