Skip to content

Commit 1e2405e

Browse files
committed
C#: Fixup of extration.
1 parent d8bcd79 commit 1e2405e

File tree

5 files changed

+24
-15
lines changed

5 files changed

+24
-15
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,5 +648,17 @@ public static IEnumerable<AnnotatedTypeSymbol> GetAnnotatedTypeArguments(this IN
648648
/// </summary>
649649
public static bool IsPublicOrProtected(this ISymbol symbol) =>
650650
symbol.DeclaredAccessibility == Accessibility.Public || symbol.DeclaredAccessibility == Accessibility.Protected;
651+
652+
/// <summary>
653+
/// Returns true if the given symbol should be extracted in this context.
654+
/// </summary>
655+
public static bool ShouldExtractSymbol(this ISymbol symbol) =>
656+
symbol.Locations.Any(x => !x.IsInMetadata) || symbol.IsPublicOrProtected();
657+
658+
/// <summary>
659+
/// Returns the symbols that should be extracted in the given context.
660+
/// </summary>
661+
public static IEnumerable<T> ToExtract<T>(this IEnumerable<T> symbols) where T : ISymbol =>
662+
symbols.Where(symbol => symbol.ShouldExtractSymbol());
651663
}
652664
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public void Overrides(TextWriter trapFile)
101101
}
102102
}
103103

104-
if (Symbol.OverriddenMethod is not null)
104+
if (Symbol.OverriddenMethod is not null && Symbol.OverriddenMethod.ShouldExtractSymbol())
105105
{
106106
trapFile.overrides(this, Method.Create(Context, Symbol.OverriddenMethod));
107107
}

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

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -228,24 +228,20 @@ private void ExtractParametersForDelegateLikeType(TextWriter trapFile, IMethodSy
228228
/// 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>
232231
/// </summary>
233-
public void ExtractRecursive(bool onlyEffectivelyPublic = false)
232+
public void ExtractRecursive()
234233
{
235234
foreach (var l in Symbol.DeclaringSyntaxReferences.Select(s => s.GetSyntax().GetLocation()))
236235
{
237236
Context.BindComments(this, l);
238237
}
239238

240-
foreach (var member in Symbol.GetMembers())
239+
foreach (var member in Symbol.GetMembers().ToExtract())
241240
{
242-
if (onlyEffectivelyPublic && !member.IsPublicOrProtected())
243-
continue;
244-
245241
switch (member.Kind)
246242
{
247243
case SymbolKind.NamedType:
248-
Create(Context, (ITypeSymbol)member).ExtractRecursive(onlyEffectivelyPublic);
244+
Create(Context, (ITypeSymbol)member).ExtractRecursive();
249245
break;
250246
default:
251247
Context.CreateEntity(member);
@@ -266,16 +262,16 @@ public void PopulateGenerics()
266262

267263
var members = new List<ISymbol>();
268264

269-
foreach (var member in Symbol.GetMembers())
265+
foreach (var member in Symbol.GetMembers().ToExtract())
270266
members.Add(member);
271-
foreach (var member in Symbol.GetTypeMembers())
267+
foreach (var member in Symbol.GetTypeMembers().ToExtract())
272268
members.Add(member);
273269

274270
// Mono extractor puts all BASE interface members as members of the current interface.
275271

276272
if (Symbol.TypeKind == TypeKind.Interface)
277273
{
278-
foreach (var baseInterface in Symbol.Interfaces)
274+
foreach (var baseInterface in Symbol.Interfaces.ToExtract())
279275
{
280276
foreach (var member in baseInterface.GetMembers())
281277
members.Add(member);
@@ -289,10 +285,10 @@ public void PopulateGenerics()
289285
Context.CreateEntity(member);
290286
}
291287

292-
if (Symbol.BaseType is not null)
288+
if (Symbol.BaseType is not null && Symbol.BaseType.ShouldExtractSymbol())
293289
Create(Context, Symbol.BaseType).PopulateGenerics();
294290

295-
foreach (var i in Symbol.Interfaces)
291+
foreach (var i in Symbol.Interfaces.ToExtract())
296292
{
297293
Create(Context, i).PopulateGenerics();
298294
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,9 +271,9 @@ private static void AnalyseNamespace(Context cx, INamespaceSymbol ns)
271271

272272
foreach (var memberType in ns.GetTypeMembers())
273273
{
274-
if (memberType.IsPublicOrProtected())
274+
if (memberType.ShouldExtractSymbol())
275275
{
276-
Entities.Type.Create(cx, memberType).ExtractRecursive(onlyEffectivelyPublic: true);
276+
Entities.Type.Create(cx, memberType).ExtractRecursive();
277277
}
278278
}
279279
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,7 @@ public bool Defines(ISymbol symbol) =>
550550
!SymbolEqualityComparer.Default.Equals(symbol, symbol.OriginalDefinition) ||
551551
scope.InScope(symbol);
552552

553+
553554
/// <summary>
554555
/// Runs the given action <paramref name="a"/>, guarding for trap duplication
555556
/// based on key <paramref name="key"/>.

0 commit comments

Comments
 (0)