diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs index 3e9a4952645..685f9752a2f 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/Autobuilder.cs @@ -322,16 +322,30 @@ namespace Semmle.Autobuild.Shared .Select(result => result.ToDiagnosticMessage(this, diagSeverity)) .ForEach(AddDiagnostic); - if (buildResult == 0 && IsBuildless) + if (IsBuildless) { - AddDiagnostic(new DiagnosticMessage( - Options.Language, - "buildless/complete", - "C# analysis with build-mode 'none' completed", - visibility: new DiagnosticMessage.TspVisibility(statusPage: false, cliSummaryTable: true, telemetry: true), - markdownMessage: "C# analysis with build-mode 'none' completed.", - severity: DiagnosticMessage.TspSeverity.Unknown - )); + if (buildResult == 0) + { + AddDiagnostic(new DiagnosticMessage( + Options.Language, + "buildless/complete", + "C# analysis with build-mode 'none' completed", + visibility: new DiagnosticMessage.TspVisibility(statusPage: false, cliSummaryTable: true, telemetry: true), + markdownMessage: "C# analysis with build-mode 'none' completed.", + severity: DiagnosticMessage.TspSeverity.Unknown + )); + } + else + { + AddDiagnostic(new DiagnosticMessage( + Options.Language, + "buildless/failed", + "C# analysis with build-mode 'none' failed", + visibility: new DiagnosticMessage.TspVisibility(statusPage: true, cliSummaryTable: true, telemetry: true), + markdownMessage: "C# analysis with build-mode 'none' failed.", + severity: DiagnosticMessage.TspSeverity.Error + )); + } } return buildResult; diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs index c4c901a3cc4..713d52d8e3f 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DependencyManager.cs @@ -728,6 +728,11 @@ namespace Semmle.Extraction.CSharp.DependencyFetching /// public IEnumerable GeneratedSourceFiles => generatedSources; + /// + /// All of the non-generated source files in the source directory. + /// + public IEnumerable NonGeneratedSourcesFiles => nonGeneratedSources; + /// /// All of the source files in the source directory. /// diff --git a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs index d868768e350..9a58011196c 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.Standalone/Extractor.cs @@ -146,7 +146,7 @@ namespace Semmle.Extraction.CSharp.Standalone logger.Log(Severity.Info, "Extracting C# in buildless mode"); using var dependencyManager = new DependencyManager(options.SrcDir, logger); - if (!dependencyManager.AllSourceFiles.Any()) + if (!dependencyManager.NonGeneratedSourcesFiles.Any()) { logger.Log(Severity.Error, "No source files found"); return ExitCode.Errors; diff --git a/csharp/ql/integration-tests/all-platforms/standalone_failed/diagnostics.expected b/csharp/ql/integration-tests/all-platforms/standalone_failed/diagnostics.expected new file mode 100644 index 00000000000..65b8c89ce70 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_failed/diagnostics.expected @@ -0,0 +1,28 @@ +{ + "markdownMessage": "C# analysis with build-mode 'none' failed.", + "severity": "error", + "source": { + "extractorName": "csharp", + "id": "csharp/autobuilder/buildless/failed", + "name": "C# analysis with build-mode 'none' failed" + }, + "visibility": { + "cliSummaryTable": true, + "statusPage": true, + "telemetry": true + } +} +{ + "markdownMessage": "C# with build-mode set to 'none'. This means that all C# source in the working directory will be scanned, with build tools, such as Nuget and Dotnet CLIs, only contributing information about external dependencies.", + "severity": "note", + "source": { + "extractorName": "csharp", + "id": "csharp/autobuilder/buildless/mode-active", + "name": "C# with build-mode set to 'none'" + }, + "visibility": { + "cliSummaryTable": true, + "statusPage": true, + "telemetry": true + } +} diff --git a/csharp/ql/integration-tests/all-platforms/standalone_failed/standalone.csproj b/csharp/ql/integration-tests/all-platforms/standalone_failed/standalone.csproj new file mode 100644 index 00000000000..324eba5d4ef --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_failed/standalone.csproj @@ -0,0 +1,14 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + diff --git a/csharp/ql/integration-tests/all-platforms/standalone_failed/test.py b/csharp/ql/integration-tests/all-platforms/standalone_failed/test.py new file mode 100644 index 00000000000..403e8efff23 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/standalone_failed/test.py @@ -0,0 +1,6 @@ +from create_database_utils import * +from diagnostics_test_utils import * + +run_codeql_database_create([], db=None, lang="csharp", extra_args=["--build-mode=none"], runFunction=runUnsuccessfully) + +check_diagnostics()