Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 94bf346

Browse files
committed
Extract pragma checksum directives
1 parent 8b9c671 commit 94bf346

10 files changed

Lines changed: 105 additions & 27 deletions

File tree

csharp/extractor/Semmle.Extraction.CSharp/Entities/PreprocessorDirectives/IPreprocessorDirective.cs

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Microsoft.CodeAnalysis.CSharp.Syntax;
2+
using System.IO;
3+
4+
namespace Semmle.Extraction.CSharp.Entities
5+
{
6+
internal class PragmaChecksumDirective : PreprocessorDirective<PragmaChecksumDirectiveTriviaSyntax>
7+
{
8+
public PragmaChecksumDirective(Context cx, PragmaChecksumDirectiveTriviaSyntax trivia)
9+
: base(cx, trivia)
10+
{
11+
}
12+
13+
protected override void PopulatePreprocessor(TextWriter trapFile)
14+
{
15+
trapFile.pragma_checksums(this, trivia.File.ToString(), trivia.Guid.ToString(), trivia.Bytes.ToString());
16+
}
17+
}
18+
}
Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
11
using Microsoft.CodeAnalysis;
22
using Microsoft.CodeAnalysis.CSharp;
33
using Microsoft.CodeAnalysis.CSharp.Syntax;
4-
using Semmle.Extraction.Entities;
54
using System.IO;
65

76
namespace Semmle.Extraction.CSharp.Entities
87
{
9-
internal class PragmaWarningDirective : FreshEntity, IPreprocessorDirective
8+
internal class PragmaWarningDirective : PreprocessorDirective<PragmaWarningDirectiveTriviaSyntax>
109
{
11-
private readonly PragmaWarningDirectiveTriviaSyntax trivia;
12-
1310
public PragmaWarningDirective(Context cx, PragmaWarningDirectiveTriviaSyntax trivia)
14-
: base(cx)
11+
: base(cx, trivia)
1512
{
16-
this.trivia = trivia;
17-
TryPopulate();
1813
}
1914

20-
protected override void Populate(TextWriter trapFile)
15+
protected override void PopulatePreprocessor(TextWriter trapFile)
2116
{
2217
trapFile.pragma_warnings(this, trivia.DisableOrRestoreKeyword.IsKind(SyntaxKind.DisableKeyword) ? 0 : 1);
2318

@@ -26,18 +21,6 @@ protected override void Populate(TextWriter trapFile)
2621
{
2722
trapFile.pragma_warning_error_codes(this, code.ToString(), childIndex++);
2823
}
29-
30-
trapFile.preprocessor_directive_location(this, cx.Create(ReportingLocation));
31-
32-
if (!cx.Extractor.Standalone)
33-
{
34-
var assembly = Assembly.CreateOutputAssembly(cx);
35-
trapFile.preprocessor_directive_assembly(this, assembly);
36-
}
3724
}
38-
39-
public sealed override Microsoft.CodeAnalysis.Location ReportingLocation => trivia.GetLocation();
40-
41-
public override TrapStackBehaviour TrapStackBehaviour => TrapStackBehaviour.OptionalLabel;
4225
}
4326
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using Microsoft.CodeAnalysis.CSharp.Syntax;
2+
using Semmle.Extraction.Entities;
3+
using System.IO;
4+
5+
namespace Semmle.Extraction.CSharp.Entities
6+
{
7+
internal abstract class PreprocessorDirective<TDirective> : FreshEntity where TDirective : DirectiveTriviaSyntax
8+
{
9+
protected readonly TDirective trivia;
10+
11+
protected PreprocessorDirective(Context cx, TDirective trivia)
12+
: base(cx)
13+
{
14+
this.trivia = trivia;
15+
TryPopulate();
16+
}
17+
18+
protected sealed override void Populate(TextWriter trapFile)
19+
{
20+
PopulatePreprocessor(trapFile);
21+
22+
trapFile.preprocessor_directive_location(this, cx.Create(ReportingLocation));
23+
24+
if (!cx.Extractor.Standalone)
25+
{
26+
var assembly = Assembly.CreateOutputAssembly(cx);
27+
trapFile.preprocessor_directive_assembly(this, assembly);
28+
}
29+
}
30+
31+
protected abstract void PopulatePreprocessor(TextWriter trapFile);
32+
33+
public sealed override Microsoft.CodeAnalysis.Location ReportingLocation => trivia.GetLocation();
34+
35+
public override TrapStackBehaviour TrapStackBehaviour => TrapStackBehaviour.OptionalLabel;
36+
}
37+
}

csharp/extractor/Semmle.Extraction.CSharp/Populators/DirectiveVisitor.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,10 @@ public override void VisitPragmaWarningDirectiveTrivia(PragmaWarningDirectiveTri
1717
{
1818
new Entities.PragmaWarningDirective(cx, node);
1919
}
20+
21+
public override void VisitPragmaChecksumDirectiveTrivia(PragmaChecksumDirectiveTriviaSyntax node)
22+
{
23+
new Entities.PragmaChecksumDirective(cx, node);
24+
}
2025
}
2126
}

