Skip to content

Commit fa769aa

Browse files
committed
C#: Add unbound parameter for constructed generic extensions.
1 parent 5f3c3bf commit fa769aa

File tree

1 file changed

+8
-1
lines changed
  • csharp/extractor/Semmle.Extraction.CSharp/Entities/Types

1 file changed

+8
-1
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ private NamedType(Context cx, INamedTypeSymbol init, bool constructUnderlyingTup
2020
public static NamedType Create(Context cx, INamedTypeSymbol type) =>
2121
NamedTypeFactory.Instance.CreateEntityFromSymbol(cx, type);
2222

23+
public NamedType OriginalDefinition => Create(Context, Symbol.OriginalDefinition);
24+
2325
/// <summary>
2426
/// Creates a named type entity from a tuple type. Unlike <see cref="Create"/>, this
2527
/// will create an entity for the underlying `System.ValueTuple` struct.
@@ -97,7 +99,12 @@ public override void Populate(TextWriter trapFile)
9799
// even when there is no parameter.
98100
if (!string.IsNullOrEmpty(parameter.Name))
99101
{
100-
Parameter.Create(Context, parameter, this);
102+
var originalType = OriginalDefinition;
103+
// In case the this is constructed generic, we also need to create the unbound parameter.
104+
var originalParameter = SymbolEqualityComparer.Default.Equals(Symbol, originalType.Symbol.ExtensionParameter) || originalType.Symbol.ExtensionParameter is null
105+
? null
106+
: Parameter.Create(Context, originalType.Symbol.ExtensionParameter, originalType);
107+
Parameter.Create(Context, parameter, this, originalParameter);
101108
}
102109

103110
// Use the parameter type as the receiver type.

0 commit comments

Comments
 (0)