C#: Add new class needed for LineSpanDirective and modify existing implementation to use the new types.

This commit is contained in:
Michael Nebel
2022-01-12 16:37:10 +01:00
parent a197befb5f
commit 195d40c04e
3 changed files with 55 additions and 13 deletions

View File

@@ -5,7 +5,7 @@ using System.IO;
namespace Semmle.Extraction.CSharp.Entities
{
internal class LineDirective : PreprocessorDirective<LineDirectiveTriviaSyntax>
internal class LineDirective : LineOrSpanDirective<LineDirectiveTriviaSyntax>
{
private LineDirective(Context cx, LineDirectiveTriviaSyntax trivia)
: base(cx, trivia)
@@ -16,9 +16,9 @@ namespace Semmle.Extraction.CSharp.Entities
{
var type = Symbol.Line.Kind() switch
{
SyntaxKind.DefaultKeyword => 0,
SyntaxKind.HiddenKeyword => 1,
SyntaxKind.NumericLiteralToken => 2,
SyntaxKind.DefaultKeyword => LineDirectiveKind.Default,
SyntaxKind.HiddenKeyword => LineDirectiveKind.Hidden,
SyntaxKind.NumericLiteralToken => LineDirectiveKind.Numeric,
_ => throw new InternalError(Symbol, "Unhandled line token kind")
};
@@ -28,13 +28,9 @@ namespace Semmle.Extraction.CSharp.Entities
{
var value = (int)Symbol.Line.Value!;
trapFile.directive_line_value(this, value);
if (!string.IsNullOrWhiteSpace(Symbol.File.ValueText))
{
var file = File.Create(Context, Symbol.File.ValueText);
trapFile.directive_line_file(this, file);
}
}
base.PopulatePreprocessor(trapFile);
}
public static LineDirective Create(Context cx, LineDirectiveTriviaSyntax line) =>

View File

@@ -0,0 +1,40 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.IO;
namespace Semmle.Extraction.CSharp.Entities
{
internal class LineSpanDirective : LineOrSpanDirective<LineSpanDirectiveTriviaSyntax>
{
private LineSpanDirective(Context cx, LineSpanDirectiveTriviaSyntax trivia)
: base(cx, trivia) { }
public static LineSpanDirective Create(Context cx, LineSpanDirectiveTriviaSyntax line) =>
LineSpanDirectiveFactory.Instance.CreateEntity(cx, line, line);
protected override void PopulatePreprocessor(TextWriter trapFile)
{
trapFile.directive_lines(this, LineDirectiveKind.Span);
var startLine = (int)Symbol.Start.Line.Value!;
var startColumn = (int)Symbol.Start.Character.Value!;
var endLine = (int)Symbol.End.Line.Value!;
var endColumn = (int)Symbol.End.Character.Value!;
trapFile.directive_line_span(this, startLine, startColumn, endLine, endColumn);
var offset = Symbol.CharacterOffset.Value;
if (offset is not null)
{
trapFile.directive_line_offset(this, (int)offset);
}
base.PopulatePreprocessor(trapFile);
}
private class LineSpanDirectiveFactory : CachedEntityFactory<LineSpanDirectiveTriviaSyntax, LineSpanDirective>
{
public static LineSpanDirectiveFactory Instance { get; } = new LineSpanDirectiveFactory();
public override LineSpanDirective Create(Context cx, LineSpanDirectiveTriviaSyntax init) => new(cx, init);
}
}
}

View File

@@ -413,15 +413,21 @@ namespace Semmle.Extraction.CSharp
internal static void directive_nullables(this TextWriter trapFile, NullableDirective directive, int setting, int target) =>
trapFile.WriteTuple("directive_nullables", directive, setting, target);
internal static void directive_lines(this TextWriter trapFile, LineDirective directive, int kind) =>
trapFile.WriteTuple("directive_lines", directive, kind);
internal static void directive_lines<T>(this TextWriter trapFile, LineOrSpanDirective<T> directive, LineDirectiveKind kind) where T : LineOrSpanDirectiveTriviaSyntax =>
trapFile.WriteTuple("directive_lines", directive, (int)kind);
internal static void directive_line_value(this TextWriter trapFile, LineDirective directive, int line) =>
trapFile.WriteTuple("directive_line_value", directive, line);
internal static void directive_line_file(this TextWriter trapFile, LineDirective directive, Extraction.Entities.File file) =>
internal static void directive_line_file<T>(this TextWriter trapFile, LineOrSpanDirective<T> directive, Extraction.Entities.File file) where T : LineOrSpanDirectiveTriviaSyntax =>
trapFile.WriteTuple("directive_line_file", directive, file);
internal static void directive_line_offset(this TextWriter trapFile, LineSpanDirective directive, int offset) =>
trapFile.WriteTuple("directive_line_offset", directive, offset);
internal static void directive_line_span(this TextWriter trapFile, LineSpanDirective directive, int startLine, int startColumn, int endLine, int endColumn) =>
trapFile.WriteTuple("directive_line_span", directive, startLine, startColumn, endLine, endColumn);
internal static void directive_regions(this TextWriter trapFile, RegionDirective directive, string name) =>
trapFile.WriteTuple("directive_regions", directive, name);