[Dependency Scanner] Add API to query emitted diagnostics during a scan

This commit is contained in:
Artem Chikin
2022-09-06 17:19:23 -07:00
parent aec29cc9a7
commit 606151683c
6 changed files with 193 additions and 7 deletions

View File

@@ -534,6 +534,70 @@ swiftscan_compiler_supported_features_query() {
return swift::c_string_utils::create_set(allFeatures);
}
//=== Scanner Diagnostics -------------------------------------------------===//
swiftscan_diagnostic_set_t*
swiftscan_scanner_diagnostics_query(swiftscan_scanner_t scanner) {
DependencyScanningTool *ScanningTool = unwrap(scanner);
auto NumDiagnostics = ScanningTool->getDiagnostics().size();
swiftscan_diagnostic_set_t *Result = new swiftscan_diagnostic_set_t;
Result->count = NumDiagnostics;
Result->diagnostics = new swiftscan_diagnostic_info_t[NumDiagnostics];
for (size_t i = 0; i < NumDiagnostics; ++i) {
const auto &Diagnostic = ScanningTool->getDiagnostics()[i];
swiftscan_diagnostic_info_s *DiagnosticInfo = new swiftscan_diagnostic_info_s;
DiagnosticInfo->message = swift::c_string_utils::create_clone(Diagnostic.Message.c_str());
switch (Diagnostic.Severity) {
case llvm::SourceMgr::DK_Error:
DiagnosticInfo->severity = SWIFTSCAN_DIAGNOSTIC_SEVERITY_ERROR;
break;
case llvm::SourceMgr::DK_Warning:
DiagnosticInfo->severity = SWIFTSCAN_DIAGNOSTIC_SEVERITY_WARNING;
break;
case llvm::SourceMgr::DK_Note:
DiagnosticInfo->severity = SWIFTSCAN_DIAGNOSTIC_SEVERITY_NOTE;
break;
case llvm::SourceMgr::DK_Remark:
DiagnosticInfo->severity = SWIFTSCAN_DIAGNOSTIC_SEVERITY_REMARK;
break;
}
Result->diagnostics[i] = DiagnosticInfo;
}
return Result;
}
void
swiftscan_scanner_diagnostics_reset(swiftscan_scanner_t scanner) {
DependencyScanningTool *ScanningTool = unwrap(scanner);
ScanningTool->resetDiagnostics();
}
swiftscan_string_ref_t
swiftscan_diagnostic_get_message(swiftscan_diagnostic_info_t diagnostic) {
return diagnostic->message;
}
swiftscan_diagnostic_severity_t
swiftscan_diagnostic_get_severity(swiftscan_diagnostic_info_t diagnostic) {
return diagnostic->severity;
}
void swiftscan_diagnostic_dispose(swiftscan_diagnostic_info_t diagnostic) {
swiftscan_string_dispose(diagnostic->message);
delete diagnostic;
}
void
swiftscan_diagnostics_set_dispose(swiftscan_diagnostic_set_t* diagnostics){
for (size_t i = 0; i < diagnostics->count; ++i) {
swiftscan_diagnostic_dispose(diagnostics->diagnostics[i]);
}
delete[] diagnostics->diagnostics;
delete diagnostics;
}
//=== Experimental Compiler Invocation Functions ------------------------===//
int invoke_swift_compiler(int argc, const char **argv) {