Skip to content

Commit e8b23b6

Browse files
committed
C#: Only extract Public and Protected members from reference assemblies.
1 parent 7675aa3 commit e8b23b6

File tree

4 files changed

+17
-5
lines changed

4 files changed

+17
-5
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,5 +642,11 @@ public static AnnotatedTypeSymbol GetType(this Context cx, Microsoft.CodeAnalysi
642642
/// </summary>
643643
public static IEnumerable<AnnotatedTypeSymbol> GetAnnotatedTypeArguments(this INamedTypeSymbol symbol) =>
644644
symbol.TypeArguments.Zip(symbol.TypeArgumentNullableAnnotations, (t, a) => new AnnotatedTypeSymbol(t, a));
645+
646+
/// <summary>
647+
/// Returns true if the symbol is public or protected.
648+
/// </summary>
649+
public static bool IsPublicOrProtected(this ISymbol symbol) =>
650+
symbol.DeclaredAccessibility == Accessibility.Public || symbol.DeclaredAccessibility == Accessibility.Protected;
645651
}
646652
}

csharp/extractor/Semmle.Extraction.CSharp/Entities/Types/Type.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,11 +225,12 @@ private void ExtractParametersForDelegateLikeType(TextWriter trapFile, IMethodSy
225225
}
226226

227227
/// <summary>
228-
/// Called to extract all members and nested types.
228+
/// Called to extract members and nested types.
229229
/// This is called on each member of a namespace,
230230
/// in either source code or an assembly.
231+
/// <param name="onlyEffectivelyPublic">If true, only extract members that are effectively public otherwise extract all members.</param>
231232
/// </summary>
232-
public void ExtractRecursive()
233+
public void ExtractRecursive(bool onlyEffectivelyPublic = false)
233234
{
234235
foreach (var l in Symbol.DeclaringSyntaxReferences.Select(s => s.GetSyntax().GetLocation()))
235236
{
@@ -238,10 +239,13 @@ public void ExtractRecursive()
238239

239240
foreach (var member in Symbol.GetMembers())
240241
{
242+
if (onlyEffectivelyPublic && !member.IsPublicOrProtected())
243+
continue;
244+
241245
switch (member.Kind)
242246
{
243247
case SymbolKind.NamedType:
244-
Create(Context, (ITypeSymbol)member).ExtractRecursive();
248+
Create(Context, (ITypeSymbol)member).ExtractRecursive(onlyEffectivelyPublic);
245249
break;
246250
default:
247251
Context.CreateEntity(member);

csharp/extractor/Semmle.Extraction.CSharp/Extractor/Analyser.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,10 @@ private static void AnalyseNamespace(Context cx, INamespaceSymbol ns)
271271

272272
foreach (var memberType in ns.GetTypeMembers())
273273
{
274-
Entities.Type.Create(cx, memberType).ExtractRecursive();
274+
if (memberType.IsPublicOrProtected())
275+
{
276+
Entities.Type.Create(cx, memberType).ExtractRecursive(onlyEffectivelyPublic: true);
277+
}
275278
}
276279
}
277280

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,6 @@ private static ExitCode AnalyseTracing(
549549
compilerArguments.CompilationOptions
550550
.WithAssemblyIdentityComparer(DesktopAssemblyIdentityComparer.Default)
551551
.WithStrongNameProvider(new DesktopStrongNameProvider(compilerArguments.KeyFileSearchPaths))
552-
.WithMetadataImportOptions(MetadataImportOptions.All)
553552
);
554553
},
555554
(compilation, options) => analyser.EndInitialize(compilerArguments, options, compilation, cwd, args),

0 commit comments

Comments
 (0)