mirror of
https://github.com/github/codeql.git
synced 2026-03-01 13:23:49 +01:00
Merge pull request #20088 from aschackmull/java/joinorders1
Java: Improve several join-orders
This commit is contained in:
@@ -521,7 +521,13 @@ private predicate unificationTargets(RefType t1, Type t2) {
|
||||
t2 = a2.getComponentType()
|
||||
)
|
||||
or
|
||||
exists(ParameterizedType pt1, ParameterizedType pt2, int pos |
|
||||
unificationTargetsParameterized(_, _, t1, t2)
|
||||
}
|
||||
|
||||
private predicate unificationTargetsParameterized(
|
||||
ParameterizedType pt1, ParameterizedType pt2, RefType t1, RefType t2
|
||||
) {
|
||||
exists(int pos |
|
||||
unificationTargets(pt1, pt2) and
|
||||
t1 = pt1.getTypeArgument(pos) and
|
||||
t2 = pt2.getTypeArgument(pos)
|
||||
@@ -565,10 +571,12 @@ private predicate hasParameterSubstitution(
|
||||
GenericType g1, ParameterizedType pt1, GenericType g2, ParameterizedType pt2, TypeVariable v,
|
||||
RefType subst
|
||||
) {
|
||||
unificationTargets(pt1, pt2) and
|
||||
exists(int pos | hasSubstitution(pt1.getTypeArgument(pos), pt2.getTypeArgument(pos), v, subst)) and
|
||||
g1 = pt1.getGenericType() and
|
||||
g2 = pt2.getGenericType()
|
||||
exists(RefType t1, RefType t2 |
|
||||
unificationTargetsParameterized(pt1, pt2, t1, t2) and
|
||||
hasSubstitution(t1, t2, v, subst) and
|
||||
g1 = pt1.getGenericType() and
|
||||
g2 = pt2.getGenericType()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1261,14 +1261,21 @@ private Type erase(Type t) {
|
||||
*
|
||||
* For the definition of the notion of *erasure* see JLS v8, section 4.6 (Type Erasure).
|
||||
*/
|
||||
bindingset[t1, t2]
|
||||
overlay[caller?]
|
||||
pragma[inline]
|
||||
pragma[inline_late]
|
||||
predicate haveIntersection(RefType t1, RefType t2) {
|
||||
exists(RefType e1, RefType e2 | e1 = erase(t1) and e2 = erase(t2) |
|
||||
erasedHaveIntersection(e1, e2)
|
||||
erasedHaveIntersectionFilter(e1, e2)
|
||||
)
|
||||
}
|
||||
|
||||
bindingset[t1, t2]
|
||||
pragma[inline_late]
|
||||
private predicate erasedHaveIntersectionFilter(RefType t1, RefType t2) {
|
||||
erasedHaveIntersection(t1, t2)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if there is no common (reflexive, transitive) subtype of the erasures
|
||||
* of types `t1` and `t2`.
|
||||
|
||||
Reference in New Issue
Block a user