Python: Refactor how we find a Class from API::Node

Using `getAnImmediateUse` might give better performance than `getAUse`.

Since all the changed code is about `API::Node`s that are found after
doing `.getASubclass*()`, this change is OK.

It's also nice to align how we actually do this.
This commit is contained in:
Rasmus Wriedt Larsen
2022-04-06 15:12:24 +02:00
parent b99767ef52
commit 1c2323eb85
7 changed files with 18 additions and 14 deletions

View File

@@ -243,7 +243,9 @@ module AiohttpWebModel {
/** A class that has a super-type which is an aiohttp.web View class. */
class AiohttpViewClassFromSuperClass extends AiohttpViewClass {
AiohttpViewClassFromSuperClass() { this.getABase() = View::subclassRef().getAUse().asExpr() }
AiohttpViewClassFromSuperClass() {
this.getParent() = View::subclassRef().getAnImmediateUse().asExpr()
}
}
/** A class that is used in a route-setup, therefore being considered an aiohttp.web View class. */

View File

@@ -829,7 +829,7 @@ module PrivateDjango {
/** Gets the (AST) class of the Django model class `modelClass`. */
Class getModelClassClass(API::Node modelClass) {
result.getParent() = modelClass.getAUse().asExpr().(ClassExpr) and
result.getParent() = modelClass.getAnImmediateUse().asExpr() and
modelClass = Model::subclassRef()
}
@@ -2162,7 +2162,9 @@ module PrivateDjango {
* thereby handling user input.
*/
class DjangoFormClass extends Class, SelfRefMixin {
DjangoFormClass() { this.getABase() = Django::Forms::Form::subclassRef().getAUse().asExpr() }
DjangoFormClass() {
this.getParent() = Django::Forms::Form::subclassRef().getAnImmediateUse().asExpr()
}
}
/**
@@ -2195,7 +2197,7 @@ module PrivateDjango {
*/
class DjangoFormFieldClass extends Class {
DjangoFormFieldClass() {
this.getABase() = Django::Forms::Field::subclassRef().getAUse().asExpr()
this.getParent() = Django::Forms::Field::subclassRef().getAnImmediateUse().asExpr()
}
}
@@ -2298,7 +2300,7 @@ module PrivateDjango {
*/
class DjangoViewClassFromSuperClass extends DjangoViewClass {
DjangoViewClassFromSuperClass() {
this.getABase() = Django::Views::View::subclassRef().getAUse().asExpr()
this.getParent() = Django::Views::View::subclassRef().getAnImmediateUse().asExpr()
}
}

View File

@@ -194,7 +194,7 @@ module Flask {
API::Node api_node;
FlaskViewClass() {
this.getABase() = Views::View::subclassRef().getAUse().asExpr() and
this.getParent() = Views::View::subclassRef().getAnImmediateUse().asExpr() and
api_node.getAnImmediateUse().asExpr() = this.getParent()
}
@@ -219,7 +219,7 @@ module Flask {
*/
class FlaskMethodViewClass extends FlaskViewClass {
FlaskMethodViewClass() {
this.getABase() = Views::MethodView::subclassRef().getAUse().asExpr() and
this.getParent() = Views::MethodView::subclassRef().getAnImmediateUse().asExpr() and
api_node.getAnImmediateUse().asExpr() = this.getParent()
}

View File

@@ -115,7 +115,7 @@ private module RestFramework {
*/
class RestFrameworkApiViewClass extends PrivateDjango::DjangoViewClassFromSuperClass {
RestFrameworkApiViewClass() {
this.getABase() = any(ModeledApiViewClasses c).getASubclass*().getAUse().asExpr()
this.getParent() = any(ModeledApiViewClasses c).getASubclass*().getAnImmediateUse().asExpr()
}
override Function getARequestHandler() {

View File

@@ -1934,7 +1934,7 @@ private module StdlibPrivate {
/** A HttpRequestHandler class definition (most likely in project code). */
class HttpRequestHandlerClassDef extends Class {
HttpRequestHandlerClassDef() { this.getParent() = subclassRef().getAUse().asExpr() }
HttpRequestHandlerClassDef() { this.getParent() = subclassRef().getAnImmediateUse().asExpr() }
}
/** DEPRECATED: Alias for HttpRequestHandlerClassDef */
@@ -2027,12 +2027,12 @@ private module StdlibPrivate {
private module WsgirefSimpleServer {
class WsgiServerSubclass extends Class, SelfRefMixin {
WsgiServerSubclass() {
this.getABase() =
this.getParent() =
API::moduleImport("wsgiref")
.getMember("simple_server")
.getMember("WSGIServer")
.getASubclass*()
.getAUse()
.getAnImmediateUse()
.asExpr()
}
}

View File

@@ -92,7 +92,7 @@ private module Tornado {
/** A RequestHandler class (most likely in project code). */
class RequestHandlerClass extends Class {
RequestHandlerClass() { this.getParent() = subclassRef().getAUse().asExpr() }
RequestHandlerClass() { this.getParent() = subclassRef().getAnImmediateUse().asExpr() }
/** Gets a function that could handle incoming requests, if any. */
Function getARequestHandler() {

View File

@@ -27,13 +27,13 @@ private module Twisted {
*/
class TwistedResourceSubclass extends Class {
TwistedResourceSubclass() {
this.getABase() =
this.getParent() =
API::moduleImport("twisted")
.getMember("web")
.getMember("resource")
.getMember("Resource")
.getASubclass*()
.getAUse()
.getAnImmediateUse()
.asExpr()
}