Extract define directives

This commit is contained in:
Tamas Vajk
2021-01-19 17:15:14 +01:00
parent 94bf3467b7
commit 9b405144ff
7 changed files with 50 additions and 1 deletions

View File

@@ -0,0 +1,18 @@
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.IO;
namespace Semmle.Extraction.CSharp.Entities
{
internal class DefineDirective : PreprocessorDirective<DefineDirectiveTriviaSyntax>
{
public DefineDirective(Context cx, DefineDirectiveTriviaSyntax trivia)
: base(cx, trivia)
{
}
protected override void PopulatePreprocessor(TextWriter trapFile)
{
trapFile.directive_defines(this, trivia.Name.ToString());
}
}
}

View File

@@ -22,5 +22,10 @@ namespace Semmle.Extraction.CSharp.Populators
{
new Entities.PragmaChecksumDirective(cx, node);
}
public override void VisitDefineDirectiveTrivia(DefineDirectiveTriviaSyntax node)
{
new Entities.DefineDirective(cx, node);
}
}
}

View File

@@ -620,5 +620,10 @@ namespace Semmle.Extraction.CSharp
{
trapFile.WriteTuple("pragma_checksums", pragma, file, guid, bytes);
}
internal static void directive_defines(this TextWriter trapFile, DefineDirective directive, string name)
{
trapFile.WriteTuple("directive_defines", directive, name);
}
}
}

View File

@@ -46,3 +46,15 @@ class PragmaChecksumDirective extends PreprocessorDirective, @pragma_checksum {
override string getAPrimaryQlClass() { result = "PragmaChecksumDirective" }
}
/**
* An `#define` directive.
*/
class DefineDirective extends PreprocessorDirective, @directive_define {
/** Gets the name of the preprocessor symbol that is being set by this directive. */
string getName() { directive_defines(this, result) }
override string toString() { result = "#define ..." }
override string getAPrimaryQlClass() { result = "DefineDirective" }
}

View File

@@ -331,7 +331,11 @@ using_directive_location(
unique int id: @using_directive ref,
int loc: @location ref);
@preprocessor_directive = @pragma_warning | @pragma_checksum;
@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define;
directive_defines(
unique int id: @directive_define,
string name: string ref);
pragma_checksums(
unique int id: @pragma_checksum,

View File

@@ -0,0 +1 @@
| trivia.cs:4:1:4:13 | #define ... | DEBUG |

View File

@@ -0,0 +1,4 @@
import csharp
from DefineDirective d
select d, d.getName()