Skip to content

Commit ffb8a57

Browse files
committed
C#: Make extractor support for file scoped types.
1 parent 8b967f9 commit ffb8a57

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ private static void ExtractNamedTypeModifiers(Context cx, TextWriter trapFile, I
8585
if (nt.IsRecord)
8686
HasModifier(cx, trapFile, key, Modifiers.Record);
8787

88+
if (nt.IsFileLocal)
89+
HasModifier(cx, trapFile, key, Modifiers.File);
90+
8891
if (nt.TypeKind == TypeKind.Struct)
8992
{
9093
if (nt.IsReadOnly)
@@ -97,7 +100,9 @@ private static void ExtractNamedTypeModifiers(Context cx, TextWriter trapFile, I
97100

98101
public static void ExtractModifiers(Context cx, TextWriter trapFile, IEntity key, ISymbol symbol)
99102
{
100-
HasAccessibility(cx, trapFile, key, symbol.DeclaredAccessibility);
103+
if (symbol.Kind != SymbolKind.NamedType || !((INamedTypeSymbol)symbol).IsFileLocal)
104+
HasAccessibility(cx, trapFile, key, symbol.DeclaredAccessibility);
105+
101106
if (symbol.Kind == SymbolKind.ErrorType)
102107
trapFile.has_modifiers(key, Modifier.Create(cx, Accessibility.Public));
103108

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ internal static class Modifiers
44
public const string Async = "async";
55
public const string Const = "const";
66
public const string Extern = "extern";
7+
public const string File = "file";
78
public const string Internal = "internal";
89
public const string New = "new";
910
public const string Override = "override";

csharp/extractor/Semmle.Extraction.CSharp/SymbolExtensions.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ private static void BuildFunctionPointerTypeId(this IFunctionPointerTypeSymbol f
286286
public static IEnumerable<IFieldSymbol?> GetTupleElementsMaybeNull(this INamedTypeSymbol type) =>
287287
type.TupleElements;
288288

289-
private static void AddContaining(INamedTypeSymbol named, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined)
289+
private static void BuildQualifierAndName(INamedTypeSymbol named, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined)
290290
{
291291
if (named.ContainingType is not null)
292292
{
@@ -299,6 +299,9 @@ private static void AddContaining(INamedTypeSymbol named, Context cx, EscapingTe
299299
BuildAssembly(named.ContainingAssembly, trapFile);
300300
named.ContainingNamespace.BuildNamespace(cx, trapFile);
301301
}
302+
303+
var name = named.IsFileLocal ? named.MetadataName : named.Name;
304+
trapFile.Write(name);
302305
}
303306

304307
private static void BuildTupleId(INamedTypeSymbol named, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined)
@@ -332,13 +335,11 @@ private static void BuildNamedTypeId(this INamedTypeSymbol named, Context cx, Es
332335

333336
if (named.TypeParameters.IsEmpty)
334337
{
335-
AddContaining(named, cx, trapFile, symbolBeingDefined);
336-
trapFile.Write(named.Name);
338+
BuildQualifierAndName(named, cx, trapFile, symbolBeingDefined);
337339
}
338340
else if (named.IsReallyUnbound())
339341
{
340-
AddContaining(named, cx, trapFile, symbolBeingDefined);
341-
trapFile.Write(named.Name);
342+
BuildQualifierAndName(named, cx, trapFile, symbolBeingDefined);
342343
trapFile.Write("`");
343344
trapFile.Write(named.TypeParameters.Length);
344345
}

0 commit comments

Comments
 (0)