From 0d1952c62070e6a7ecb9a05d148720a2c511db57 Mon Sep 17 00:00:00 2001 From: Robert Clipsham Date: Fri, 15 Nov 2019 08:43:47 +0000 Subject: [PATCH 1/2] Ensure class constructors are marked as public [#422] Fixes #422 --- CHANGELOG.md | 1 + .../CSharp/CommonConversions.cs | 2 +- Tests/CSharp/ExpressionTests.cs | 2 +- Tests/CSharp/MemberTests.cs | 16 +++++++++++++++- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77cf4802e..73946c41a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All notable changes to the code converter will be documented here. * Correctly handle type promoted module symbols (#375) * Prefer renamed imports for name resolution (#401) * Correctly convert ambiguous names (#332) +* Ensure correct visibility for constructors (#422) ### C# -> VB * Convert property accessors with visiblity modifiers (#92) diff --git a/ICSharpCode.CodeConverter/CSharp/CommonConversions.cs b/ICSharpCode.CodeConverter/CSharp/CommonConversions.cs index 92135ddfb..029740f20 100644 --- a/ICSharpCode.CodeConverter/CSharp/CommonConversions.cs +++ b/ICSharpCode.CodeConverter/CSharp/CommonConversions.cs @@ -265,7 +265,7 @@ public SyntaxTokenList ConvertModifiers(SyntaxNode node, IEnumerable Date: Sun, 17 Nov 2019 09:57:44 +0000 Subject: [PATCH 2/2] Explicitly say that static constructors are special --- ICSharpCode.CodeConverter/CSharp/CommonConversions.cs | 6 +++--- ICSharpCode.CodeConverter/CSharp/DeclarationNodeVisitor.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ICSharpCode.CodeConverter/CSharp/CommonConversions.cs b/ICSharpCode.CodeConverter/CSharp/CommonConversions.cs index 029740f20..d10a542bc 100644 --- a/ICSharpCode.CodeConverter/CSharp/CommonConversions.cs +++ b/ICSharpCode.CodeConverter/CSharp/CommonConversions.cs @@ -259,14 +259,14 @@ private static SyntaxToken CsEscapedIdentifier(string text) } public SyntaxTokenList ConvertModifiers(SyntaxNode node, IEnumerable modifiers, - TokenContext context = TokenContext.Global, bool isVariableOrConst = false, bool isConstructor = false, params CSSyntaxKind[] extraCsModifierKinds) + TokenContext context = TokenContext.Global, bool isVariableOrConst = false, params CSSyntaxKind[] extraCsModifierKinds) { ISymbol declaredSymbol = _semanticModel.GetDeclaredSymbol(node); var declaredAccessibility = declaredSymbol?.DeclaredAccessibility ?? Accessibility.NotApplicable; var contextsWithIdenticalDefaults = new[] { TokenContext.Global, TokenContext.Local, TokenContext.InterfaceOrModule, TokenContext.MemberInInterface }; - bool isPartial = declaredSymbol.IsPartialClassDefinition() || declaredSymbol.IsPartialMethodDefinition() || declaredSymbol.IsPartialMethodImplementation() || declaredSymbol.IsConstructor(); - bool implicitVisibility = contextsWithIdenticalDefaults.Contains(context) || isVariableOrConst || isConstructor; + bool isPartial = declaredSymbol.IsPartialClassDefinition() || declaredSymbol.IsPartialMethodDefinition() || declaredSymbol.IsPartialMethodImplementation(); + bool implicitVisibility = contextsWithIdenticalDefaults.Contains(context) || isVariableOrConst || declaredSymbol.IsStaticConstructor(); if (implicitVisibility && !isPartial) declaredAccessibility = Accessibility.NotApplicable; var modifierSyntaxs = ConvertModifiersCore(declaredAccessibility, modifiers, context) .Concat(extraCsModifierKinds.Select(SyntaxFactory.Token)) diff --git a/ICSharpCode.CodeConverter/CSharp/DeclarationNodeVisitor.cs b/ICSharpCode.CodeConverter/CSharp/DeclarationNodeVisitor.cs index ecc5d3fa0..06b6422c4 100644 --- a/ICSharpCode.CodeConverter/CSharp/DeclarationNodeVisitor.cs +++ b/ICSharpCode.CodeConverter/CSharp/DeclarationNodeVisitor.cs @@ -1041,7 +1041,7 @@ public override async Task VisitConstructorBlock(VBSyntax.Cons { var block = node.BlockStatement; var attributes = await block.AttributeLists.SelectManyAsync(_expressionNodeVisitor.ConvertAttribute); - var modifiers = CommonConversions.ConvertModifiers(block, block.Modifiers, GetMemberContext(node), isConstructor: true); + var modifiers = CommonConversions.ConvertModifiers(block, block.Modifiers, GetMemberContext(node)); var ctor = (node.Statements.FirstOrDefault() as VBSyntax.ExpressionStatementSyntax)?.Expression as VBSyntax.InvocationExpressionSyntax; var ctorExpression = ctor?.Expression as VBSyntax.MemberAccessExpressionSyntax;