public void DiagnosticRunnerTest_NoAnalyzer() { var runner = new DiagnosticsRunner(ImmutableArray.Create<DiagnosticAnalyzer>()); var solution = CompilationHelper.GetSolutionFromText(""); var compilation = solution.Projects.First().GetCompilationAsync().Result; var diagnosticsResult = runner.GetDiagnostics(compilation); diagnosticsResult.Should().HaveCount(0); }
public void DiagnosticRunnerTest_NoAnalyzer() { var tempInputFilePath = Path.Combine(TestContext.DeploymentDirectory, ParameterLoader.ParameterConfigurationFileName); File.Copy("TestResources\\ConfigurationTest.Empty.xml", tempInputFilePath, true); var runner = new DiagnosticsRunner(new Configuration(tempInputFilePath, Common.AnalyzerLanguage.CSharp)); var solution = CompilationHelper.GetSolutionWithEmptyFile(); var compilation = solution.Projects.First().GetCompilationAsync().Result; var diagnosticsResult = runner.GetDiagnostics(compilation); diagnosticsResult.Should().HaveCount(0); }
public static int Main(string[] args) { if (args.Length != 3) { Write("Expected parameters: "); Write("[Input configuration path]"); Write("[Output file path]"); Write("[AnalyzerLanguage: 'cs' for C#, 'vbnet' for VB.Net]"); return(-1); } var language = AnalyzerLanguage.Parse(args[2]); Write($"SonarLint for Visual Studio version {typeof (Program).Assembly.GetName().Version}"); var configuration = new Configuration(args[0], language); var diagnosticsRunner = new DiagnosticsRunner(configuration); var xmlOutSettings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true, IndentChars = " " }; using (var xmlOut = XmlWriter.Create(args[1], xmlOutSettings)) { xmlOut.WriteComment("This XML format is not an API"); xmlOut.WriteStartElement("AnalysisOutput"); xmlOut.WriteStartElement("Files"); var n = 0; foreach (var file in configuration.Files) { xmlOut.Flush(); Write(n + "/" + configuration.Files.Count() + " files analyzed, starting to analyze: " + file); n++; try { var solution = CompilationHelper.GetSolutionFromFiles(file, language); var compilation = solution.Projects.First().GetCompilationAsync().Result; var syntaxTree = compilation.SyntaxTrees.First(); var metrics = language == AnalyzerLanguage.CSharp ? (MetricsBase) new Common.CSharp.Metrics(syntaxTree) : new Common.VisualBasic.Metrics(syntaxTree); xmlOut.WriteStartElement("File"); xmlOut.WriteElementString("Path", file); xmlOut.WriteStartElement("Metrics"); xmlOut.WriteElementString("Lines", metrics.GetLineCount().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Classes", metrics.GetClassCount().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Accessors", metrics.GetAccessorCount().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Statements", metrics.GetStatementCount().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Functions", metrics.GetFunctionCount().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("PublicApi", metrics.GetPublicApiCount().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("PublicUndocumentedApi", metrics.GetPublicUndocumentedApiCount().ToString(CultureInfo.InvariantCulture)); var complexity = metrics.GetComplexity(); xmlOut.WriteElementString("Complexity", complexity.ToString(CultureInfo.InvariantCulture)); // TODO This is a bit ridiculous, but is how SonarQube works var fileComplexityDistribution = new Distribution(0, 5, 10, 20, 30, 60, 90); fileComplexityDistribution.Add(complexity); xmlOut.WriteElementString("FileComplexityDistribution", fileComplexityDistribution.ToString()); xmlOut.WriteElementString("FunctionComplexityDistribution", metrics.GetFunctionComplexityDistribution().ToString()); var comments = metrics.GetComments(configuration.IgnoreHeaderComments); xmlOut.WriteStartElement("Comments"); xmlOut.WriteStartElement("NoSonar"); foreach (var line in comments.NoSonar) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteStartElement("NonBlank"); foreach (var line in comments.NonBlank) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteStartElement("LinesOfCode"); foreach (var line in metrics.GetLinesOfCode()) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteStartElement("Issues"); foreach (var diagnostic in diagnosticsRunner.GetDiagnostics(compilation)) { xmlOut.WriteStartElement("Issue"); xmlOut.WriteElementString("Id", diagnostic.Id); if (diagnostic.Location != Location.None) { xmlOut.WriteElementString("Line", (diagnostic.GetLineNumberToReport()).ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteElementString("Message", diagnostic.GetMessage()); xmlOut.WriteEndElement(); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); } catch (Exception e) { Console.Error.WriteLine("Failed to analyze the file: " + file); Console.Error.WriteLine(e); return(1); } } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteEndDocument(); xmlOut.Flush(); return(0); } }
public static int Main(string[] args) { if (args.Length != 3) { Write("Expected parameters: "); Write("[Input configuration path]"); Write("[Output file path]"); Write("[AnalyzerLanguage: 'cs' for C#, 'vbnet' for VB.Net]"); return -1; } var language = AnalyzerLanguage.Parse(args[2]); Write($"SonarLint for Visual Studio version {typeof (Program).Assembly.GetName().Version}"); var configuration = new Configuration(args[0], language); var diagnosticsRunner = new DiagnosticsRunner(configuration); var xmlOutSettings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true, IndentChars = " " }; using (var xmlOut = XmlWriter.Create(args[1], xmlOutSettings)) { xmlOut.WriteComment("This XML format is not an API"); xmlOut.WriteStartElement("AnalysisOutput"); xmlOut.WriteStartElement("Files"); var currentFileIndex = 0; foreach (var file in configuration.Files) { xmlOut.Flush(); Write(currentFileIndex + "/" + configuration.Files.Count + " files analyzed, starting to analyze: " + file); currentFileIndex++; try { var solution = CompilationHelper.GetSolutionFromFiles(file, language); var compilation = solution.Projects.First().GetCompilationAsync().Result; var syntaxTree = compilation.SyntaxTrees.First(); var metrics = language == AnalyzerLanguage.CSharp ? (MetricsBase)new Common.CSharp.Metrics(syntaxTree) : new Common.VisualBasic.Metrics(syntaxTree); xmlOut.WriteStartElement("File"); xmlOut.WriteElementString("Path", file); xmlOut.WriteStartElement("Metrics"); xmlOut.WriteElementString("Lines", metrics.LineCount.ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Classes", metrics.ClassCount.ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Accessors", metrics.AccessorCount.ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Statements", metrics.StatementCount.ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Functions", metrics.FunctionCount.ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("PublicApi", metrics.PublicApiCount.ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("PublicUndocumentedApi", metrics.PublicUndocumentedApiCount.ToString(CultureInfo.InvariantCulture)); var complexity = metrics.Complexity; xmlOut.WriteElementString("Complexity", complexity.ToString(CultureInfo.InvariantCulture)); // TODO This is a bit ridiculous, but is how SonarQube works var fileComplexityDistribution = new Distribution(0, 5, 10, 20, 30, 60, 90); fileComplexityDistribution.Add(complexity); xmlOut.WriteElementString("FileComplexityDistribution", fileComplexityDistribution.ToString()); xmlOut.WriteElementString("FunctionComplexityDistribution", metrics.FunctionComplexityDistribution.ToString()); var comments = metrics.GetComments(configuration.IgnoreHeaderComments); xmlOut.WriteStartElement("Comments"); xmlOut.WriteStartElement("NoSonar"); foreach (var line in comments.NoSonar) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteStartElement("NonBlank"); foreach (var line in comments.NonBlank) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteStartElement("LinesOfCode"); foreach (var line in metrics.LinesOfCode) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteStartElement("Issues"); foreach (var diagnostic in diagnosticsRunner.GetDiagnostics(compilation)) { xmlOut.WriteStartElement("Issue"); xmlOut.WriteElementString("Id", diagnostic.Id); if (diagnostic.Location != Location.None) { xmlOut.WriteElementString("Line", diagnostic.GetLineNumberToReport().ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteElementString("Message", diagnostic.GetMessage()); xmlOut.WriteEndElement(); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); } catch (Exception e) { Console.Error.WriteLine("Failed to analyze the file: " + file); Console.Error.WriteLine(e); return 1; } } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteEndDocument(); xmlOut.Flush(); return 0; } }
public static int Main(string[] args) { Write(string.Format("SonarLint for Visual Studio version {0}", typeof (Program).Assembly.GetName().Version)); var configuration = new Configuration(XDocument.Load(args[0])); var diagnosticsRunner = new DiagnosticsRunner(configuration.Analyzers()); var xmlOutSettings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true, IndentChars = " " }; using (var xmlOut = XmlWriter.Create(args[1], xmlOutSettings)) { xmlOut.WriteComment("This XML format is not an API"); xmlOut.WriteStartElement("AnalysisOutput"); xmlOut.WriteStartElement("Files"); var n = 0; foreach (var file in configuration.Files) { xmlOut.Flush(); Write(n + "/" + configuration.Files.Count() + " files analyzed, starting to analyze: " + file); n++; try { var solution = CompilationHelper.GetSolutionFromFiles(file); var compilation = solution.Projects.First().GetCompilationAsync().Result; var syntaxTree = compilation.SyntaxTrees.First(); var metrics = new Metrics(syntaxTree); xmlOut.WriteStartElement("File"); xmlOut.WriteElementString("Path", file); xmlOut.WriteStartElement("Metrics"); xmlOut.WriteElementString("Lines", metrics.Lines().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Classes", metrics.Classes().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Accessors", metrics.Accessors().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Statements", metrics.Statements().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("Functions", metrics.Functions().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("PublicApi", metrics.PublicApi().ToString(CultureInfo.InvariantCulture)); xmlOut.WriteElementString("PublicUndocumentedApi", metrics.PublicUndocumentedApi().ToString(CultureInfo.InvariantCulture)); var complexity = metrics.Complexity(); xmlOut.WriteElementString("Complexity", complexity.ToString(CultureInfo.InvariantCulture)); // TODO This is a bit ridiculous, but is how SonarQube works var fileComplexityDistribution = new Distribution(0, 5, 10, 20, 30, 60, 90); fileComplexityDistribution.Add(complexity); xmlOut.WriteElementString("FileComplexityDistribution", fileComplexityDistribution.ToString()); xmlOut.WriteElementString("FunctionComplexityDistribution", metrics.FunctionComplexityDistribution().ToString()); var comments = metrics.Comments(configuration.IgnoreHeaderComments); xmlOut.WriteStartElement("Comments"); xmlOut.WriteStartElement("NoSonar"); foreach (var line in comments.NoSonar) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteStartElement("NonBlank"); foreach (var line in comments.NonBlank) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteStartElement("LinesOfCode"); foreach (var line in metrics.LinesOfCode()) { xmlOut.WriteElementString("Line", line.ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteStartElement("Issues"); foreach (var diagnostic in diagnosticsRunner.GetDiagnostics(compilation)) { xmlOut.WriteStartElement("Issue"); xmlOut.WriteElementString("Id", diagnostic.Id); if (diagnostic.Location != Location.None) { xmlOut.WriteElementString("Line", (diagnostic.GetLineNumberToReport()).ToString(CultureInfo.InvariantCulture)); } xmlOut.WriteElementString("Message", diagnostic.GetMessage()); xmlOut.WriteEndElement(); } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); } catch (Exception e) { Console.Error.WriteLine("Failed to analyze the file: " + file); Console.Error.WriteLine(e); return 1; } } xmlOut.WriteEndElement(); xmlOut.WriteEndElement(); xmlOut.WriteEndDocument(); xmlOut.Flush(); return 0; } }