Skip to content

Commit 04df56d

Browse files
alexrfordhvitved
authored andcommitted
Support synthesis of SimpleParameters
1 parent 7cfc696 commit 04df56d

File tree

5 files changed

+43
-9
lines changed

5 files changed

+43
-9
lines changed

ruby/ql/lib/codeql/ruby/ast/Parameter.qll

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,12 @@ class NamedParameter extends Parameter, TNamedParameter {
6868
}
6969

7070
/** A simple (normal) parameter. */
71-
class SimpleParameter extends NamedParameter, PatternParameter, VariablePattern, TSimpleParameter {
72-
private Ruby::Identifier g;
71+
class SimpleParameter extends NamedParameter, PatternParameter, VariablePattern, TSimpleParameter instanceof SimpleParameterImpl {
72+
final override string getName() { result = SimpleParameterImpl.super.getNameImpl() }
7373

74-
SimpleParameter() { this = TSimpleParameter(g) }
75-
76-
final override string getName() { result = g.getValue() }
77-
78-
final override LocalVariable getVariable() { result = TLocalVariableReal(_, _, g) }
74+
final override LocalVariable getVariable() {
75+
result = SimpleParameterImpl.super.getVariableImpl()
76+
}
7977

8078
final override LocalVariable getAVariable() { result = this.getVariable() }
8179

ruby/ql/lib/codeql/ruby/ast/Pattern.qll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ private import internal.AST
44
private import internal.Pattern
55
private import internal.TreeSitter
66
private import internal.Variable
7+
private import internal.Parameter
78

89
/** A pattern. */
910
class Pattern extends AstNode {
@@ -15,6 +16,8 @@ class Pattern extends AstNode {
1516
implicitParameterAssignmentNode(toGenerated(this), _)
1617
or
1718
this = getSynthChild(any(AssignExpr ae), 0)
19+
or
20+
this instanceof SimpleParameterImpl
1821
}
1922

2023
/** Gets a variable used in (or introduced by) this pattern. */

ruby/ql/lib/codeql/ruby/ast/internal/AST.qll

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,10 @@ private module Cached {
238238
TSelfSynth(AST::AstNode parent, int i, AST::SelfVariable v) {
239239
mkSynthChild(SelfKind(v), parent, i)
240240
} or
241-
TSimpleParameter(Ruby::Identifier g) { g instanceof Parameter::Range } or
241+
TSimpleParameterReal(Ruby::Identifier g) { g instanceof Parameter::Range } or
242+
TSimpleParameterSynth(AST::AstNode parent, int i) {
243+
mkSynthChild(SimpleParameterKind(), parent, i)
244+
} or
242245
TSimpleSymbolLiteral(Ruby::SimpleSymbol g) or
243246
TSingletonClass(Ruby::SingletonClass g) or
244247
TSingletonMethod(Ruby::SingletonMethod g) or
@@ -439,7 +442,7 @@ private module Cached {
439442
n = TScopeResolutionConstantAccess(result, _) or
440443
n = TScopeResolutionMethodCall(result, _) or
441444
n = TSelfReal(result) or
442-
n = TSimpleParameter(result) or
445+
n = TSimpleParameterReal(result) or
443446
n = TSimpleSymbolLiteral(result) or
444447
n = TSingletonClass(result) or
445448
n = TSingletonMethod(result) or
@@ -522,6 +525,8 @@ private module Cached {
522525
or
523526
result = TSelfSynth(parent, i, _)
524527
or
528+
result = TSimpleParameterSynth(parent, i)
529+
or
525530
result = TSplatExprSynth(parent, i)
526531
or
527532
result = TStmtSequenceSynth(parent, i)
@@ -730,6 +735,8 @@ class TParameter =
730735
TPatternParameter or TBlockParameter or THashSplatParameter or TKeywordParameter or
731736
TOptionalParameter or TSplatParameter or TForwardParameter;
732737

738+
class TSimpleParameter = TSimpleParameterReal or TSimpleParameterSynth;
739+
733740
class TPatternParameter = TSimpleParameter or TTuplePatternParameter;
734741

735742
class TNamedParameter =

ruby/ql/lib/codeql/ruby/ast/internal/Parameter.qll

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
private import codeql.ruby.AST
22
private import AST
33
private import TreeSitter
4+
private import Variable
45

56
module Parameter {
67
class Range extends Ruby::AstNode {
@@ -17,3 +18,27 @@ module Parameter {
1718
int getPosition() { result = pos }
1819
}
1920
}
21+
22+
abstract class SimpleParameterImpl extends AstNode, TSimpleParameter {
23+
abstract LocalVariable getVariableImpl();
24+
25+
abstract string getNameImpl();
26+
}
27+
28+
private class SimpleParameterRealImpl extends SimpleParameterImpl, TSimpleParameterReal {
29+
private Ruby::Identifier g;
30+
31+
SimpleParameterRealImpl() { this = TSimpleParameterReal(g) }
32+
33+
override LocalVariable getVariableImpl() { result = TLocalVariableReal(_, _, g) }
34+
35+
override string getNameImpl() { result = g.getValue() }
36+
}
37+
38+
private class SimpleParameterSynthImpl extends SimpleParameterImpl, TSimpleParameterSynth {
39+
SimpleParameterSynthImpl() { this = TSimpleParameterSynth(_, _) }
40+
41+
override LocalVariable getVariableImpl() { result = TLocalVariableSynth(this, _) }
42+
43+
override string getNameImpl() { result = this.getVariableImpl().getName() }
44+
}

ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ newtype SynthKind =
3333
MulExprKind() or
3434
RangeLiteralKind(boolean inclusive) { inclusive in [false, true] } or
3535
RShiftExprKind() or
36+
SimpleParameterKind() or
3637
SplatExprKind() or
3738
StmtSequenceKind() or
3839
SelfKind(SelfVariable v) or

0 commit comments

Comments
 (0)