Skip to content

Commit 3d60c14

Browse files
hvitvedtamasvajk
authored andcommitted
C#: Base IDs for constructed methods on their unconstructed counterparts
1 parent d044b15 commit 3d60c14

File tree

2 files changed

+40
-15
lines changed

2 files changed

+40
-15
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,15 @@ private ConstructorDeclarationSyntax? Syntax
146146

147147
public override void WriteId(EscapingTextWriter trapFile)
148148
{
149+
if (!SymbolEqualityComparer.Default.Equals(Symbol, Symbol.OriginalDefinition))
150+
{
151+
trapFile.WriteSubId(ContainingType!);
152+
trapFile.Write(".");
153+
trapFile.WriteSubId(OriginalDefinition);
154+
trapFile.Write(";constructor");
155+
return;
156+
}
157+
149158
if (Symbol.IsStatic)
150159
trapFile.Write("static");
151160
trapFile.WriteSubId(ContainingType!);

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

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,30 @@ public void Overrides(TextWriter trapFile)
129129
/// </summary>
130130
private static void BuildMethodId(Method m, EscapingTextWriter trapFile)
131131
{
132+
if (!SymbolEqualityComparer.Default.Equals(m.Symbol, m.Symbol.OriginalDefinition))
133+
{
134+
if (!SymbolEqualityComparer.Default.Equals(m.Symbol, m.ConstructedFromSymbol))
135+
{
136+
trapFile.WriteSubId(Create(m.Context, m.ConstructedFromSymbol));
137+
trapFile.Write('<');
138+
// Encode the nullability of the type arguments in the label.
139+
// Type arguments with different nullability can result in
140+
// a constructed method with different nullability of its parameters and return type,
141+
// so we need to create a distinct database entity for it.
142+
trapFile.BuildList(",", m.Symbol.GetAnnotatedTypeArguments(), ta => { ta.Symbol.BuildOrWriteId(m.Context, trapFile, m.Symbol); trapFile.Write((int)ta.Nullability); });
143+
trapFile.Write('>');
144+
}
145+
else
146+
{
147+
trapFile.WriteSubId(m.ContainingType!);
148+
trapFile.Write(".");
149+
trapFile.WriteSubId(m.OriginalDefinition);
150+
}
151+
152+
WritePostfix(m, trapFile);
153+
return;
154+
}
155+
132156
m.Symbol.ReturnType.BuildOrWriteId(m.Context, trapFile, m.Symbol);
133157
trapFile.Write(" ");
134158

@@ -141,24 +165,16 @@ private static void BuildMethodId(Method m, EscapingTextWriter trapFile)
141165

142166
if (m.Symbol.IsGenericMethod)
143167
{
144-
if (SymbolEqualityComparer.Default.Equals(m.Symbol, m.Symbol.OriginalDefinition))
145-
{
146-
trapFile.Write('`');
147-
trapFile.Write(m.Symbol.TypeParameters.Length);
148-
}
149-
else
150-
{
151-
trapFile.Write('<');
152-
// Encode the nullability of the type arguments in the label.
153-
// Type arguments with different nullability can result in
154-
// a constructed method with different nullability of its parameters and return type,
155-
// so we need to create a distinct database entity for it.
156-
trapFile.BuildList(",", m.Symbol.GetAnnotatedTypeArguments(), ta => { ta.Symbol.BuildOrWriteId(m.Context, trapFile, m.Symbol); trapFile.Write((int)ta.Nullability); });
157-
trapFile.Write('>');
158-
}
168+
trapFile.Write('`');
169+
trapFile.Write(m.Symbol.TypeParameters.Length);
159170
}
160171

161172
AddParametersToId(m.Context, trapFile, m.Symbol);
173+
WritePostfix(m, trapFile);
174+
}
175+
176+
private static void WritePostfix(Method m, EscapingTextWriter trapFile)
177+
{
162178
switch (m.Symbol.MethodKind)
163179
{
164180
case MethodKind.PropertyGet:

0 commit comments

Comments
 (0)