Skip to content

Commit 078c3e9

Browse files
committed
Ruby: create top-level module for ActionMailer
1 parent e38cfd5 commit 078c3e9

File tree

1 file changed

+37
-32
lines changed

1 file changed

+37
-32
lines changed

ruby/ql/lib/codeql/ruby/frameworks/ActionMailer.qll

Lines changed: 37 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,42 +7,47 @@ private import codeql.ruby.ApiGraphs
77
private import codeql.ruby.frameworks.internal.Rails
88

99
/**
10-
* A `ClassDeclaration` for a class that extends `ActionMailer::Base`.
11-
* For example,
12-
*
13-
* ```rb
14-
* class FooMailer < ActionMailer::Base
15-
* ...
16-
* end
17-
* ```
10+
* Provides modeling for the `ActionMailer` library.
1811
*/
19-
class ActionMailerMailerClass extends ClassDeclaration {
20-
ActionMailerMailerClass() {
21-
this.getSuperclassExpr() =
22-
[
23-
API::getTopLevelMember("ActionMailer").getMember("Base"),
24-
// In Rails applications `ApplicationMailer` typically extends
25-
// `ActionMailer::Base`, but we treat it separately in case the
26-
// `ApplicationMailer` definition is not in the database.
27-
API::getTopLevelMember("ApplicationMailer")
28-
].getASubclass().getAValueReachableFromSource().asExpr().getExpr()
12+
module ActionMailer {
13+
/**
14+
* A `ClassDeclaration` for a class that extends `ActionMailer::Base`.
15+
* For example,
16+
*
17+
* ```rb
18+
* class FooMailer < ActionMailer::Base
19+
* ...
20+
* end
21+
* ```
22+
*/
23+
class MailerClass extends ClassDeclaration {
24+
MailerClass() {
25+
this.getSuperclassExpr() =
26+
[
27+
API::getTopLevelMember("ActionMailer").getMember("Base"),
28+
// In Rails applications `ApplicationMailer` typically extends
29+
// `ActionMailer::Base`, but we treat it separately in case the
30+
// `ApplicationMailer` definition is not in the database.
31+
API::getTopLevelMember("ApplicationMailer")
32+
].getASubclass().getAValueReachableFromSource().asExpr().getExpr()
33+
}
2934
}
30-
}
3135

32-
/** A method call with a `self` receiver from within a mailer class */
33-
private class ActionMailerContextCall extends MethodCall {
34-
private ActionMailerMailerClass mailerClass;
36+
/** A method call with a `self` receiver from within a mailer class */
37+
private class ContextCall extends MethodCall {
38+
private MailerClass mailerClass;
3539

36-
ActionMailerContextCall() {
37-
this.getReceiver() instanceof SelfVariableAccess and
38-
this.getEnclosingModule() = mailerClass
39-
}
40+
ContextCall() {
41+
this.getReceiver() instanceof SelfVariableAccess and
42+
this.getEnclosingModule() = mailerClass
43+
}
4044

41-
/** Gets the mailer class containing this method. */
42-
ActionMailerMailerClass getMailerClass() { result = mailerClass }
43-
}
45+
/** Gets the mailer class containing this method. */
46+
MailerClass getMailerClass() { result = mailerClass }
47+
}
4448

45-
/** A call to `params` from within a mailer. */
46-
class ActionMailerParamsCall extends ActionMailerContextCall, ParamsCallImpl {
47-
ActionMailerParamsCall() { this.getMethodName() = "params" }
49+
/** A call to `params` from within a mailer. */
50+
class ParamsCall extends ContextCall, ParamsCallImpl {
51+
ParamsCall() { this.getMethodName() = "params" }
52+
}
4853
}

0 commit comments

Comments
 (0)