Skip to content

Commit d270aa2

Browse files
committed
C#: Extract ID writing logic to separate class
1 parent fc5f6c5 commit d270aa2

File tree

5 files changed

+95
-104
lines changed

5 files changed

+95
-104
lines changed

csharp/extractor/Semmle.Extraction.CIL/Entities/ConstructedType.cs

Lines changed: 25 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -18,31 +18,11 @@ public sealed class ConstructedType : Type
1818
private readonly Type[]? thisTypeArguments;
1919

2020
private readonly Type? containingType;
21-
22-
public override IEnumerable<Type> ThisTypeArguments => thisTypeArguments.EnumerateNull();
23-
24-
public override IEnumerable<Type> ThisGenericArguments => thisTypeArguments.EnumerateNull();
25-
26-
public override IEnumerable<IExtractionProduct> Contents
27-
{
28-
get
29-
{
30-
foreach (var c in base.Contents)
31-
yield return c;
32-
33-
var i = 0;
34-
foreach (var type in ThisTypeArguments)
35-
{
36-
yield return type;
37-
yield return Tuples.cil_type_argument(this, i++, type);
38-
}
39-
}
40-
}
41-
42-
public override Type SourceDeclaration => unboundGenericType;
21+
private readonly NamedTypeIdWriter idWriter;
4322

4423
public ConstructedType(Context cx, Type unboundType, IEnumerable<Type> typeArguments) : base(cx)
4524
{
25+
idWriter = new NamedTypeIdWriter(this);
4626
var suppliedArgs = typeArguments.Count();
4727
if (suppliedArgs != unboundType.TotalTypeParametersCount)
4828
throw new InternalError("Unexpected number of type arguments in ConstructedType");
@@ -90,6 +70,28 @@ public override int GetHashCode()
9070
return h;
9171
}
9272

73+
public override IEnumerable<Type> ThisTypeArguments => thisTypeArguments.EnumerateNull();
74+
75+
public override IEnumerable<Type> ThisGenericArguments => thisTypeArguments.EnumerateNull();
76+
77+
public override IEnumerable<IExtractionProduct> Contents
78+
{
79+
get
80+
{
81+
foreach (var c in base.Contents)
82+
yield return c;
83+
84+
var i = 0;
85+
foreach (var type in ThisTypeArguments)
86+
{
87+
yield return type;
88+
yield return Tuples.cil_type_argument(this, i++, type);
89+
}
90+
}
91+
}
92+
93+
public override Type SourceDeclaration => unboundGenericType;
94+
9395
public override Type? ContainingType => containingType;
9496

9597
public override string Name => unboundGenericType.Name;
@@ -107,34 +109,7 @@ public override Type Construct(IEnumerable<Type> typeArguments)
107109

108110
public override void WriteId(TextWriter trapFile, bool inContext)
109111
{
110-
if (ContainingType != null)
111-
{
112-
ContainingType.GetId(trapFile, inContext);
113-
trapFile.Write('.');
114-
}
115-
else
116-
{
117-
WriteAssemblyPrefix(trapFile);
118-
119-
if (!ContainingNamespace.IsGlobalNamespace)
120-
{
121-
ContainingNamespace.WriteId(trapFile);
122-
trapFile.Write('.');
123-
}
124-
}
125-
trapFile.Write(unboundGenericType.Name);
126-
127-
if (thisTypeArguments != null && thisTypeArguments.Any())
128-
{
129-
trapFile.Write('<');
130-
var index = 0;
131-
foreach (var t in thisTypeArguments)
132-
{
133-
trapFile.WriteSeparator(",", ref index);
134-
t.WriteId(trapFile);
135-
}
136-
trapFile.Write('>');
137-
}
112+
idWriter.WriteId(trapFile, inContext);
138113
}
139114

140115
public override void WriteAssemblyPrefix(TextWriter trapFile) => unboundGenericType.WriteAssemblyPrefix(trapFile);
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using Microsoft.CodeAnalysis;
2+
using System.Linq;
3+
using System.IO;
4+
5+
namespace Semmle.Extraction.CIL.Entities
6+
{
7+
internal class NamedTypeIdWriter
8+
{
9+
private readonly Type type;
10+
11+
public NamedTypeIdWriter(Type type)
12+
{
13+
this.type = type;
14+
}
15+
16+
public void WriteId(TextWriter trapFile, bool inContext)
17+
{
18+
if (type.IsPrimitiveType)
19+
{
20+
Type.WritePrimitiveTypeId(trapFile, type.Name);
21+
return;
22+
}
23+
24+
var ct = type.ContainingType;
25+
if (ct != null)
26+
{
27+
ct.GetId(trapFile, inContext);
28+
trapFile.Write('.');
29+
}
30+
else
31+
{
32+
type.WriteAssemblyPrefix(trapFile);
33+
34+
var ns = type.ContainingNamespace!;
35+
if (!ns.IsGlobalNamespace)
36+
{
37+
ns.WriteId(trapFile);
38+
trapFile.Write('.');
39+
}
40+
}
41+
42+
trapFile.Write(type.Name);
43+
44+
var thisTypeArguments = type.ThisTypeArguments;
45+
if (thisTypeArguments != null && thisTypeArguments.Any())
46+
{
47+
trapFile.Write('<');
48+
var index = 0;
49+
foreach (var t in thisTypeArguments)
50+
{
51+
trapFile.WriteSeparator(",", ref index);
52+
t.WriteId(trapFile);
53+
}
54+
trapFile.Write('>');
55+
}
56+
else if (type.ThisTypeParameterCount > 0)
57+
{
58+
trapFile.Write('`');
59+
trapFile.Write(type.ThisTypeParameterCount);
60+
}
61+
}
62+
}
63+
}

