mirror of
https://github.com/github/codeql.git
synced 2026-01-08 20:20:34 +01:00
44 lines
1.4 KiB
Plaintext
44 lines
1.4 KiB
Plaintext
/**
|
|
* @name Semicolon insertion
|
|
* @description Code that uses automatic semicolon insertion inconsistently is hard to read and maintain.
|
|
* @kind problem
|
|
* @problem.severity recommendation
|
|
* @id js/automatic-semicolon-insertion
|
|
* @tags maintainability
|
|
* language-features
|
|
* statistical
|
|
* non-attributable
|
|
* @precision very-high
|
|
*/
|
|
|
|
import javascript
|
|
import semmle.javascript.RestrictedLocations
|
|
|
|
/**
|
|
* Holds if statement `s` in statement container `sc` either has a semicolon
|
|
* inserted and `asi` is true, or does not have a semicolon inserted and `asi`
|
|
* is `false`.
|
|
*/
|
|
predicate asi(StmtContainer sc, Stmt s, boolean asi) {
|
|
exists(TopLevel tl | tl = sc.getTopLevel() |
|
|
not tl instanceof EventHandlerCode and
|
|
not tl.isExterns()
|
|
) and
|
|
sc = s.getContainer() and
|
|
s.isSubjectToSemicolonInsertion() and
|
|
(if s.hasSemicolonInserted() then asi = true else asi = false)
|
|
}
|
|
|
|
from Stmt s, StmtContainer sc, string sctype, float asi, int nstmt, int perc
|
|
where
|
|
s.hasSemicolonInserted() and
|
|
sc = s.getContainer() and
|
|
(if sc instanceof Function then sctype = "function" else sctype = "script") and
|
|
asi = strictcount(Stmt ss | asi(sc, ss, true)) and
|
|
nstmt = strictcount(Stmt ss | asi(sc, ss, _)) and
|
|
perc = ((1 - asi / nstmt) * 100).floor() and
|
|
perc >= 90
|
|
select s.(LastLineOf),
|
|
"Avoid automated semicolon insertion " + "(" + perc +
|
|
"% of all statements in $@ have an explicit semicolon).", sc, "the enclosing " + sctype
|