Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions java/ql/src/Diagnostics/DiagnosticsReporting.qll
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/**
* Provides classes and predicates for reporting extractor diagnostics to end users.
*/

import java

/** Gets the SARIF severity level that indicates an error. */
private int getErrorSeverity() { result = 2 }

/** Gets the SARIF severity level that indicates a warning. */
private int getWarnSeverity() { result = 1 }

private predicate knownWarnings(@diagnostic d, string msg, int sev) {
exists(string filename |
diagnostics(d, 2, _, "Skipping Lombok-ed source file: " + filename, _, _) and
msg = "Use of Lombok detected. Skipping file: " + filename and
sev = getWarnSeverity()
)
}

private predicate knownErrors(@diagnostic d, string msg, int sev) {
exists(string numErr, Location l |
diagnostics(d, 6, _, numErr, _, l) and
msg = "Frontend errors in file: " + l.getFile().getAbsolutePath() + " (" + numErr + ")" and
sev = getErrorSeverity()
)
or
exists(string filename, Location l |
diagnostics(d, 7, _, "Exception compiling file " + filename, _, l) and
msg = "Extraction incomplete in file: " + filename and
sev = getErrorSeverity()
)
or
exists(string errMsg, Location l |
diagnostics(d, 8, _, errMsg, _, l) and
msg = "Severe error: " + errMsg and
sev = getErrorSeverity()
)
}

private predicate unknownErrors(@diagnostic d, string msg, int sev) {
not knownErrors(d, _, _) and
exists(Location l, File f, int diagSev |
diagnostics(d, diagSev, _, _, _, l) and l.getFile() = f and diagSev > 3
|
exists(f.getRelativePath()) and
msg = "Unknown errors in file: " + f.getAbsolutePath() + " (" + diagSev + ")" and
sev = getErrorSeverity()
)
}

/**
* Holds if an extraction error or warning occurred that should be reported to end users,
* with the error message `msg` and SARIF severity `sev`.
*/
predicate reportableDiagnostics(@diagnostic d, string msg, int sev) {
knownWarnings(d, msg, sev) or knownErrors(d, msg, sev) or unknownErrors(d, msg, sev)
}

/**
* Holds if compilation unit `f` is a source file that has
* no relevant extraction diagnostics associated with it.
*/
predicate successfullyExtracted(CompilationUnit f) {
not exists(@diagnostic d, Location l |
reportableDiagnostics(d, _, _) and diagnostics(d, _, _, _, _, l) and l.getFile() = f
) and
exists(f.getRelativePath()) and
f.fromSource()
}
13 changes: 13 additions & 0 deletions java/ql/src/Diagnostics/ExtractionErrors.ql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* @name Extraction errors
* @description A list of extraction errors for files in the source code directory.
* @kind diagnostic
* @id java/diagnostics/extraction-errors
*/

import java
import DiagnosticsReporting

from string msg, int sev
where reportableDiagnostics(_, msg, sev)
select msg, sev
14 changes: 14 additions & 0 deletions java/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/**
* @name Successfully extracted files
* @description A list of all files in the source code directory that
* were extracted without encountering an error in the file.
* @kind diagnostic
* @id java/diagnostics/successfully-extracted-files
*/

import java
import DiagnosticsReporting

from CompilationUnit f
where successfullyExtracted(f)
select f, ""