csharp/extractor/Semmle.Extraction.CIL/Entities/Type.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ private bool TryGetPrimitiveTypeCode(out PrimitiveTypeCode code)
193193
return false;
194194
}
195195

196-
protected bool IsPrimitiveType => TryGetPrimitiveTypeCode(out _);
196+
protected internal bool IsPrimitiveType => TryGetPrimitiveTypeCode(out _);
197197

198198
public sealed override IEnumerable<Type> MethodParameters => Enumerable.Empty<Type>();
199199

csharp/extractor/Semmle.Extraction.CIL/Entities/TypeDefinitionType.cs

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ public sealed class TypeDefinitionType : Type
1919
private readonly TypeDefinition td;
2020
private readonly Lazy<IEnumerable<TypeTypeParameter>> typeParams;
2121
private readonly Type? declType;
22+
private readonly NamedTypeIdWriter idWriter;
2223

2324
public TypeDefinitionType(Context cx, TypeDefinitionHandle handle) : base(cx)
2425
{
26+
idWriter = new NamedTypeIdWriter(this);
2527
td = cx.MdReader.GetTypeDefinition(handle);
2628
this.handle = handle;
2729

@@ -42,32 +44,7 @@ public override bool Equals(object? obj)
4244

4345
public override void WriteId(TextWriter trapFile, bool inContext)
4446
{
45-
if (IsPrimitiveType)
46-
{
47-
WritePrimitiveTypeId(trapFile, Name);
48-
return;
49-
}
50-
51-
var name = Cx.GetString(td.Name);
52-
53-
if (ContainingType != null)
54-
{
55-
ContainingType.GetId(trapFile, inContext);
56-
trapFile.Write('.');
57-
}
58-
else
59-
{
60-
WriteAssemblyPrefix(trapFile);
61-
62-
var ns = ContainingNamespace;
63-
if (!ns.IsGlobalNamespace)
64-
{
65-
ns.WriteId(trapFile);
66-
trapFile.Write('.');
67-
}
68-
}
69-
70-
trapFile.Write(name);
47+
idWriter.WriteId(trapFile, inContext);
7148
}
7249

7350
public override string Name

csharp/extractor/Semmle.Extraction.CIL/Entities/TypeReferenceType.cs

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ public sealed class TypeReferenceType : Type
1616
private readonly TypeReferenceHandle handle;
1717
private readonly TypeReference tr;
1818
private readonly Lazy<TypeTypeParameter[]> typeParams;
19+
private readonly NamedTypeIdWriter idWriter;
1920

2021
public TypeReferenceType(Context cx, TypeReferenceHandle handle) : base(cx)
2122
{
23+
this.idWriter = new NamedTypeIdWriter(this);
2224
this.typeParams = new Lazy<TypeTypeParameter[]>(MakeTypeParameters);
2325
this.handle = handle;
2426
this.tr = cx.MdReader.GetTypeReference(handle);
@@ -124,33 +126,7 @@ public override void WriteAssemblyPrefix(TextWriter trapFile)
124126

125127
public override void WriteId(TextWriter trapFile, bool inContext)
126128
{
127-
if (IsPrimitiveType)
128-
{
129-
WritePrimitiveTypeId(trapFile, Name);
130-
return;
131-
}
132-
133-
var ct = ContainingType;
134-
if (ct != null)
135-
{
136-
ct.GetId(trapFile, inContext);
137-
trapFile.Write('.');
138-
}
139-
else
140-
{
141-
if (tr.ResolutionScope.Kind == HandleKind.AssemblyReference)
142-
{
143-
WriteAssemblyPrefix(trapFile);
144-
}
145-
146-
if (!ContainingNamespace.IsGlobalNamespace)
147-
{
148-
ContainingNamespace.WriteId(trapFile);
149-
trapFile.Write('.');
150-
}
151-
}
152-
153-
trapFile.Write(Cx.GetString(tr.Name));
129+
idWriter.WriteId(trapFile, inContext);
154130
}
155131

156132
public override Type Construct(IEnumerable<Type> typeArguments)

0 commit comments

Comments
 (0)