csharp/extractor/Semmle.Extraction.CSharp/Tuples.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Microsoft.CodeAnalysis.CSharp.Syntax;
12
using Semmle.Extraction.CommentProcessing;
23
using Semmle.Extraction.CSharp.Entities;
34
using Semmle.Extraction.Entities;
@@ -591,12 +592,16 @@ internal static void using_static_directives(this TextWriter trapFile, UsingDire
591592
trapFile.WriteTuple("using_static_directives", @using, type);
592593
}
593594

594-
internal static void preprocessor_directive_location(this TextWriter trapFile, IPreprocessorDirective directive, Location location)
595+
internal static void preprocessor_directive_location<TDirective>(this TextWriter trapFile,
596+
PreprocessorDirective<TDirective> directive, Location location)
597+
where TDirective : DirectiveTriviaSyntax
595598
{
596599
trapFile.WriteTuple("preprocessor_directive_location", directive, location);
597600
}
598601

599-
internal static void preprocessor_directive_assembly(this TextWriter trapFile, IPreprocessorDirective directive, Assembly assembly)
602+
internal static void preprocessor_directive_assembly<TDirective>(this TextWriter trapFile,
603+
PreprocessorDirective<TDirective> directive, Assembly assembly)
604+
where TDirective : DirectiveTriviaSyntax
600605
{
601606
trapFile.WriteTuple("preprocessor_directive_assembly", directive, assembly);
602607
}
@@ -610,5 +615,10 @@ internal static void pragma_warning_error_codes(this TextWriter trapFile, Pragma
610615
{
611616
trapFile.WriteTuple("pragma_warning_error_codes", pragma, errorCode, child);
612617
}
618+
619+
internal static void pragma_checksums(this TextWriter trapFile, PragmaChecksumDirective pragma, string file, string guid, string bytes)
620+
{
621+
trapFile.WriteTuple("pragma_checksums", pragma, file, guid, bytes);
622+
}
613623
}
614624
}

csharp/ql/src/semmle/code/csharp/Preprocessor.qll

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,21 @@ class PragmaWarningDirective extends PreprocessorDirective, @pragma_warning {
2828

2929
override string getAPrimaryQlClass() { result = "PragmaWarningDirective" }
3030
}
31+
32+
/**
33+
* A `#pragma checksum` directive.
34+
*/
35+
class PragmaChecksumDirective extends PreprocessorDirective, @pragma_checksum {
36+
/** Gets the file name of this directive. */
37+
string getFileName() { pragma_checksums(this, result, _, _) }
38+
39+
/** Gets the GUID of this directive. */
40+
string getGuid() { pragma_checksums(this, _, result, _) }
41+
42+
/** Gets the checksum bytes of this directive. */
43+
string getBytes() { pragma_checksums(this, _, _, result) }
44+
45+
override string toString() { result = "#pragma checksum ..." }
46+
47+
override string getAPrimaryQlClass() { result = "PragmaChecksumDirective" }
48+
}

csharp/ql/src/semmlecode.csharp.dbscheme

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,13 @@ using_directive_location(
331331
unique int id: @using_directive ref,
332332
int loc: @location ref);
333333

334-
@preprocessor_directive = @pragma_warning;
334+
@preprocessor_directive = @pragma_warning | @pragma_checksum;
335+
336+
pragma_checksums(
337+
unique int id: @pragma_checksum,
338+
string file: string ref,
339+
string guid: string ref,
340+
string bytes: string ref);
335341

336342
pragma_warnings(
337343
unique int id: @pragma_warning,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| trivia.cs:13:1:13:98 | #pragma checksum ... | "file.cs" | "{406EA660-64CF-4C82-B6F0-42D48172A799}" | "ab007f1d23d9" |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import csharp
2+
3+
from PragmaChecksumDirective p
4+
select p, p.getFileName(), p.getGuid(), p.getBytes()

0 commit comments

Comments
 (0)