forked from github/codeql
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNonGeneratedSourceLocation.cs
More file actions
85 lines (72 loc) · 2.86 KB
/
NonGeneratedSourceLocation.cs
File metadata and controls
85 lines (72 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System.IO;
using Microsoft.CodeAnalysis;
namespace Semmle.Extraction.CSharp.Entities
{
internal class NonGeneratedSourceLocation : SourceLocation
{
protected NonGeneratedSourceLocation(Context cx, Microsoft.CodeAnalysis.Location init)
: base(cx, init)
{
Position = init.GetLineSpan();
FileEntity = File.Create(Context, Position.Path);
}
public static NonGeneratedSourceLocation Create(Context cx, Microsoft.CodeAnalysis.Location loc) => SourceLocationFactory.Instance.CreateEntity(cx, loc, loc);
public override void Populate(TextWriter trapFile)
{
trapFile.locations_default(this, FileEntity,
Position.Span.Start.Line + 1, Position.Span.Start.Character + 1,
Position.Span.End.Line + 1, Position.Span.End.Character);
var mapped = Symbol.GetMappedLineSpan();
if (mapped.HasMappedPath && mapped.IsValid)
{
var path = Context.TryAdjustRelativeMappedFilePath(mapped.Path, Position.Path);
var mappedLoc = Create(Context, Microsoft.CodeAnalysis.Location.Create(path, default, mapped.Span));
trapFile.locations_mapped(this, mappedLoc);
}
}
public FileLinePositionSpan Position
{
get;
}
public File FileEntity
{
get;
}
private static void WriteStarId(EscapingTextWriter writer)
{
writer.Write('*');
}
public sealed override void WriteQuotedId(EscapingTextWriter writer)
{
if (Context.ExtractionContext.IsStandalone)
{
WriteStarId(writer);
return;
}
base.WriteQuotedId(writer);
}
public override void WriteId(EscapingTextWriter trapFile)
{
if (Context.ExtractionContext.IsStandalone)
{
WriteStarId(trapFile);
return;
}
trapFile.Write("loc,");
trapFile.WriteSubId(FileEntity);
trapFile.Write(',');
trapFile.Write(Position.Span.Start.Line + 1);
trapFile.Write(',');
trapFile.Write(Position.Span.Start.Character + 1);
trapFile.Write(',');
trapFile.Write(Position.Span.End.Line + 1);
trapFile.Write(',');
trapFile.Write(Position.Span.End.Character);
}
private class SourceLocationFactory : CachedEntityFactory<Microsoft.CodeAnalysis.Location, NonGeneratedSourceLocation>
{
public static SourceLocationFactory Instance { get; } = new SourceLocationFactory();
public override NonGeneratedSourceLocation Create(Context cx, Microsoft.CodeAnalysis.Location init) => new NonGeneratedSourceLocation(cx, init);
}
}
}