mirror of
https://github.com/github/codeql.git
synced 2026-04-25 16:55:19 +02: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`.
|
||||
|
||||
@@ -103,8 +103,8 @@ class MismatchedContainerAccess extends MethodCall {
|
||||
|
|
||||
this.getCallee()
|
||||
.getDeclaringType()
|
||||
.getASourceSupertype*()
|
||||
.getSourceDeclaration()
|
||||
.getASourceSupertype*()
|
||||
.hasQualifiedName(package, type) and
|
||||
this.getCallee().getParameter(i).getType() instanceof TypeObject
|
||||
)
|
||||
@@ -119,7 +119,7 @@ class MismatchedContainerAccess extends MethodCall {
|
||||
containerAccess(package, type, p, this.getCallee().getSignature(), i)
|
||||
|
|
||||
t = this.getCallee().getDeclaringType() and
|
||||
t.getASourceSupertype*().getSourceDeclaration() = g and
|
||||
t.getSourceDeclaration().getASourceSupertype*() = g and
|
||||
g.hasQualifiedName(package, type) and
|
||||
indirectlyInstantiates(t, g, p, result)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user