Skip to content

Commit 23acd5c

Browse files
committed
C#: Small re-factor of the Modifier class.
1 parent 3a4ec90 commit 23acd5c

File tree

2 files changed

+62
-42
lines changed

2 files changed

+62
-42
lines changed

csharp/extractor/Semmle.Extraction.CSharp/Entities/Modifier.cs

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,14 @@ public override void Populate(TextWriter trapFile)
2525

2626
public static string AccessibilityModifier(Accessibility access)
2727
{
28-
switch (access)
28+
return access switch
2929
{
30-
case Accessibility.Private:
31-
return "private";
32-
case Accessibility.Protected:
33-
return "protected";
34-
case Accessibility.Public:
35-
return "public";
36-
case Accessibility.Internal:
37-
return "internal";
38-
default:
39-
throw new InternalError("Unavailable modifier combination");
40-
}
30+
Accessibility.Private => Modifiers.Private,
31+
Accessibility.Protected => Modifiers.Protected,
32+
Accessibility.Public => Modifiers.Public,
33+
Accessibility.Internal => Modifiers.Internal,
34+
_ => throw new InternalError("Unavailable modifier combination"),
35+
};
4136
}
4237

4338
public static void HasAccessibility(Context cx, TextWriter trapFile, IEntity type, Accessibility access)
@@ -48,17 +43,17 @@ public static void HasAccessibility(Context cx, TextWriter trapFile, IEntity typ
4843
case Accessibility.Public:
4944
case Accessibility.Protected:
5045
case Accessibility.Internal:
51-
HasModifier(cx, trapFile, type, Modifier.AccessibilityModifier(access));
46+
HasModifier(cx, trapFile, type, AccessibilityModifier(access));
5247
break;
5348
case Accessibility.NotApplicable:
5449
break;
5550
case Accessibility.ProtectedOrInternal:
56-
HasModifier(cx, trapFile, type, "protected");
57-
HasModifier(cx, trapFile, type, "internal");
51+
HasModifier(cx, trapFile, type, Modifiers.Protected);
52+
HasModifier(cx, trapFile, type, Modifiers.Internal);
5853
break;
5954
case Accessibility.ProtectedAndInternal:
60-
HasModifier(cx, trapFile, type, "protected");
61-
HasModifier(cx, trapFile, type, "private");
55+
HasModifier(cx, trapFile, type, Modifiers.Protected);
56+
HasModifier(cx, trapFile, type, Modifiers.Private);
6257
break;
6358
default:
6459
throw new InternalError($"Unhandled Microsoft.CodeAnalysis.Accessibility value: {access}");
@@ -70,58 +65,63 @@ public static void HasModifier(Context cx, TextWriter trapFile, IEntity target,
7065
trapFile.has_modifiers(target, Modifier.Create(cx, modifier));
7166
}
7267

68+
private static void ExtractNamedTypeModifiers(Context cx, TextWriter trapFile, IEntity key, ISymbol symbol)
69+
{
70+
if (symbol.Kind != SymbolKind.NamedType)
71+
return;
72+
73+
if (symbol is not INamedTypeSymbol nt)
74+
throw new InternalError(symbol, "Symbol kind is inconsistent with its type");
75+
76+
if (nt.IsRecord)
77+
HasModifier(cx, trapFile, key, Modifiers.Record);
78+
79+
if (nt.TypeKind == TypeKind.Struct)
80+
{
81+
if (nt.IsReadOnly)
82+
HasModifier(cx, trapFile, key, Modifiers.Readonly);
83+
84+
if (nt.IsRefLikeType)
85+
HasModifier(cx, trapFile, key, Modifiers.Ref);
86+
}
87+
}
88+
7389
public static void ExtractModifiers(Context cx, TextWriter trapFile, IEntity key, ISymbol symbol)
7490
{
7591
HasAccessibility(cx, trapFile, key, symbol.DeclaredAccessibility);
7692
if (symbol.Kind == SymbolKind.ErrorType)
7793
trapFile.has_modifiers(key, Modifier.Create(cx, Accessibility.Public));
7894

7995
if (symbol.IsAbstract && (symbol.Kind != SymbolKind.NamedType || ((INamedTypeSymbol)symbol).TypeKind != TypeKind.Interface))
80-
HasModifier(cx, trapFile, key, "abstract");
96+
HasModifier(cx, trapFile, key, Modifiers.Abstract);
8197

8298
if (symbol.IsSealed)
83-
HasModifier(cx, trapFile, key, "sealed");
99+
HasModifier(cx, trapFile, key, Modifiers.Sealed);
84100

85101
var fromSource = symbol.DeclaringSyntaxReferences.Length > 0;
86102

87103
if (symbol.IsStatic && !(symbol.Kind == SymbolKind.Field && ((IFieldSymbol)symbol).IsConst && !fromSource))
88-
HasModifier(cx, trapFile, key, "static");
104+
HasModifier(cx, trapFile, key, Modifiers.Static);
89105

90106
if (symbol.IsVirtual)
91-
HasModifier(cx, trapFile, key, "virtual");
107+
HasModifier(cx, trapFile, key, Modifiers.Virtual);
92108

93109
if (symbol.Kind == SymbolKind.Field && ((IFieldSymbol)symbol).IsReadOnly)
94-
HasModifier(cx, trapFile, key, "readonly");
110+
HasModifier(cx, trapFile, key, Modifiers.Readonly);
95111

96112
if (symbol.IsOverride)
97-
HasModifier(cx, trapFile, key, "override");
113+
HasModifier(cx, trapFile, key, Modifiers.Override);
98114

99115
if (symbol.Kind == SymbolKind.Method && ((IMethodSymbol)symbol).IsAsync)
100-
HasModifier(cx, trapFile, key, "async");
116+
HasModifier(cx, trapFile, key, Modifiers.Async);
101117

102118
if (symbol.IsExtern)
103-
HasModifier(cx, trapFile, key, "extern");
119+
HasModifier(cx, trapFile, key, Modifiers.Extern);
104120

105121
foreach (var modifier in symbol.GetSourceLevelModifiers())
106122
HasModifier(cx, trapFile, key, modifier);
107123

108-
if (symbol.Kind == SymbolKind.NamedType)
109-
{
110-
var nt = symbol as INamedTypeSymbol;
111-
if (nt is null)
112-
throw new InternalError(symbol, "Symbol kind is inconsistent with its type");
113-
114-
if (nt.IsRecord)
115-
HasModifier(cx, trapFile, key, "record");
116-
117-
if (nt.TypeKind == TypeKind.Struct)
118-
{
119-
if (nt.IsReadOnly)
120-
HasModifier(cx, trapFile, key, "readonly");
121-
if (nt.IsRefLikeType)
122-
HasModifier(cx, trapFile, key, "ref");
123-
}
124-
}
124+
ExtractNamedTypeModifiers(cx, trapFile, key, symbol);
125125
}
126126

127127
public static Modifier Create(Context cx, string modifier)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
internal static class Modifiers
2+
{
3+
public const string Abstract = "abstract";
4+
public const string Async = "async";
5+
public const string Const = "const";
6+
public const string Extern = "extern";
7+
public const string Internal = "internal";
8+
public const string New = "new";
9+
public const string Override = "override";
10+
public const string Partial = "partial";
11+
public const string Private = "private";
12+
public const string Protected = "protected";
13+
public const string Public = "public";
14+
public const string Readonly = "readonly";
15+
public const string Record = "record";
16+
public const string Ref = "ref";
17+
public const string Sealed = "sealed";
18+
public const string Static = "static";
19+
public const string Virtual = "virtual";
20+
}

0 commit comments

Comments
 (0)