Extract warning and error directives

This commit is contained in:
Tamas Vajk
2021-01-20 08:55:41 +01:00
parent 3740aba4a8
commit 15c611e22f
10 changed files with 100 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 ErrorDirective : PreprocessorDirective<ErrorDirectiveTriviaSyntax>
{
public ErrorDirective(Context cx, ErrorDirectiveTriviaSyntax trivia)
: base(cx, trivia)
{
}
protected override void PopulatePreprocessor(TextWriter trapFile)
{
trapFile.directive_errors(this, trivia.EndOfDirectiveToken.LeadingTrivia.ToString());
}
}
}

View File

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

View File

@@ -32,5 +32,15 @@ namespace Semmle.Extraction.CSharp.Populators
{
new Entities.UndefineDirective(cx, node);
}
public override void VisitWarningDirectiveTrivia(WarningDirectiveTriviaSyntax node)
{
new Entities.WarningDirective(cx, node);
}
public override void VisitErrorDirectiveTrivia(ErrorDirectiveTriviaSyntax node)
{
new Entities.ErrorDirective(cx, node);
}
}
}

View File

@@ -630,5 +630,15 @@ namespace Semmle.Extraction.CSharp
{
trapFile.WriteTuple("directive_undefines", directive, name);
}
internal static void directive_warnings(this TextWriter trapFile, WarningDirective directive, string message)
{
trapFile.WriteTuple("directive_warnings", directive, message);
}
internal static void directive_errors(this TextWriter trapFile, ErrorDirective directive, string message)
{
trapFile.WriteTuple("directive_errors", directive, message);
}
}
}

View File

@@ -70,3 +70,27 @@ class UndefineDirective extends PreprocessorDirective, @directive_undefine {
override string getAPrimaryQlClass() { result = "UndefineDirective" }
}
/**
* A `#warning` directive.
*/
class WarningDirective extends PreprocessorDirective, @directive_warning {
/** Gets the text of the warning. */
string getMessage() { directive_warnings(this, result) }
override string toString() { result = "#warning ..." }
override string getAPrimaryQlClass() { result = "WarningDirective" }
}
/**
* An `#error` directive.
*/
class ErrorDirective extends PreprocessorDirective, @directive_error {
/** Gets the text of the error. */
string getMessage() { directive_errors(this, result) }
override string toString() { result = "#error ..." }
override string getAPrimaryQlClass() { result = "ErrorDirective" }
}

View File

@@ -331,7 +331,16 @@ using_directive_location(
unique int id: @using_directive ref,
int loc: @location ref);
@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine;
@preprocessor_directive = @pragma_warning | @pragma_checksum | @directive_define | @directive_undefine | @directive_warning
| @directive_error;
directive_warnings(
unique int id: @directive_warning,
string message: string ref);
directive_errors(
unique int id: @directive_error,
string message: string ref);
directive_undefines(
unique int id: @directive_undefine,

View File

@@ -0,0 +1 @@
| trivia.cs:72:1:72:41 | #error ... | NOTDEBUG is defined or TEST is not |

View File

@@ -0,0 +1,4 @@
import csharp
from ErrorDirective d
select d, d.getMessage()

View File

@@ -0,0 +1 @@
| trivia.cs:66:1:66:25 | #warning ... | DEBUG is defined |

View File

@@ -0,0 +1,4 @@
import csharp
from WarningDirective d
select d, d.getMessage()