mirror of
https://github.com/github/codeql.git
synced 2026-04-25 00:35:20 +02:00
A few changes, all bundled together: - We were getting a lot of magic applied to the predicates in the `ImportStar` module, and this was causing needless re-evaluation. To address this, the easiest solution was to simply cache the entire module. - In order to separate this from the dataflow analysis and make it dependent only on control flow, `potentialImportStarBase` was changed to return a `ControlFlowNode`. - `isDefinedLocally` was defined on control flow nodes, which meant we were duplicating a lot of tuples due to control flow splitting, to no actual benefit. Finally, there was a really bad join in `isDefinedLocally` that was fixed by separating out a helper predicate. This is a case where we could use a three-way join, since the join between the `Scope`, the `name` string and the `Name` is big no matter what. If we join `scope_defines_name` with `n.getId()`, we'll get `Name`s belonging to irrelevant scopes. If we join `scope_defines_name` with the enclosing scope of the `Name` `n`, then we'll get this also for `Name`s that don't share their `getId` with the local variable defined in the scope. If we join `n.getId()` with `n.getScope()...` then we'll get all enclosing scopes for each `Name`. The last of these is what we currently have. It's not terrible, but not great either. (Though thankfully it's rare to have lots of enclosing scopes.)