Skip to content

Commit 8679237

Browse files
committed
C#: Only extract a single empty location.
1 parent ea53099 commit 8679237

File tree

5 files changed

+64
-49
lines changed

5 files changed

+64
-49
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System.IO;
2+
using System.Threading;
3+
4+
namespace Semmle.Extraction.CSharp.Entities
5+
{
6+
public class EmptyLocation : SourceLocation
7+
{
8+
private readonly File generatedFile;
9+
10+
// The Ql library assumes the presence of a single "empty" location.
11+
private static EmptyLocation? instance;
12+
private static readonly Lock instanceLock = new();
13+
14+
private EmptyLocation(Context cx)
15+
: base(cx, null)
16+
{
17+
generatedFile = GeneratedFile.Create(cx);
18+
}
19+
20+
public override void Populate(TextWriter trapFile)
21+
{
22+
trapFile.locations_default(this, generatedFile, 0, 0, 0, 0);
23+
}
24+
25+
public override void WriteId(EscapingTextWriter trapFile)
26+
{
27+
if (Context.ExtractionContext.IsStandalone)
28+
{
29+
WriteStarId(trapFile);
30+
return;
31+
}
32+
33+
trapFile.Write("loc,");
34+
trapFile.WriteSubId(generatedFile);
35+
trapFile.Write(",0,0,0,0");
36+
}
37+
38+
public override int GetHashCode() => 98732567;
39+
40+
public override bool Equals(object? obj) => obj is not null && obj.GetType() == typeof(EmptyLocation);
41+
42+
public static EmptyLocation Create(Context cx)
43+
{
44+
lock (instanceLock)
45+
{
46+
instance ??= EmptyLocationFactory.Instance.CreateEntity(cx, typeof(EmptyLocation), null);
47+
return instance;
48+
}
49+
}
50+
51+
private class EmptyLocationFactory : CachedEntityFactory<string?, EmptyLocation>
52+
{
53+
public static EmptyLocationFactory Instance { get; } = new EmptyLocationFactory();
54+
55+
public override EmptyLocation Create(Context cx, string? init) => new EmptyLocation(cx);
56+
}
57+
}
58+
}

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

Lines changed: 0 additions & 46 deletions
This file was deleted.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ public override void Populate(TextWriter trapFile)
247247
var typeKey = VarargsType.Create(Context);
248248
// !! Maybe originaldefinition is wrong
249249
trapFile.@params(this, "", typeKey, Ordinal, Kind.None, Parent!, this);
250-
trapFile.param_location(this, GeneratedLocation.Create(Context));
250+
trapFile.param_location(this, EmptyLocation.Create(Context));
251251
}
252252

253253
protected override int Ordinal => ((Method)Parent!).OriginalDefinition.Symbol.Parameters.Length;

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+
// Ensure that the empty location is always created.
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);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,14 +582,14 @@ public void WithDuplicationGuard(Key key, Action a)
582582
public Entities.Location CreateLocation()
583583
{
584584
return SourceTree is null
585-
? Entities.GeneratedLocation.Create(this)
585+
? Entities.EmptyLocation.Create(this)
586586
: CreateLocation(Microsoft.CodeAnalysis.Location.Create(SourceTree, Microsoft.CodeAnalysis.Text.TextSpan.FromBounds(0, 0)));
587587
}
588588

589589
public Entities.Location CreateLocation(Microsoft.CodeAnalysis.Location? location)
590590
{
591591
return (location is null || location.Kind == LocationKind.None)
592-
? Entities.GeneratedLocation.Create(this)
592+
? Entities.EmptyLocation.Create(this)
593593
: location.IsInSource
594594
? Entities.NonGeneratedSourceLocation.Create(this, location)
595595
: Entities.Assembly.Create(this, location);

0 commit comments

Comments
 (0)