diff --git a/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer.Test/UnitTests.cs b/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer.Test/UnitTests.cs index 991b487..8095b44 100644 --- a/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer.Test/UnitTests.cs +++ b/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer.Test/UnitTests.cs @@ -382,6 +382,14 @@ private void AnalyzerTest() VerifyCSharpDiagnostic(test); } + [TestMethod] + public void Test_NonSqlString_WithSqlPaser() + { + var result = SqlParser.Parse("select a value from Hello Test"); + + Assert.IsTrue(result.Count == 0, "Non Sql should not parse and returns no errors."); + } + protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() { return new TSqlAnalyzer(); diff --git a/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer/DiagnosticAnalyzer.cs b/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer/DiagnosticAnalyzer.cs index c6c7702..46cbc71 100644 --- a/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer/DiagnosticAnalyzer.cs +++ b/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer/DiagnosticAnalyzer.cs @@ -21,12 +21,30 @@ public class TSqlAnalyzer : DiagnosticAnalyzer public override ImmutableArray SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } } public override void Initialize(AnalysisContext context) - { - // TODO: Consider registering other actions that act on syntax instead of or in addition to symbols + { + // TODO: Consider registering other actions that act on syntax instead of or in addition to symbols + context.RegisterSyntaxNodeAction(AnalyzeStringLiteralForSql, SyntaxKind.LocalDeclarationStatement); context.RegisterSyntaxNodeAction(AnalyzeConstructorNode, SyntaxKind.ObjectCreationExpression); context.RegisterSyntaxNodeAction(AnalyzeAssignmentNode, SyntaxKind.SimpleAssignmentExpression); } + private static void AnalyzeStringLiteralForSql(SyntaxNodeAnalysisContext context) + { + var localDeclarationExpression = context.Node as LocalDeclarationStatementSyntax; + + var innerObjectInitializers = localDeclarationExpression.DescendantNodes().ToList(); + + var stringText = innerObjectInitializers.OfType().FirstOrDefault(x => x.IsKind(SyntaxKind.StringLiteralExpression) || x.IsKind(SyntaxKind.InterpolatedStringExpression)); + + if (stringText != null) + { + if (!SqlParser.Parse(stringText.ToFullString()).Any()) + return; + } + + ExpressionSyntax expressionSyntax = stringText; + RunDiagnostic(context, expressionSyntax); + } private static void AnalyzeAssignmentNode(SyntaxNodeAnalysisContext context) { var assignmentExpression = (AssignmentExpressionSyntax)context.Node; diff --git a/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer/Diagnostics/ExpressionDiagnostic.cs b/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer/Diagnostics/ExpressionDiagnostic.cs index d8e4e8d..76d35a9 100644 --- a/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer/Diagnostics/ExpressionDiagnostic.cs +++ b/src/TSqlAnalyzer/TSqlAnalyzer/TSqlAnalyzer/Diagnostics/ExpressionDiagnostic.cs @@ -18,8 +18,11 @@ internal class ExpressionDiagnostic internal static DiagnosticDescriptor RuleParam = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, isEnabledByDefault: true); internal static void Run(SyntaxNodeAnalysisContext context, ExpressionSyntax token) - { - string id = token.ToFullString(); + { + if (token == null) + return; + + string id = token.ToFullString(); if (string.IsNullOrWhiteSpace(id)) return;