mirror of
https://github.com/github/codeql.git
synced 2026-05-01 11:45:14 +02:00
Java: Add MemberType
This commit is contained in:
@@ -100,8 +100,7 @@ predicate potentiallyStatic(InnerClass c) {
|
||||
m = a.getEnclosingCallable() and
|
||||
m.getDeclaringType() = c
|
||||
) and
|
||||
not c instanceof AnonymousClass and
|
||||
not c instanceof LocalClass and
|
||||
c instanceof MemberType and
|
||||
forall(
|
||||
InnerClass other // If nested and non-static, ...
|
||||
|
|
||||
|
||||
@@ -433,9 +433,7 @@ final class ClassInterfaceNode extends ElementNode {
|
||||
or
|
||||
result.(FieldDeclaration).getAField().getDeclaringType() = ty
|
||||
or
|
||||
result.(NestedType).getEnclosingType().getSourceDeclaration() = ty and
|
||||
not result instanceof AnonymousClass and
|
||||
not result instanceof LocalClass
|
||||
result.(MemberType).getEnclosingType().getSourceDeclaration() = ty
|
||||
or
|
||||
isInitBlock(ty, result)
|
||||
}
|
||||
|
||||
@@ -517,7 +517,12 @@ class RefType extends Type, Annotatable, Modifiable, @reftype {
|
||||
/** Holds if this is a top-level type, which is not nested inside any other types. */
|
||||
predicate isTopLevel() { this instanceof TopLevelType }
|
||||
|
||||
/** Holds if this type is declared in a specified package with the specified name. */
|
||||
/**
|
||||
* Holds if this type is declared in a specified package with the specified name.
|
||||
*
|
||||
* For nested types the name of the nested type is prefixed with a `$` and appended
|
||||
* to the name of the enclosing type, which might be a nested type as well.
|
||||
*/
|
||||
predicate hasQualifiedName(string package, string type) {
|
||||
this.getPackage().hasName(package) and type = this.nestedName()
|
||||
}
|
||||
@@ -532,7 +537,12 @@ class RefType extends Type, Annotatable, Modifiable, @reftype {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the qualified name of this type.
|
||||
* Gets the qualified name of this type, consisting of the package name followed by
|
||||
* a `.` and the name of this type.
|
||||
*
|
||||
* For nested types the name of the nested type is prefixed with a `$` and appended
|
||||
* to the name of the enclosing type, which might be a nested type as well. For example:
|
||||
* `java.util.Map$Entry`.
|
||||
*/
|
||||
string getQualifiedName() {
|
||||
exists(string pkgName | pkgName = getPackage().getName() |
|
||||
@@ -540,7 +550,13 @@ class RefType extends Type, Annotatable, Modifiable, @reftype {
|
||||
)
|
||||
}
|
||||
|
||||
/** Gets the nested name of this type. */
|
||||
/**
|
||||
* Gets the nested name of this type.
|
||||
*
|
||||
* If this type is not a nested type, the result is the same as `getName()`.
|
||||
* Otherwise the name of the nested type is prefixed with a `$` and appended to
|
||||
* the name of the enclosing type, which might be a nested type as well.
|
||||
*/
|
||||
string nestedName() {
|
||||
not this instanceof NestedType and result = this.getName()
|
||||
or
|
||||
@@ -788,6 +804,21 @@ class NestedType extends RefType {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A nested type which is a direct member of the enclosing type,
|
||||
* that is, neither an anonymous nor local class.
|
||||
*/
|
||||
class MemberType extends NestedType, Member {
|
||||
/**
|
||||
* Gets the qualified name of this member type.
|
||||
*
|
||||
* The qualified name consists of the package name, a `.`, the name of the declaring
|
||||
* type (which might be a nested or member type as well), followed by a `$` and the
|
||||
* name of this member type. For example: `java.util.Map$Entry`.
|
||||
*/
|
||||
override string getQualifiedName() { result = NestedType.super.getQualifiedName() }
|
||||
}
|
||||
|
||||
/**
|
||||
* A class declared within another type.
|
||||
*
|
||||
@@ -797,8 +828,9 @@ class NestedType extends RefType {
|
||||
class NestedClass extends NestedType, Class { }
|
||||
|
||||
/**
|
||||
* An inner class is a nested class that is neither
|
||||
* explicitly nor implicitly declared static.
|
||||
* An inner class is a nested class that is neither explicitly nor
|
||||
* implicitly declared static. This includes anonymous and local
|
||||
* classes.
|
||||
*/
|
||||
class InnerClass extends NestedClass {
|
||||
InnerClass() { not this.isStatic() }
|
||||
|
||||
@@ -44,14 +44,8 @@ class PlayAddCsrfTokenAnnotation extends Annotation {
|
||||
/**
|
||||
* The type `play.libs.F.Promise<Result>`.
|
||||
*/
|
||||
class PlayAsyncResultPromise extends Member {
|
||||
PlayAsyncResultPromise() {
|
||||
exists(Class c |
|
||||
c.hasQualifiedName("play.libs", "F") and
|
||||
this = c.getAMember() and
|
||||
this.getQualifiedName() = "F.Promise<Result>"
|
||||
)
|
||||
}
|
||||
class PlayAsyncResultPromise extends MemberType {
|
||||
PlayAsyncResultPromise() { hasQualifiedName("play.libs", "F$Promise<Result>") }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user