Skip to content

Commit 7185410

Browse files
Slightly simplify by removing parameter
1 parent 26bc88e commit 7185410

File tree

3 files changed

+57
-49
lines changed

3 files changed

+57
-49
lines changed

CodeConverter/CSharp/DeclarationNodeVisitor.cs

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -200,40 +200,48 @@ private async Task<IEnumerable<MemberDeclarationSyntax>> ConvertMembersAsync(VBS
200200
var methodsWithHandles = MethodsWithHandles.Create(GetMethodWithHandles(parentType));
201201

202202
if (methodsWithHandles.Any()) _extraUsingDirectives.Add("System.Runtime.CompilerServices");//For MethodImplOptions.Synchronized
203+
204+
_typeContext.Push(methodsWithHandles, additionalInitializers);
205+
try {
206+
var convertedMembers = (await members.SelectManyAsync(async member =>
207+
(await ConvertMemberAsync(member)).Yield().Concat(GetAdditionalDeclarations(member)))
208+
);
203209

204-
IEnumerable<MemberDeclarationSyntax> directlyConvertedMembers = await GetDirectlyConvertedMembers(additionalInitializers, methodsWithHandles);
205-
206-
var requiresInitializeComponent = namedTypeSymbol.IsDesignerGeneratedTypeWithInitializeComponent(_vbCompilation);
207-
208-
if (shouldAddTypeWideInitToThisPart) {
209-
var otherPartsOfType = GetAllPartsOfType(parentType, namedTypeSymbol).ToArray();
210-
var constructorFieldInitializersFromOtherParts = otherPartsOfType
211-
.Where(t => (!Equals(t.Type.SyntaxTree.FilePath, _semanticModel.SyntaxTree.FilePath) || !t.Type.Span.Equals(parentType.Span)))
212-
.SelectMany(r => GetFieldsIdentifiersWithInitializer(r.Type, r.SemanticModel));
213-
additionalInitializers.AdditionalInstanceInitializers.AddRange(constructorFieldInitializersFromOtherParts);
214-
if (requiresInitializeComponent) {
215-
// Constructor event handlers not required since they'll be inside InitializeComponent - see other use of IsDesignerGeneratedTypeWithInitializeComponent
216-
directlyConvertedMembers = directlyConvertedMembers
217-
.Concat(methodsWithHandles.CreateDelegatingMethodsRequiredByInitializeComponent());
218-
additionalInitializers.AdditionalInstanceInitializers
219-
.AddRange(CommonConversions.WinformsConversions.GetNameAssignments(methodsWithHandles, otherPartsOfType));
220-
} else {
221-
additionalInitializers.AdditionalInstanceInitializers.AddRange(methodsWithHandles.GetConstructorEventHandlers());
222-
}
210+
return WithAdditionalMembers(convertedMembers).ToArray();//Ensure evaluated before popping type context
211+
} finally {
212+
_typeContext.Pop();
223213
}
224214

225-
return additionalInitializers.WithAdditionalInitializers(namedTypeSymbol, directlyConvertedMembers.ToList(), CommonConversions.ConvertIdentifier(parentType.BlockStatement.Identifier), requiresInitializeComponent);
226-
227-
async Task<MemberDeclarationSyntax[]> GetDirectlyConvertedMembers(AdditionalInitializers additionalInitializers, MethodsWithHandles methodsWithHandles)
215+
IEnumerable<MemberDeclarationSyntax> WithAdditionalMembers(IEnumerable<MemberDeclarationSyntax> convertedMembers)
228216
{
229-
_typeContext.Push(methodsWithHandles, additionalInitializers);
230-
try {
231-
var convertedMembers = await members.SelectManyAsync(async member =>
232-
new[] { await ConvertMemberAsync(member) }.Concat(GetAdditionalDeclarations(member)));
233-
return convertedMembers.ToArray();
234-
} finally {
235-
_typeContext.Pop();
217+
var requiresInitializeComponent = namedTypeSymbol.IsDesignerGeneratedTypeWithInitializeComponent(_vbCompilation);
218+
219+
if (shouldAddTypeWideInitToThisPart)
220+
{
221+
var otherPartsOfType = GetAllPartsOfType(parentType, namedTypeSymbol).ToArray();
222+
var constructorFieldInitializersFromOtherParts = otherPartsOfType
223+
.Where(t => (!Equals(t.Type.SyntaxTree.FilePath, _semanticModel.SyntaxTree.FilePath) ||
224+
!t.Type.Span.Equals(parentType.Span)))
225+
.SelectMany(r => GetFieldsIdentifiersWithInitializer(r.Type, r.SemanticModel));
226+
additionalInitializers.AdditionalInstanceInitializers.AddRange(constructorFieldInitializersFromOtherParts);
227+
if (requiresInitializeComponent)
228+
{
229+
// Constructor event handlers not required since they'll be inside InitializeComponent - see other use of IsDesignerGeneratedTypeWithInitializeComponent
230+
convertedMembers = convertedMembers
231+
.Concat(methodsWithHandles.CreateDelegatingMethodsRequiredByInitializeComponent());
232+
additionalInitializers.AdditionalInstanceInitializers
233+
.AddRange(
234+
CommonConversions.WinformsConversions.GetNameAssignments(otherPartsOfType));
235+
}
236+
else
237+
{
238+
additionalInitializers.AdditionalInstanceInitializers.AddRange(methodsWithHandles
239+
.GetConstructorEventHandlers());
240+
}
236241
}
242+
243+
return additionalInitializers.WithAdditionalInitializers(namedTypeSymbol, convertedMembers.ToList(),
244+
CommonConversions.ConvertIdentifier(parentType.BlockStatement.Identifier), requiresInitializeComponent);
237245
}
238246
}
239247

CodeConverter/CSharp/ExpressionNodeVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ public override async Task<CSharpSyntaxNode> VisitLiteralExpression(VBasic.Synta
269269

270270
var val = node.Token.Value;
271271
var text = node.Token.Text;
272-
if (_typeContext.Any() && CommonConversions.WinformsConversions.ShouldPrefixAssignedNameWithUnderscore(node.Parent as VBSyntax.AssignmentStatementSyntax, _typeContext.MethodsWithHandles) && val is string valStr) {
272+
if (_typeContext.Any() && CommonConversions.WinformsConversions.ShouldPrefixAssignedNameWithUnderscore(node.Parent as VBSyntax.AssignmentStatementSyntax) && val is string valStr) {
273273
val = "_" + valStr;
274274
text = "\"_" + valStr + "\"";
275275
}

CodeConverter/CSharp/WinformsConversions.cs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,35 +38,20 @@ private static bool IsInitializeComponent(VBSyntax.MethodBlockSyntax methodBlock
3838
return methodBlockSyntax?.SubOrFunctionStatement.Identifier.Text == "InitializeComponent";
3939
}
4040

41-
/// <summary>
42-
/// We replace a field with a property to handle event subscription, so need to update the name so the winforms designer regenerates the file correctly in future
43-
/// </summary>
44-
public bool ShouldPrefixAssignedNameWithUnderscore(VBSyntax.StatementSyntax statementOrNull, MethodsWithHandles typeContextMethodsWithHandles)
45-
{
46-
return statementOrNull is VBSyntax.AssignmentStatementSyntax assignment && InMethodCalledInitializeComponent(assignment) &&
47-
assignment.Left is VBSyntax.MemberAccessExpressionSyntax maes &&
48-
!(maes.Expression is VBSyntax.MeExpressionSyntax) &&
49-
maes.Name.ToString() == "Name" &&
50-
maes.Expression.LastOrDefaultDescendant<VBSyntax.IdentifierNameSyntax>()?.Identifier.Text is {} propName &&
51-
typeContextMethodsWithHandles.AnyForPropertyName(propName);
52-
}
53-
54-
public IEnumerable<Assignment> GetNameAssignments(MethodsWithHandles typeContextMethodsWithHandles,
55-
(VBSyntax.TypeBlockSyntax Type, SemanticModel SemanticModel)[] otherPartsOfType)
41+
public IEnumerable<Assignment> GetNameAssignments((VBSyntax.TypeBlockSyntax Type, SemanticModel SemanticModel)[] otherPartsOfType)
5642
{
5743
return otherPartsOfType.SelectMany(typePart =>
5844
typePart.Type.Members.OfType<VBSyntax.MethodBlockSyntax>()
5945
.Where(IsInitializeComponent)
60-
.SelectMany(syntax => GetAssignments(typeContextMethodsWithHandles, syntax))
46+
.SelectMany(GetAssignments)
6147
);
6248
}
6349

64-
private IEnumerable<Assignment> GetAssignments(MethodsWithHandles typeContextMethodsWithHandles,
65-
VBSyntax.MethodBlockSyntax initializeComponent)
50+
private IEnumerable<Assignment> GetAssignments(VBSyntax.MethodBlockSyntax initializeComponent)
6651
{
6752
return initializeComponent.Statements
6853
.OfType<VBSyntax.AssignmentStatementSyntax>()
69-
.Where(syntax => ShouldPrefixAssignedNameWithUnderscore(syntax, typeContextMethodsWithHandles))
54+
.Where(ShouldPrefixAssignedNameWithUnderscore)
7055
.Select(s => (s.Left as VBSyntax.MemberAccessExpressionSyntax)?.Expression.LastOrDefaultDescendant<VBSyntax.IdentifierNameSyntax>())
7156
.Where(s => s != null)
7257
.Select(id => {
@@ -75,5 +60,20 @@ private IEnumerable<Assignment> GetAssignments(MethodsWithHandles typeContextMet
7560
return new Assignment(nameAccess, SyntaxKind.SimpleAssignmentExpression, originalRuntimeNameToRestore, true);
7661
});
7762
}
63+
64+
/// <summary>
65+
/// We replace a field with a property to handle event subscription, so need to update the name so the winforms designer regenerates the file correctly in future
66+
/// </summary>
67+
public bool ShouldPrefixAssignedNameWithUnderscore(VBSyntax.StatementSyntax statementOrNull)
68+
{
69+
return statementOrNull is VBSyntax.AssignmentStatementSyntax assignment &&
70+
_typeContext.Any() &&
71+
InMethodCalledInitializeComponent(assignment) &&
72+
assignment.Left is VBSyntax.MemberAccessExpressionSyntax maes &&
73+
maes.Name.Identifier.Text == "Name" &&
74+
!(maes.Expression is VBSyntax.MeExpressionSyntax) &&
75+
maes.Expression.LastOrDefaultDescendant<VBSyntax.IdentifierNameSyntax>()?.Identifier.Text is {} propName &&
76+
_typeContext.MethodsWithHandles.AnyForPropertyName(propName);
77+
}
7878
}
7979
}

0 commit comments

Comments
 (0)