Skip to content

Commit 8c8cd6b

Browse files
Avoid compilation error regarding clash of member name with My group member
1 parent 3c835c6 commit 8c8cd6b

2 files changed

Lines changed: 23 additions & 17 deletions

File tree

ICSharpCode.CodeConverter/CSharp/ProjectMergedDeclarationExtensions.cs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,24 +80,27 @@ private static string GetVbTextForProperties(INamedTypeSymbol myProject, string
8080
var containerType = myProject?.GetMembers(propertyContainerClassName).OfType<ITypeSymbol>().FirstOrDefault();
8181
var propertiesToReplicate = containerType?.GetMembers().Where(m => m.IsKind(SymbolKind.Property)).ToArray();
8282
if (propertiesToReplicate?.Any() != true) return "";
83-
var vbTextForProperties = propertiesToReplicate.Select(s => $@"
83+
var vbTextForProperties = propertiesToReplicate.Select(s => {
84+
var fieldName = $"{Constants.MergedMyMemberPrefix}m_{s.Name}";
85+
return $@"
8486
<EditorBrowsable(EditorBrowsableState.Never)>
85-
Public m_{s.Name} As {s.Name}
87+
Public {fieldName} As {s.Name}
8688
87-
Public Property {s.Name} As {s.Name}
89+
Public Property {Constants.MergedMyMemberPrefix}{s.Name} As {s.Name}
8890
<DebuggerHidden>
8991
Get
90-
m_{s.Name} = Create__Instance__(Of {s.Name})(m_{s.Name})
91-
Return m_{s.Name}
92+
{fieldName} = Create__Instance__(Of {s.Name})({fieldName})
93+
Return {fieldName}
9294
End Get
9395
<DebuggerHidden>
9496
Set(ByVal value As {s.Name})
95-
If value Is m_{s.Name} Then Return
97+
If value Is {fieldName} Then Return
9698
If value IsNot Nothing Then Throw New ArgumentException(""Property can only be set to Nothing"")
97-
Me.Dispose__Instance__(Of {s.Name})(m_{s.Name})
99+
Me.Dispose__Instance__(Of {s.Name})({fieldName})
98100
End Set
99101
End Property
100-
");
102+
";
103+
});
101104
string propertiesWithoutContainer = string.Join(Environment.NewLine, vbTextForProperties);
102105
return $@" Friend Partial Class {propertyContainerClassName}
103106
{propertiesWithoutContainer}
@@ -113,25 +116,26 @@ private static string Renamespace(this string sourceText)
113116

114117
public static async Task<Project> RenameMergedNamespaces(this Project project)
115118
{
116-
project = await RenameNamespace(project, Constants.MergedMyNamespace, "My");
117-
project = await RenameNamespace(project, Constants.MergedMsVbNamespace, "VisualBasic");
119+
project = await RenamePrefix(project, Constants.MergedMyNamespace, "My", SymbolFilter.Namespace);
120+
project = await RenamePrefix(project, Constants.MergedMsVbNamespace, "VisualBasic", SymbolFilter.Namespace);
121+
project = await RenamePrefix(project, Constants.MergedMyMemberPrefix, "", SymbolFilter.Member);
118122
return project;
119123
}
120124

121-
private static async Task<Project> RenameNamespace(Project project, string oldName, string newName)
125+
private static async Task<Project> RenamePrefix(Project project, string oldNamePrefix, string newNamePrefix, SymbolFilter symbolFilter)
122126
{
123-
for (var symbolToRename = await GetFirstSymbolWithName(project, oldName); symbolToRename != null; symbolToRename = await GetFirstSymbolWithName(project, oldName))
127+
for (var symbolToRename = await GetFirstSymbolStartingWith(project, oldNamePrefix, symbolFilter); symbolToRename != null; symbolToRename = await GetFirstSymbolStartingWith(project, oldNamePrefix, symbolFilter))
124128
{
125-
var renamedSolution = await Renamer.RenameSymbolAsync(project.Solution, symbolToRename, newName, default(OptionSet));
129+
var renamedSolution = await Renamer.RenameSymbolAsync(project.Solution, symbolToRename, symbolToRename.Name.Replace(oldNamePrefix, newNamePrefix), default(OptionSet));
126130
project = renamedSolution.GetProject(project.Id);
127131
}
128132
return project;
129133
}
130134

131-
private static async Task<ISymbol> GetFirstSymbolWithName(Project project, string mergedMyNamespace)
135+
private static async Task<ISymbol> GetFirstSymbolStartingWith(Project project, string symbolPrefix, SymbolFilter symbolFilter)
132136
{
133137
var compilation = await project.GetCompilationAsync();
134-
return compilation.GetSymbolsWithName(s => s == mergedMyNamespace, SymbolFilter.Namespace).FirstOrDefault();
138+
return compilation.GetSymbolsWithName(s => s.StartsWith(symbolPrefix), symbolFilter).FirstOrDefault();
135139
}
136140
}
137141
}

ICSharpCode.CodeConverter/Shared/Constants.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
{
33
internal class Constants
44
{
5-
public const string MergedMsVbNamespace = "MergedMsVbNamespace50E26D7D27174AAEABCA70DEBD52E2FA";
6-
public const string MergedMyNamespace = "MergedMyNamespace50E26D7D27174AAEABCA70DEBD52E2FA";
5+
private const string UnlikelyToAppearInCodeOtherThanThisSolution = "50E26D7D27174AAEABCA70DEBD52E2FA";
6+
public const string MergedMsVbNamespace = "MergedMsVbNamespace" + UnlikelyToAppearInCodeOtherThanThisSolution;
7+
public const string MergedMyNamespace = "MergedMyNamespace" + UnlikelyToAppearInCodeOtherThanThisSolution;
8+
public const string MergedMyMemberPrefix = "MyProperty" + UnlikelyToAppearInCodeOtherThanThisSolution;
79
}
810
}

0 commit comments

Comments
 (0)