Skip to content

Commit 168a307

Browse files
authored
Merge pull request #24 from ful-stackz/task/use-switch-expression
Simplify property access modifier logic when generating ast
2 parents 1d7e873 + 83eccd2 commit 168a307

1 file changed

Lines changed: 36 additions & 71 deletions

File tree

src/SharpCode/Ast.cs

Lines changed: 36 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
using System;
21
using System.Collections.Generic;
32
using System.Linq;
43
using Microsoft.CodeAnalysis;
@@ -103,10 +102,9 @@ public static PropertyDeclarationSyntax FromDefinition(Property definition)
103102

104103
definition.Setter.Map(x => x.Trim()).MatchSome(body =>
105104
{
106-
AccessorDeclarationSyntax accessor =
107-
SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration);
105+
var accessor = SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration);
108106

109-
if (IsHigher(definition.AccessModifier, definition.SetterAccessModifier))
107+
if (IsAccessModifierLessRestrictive(definition.AccessModifier, definition.SetterAccessModifier))
110108
{
111109
accessor = accessor.WithModifiers(
112110
new SyntaxTokenList(FromDefinition(definition.SetterAccessModifier)));
@@ -169,73 +167,6 @@ static AccessorDeclarationSyntax AddBodyToAccessor(AccessorDeclarationSyntax acc
169167
.WithExpressionBody(SyntaxFactory.ArrowExpressionClause(SyntaxFactory.ParseExpression(body)))
170168
.WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken));
171169
}
172-
173-
static bool IsHigher(AccessModifier left, AccessModifier right)
174-
{
175-
switch (left)
176-
{
177-
case AccessModifier.None:
178-
case AccessModifier.Private:
179-
return false;
180-
case AccessModifier.Internal:
181-
switch (right)
182-
{
183-
case AccessModifier.Private:
184-
case AccessModifier.PrivateProtected:
185-
return true;
186-
default:
187-
return false;
188-
}
189-
190-
case AccessModifier.Protected:
191-
switch (right)
192-
{
193-
case AccessModifier.Private:
194-
case AccessModifier.PrivateProtected:
195-
return true;
196-
default:
197-
return false;
198-
}
199-
200-
case AccessModifier.Public:
201-
switch (right)
202-
{
203-
case AccessModifier.Private:
204-
case AccessModifier.PrivateProtected:
205-
case AccessModifier.Internal:
206-
case AccessModifier.Protected:
207-
case AccessModifier.ProtectedInternal:
208-
return true;
209-
default:
210-
return false;
211-
}
212-
213-
case AccessModifier.PrivateProtected:
214-
switch (right)
215-
{
216-
case AccessModifier.Private:
217-
return true;
218-
default:
219-
return false;
220-
}
221-
222-
case AccessModifier.ProtectedInternal:
223-
switch (right)
224-
{
225-
case AccessModifier.Private:
226-
case AccessModifier.Internal:
227-
case AccessModifier.Protected:
228-
case AccessModifier.PrivateProtected:
229-
case AccessModifier.ProtectedInternal:
230-
return true;
231-
default:
232-
return false;
233-
}
234-
235-
default:
236-
return false;
237-
}
238-
}
239170
}
240171

241172
public static ParameterSyntax FromDefinition(Parameter definition)
@@ -634,5 +565,39 @@ static XmlElementSyntax CreateXmlDocBlock(string name, string content)
634565
SyntaxFactory.Identifier(name))));
635566
}
636567
}
568+
569+
/// <summary>
570+
/// Checks whether <paramref name="left"/> is a less restrictive access modifier than <paramref name="right"/>,
571+
/// eg. <c>public</c> is less restrictive than <c>protected</c>
572+
/// and <c>protected</c> is less restricitve than <c>private</c>.
573+
/// </summary>
574+
private static bool IsAccessModifierLessRestrictive(AccessModifier left, AccessModifier right) =>
575+
(left, right) switch {
576+
// private protected
577+
(AccessModifier.PrivateProtected, AccessModifier.Private) => true,
578+
579+
// internal
580+
(AccessModifier.Internal, AccessModifier.Private) => true,
581+
(AccessModifier.Internal, AccessModifier.PrivateProtected) => true,
582+
583+
// protected
584+
(AccessModifier.Protected, AccessModifier.Private) => true,
585+
(AccessModifier.Protected, AccessModifier.PrivateProtected) => true,
586+
587+
// protected internal
588+
(AccessModifier.ProtectedInternal, AccessModifier.Private) => true,
589+
(AccessModifier.ProtectedInternal, AccessModifier.PrivateProtected) => true,
590+
(AccessModifier.ProtectedInternal, AccessModifier.Internal) => true,
591+
(AccessModifier.ProtectedInternal, AccessModifier.Protected) => true,
592+
593+
// public
594+
(AccessModifier.Public, AccessModifier.Private) => true,
595+
(AccessModifier.Public, AccessModifier.PrivateProtected) => true,
596+
(AccessModifier.Public, AccessModifier.Internal) => true,
597+
(AccessModifier.Public, AccessModifier.Protected) => true,
598+
(AccessModifier.Public, AccessModifier.ProtectedInternal) => true,
599+
600+
_ => false
601+
};
637602
}
638603
}

0 commit comments

Comments
 (0)