Files
codeql/powershell/extractor/Semmle.Extraction.PowerShell/Entities/Base/SourceCodeLocation.cs
2024-08-14 18:11:02 +01:00

60 lines
2.0 KiB
C#

using Microsoft.CodeAnalysis;
using System.IO;
namespace Semmle.Extraction.PowerShell.Entities
{
internal class SourceCodeLocation : Extraction.Entities.SourceLocation
{
public PowerShellContext powershellContext => (PowerShellContext)base.Context;
protected SourceCodeLocation(PowerShellContext cx, Location init)
: base(cx, init)
{
Position = init.GetLineSpan();
FileEntity = File.Create(powershellContext, Position.Path);
}
public override bool NeedsPopulation { get; } = true;
public static SourceCodeLocation Create(PowerShellContext cx, Location loc) => SourceLocationFactory.Instance.CreateEntity(cx, loc, loc);
public override void Populate(TextWriter trapFile)
{
trapFile.locations_default(this, FileEntity,
Position.Span.Start.Line, Position.Span.Start.Character,
Position.Span.End.Line, Position.Span.End.Character);
}
public FileLinePositionSpan Position
{
get;
}
public File FileEntity
{
get;
}
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write("loc,");
trapFile.WriteSubId(FileEntity);
trapFile.Write(',');
trapFile.Write(Position.Span.Start.Line);
trapFile.Write(',');
trapFile.Write(Position.Span.Start.Character);
trapFile.Write(',');
trapFile.Write(Position.Span.End.Line);
trapFile.Write(',');
trapFile.Write(Position.Span.End.Character);
}
private class SourceLocationFactory : CachedEntityFactory<Location, SourceCodeLocation>
{
public static SourceLocationFactory Instance { get; } = new SourceLocationFactory();
public override SourceCodeLocation Create(PowerShellContext cx, Location init) => new SourceCodeLocation(cx, init);
}
}
}