diff --git a/ql/src/codeql_ruby/ast/Parameter.qll b/ql/src/codeql_ruby/ast/Parameter.qll index f870a62d7f3..af7748d504a 100644 --- a/ql/src/codeql_ruby/ast/Parameter.qll +++ b/ql/src/codeql_ruby/ast/Parameter.qll @@ -108,7 +108,15 @@ class HashSplatParameter extends @hash_splat_parameter, NamedParameter { } /** - * TODO + * A keyword parameter, including a default value if the parameter is optional. + * For example, in the following example, `foo` is a keyword parameter with a + * default value of `0`, and `bar` is a mandatory keyword parameter with no + * default value mandatory parameter). + * ```rb + * def f(foo: 0, bar:) + * foo * 10 + bar + * end + * ``` */ class KeywordParameter extends @keyword_parameter, NamedParameter { override Generated::KeywordParameter generated; @@ -127,6 +135,12 @@ class KeywordParameter extends @keyword_parameter, NamedParameter { */ AstNode getDefaultValue() { result = generated.getValue() } + /** + * Holds if the parameter is optional. That is, there is a default value that + * is used when the caller omits this parameter. + */ + predicate isOptional() { exists(this.getDefaultValue()) } + override string toString() { result = this.getName() } } diff --git a/ql/test/library-tests/ast/params/params.ql b/ql/test/library-tests/ast/params/params.ql index 0ae480f0100..77394ff3a4c 100644 --- a/ql/test/library-tests/ast/params/params.ql +++ b/ql/test/library-tests/ast/params/params.ql @@ -16,7 +16,7 @@ query predicate hashSplatParams(HashSplatParameter hsp, string name) { name = hs query predicate keywordParams(KeywordParameter kp, string name, string defaultValueStr) { name = kp.getName() and - if exists(kp.getDefaultValue()) + if kp.isOptional() then defaultValueStr = kp.getDefaultValue().toString() else defaultValueStr = "(none)" }