Skip to content

Commit 53fb4b0

Browse files
committed
C#: Only create a single empty location element.
1 parent 3fd04ff commit 53fb4b0

File tree

3 files changed

+51
-5
lines changed

3 files changed

+51
-5
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System.IO;
2+
3+
namespace Semmle.Extraction.CSharp.Entities
4+
{
5+
/// <summary>
6+
/// Used to create a single canonical empty location entity.
7+
/// </summary>
8+
public class EmptyLocation : GeneratedLocation
9+
{
10+
private EmptyLocation(Context cx) : base(cx) { }
11+
12+
public override void Populate(TextWriter trapFile)
13+
{
14+
trapFile.locations_default(this, GenFile, -1, -1, -1, -1);
15+
}
16+
17+
public override void WriteId(EscapingTextWriter trapFile)
18+
{
19+
if (Context.ExtractionContext.IsStandalone)
20+
{
21+
WriteStarId(trapFile);
22+
return;
23+
}
24+
25+
trapFile.Write("loc,");
26+
trapFile.WriteSubId(GenFile);
27+
trapFile.Write(",-1,-1,-1,-1");
28+
}
29+
30+
public static new EmptyLocation Create(Context cx) => EmptyLocationFactory.Instance.CreateEntity(cx, typeof(EmptyLocation), null);
31+
32+
private class EmptyLocationFactory : CachedEntityFactory<string?, EmptyLocation>
33+
{
34+
public static EmptyLocationFactory Instance { get; } = new EmptyLocationFactory();
35+
36+
/// <summary>
37+
/// The QL library assumes the presence of a single empty location element.
38+
/// </summary>
39+
public override EmptyLocation Create(Context cx, string? init) => new EmptyLocation(cx);
40+
}
41+
}
42+
43+
}

csharp/extractor/Semmle.Extraction.CSharp/Entities/Locations/GeneratedLocation.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ namespace Semmle.Extraction.CSharp.Entities
44
{
55
public class GeneratedLocation : SourceLocation
66
{
7-
private readonly File generatedFile;
7+
protected File GenFile { get; init; }
88

9-
private GeneratedLocation(Context cx)
9+
protected GeneratedLocation(Context cx)
1010
: base(cx, null)
1111
{
12-
generatedFile = GeneratedFile.Create(cx);
12+
GenFile = GeneratedFile.Create(cx);
1313
}
1414

1515
public override void Populate(TextWriter trapFile)
1616
{
17-
trapFile.locations_default(this, generatedFile, 0, 0, 0, 0);
17+
trapFile.locations_default(this, GenFile, 0, 0, 0, 0);
1818
}
1919

2020
public override void WriteId(EscapingTextWriter trapFile)
@@ -26,7 +26,7 @@ public override void WriteId(EscapingTextWriter trapFile)
2626
}
2727

2828
trapFile.Write("loc,");
29-
trapFile.WriteSubId(generatedFile);
29+
trapFile.WriteSubId(GenFile);
3030
trapFile.Write(",0,0,0,0");
3131
}
3232

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,9 @@ private void DoAnalyseCompilation()
238238

239239
compilationEntity = Entities.Compilation.Create(cx);
240240

241+
// Add a single empty location
242+
Entities.EmptyLocation.Create(cx);
243+
241244
ExtractionContext.CompilationInfos.ForEach(ci => trapWriter.Writer.compilation_info(compilationEntity, ci.key, ci.value));
242245

243246
ReportProgressTaskDone(currentTaskId, assemblyPath, trapWriter.TrapFile, stopwatch.Elapsed, AnalysisAction.Extracted);

0 commit comments

Comments
 (0)