diff --git a/swift/ql/lib/codeql/swift/elements/AstNodeImpl.qll b/swift/ql/lib/codeql/swift/elements/AstNodeImpl.qll index 24cb90b2a303a..018db3e94f38f 100644 --- a/swift/ql/lib/codeql/swift/elements/AstNodeImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/AstNodeImpl.qll @@ -5,80 +5,82 @@ private import codeql.swift.elements.expr.ClosureExpr private import codeql.swift.elements.Callable private import codeql.swift.generated.ParentChild -private module Cached { - private Element getEnclosingDeclStep(Element e) { - not e instanceof Decl and - result = getImmediateParent(e) - } +module Impl { + private module Cached { + private Element getEnclosingDeclStep(Element e) { + not e instanceof Decl and + result = getImmediateParent(e) + } - cached - Decl getEnclosingDecl(AstNode ast) { result = getEnclosingDeclStep*(getImmediateParent(ast)) } + cached + Decl getEnclosingDecl(AstNode ast) { result = getEnclosingDeclStep*(getImmediateParent(ast)) } - private Element getEnclosingFunctionStep(Element e) { - not e instanceof Function and - result = getEnclosingDecl(e) - } + private Element getEnclosingFunctionStep(Element e) { + not e instanceof Function and + result = getEnclosingDecl(e) + } - cached - Function getEnclosingFunction(AstNode ast) { - result = getEnclosingFunctionStep*(getEnclosingDecl(ast)) - } + cached + Function getEnclosingFunction(AstNode ast) { + result = getEnclosingFunctionStep*(getEnclosingDecl(ast)) + } - private Element getEnclosingClosureStep(Element e) { - not e instanceof Callable and - result = getImmediateParent(e) - } + private Element getEnclosingClosureStep(Element e) { + not e instanceof Callable and + result = getImmediateParent(e) + } - cached - ClosureExpr getEnclosingClosure(AstNode ast) { - result = getEnclosingClosureStep*(getImmediateParent(ast)) + cached + ClosureExpr getEnclosingClosure(AstNode ast) { + result = getEnclosingClosureStep*(getImmediateParent(ast)) + } } -} -/** - * A node in the abstract syntax tree. - */ -class AstNode extends Generated::AstNode { /** - * Gets the nearest function definition that contains this AST node, if any. - * This includes functions, methods, (de)initializers, and accessors, but not closures. - * - * For example, in the following code, the AST node for `n + 1` has `foo` as its - * enclosing function (via `getEnclosingFunction`), whereas its enclosing callable is - * the closure `{(n : Int) in n + 1 }` (via `getEnclosingCallable`): - * - * ```swift - * func foo() { - * var f = { (n : Int) in n + 1 } - * } - * ``` + * A node in the abstract syntax tree. */ - final Function getEnclosingFunction() { result = Cached::getEnclosingFunction(this) } + class AstNode extends Generated::AstNode { + /** + * Gets the nearest function definition that contains this AST node, if any. + * This includes functions, methods, (de)initializers, and accessors, but not closures. + * + * For example, in the following code, the AST node for `n + 1` has `foo` as its + * enclosing function (via `getEnclosingFunction`), whereas its enclosing callable is + * the closure `{(n : Int) in n + 1 }` (via `getEnclosingCallable`): + * + * ```swift + * func foo() { + * var f = { (n : Int) in n + 1 } + * } + * ``` + */ + final Function getEnclosingFunction() { result = Cached::getEnclosingFunction(this) } - /** - * Gets the nearest declaration that contains this AST node, if any. - * - * Note that the nearest declaration may be an extension of a type declaration. If you always - * want the type declaration and not the extension, use `getEnclosingDecl().asNominalTypeDecl()`. - */ - final Decl getEnclosingDecl() { result = Cached::getEnclosingDecl(this) } + /** + * Gets the nearest declaration that contains this AST node, if any. + * + * Note that the nearest declaration may be an extension of a type declaration. If you always + * want the type declaration and not the extension, use `getEnclosingDecl().asNominalTypeDecl()`. + */ + final Decl getEnclosingDecl() { result = Cached::getEnclosingDecl(this) } - /** - * Gets the nearest `Callable` that contains this AST node, if any. - * This includes (auto)closures, functions, methods, (de)initializers, and accessors. - * - * For example, in the following code, the AST node for `n + 1` has the closure - * `{(n : Int) in n + 1 }` as its enclosing callable. - * - * ```swift - * func foo() { - * var f = { (n : Int) in n + 1 } - * } - * ``` - */ - final Callable getEnclosingCallable() { - if exists(Cached::getEnclosingClosure(this)) - then result = Cached::getEnclosingClosure(this) - else result = Cached::getEnclosingFunction(this) + /** + * Gets the nearest `Callable` that contains this AST node, if any. + * This includes (auto)closures, functions, methods, (de)initializers, and accessors. + * + * For example, in the following code, the AST node for `n + 1` has the closure + * `{(n : Int) in n + 1 }` as its enclosing callable. + * + * ```swift + * func foo() { + * var f = { (n : Int) in n + 1 } + * } + * ``` + */ + final Callable getEnclosingCallable() { + if exists(Cached::getEnclosingClosure(this)) + then result = Cached::getEnclosingClosure(this) + else result = Cached::getEnclosingFunction(this) + } } } diff --git a/swift/ql/lib/codeql/swift/elements/AvailabilityInfoImpl.qll b/swift/ql/lib/codeql/swift/elements/AvailabilityInfoImpl.qll index 6e04261dc4f95..caa478fbc2de3 100644 --- a/swift/ql/lib/codeql/swift/elements/AvailabilityInfoImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/AvailabilityInfoImpl.qll @@ -1,25 +1,27 @@ private import codeql.swift.generated.AvailabilityInfo -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * An availability condition of an `if`, `while`, or `guard` statements. - * - * Examples: - * ``` - * if #available(iOS 12, *) { - * // Runs on iOS 12 and above - * } else { - * // Runs only anything below iOS 12 - * } - * if #unavailable(macOS 10.14, *) { - * // Runs only on macOS 10 and below - * } - * ``` - */ -class AvailabilityInfo extends Generated::AvailabilityInfo { - override string toString() { - result = "#available" and not this.isUnavailable() - or - result = "#unavailable" and this.isUnavailable() +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * An availability condition of an `if`, `while`, or `guard` statements. + * + * Examples: + * ``` + * if #available(iOS 12, *) { + * // Runs on iOS 12 and above + * } else { + * // Runs only anything below iOS 12 + * } + * if #unavailable(macOS 10.14, *) { + * // Runs only on macOS 10 and below + * } + * ``` + */ + class AvailabilityInfo extends Generated::AvailabilityInfo { + override string toString() { + result = "#available" and not this.isUnavailable() + or + result = "#unavailable" and this.isUnavailable() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/CallableImpl.qll b/swift/ql/lib/codeql/swift/elements/CallableImpl.qll index b74b530683d70..7b03eaa5f6ecf 100644 --- a/swift/ql/lib/codeql/swift/elements/CallableImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/CallableImpl.qll @@ -2,18 +2,20 @@ private import codeql.swift.generated.Callable private import codeql.swift.elements.AstNode private import codeql.swift.elements.decl.Decl -class Callable extends Generated::Callable { - /** - * Holds if this Callable is a function named `funcName`. - */ - predicate hasName(string funcName) { this.getName() = funcName } +module Impl { + class Callable extends Generated::Callable { + /** + * Holds if this Callable is a function named `funcName`. + */ + predicate hasName(string funcName) { this.getName() = funcName } - /** - * Holds if this Callable is a function named `funcName` defined in a module - * called `moduleName`. - */ - predicate hasName(string moduleName, string funcName) { - this.hasName(funcName) and - this.(Decl).getModule().getFullName() = moduleName + /** + * Holds if this Callable is a function named `funcName` defined in a module + * called `moduleName`. + */ + predicate hasName(string moduleName, string funcName) { + this.hasName(funcName) and + this.(Decl).getModule().getFullName() = moduleName + } } } diff --git a/swift/ql/lib/codeql/swift/elements/CommentImpl.qll b/swift/ql/lib/codeql/swift/elements/CommentImpl.qll index b6dd7cd45458d..142cb03689a88 100644 --- a/swift/ql/lib/codeql/swift/elements/CommentImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/CommentImpl.qll @@ -1,35 +1,37 @@ private import codeql.swift.generated.Comment -class Comment extends Generated::Comment { - /** toString */ - override string toString() { result = this.getText() } -} +module Impl { + class Comment extends Generated::Comment { + /** toString */ + override string toString() { result = this.getText() } + } -class SingleLineComment extends Comment { - SingleLineComment() { - this.getText().matches("//%") and - not this instanceof SingleLineDocComment + class SingleLineComment extends Comment { + SingleLineComment() { + this.getText().matches("//%") and + not this instanceof SingleLineDocComment + } } -} -class MultiLineComment extends Comment { - MultiLineComment() { - this.getText().matches("/*%") and - not this instanceof MultiLineDocComment + class MultiLineComment extends Comment { + MultiLineComment() { + this.getText().matches("/*%") and + not this instanceof MultiLineDocComment + } } -} -class DocComment extends Comment { - DocComment() { - this instanceof SingleLineDocComment or - this instanceof MultiLineDocComment + class DocComment extends Comment { + DocComment() { + this instanceof SingleLineDocComment or + this instanceof MultiLineDocComment + } } -} -class SingleLineDocComment extends Comment { - SingleLineDocComment() { this.getText().matches("///%") } -} + class SingleLineDocComment extends Comment { + SingleLineDocComment() { this.getText().matches("///%") } + } -class MultiLineDocComment extends Comment { - MultiLineDocComment() { this.getText().matches("/**%") } + class MultiLineDocComment extends Comment { + MultiLineDocComment() { this.getText().matches("/**%") } + } } diff --git a/swift/ql/lib/codeql/swift/elements/DiagnosticsImpl.qll b/swift/ql/lib/codeql/swift/elements/DiagnosticsImpl.qll index a0ec9995355b6..3e5b3a77ca52d 100644 --- a/swift/ql/lib/codeql/swift/elements/DiagnosticsImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/DiagnosticsImpl.qll @@ -1,49 +1,51 @@ private import codeql.swift.generated.Diagnostics -/** - * A compiler-generated error, warning, note or remark. - */ -class Diagnostics extends Generated::Diagnostics { - override string toString() { result = this.getSeverity() + ": " + this.getText() } - +module Impl { /** - * Gets a string representing the severity of this compiler diagnostic. + * A compiler-generated error, warning, note or remark. */ - string getSeverity() { - this.getKind() = 1 and result = "error" - or - this.getKind() = 2 and result = "warning" - or - this.getKind() = 3 and result = "note" - or - this.getKind() = 4 and result = "remark" + class Diagnostics extends Generated::Diagnostics { + override string toString() { result = this.getSeverity() + ": " + this.getText() } + + /** + * Gets a string representing the severity of this compiler diagnostic. + */ + string getSeverity() { + this.getKind() = 1 and result = "error" + or + this.getKind() = 2 and result = "warning" + or + this.getKind() = 3 and result = "note" + or + this.getKind() = 4 and result = "remark" + } } -} -/** - * A compiler error message. - */ -class CompilerError extends Diagnostics { - CompilerError() { this.getSeverity() = "error" } -} + /** + * A compiler error message. + */ + class CompilerError extends Diagnostics { + CompilerError() { this.getSeverity() = "error" } + } -/** - * A compiler-generated warning. - */ -class CompilerWarning extends Diagnostics { - CompilerWarning() { this.getSeverity() = "warning" } -} + /** + * A compiler-generated warning. + */ + class CompilerWarning extends Diagnostics { + CompilerWarning() { this.getSeverity() = "warning" } + } -/** - * A compiler-generated note (typically attached to an error or warning). - */ -class CompilerNote extends Diagnostics { - CompilerNote() { this.getSeverity() = "note" } -} + /** + * A compiler-generated note (typically attached to an error or warning). + */ + class CompilerNote extends Diagnostics { + CompilerNote() { this.getSeverity() = "note" } + } -/** - * A compiler-generated remark (milder than a warning, this does not indicate an issue). - */ -class CompilerRemark extends Diagnostics { - CompilerRemark() { this.getSeverity() = "remark" } + /** + * A compiler-generated remark (milder than a warning, this does not indicate an issue). + */ + class CompilerRemark extends Diagnostics { + CompilerRemark() { this.getSeverity() = "remark" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/ElementImpl.qll b/swift/ql/lib/codeql/swift/elements/ElementImpl.qll index 394d1caab3b22..882e7eda383c0 100644 --- a/swift/ql/lib/codeql/swift/elements/ElementImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/ElementImpl.qll @@ -1,20 +1,22 @@ private import codeql.swift.generated.Element -class Element extends Generated::Element { - private predicate resolvesFrom(Element e) { e.getResolveStep() = this } +module Impl { + class Element extends Generated::Element { + private predicate resolvesFrom(Element e) { e.getResolveStep() = this } - override string toString() { result = this.getPrimaryQlClasses() } + override string toString() { result = this.getPrimaryQlClasses() } - Element getFullyUnresolved() { - not this.resolvesFrom(_) and result = this - or - exists(Element e | - this.resolvesFrom(e) and - result = e.getFullyUnresolved() - ) + Element getFullyUnresolved() { + not this.resolvesFrom(_) and result = this + or + exists(Element e | + this.resolvesFrom(e) and + result = e.getFullyUnresolved() + ) + } } -} -class UnknownElement extends Element { - UnknownElement() { this.isUnknown() } + class UnknownElement extends Element { + UnknownElement() { this.isUnknown() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/FileImpl.qll b/swift/ql/lib/codeql/swift/elements/FileImpl.qll index 823430ee7ee90..2aac757e248ef 100644 --- a/swift/ql/lib/codeql/swift/elements/FileImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/FileImpl.qll @@ -2,106 +2,110 @@ private import codeql.swift.generated.File private import codeql.swift.elements.Location private import codeql.swift.elements.UnknownLocation -class File extends Generated::File { - /** toString */ - override string toString() { result = this.getAbsolutePath() } +module Impl { + class File extends Generated::File { + /** toString */ + override string toString() { result = this.getAbsolutePath() } - /** Gets the absolute path of this file. */ - string getAbsolutePath() { result = this.getName() } + /** Gets the absolute path of this file. */ + string getAbsolutePath() { result = this.getName() } - /** Gets the full name of this file. */ - string getFullName() { result = this.getAbsolutePath() } + /** Gets the full name of this file. */ + string getFullName() { result = this.getAbsolutePath() } - /** Gets the URL of this file. */ - string getURL() { result = "file://" + this.getAbsolutePath() + ":0:0:0:0" } + /** Gets the URL of this file. */ + string getURL() { result = "file://" + this.getAbsolutePath() + ":0:0:0:0" } - /** - * Holds if either, - * - `part` is the base name of this container and `i = 1`, or - * - `part` is the stem of this container and `i = 2`, or - * - `part` is the extension of this container and `i = 3`. - */ - cached - private predicate splitAbsolutePath(string part, int i) { - part = this.getAbsolutePath().regexpCapture(".*/(([^/]*?)(?:\\.([^.]*))?)", i) - } + /** + * Holds if either, + * - `part` is the base name of this container and `i = 1`, or + * - `part` is the stem of this container and `i = 2`, or + * - `part` is the extension of this container and `i = 3`. + */ + cached + private predicate splitAbsolutePath(string part, int i) { + part = this.getAbsolutePath().regexpCapture(".*/(([^/]*?)(?:\\.([^.]*))?)", i) + } - /** Gets the base name of this file. */ - string getBaseName() { this.splitAbsolutePath(result, 1) } + /** Gets the base name of this file. */ + string getBaseName() { this.splitAbsolutePath(result, 1) } - /** - * Gets the extension of this container, that is, the suffix of its base name - * after the last dot character, if any. - * - * In particular, - * - * - if the name does not include a dot, there is no extension, so this - * predicate has no result; - * - if the name ends in a dot, the extension is the empty string; - * - if the name contains multiple dots, the extension follows the last dot. - * - * Here are some examples of absolute paths and the corresponding extensions - * (surrounded with quotes to avoid ambiguity): - * - * - * - * - * - * - * - * - *
Absolute pathExtension
"/tmp/tst.txt""txt"
"/tmp/.classpath""classpath"
"/bin/bash"not defined
"/tmp/tst2."""
"/tmp/x.tar.gz""gz"
- */ - string getExtension() { this.splitAbsolutePath(result, 3) } + /** + * Gets the extension of this container, that is, the suffix of its base name + * after the last dot character, if any. + * + * In particular, + * + * - if the name does not include a dot, there is no extension, so this + * predicate has no result; + * - if the name ends in a dot, the extension is the empty string; + * - if the name contains multiple dots, the extension follows the last dot. + * + * Here are some examples of absolute paths and the corresponding extensions + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
Absolute pathExtension
"/tmp/tst.txt""txt"
"/tmp/.classpath""classpath"
"/bin/bash"not defined
"/tmp/tst2."""
"/tmp/x.tar.gz""gz"
+ */ + string getExtension() { this.splitAbsolutePath(result, 3) } - /** - * Gets the stem of this container, that is, the prefix of its base name up to - * (but not including) the last dot character if there is one, or the entire - * base name if there is not. - * - * Here are some examples of absolute paths and the corresponding stems - * (surrounded with quotes to avoid ambiguity): - * - * - * - * - * - * - * - * - *
Absolute pathStem
"/tmp/tst.txt""tst"
"/tmp/.classpath"""
"/bin/bash""bash"
"/tmp/tst2.""tst2"
"/tmp/x.tar.gz""x.tar"
- */ - string getStem() { this.splitAbsolutePath(result, 2) } + /** + * Gets the stem of this container, that is, the prefix of its base name up to + * (but not including) the last dot character if there is one, or the entire + * base name if there is not. + * + * Here are some examples of absolute paths and the corresponding stems + * (surrounded with quotes to avoid ambiguity): + * + * + * + * + * + * + * + * + *
Absolute pathStem
"/tmp/tst.txt""tst"
"/tmp/.classpath"""
"/bin/bash""bash"
"/tmp/tst2.""tst2"
"/tmp/x.tar.gz""x.tar"
+ */ + string getStem() { this.splitAbsolutePath(result, 2) } - /** - * Gets the number of lines containing code in this file. This value - * is approximate. - */ - int getNumberOfLinesOfCode() { - result = - count(int line | - exists(Location loc | - not loc instanceof UnknownLocation and loc.getFile() = this and loc.getStartLine() = line + /** + * Gets the number of lines containing code in this file. This value + * is approximate. + */ + int getNumberOfLinesOfCode() { + result = + count(int line | + exists(Location loc | + not loc instanceof UnknownLocation and + loc.getFile() = this and + loc.getStartLine() = line + ) ) - ) - } + } - /** - * Gets the relative path of this file from the root folder of the - * analyzed source location. The relative path of the root folder itself - * would be the empty string. - * - * This has no result if the file is outside the source root, that is, - * if the root folder is not a reflexive, transitive parent of this file. - */ - string getRelativePath() { - exists(string absPath, string pref | - absPath = this.getAbsolutePath() and sourceLocationPrefix(pref) - | - absPath = pref and result = "" - or - absPath = pref.regexpReplaceAll("/$", "") + "/" + result and - not result.matches("/%") - ) + /** + * Gets the relative path of this file from the root folder of the + * analyzed source location. The relative path of the root folder itself + * would be the empty string. + * + * This has no result if the file is outside the source root, that is, + * if the root folder is not a reflexive, transitive parent of this file. + */ + string getRelativePath() { + exists(string absPath, string pref | + absPath = this.getAbsolutePath() and sourceLocationPrefix(pref) + | + absPath = pref and result = "" + or + absPath = pref.regexpReplaceAll("/$", "") + "/" + result and + not result.matches("/%") + ) + } } } diff --git a/swift/ql/lib/codeql/swift/elements/KeyPathComponentImpl.qll b/swift/ql/lib/codeql/swift/elements/KeyPathComponentImpl.qll index cc5fd523dee57..be837022a7c36 100644 --- a/swift/ql/lib/codeql/swift/elements/KeyPathComponentImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/KeyPathComponentImpl.qll @@ -1,62 +1,64 @@ private import codeql.swift.generated.KeyPathComponent private import swift -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * A component of a `KeyPathExpr`. - */ -class KeyPathComponent extends Generated::KeyPathComponent { +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** - * Property access like `.bar` in `\Foo.bar`. + * A component of a `KeyPathExpr`. */ - predicate isProperty() { this.getKind() = 3 } + class KeyPathComponent extends Generated::KeyPathComponent { + /** + * Property access like `.bar` in `\Foo.bar`. + */ + predicate isProperty() { this.getKind() = 3 } - /** - * Array or dictionary subscript like `[1]` or `["a", "b"]`. - */ - predicate isSubscript() { this.getKind() = 4 } + /** + * Array or dictionary subscript like `[1]` or `["a", "b"]`. + */ + predicate isSubscript() { this.getKind() = 4 } - /** - * Optional forcing `!`. - */ - predicate isOptionalForcing() { this.getKind() = 5 } + /** + * Optional forcing `!`. + */ + predicate isOptionalForcing() { this.getKind() = 5 } - /** - * Optional chaining `?`. - */ - predicate isOptionalChaining() { this.getKind() = 6 } + /** + * Optional chaining `?`. + */ + predicate isOptionalChaining() { this.getKind() = 6 } - /** - * Implicit optional wrapping component inserted by the compiler when an optional chain ends in a non-optional value. - */ - predicate isOptionalWrapping() { this.getKind() = 7 } + /** + * Implicit optional wrapping component inserted by the compiler when an optional chain ends in a non-optional value. + */ + predicate isOptionalWrapping() { this.getKind() = 7 } - /** - * Reference to the entire object; the `self` in `\Foo.self`. - */ - predicate isSelf() { this.getKind() = 8 } + /** + * Reference to the entire object; the `self` in `\Foo.self`. + */ + predicate isSelf() { this.getKind() = 8 } - /** - * Tuple indexing like `.1`. - */ - predicate isTupleIndexing() { this.getKind() = 9 } + /** + * Tuple indexing like `.1`. + */ + predicate isTupleIndexing() { this.getKind() = 9 } - /** Gets the underlying key-path expression which this is a component of. */ - KeyPathExpr getKeyPathExpr() { result.getAComponent() = this } + /** Gets the underlying key-path expression which this is a component of. */ + KeyPathExpr getKeyPathExpr() { result.getAComponent() = this } - /** Holds if this component is the i'th component of the underling key-path expression. */ - predicate hasIndex(int i) { any(KeyPathExpr e).getComponent(i) = this } + /** Holds if this component is the i'th component of the underling key-path expression. */ + predicate hasIndex(int i) { any(KeyPathExpr e).getComponent(i) = this } - /** Gets the next component of the underlying key-path expression. */ - KeyPathComponent getNextComponent() { - exists(int i, KeyPathExpr e | - hasKeyPathExprAndIndex(e, i, this) and - hasKeyPathExprAndIndex(e, i + 1, result) - ) + /** Gets the next component of the underlying key-path expression. */ + KeyPathComponent getNextComponent() { + exists(int i, KeyPathExpr e | + hasKeyPathExprAndIndex(e, i, this) and + hasKeyPathExprAndIndex(e, i + 1, result) + ) + } } -} -pragma[nomagic] -private predicate hasKeyPathExprAndIndex(KeyPathExpr e, int i, KeyPathComponent c) { - e.getComponent(i) = c + pragma[nomagic] + private predicate hasKeyPathExprAndIndex(KeyPathExpr e, int i, KeyPathComponent c) { + e.getComponent(i) = c + } } diff --git a/swift/ql/lib/codeql/swift/elements/LocatableImpl.qll b/swift/ql/lib/codeql/swift/elements/LocatableImpl.qll index 25877d7f07471..6c23fe7ba85f0 100644 --- a/swift/ql/lib/codeql/swift/elements/LocatableImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/LocatableImpl.qll @@ -2,17 +2,19 @@ private import codeql.swift.generated.Locatable private import codeql.swift.elements.File private import codeql.swift.elements.UnknownLocation -class Locatable extends Generated::Locatable { - pragma[nomagic] - override Location getLocation() { - result = Generated::Locatable.super.getLocation() - or - not exists(Generated::Locatable.super.getLocation()) and - result instanceof UnknownLocation - } +module Impl { + class Locatable extends Generated::Locatable { + pragma[nomagic] + override Location getLocation() { + result = Generated::Locatable.super.getLocation() + or + not exists(Generated::Locatable.super.getLocation()) and + result instanceof UnknownLocation + } - /** - * Gets the primary file where this element occurs. - */ - File getFile() { result = this.getLocation().getFile() } + /** + * Gets the primary file where this element occurs. + */ + File getFile() { result = this.getLocation().getFile() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/LocationImpl.qll b/swift/ql/lib/codeql/swift/elements/LocationImpl.qll index 6d4f3138a17aa..acb7e788e87d5 100644 --- a/swift/ql/lib/codeql/swift/elements/LocationImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/LocationImpl.qll @@ -1,28 +1,32 @@ private import codeql.swift.generated.Location -/** - * A location of a program element. - */ -class Location extends Generated::Location { +module Impl { /** - * Holds if this location is described by `path`, `startLine`, `startColumn`, `endLine` and `endColumn`. + * A location of a program element. */ - predicate hasLocationInfo(string path, int startLine, int startColumn, int endLine, int endColumn) { - path = this.getFile().getFullName() and - startLine = this.getStartLine() and - startColumn = this.getStartColumn() and - endLine = this.getEndLine() and - endColumn = this.getEndColumn() - } + class Location extends Generated::Location { + /** + * Holds if this location is described by `path`, `startLine`, `startColumn`, `endLine` and `endColumn`. + */ + predicate hasLocationInfo( + string path, int startLine, int startColumn, int endLine, int endColumn + ) { + path = this.getFile().getFullName() and + startLine = this.getStartLine() and + startColumn = this.getStartColumn() and + endLine = this.getEndLine() and + endColumn = this.getEndColumn() + } - /** - * Gets a textual representation of this location. - */ - override string toString() { - exists(string filePath, int startLine, int startColumn, int endLine, int endColumn | - this.hasLocationInfo(filePath, startLine, startColumn, endLine, endColumn) - | - toUrl(filePath, startLine, startColumn, endLine, endColumn, result) - ) + /** + * Gets a textual representation of this location. + */ + override string toString() { + exists(string filePath, int startLine, int startColumn, int endLine, int endColumn | + this.hasLocationInfo(filePath, startLine, startColumn, endLine, endColumn) + | + toUrl(filePath, startLine, startColumn, endLine, endColumn, result) + ) + } } } diff --git a/swift/ql/lib/codeql/swift/elements/MacroRoleImpl.qll b/swift/ql/lib/codeql/swift/elements/MacroRoleImpl.qll index 969a3329702f7..8ba4f5ff484b3 100644 --- a/swift/ql/lib/codeql/swift/elements/MacroRoleImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/MacroRoleImpl.qll @@ -4,97 +4,101 @@ private import codeql.swift.generated.MacroRole -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * The role of a macro, for example #freestanding(declaration) or @attached(member). - */ -class MacroRole extends Generated::MacroRole { +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** - * String representation of the role kind. + * The role of a macro, for example #freestanding(declaration) or @attached(member). */ - string getKindName() { - this.isExpressionKind() and result = "expression" - or - this.isDeclarationKind() and result = "declaration" - or - this.isAccessorKind() and result = "accessor" - or - this.isMemberAttributeKind() and result = "memberAttribute" - or - this.isMemberKind() and result = "member" - or - this.isPeerKind() and result = "peer" - or - this.isConformanceKind() and result = "conformance" - or - this.isCodeItemKind() and result = "codeItem" - or - this.isExtensionKind() and result = "extension" - } + class MacroRole extends Generated::MacroRole { + /** + * String representation of the role kind. + */ + string getKindName() { + this.isExpressionKind() and result = "expression" + or + this.isDeclarationKind() and result = "declaration" + or + this.isAccessorKind() and result = "accessor" + or + this.isMemberAttributeKind() and result = "memberAttribute" + or + this.isMemberKind() and result = "member" + or + this.isPeerKind() and result = "peer" + or + this.isConformanceKind() and result = "conformance" + or + this.isCodeItemKind() and result = "codeItem" + or + this.isExtensionKind() and result = "extension" + } - /** - * Holds for `expression` roles. - */ - predicate isExpressionKind() { this.getKind() = 1 } + /** + * Holds for `expression` roles. + */ + predicate isExpressionKind() { this.getKind() = 1 } - /** - * Holds for `declaration` roles. - */ - predicate isDeclarationKind() { this.getKind() = 2 } + /** + * Holds for `declaration` roles. + */ + predicate isDeclarationKind() { this.getKind() = 2 } - /** - * Holds for `accessor` roles. - */ - predicate isAccessorKind() { this.getKind() = 4 } + /** + * Holds for `accessor` roles. + */ + predicate isAccessorKind() { this.getKind() = 4 } - /** - * Holds for `memberAttribute` roles. - */ - predicate isMemberAttributeKind() { this.getKind() = 8 } + /** + * Holds for `memberAttribute` roles. + */ + predicate isMemberAttributeKind() { this.getKind() = 8 } - /** - * Holds for `member` roles. - */ - predicate isMemberKind() { this.getKind() = 16 } + /** + * Holds for `member` roles. + */ + predicate isMemberKind() { this.getKind() = 16 } - /** - * Holds for `peer` roles. - */ - predicate isPeerKind() { this.getKind() = 32 } + /** + * Holds for `peer` roles. + */ + predicate isPeerKind() { this.getKind() = 32 } - /** - * Holds for `conformance` roles. - */ - predicate isConformanceKind() { this.getKind() = 64 } + /** + * Holds for `conformance` roles. + */ + predicate isConformanceKind() { this.getKind() = 64 } - /** - * Holds for `codeItem` roles. - */ - predicate isCodeItemKind() { this.getKind() = 128 } + /** + * Holds for `codeItem` roles. + */ + predicate isCodeItemKind() { this.getKind() = 128 } - /** - * Holds for `extension` roles. - */ - predicate isExtensionKind() { this.getKind() = 256 } + /** + * Holds for `extension` roles. + */ + predicate isExtensionKind() { this.getKind() = 256 } - /** - * String representation of the macro syntax. - */ - string getMacroSyntaxName() { - this.isFreestandingMacroSyntax() and result = "#freestanding" - or - this.isAttachedMacroSyntax() and result = "@attached" - } + /** + * String representation of the macro syntax. + */ + string getMacroSyntaxName() { + this.isFreestandingMacroSyntax() and result = "#freestanding" + or + this.isAttachedMacroSyntax() and result = "@attached" + } - /** - * Holds for #freestanding macros. - */ - predicate isFreestandingMacroSyntax() { this.getMacroSyntax() = 0 } + /** + * Holds for #freestanding macros. + */ + predicate isFreestandingMacroSyntax() { this.getMacroSyntax() = 0 } - /** - * Holds for @attached macros. - */ - predicate isAttachedMacroSyntax() { this.getMacroSyntax() = 1 } + /** + * Holds for @attached macros. + */ + predicate isAttachedMacroSyntax() { this.getMacroSyntax() = 1 } - override string toString() { result = this.getMacroSyntaxName() + "(" + this.getKindName() + ")" } + override string toString() { + result = this.getMacroSyntaxName() + "(" + this.getKindName() + ")" + } + } } diff --git a/swift/ql/lib/codeql/swift/elements/OtherAvailabilitySpecImpl.qll b/swift/ql/lib/codeql/swift/elements/OtherAvailabilitySpecImpl.qll index bd36adab002f7..84135e66a264d 100644 --- a/swift/ql/lib/codeql/swift/elements/OtherAvailabilitySpecImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/OtherAvailabilitySpecImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.OtherAvailabilitySpec -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * A wildcard availability spec `*` - */ -class OtherAvailabilitySpec extends Generated::OtherAvailabilitySpec { - override string toString() { result = "*" } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * A wildcard availability spec `*` + */ + class OtherAvailabilitySpec extends Generated::OtherAvailabilitySpec { + override string toString() { result = "*" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/PlatformVersionAvailabilitySpecImpl.qll b/swift/ql/lib/codeql/swift/elements/PlatformVersionAvailabilitySpecImpl.qll index b66212353135e..5d17697b7fb85 100644 --- a/swift/ql/lib/codeql/swift/elements/PlatformVersionAvailabilitySpecImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/PlatformVersionAvailabilitySpecImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.PlatformVersionAvailabilitySpec -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * An availability spec based on platform and version, for example `macOS 12` or `watchOS 14` - */ -class PlatformVersionAvailabilitySpec extends Generated::PlatformVersionAvailabilitySpec { - override string toString() { result = this.getPlatform() + " " + this.getVersion() } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * An availability spec based on platform and version, for example `macOS 12` or `watchOS 14` + */ + class PlatformVersionAvailabilitySpec extends Generated::PlatformVersionAvailabilitySpec { + override string toString() { result = this.getPlatform() + " " + this.getVersion() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/SingleLineComment.qll b/swift/ql/lib/codeql/swift/elements/SingleLineComment.qll new file mode 100644 index 0000000000000..138053e695975 --- /dev/null +++ b/swift/ql/lib/codeql/swift/elements/SingleLineComment.qll @@ -0,0 +1,3 @@ +private import CommentImpl + +final class SingleLineComment = Impl::SingleLineComment; diff --git a/swift/ql/lib/codeql/swift/elements/UnknownFileImpl.qll b/swift/ql/lib/codeql/swift/elements/UnknownFileImpl.qll index 796c29de6ac5e..79e070bbee0cc 100644 --- a/swift/ql/lib/codeql/swift/elements/UnknownFileImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/UnknownFileImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.UnknownFile -class UnknownFile extends Generated::UnknownFile { - override string getName() { result = "" } +module Impl { + class UnknownFile extends Generated::UnknownFile { + override string getName() { result = "" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/UnknownLocationImpl.qll b/swift/ql/lib/codeql/swift/elements/UnknownLocationImpl.qll index df8823fe02899..a39b8ed218009 100644 --- a/swift/ql/lib/codeql/swift/elements/UnknownLocationImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/UnknownLocationImpl.qll @@ -2,19 +2,21 @@ private import codeql.swift.generated.UnknownLocation private import codeql.swift.elements.UnknownFile private import codeql.swift.elements.File -/** - * A `Location` that is given to something that is not associated with any position in the source code. - */ -class UnknownLocation extends Generated::UnknownLocation { - override File getFile() { result instanceof UnknownFile } +module Impl { + /** + * A `Location` that is given to something that is not associated with any position in the source code. + */ + class UnknownLocation extends Generated::UnknownLocation { + override File getFile() { result instanceof UnknownFile } - override int getStartLine() { result = 0 } + override int getStartLine() { result = 0 } - override int getStartColumn() { result = 0 } + override int getStartColumn() { result = 0 } - override int getEndLine() { result = 0 } + override int getEndLine() { result = 0 } - override int getEndColumn() { result = 0 } + override int getEndColumn() { result = 0 } - override string toString() { result = "UnknownLocation" } + override string toString() { result = "UnknownLocation" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/UnspecifiedElementImpl.qll b/swift/ql/lib/codeql/swift/elements/UnspecifiedElementImpl.qll index b062beeb19792..e2d7c5a32d9ba 100644 --- a/swift/ql/lib/codeql/swift/elements/UnspecifiedElementImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/UnspecifiedElementImpl.qll @@ -2,22 +2,24 @@ private import codeql.swift.generated.UnspecifiedElement import codeql.swift.elements.Location import codeql.swift.elements.Locatable -class UnspecifiedElement extends Generated::UnspecifiedElement { - override string toString() { - exists(string source, string index | - ( - source = " from " + this.getParent().getPrimaryQlClasses() - or - not this.hasParent() and source = "" - ) and - ( - index = "[" + this.getIndex() + "]" - or - not this.hasIndex() and index = "" - ) and - result = "missing " + this.getProperty() + index + source - ) - } +module Impl { + class UnspecifiedElement extends Generated::UnspecifiedElement { + override string toString() { + exists(string source, string index | + ( + source = " from " + this.getParent().getPrimaryQlClasses() + or + not this.hasParent() and source = "" + ) and + ( + index = "[" + this.getIndex() + "]" + or + not this.hasIndex() and index = "" + ) and + result = "missing " + this.getProperty() + index + source + ) + } - override Location getLocation() { result = this.getParent().(Locatable).getLocation() } + override Location getLocation() { result = this.getParent().(Locatable).getLocation() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/AccessorImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/AccessorImpl.qll index 2440ff28d686c..422aa662d13b9 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/AccessorImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/AccessorImpl.qll @@ -1,40 +1,35 @@ private import codeql.swift.generated.decl.Accessor +private import SetObserver -private predicate isKnownAccessorKind(Accessor decl, string kind) { - decl.isGetter() and kind = "get" - or - decl.isSetter() and kind = "set" - or - decl.isWillSet() and kind = "willSet" - or - decl.isDidSet() and kind = "didSet" - or - decl.isRead() and kind = "_read" - or - decl.isModify() and kind = "_modify" - or - decl.isUnsafeAddress() and kind = "unsafeAddress" - or - decl.isUnsafeMutableAddress() and kind = "unsafeMutableAddress" -} - -class Accessor extends Generated::Accessor { - predicate isPropertyObserver() { - this instanceof WillSetObserver or this instanceof DidSetObserver - } - - override string toString() { - isKnownAccessorKind(this, result) +module Impl { + private predicate isKnownAccessorKind(Accessor decl, string kind) { + decl.isGetter() and kind = "get" + or + decl.isSetter() and kind = "set" + or + decl.isWillSet() and kind = "willSet" + or + decl.isDidSet() and kind = "didSet" or - not isKnownAccessorKind(this, _) and - result = super.toString() + decl.isRead() and kind = "_read" + or + decl.isModify() and kind = "_modify" + or + decl.isUnsafeAddress() and kind = "unsafeAddress" + or + decl.isUnsafeMutableAddress() and kind = "unsafeMutableAddress" } -} -class WillSetObserver extends Accessor { - WillSetObserver() { this.isWillSet() } -} + class Accessor extends Generated::Accessor { + predicate isPropertyObserver() { + this instanceof WillSetObserver or this instanceof DidSetObserver + } -class DidSetObserver extends Accessor { - DidSetObserver() { this.isDidSet() } + override string toString() { + isKnownAccessorKind(this, result) + or + not isKnownAccessorKind(this, _) and + result = super.toString() + } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/CapturedDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/CapturedDeclImpl.qll index fe9ea0ed32b50..0d07f7c6eee2e 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/CapturedDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/CapturedDeclImpl.qll @@ -2,22 +2,24 @@ private import codeql.swift.generated.decl.CapturedDecl private import codeql.swift.elements.Callable private import codeql.swift.elements.expr.DeclRefExpr -/** - * A captured variable or function parameter in the scope of a closure. - */ -class CapturedDecl extends Generated::CapturedDecl { - override string toString() { result = this.getDecl().toString() } - +module Impl { /** - * Gets the closure or function that captures this variable. + * A captured variable or function parameter in the scope of a closure. */ - Callable getScope() { result.getACapture() = this } + class CapturedDecl extends Generated::CapturedDecl { + override string toString() { result = this.getDecl().toString() } - /** - * Get an access to this capture within the scope of its closure. - */ - DeclRefExpr getAnAccess() { - result.getEnclosingCallable() = this.getScope() and - result.getDecl() = this.getDecl() + /** + * Gets the closure or function that captures this variable. + */ + Callable getScope() { result.getACapture() = this } + + /** + * Get an access to this capture within the scope of its closure. + */ + DeclRefExpr getAnAccess() { + result.getEnclosingCallable() = this.getScope() and + result.getDecl() = this.getDecl() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/DeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/DeclImpl.qll index c1a8d3fdf8172..eb05a3b25b5ef 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/DeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/DeclImpl.qll @@ -2,21 +2,23 @@ private import codeql.swift.generated.decl.Decl private import codeql.swift.elements.decl.NominalTypeDecl private import codeql.swift.elements.decl.ExtensionDecl -class Decl extends Generated::Decl { - override string toString() { result = super.toString() } +module Impl { + class Decl extends Generated::Decl { + override string toString() { result = super.toString() } - /** - * Gets the `NominalTypeDecl` corresponding to this `Decl`, if any. This - * resolves an `ExtensionDecl` to the `NominalTypeDecl` that it extends. - */ - NominalTypeDecl asNominalTypeDecl() { - result = this - or - result = this.(ExtensionDecl).getExtendedTypeDecl() - } + /** + * Gets the `NominalTypeDecl` corresponding to this `Decl`, if any. This + * resolves an `ExtensionDecl` to the `NominalTypeDecl` that it extends. + */ + NominalTypeDecl asNominalTypeDecl() { + result = this + or + result = this.(ExtensionDecl).getExtendedTypeDecl() + } - /** - * Gets the declaration that declares this declaration as a member, if any. - */ - Decl getDeclaringDecl() { this = result.getAMember() } + /** + * Gets the declaration that declares this declaration as a member, if any. + */ + Decl getDeclaringDecl() { this = result.getAMember() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/DeinitializerImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/DeinitializerImpl.qll index 7e16de32d26dc..c46bb3867d279 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/DeinitializerImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/DeinitializerImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.decl.Deinitializer private import codeql.swift.elements.decl.Method -/** - * A deinitializer of a class. - */ -class Deinitializer extends Generated::Deinitializer, Method { - override string toString() { result = this.getSelfParam().getType() + "." + super.toString() } +module Impl { + /** + * A deinitializer of a class. + */ + class Deinitializer extends Generated::Deinitializer { + override string toString() { result = this.getSelfParam().getType() + "." + super.toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/EnumCaseDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/EnumCaseDeclImpl.qll index 4533adf2d85b4..8e2ea03a70d60 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/EnumCaseDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/EnumCaseDeclImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.decl.EnumCaseDecl -class EnumCaseDecl extends Generated::EnumCaseDecl { - override string toString() { result = "case ..." } +module Impl { + class EnumCaseDecl extends Generated::EnumCaseDecl { + override string toString() { result = "case ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/EnumDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/EnumDeclImpl.qll index 91f597c8d384d..9eff4077f933d 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/EnumDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/EnumDeclImpl.qll @@ -3,34 +3,36 @@ private import codeql.swift.elements.decl.EnumCaseDecl private import codeql.swift.elements.decl.EnumElementDecl private import codeql.swift.elements.decl.Decl -/** - * An enumeration declaration, for example: - * ``` - * enum MyColours { - * case red - * case green - * case blue - * } - * ``` - */ -class EnumDecl extends Generated::EnumDecl { +module Impl { /** - * Gets the `index`th enumeration element of this enumeration (0-based). + * An enumeration declaration, for example: + * ``` + * enum MyColours { + * case red + * case green + * case blue + * } + * ``` */ - final EnumElementDecl getEnumElement(int index) { - result = - rank[index + 1](int memberIndex, Decl d | - d = this.getMember(memberIndex) and - d instanceof EnumElementDecl - | - d order by memberIndex - ) - } + class EnumDecl extends Generated::EnumDecl { + /** + * Gets the `index`th enumeration element of this enumeration (0-based). + */ + final EnumElementDecl getEnumElement(int index) { + result = + rank[index + 1](int memberIndex, Decl d | + d = this.getMember(memberIndex) and + d instanceof EnumElementDecl + | + d order by memberIndex + ) + } - /** - * Gets an enumeration element of this enumeration. - */ - final EnumElementDecl getAnEnumElement() { - result = this.getMember(_).(EnumCaseDecl).getElement(_) + /** + * Gets an enumeration element of this enumeration. + */ + final EnumElementDecl getAnEnumElement() { + result = this.getMember(_).(EnumCaseDecl).getElement(_) + } } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/EnumElementDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/EnumElementDeclImpl.qll index 8dfc22001629d..d2234b9a0f98e 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/EnumElementDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/EnumElementDeclImpl.qll @@ -1,37 +1,39 @@ private import codeql.swift.generated.decl.EnumElementDecl private import codeql.swift.elements.decl.EnumDecl -/** - * An enum element declaration, for example `enumElement` and `anotherEnumElement` in: - * ``` - * enum MyEnum { - * case enumElement - * case anotherEnumElement(Int) - * } - * ``` - */ -class EnumElementDecl extends Generated::EnumElementDecl { - override string toString() { result = this.getName() } - +module Impl { /** - * Holds if this enum element declaration is called `enumElementName` and is a member of an - * enum called `enumName`. + * An enum element declaration, for example `enumElement` and `anotherEnumElement` in: + * ``` + * enum MyEnum { + * case enumElement + * case anotherEnumElement(Int) + * } + * ``` */ - cached - predicate hasQualifiedName(string enumName, string enumElementName) { - this.getName() = enumElementName and - exists(EnumDecl d | - d.getFullName() = enumName and - d.getAMember() = this - ) - } + class EnumElementDecl extends Generated::EnumElementDecl { + override string toString() { result = this.getName() } - /** - * Holds if this enum element declaration is called `enumElementName` and is a member of an - * enumcalled `enumName` in a module called `moduleName`. - */ - predicate hasQualifiedName(string moduleName, string enumName, string enumElementName) { - this.hasQualifiedName(enumName, enumElementName) and - this.getModule().getFullName() = moduleName + /** + * Holds if this enum element declaration is called `enumElementName` and is a member of an + * enum called `enumName`. + */ + cached + predicate hasQualifiedName(string enumName, string enumElementName) { + this.getName() = enumElementName and + exists(EnumDecl d | + d.getFullName() = enumName and + d.getAMember() = this + ) + } + + /** + * Holds if this enum element declaration is called `enumElementName` and is a member of an + * enumcalled `enumName` in a module called `moduleName`. + */ + predicate hasQualifiedName(string moduleName, string enumName, string enumElementName) { + this.hasQualifiedName(enumName, enumElementName) and + this.getModule().getFullName() = moduleName + } } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/ExtensionDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/ExtensionDeclImpl.qll index 625229fcb13a6..1d31a99a53573 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/ExtensionDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/ExtensionDeclImpl.qll @@ -1,11 +1,13 @@ private import codeql.swift.generated.decl.ExtensionDecl -class ExtensionDecl extends Generated::ExtensionDecl { - override string toString() { - result = - "extension of " + unique(NominalTypeDecl td | td = this.getExtendedTypeDecl()).toString() - or - count(this.getExtendedTypeDecl()) != 1 and - result = "extension" +module Impl { + class ExtensionDecl extends Generated::ExtensionDecl { + override string toString() { + result = + "extension of " + unique(NominalTypeDecl td | td = this.getExtendedTypeDecl()).toString() + or + count(this.getExtendedTypeDecl()) != 1 and + result = "extension" + } } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/FieldDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/FieldDecl.qll new file mode 100644 index 0000000000000..6a7c6021d72db --- /dev/null +++ b/swift/ql/lib/codeql/swift/elements/decl/FieldDecl.qll @@ -0,0 +1,32 @@ +private import VarDecl + +/** + * A field declaration. That is, a variable declaration that is a member of a + * class, struct, enum or protocol. + */ +final class FieldDecl extends VarDecl { + FieldDecl() { this = any(Decl ctx).getAMember() } + + /** + * Holds if this field is called `fieldName` and is a member of a + * class, struct, extension, enum or protocol called `typeName`. + */ + cached + predicate hasQualifiedName(string typeName, string fieldName) { + this.getName() = fieldName and + exists(Decl d | + d.asNominalTypeDecl().getFullName() = typeName and + d.getAMember() = this + ) + } + + /** + * Holds if this field is called `fieldName` and is a member of a + * class, struct, extension, enum or protocol called `typeName` in a module + * called `moduleName`. + */ + predicate hasQualifiedName(string moduleName, string typeName, string fieldName) { + this.hasQualifiedName(typeName, fieldName) and + this.getModule().getFullName() = moduleName + } +} diff --git a/swift/ql/lib/codeql/swift/elements/decl/FreeFunction.qll b/swift/ql/lib/codeql/swift/elements/decl/FreeFunction.qll new file mode 100644 index 0000000000000..ae03dc5f44a3b --- /dev/null +++ b/swift/ql/lib/codeql/swift/elements/decl/FreeFunction.qll @@ -0,0 +1,9 @@ +private import Function +private import Method + +/** + * A free (non-member) function. + */ +final class FreeFunction extends Function { + FreeFunction() { not this instanceof Method } +} diff --git a/swift/ql/lib/codeql/swift/elements/decl/FunctionImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/FunctionImpl.qll index 7fc5b5b215595..054b0b81e50bb 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/FunctionImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/FunctionImpl.qll @@ -1,26 +1,28 @@ private import codeql.swift.generated.decl.Function private import codeql.swift.elements.decl.Method -/** - * A function. - */ -class Function extends Generated::Function, Callable { - override string toString() { result = this.getName() } - +module Impl { /** - * Gets the name of this function, without the argument list. For example - * a function with name `myFunction(arg:)` has short name `myFunction`. + * A function. */ - string getShortName() { - // match as many characters as possible that are not `(`. - // (`*+` is possessive matching) - result = this.getName().regexpCapture("([^(]*+).*", 1) + class Function extends Generated::Function { + override string toString() { result = this.getName() } + + /** + * Gets the name of this function, without the argument list. For example + * a function with name `myFunction(arg:)` has short name `myFunction`. + */ + string getShortName() { + // match as many characters as possible that are not `(`. + // (`*+` is possessive matching) + result = this.getName().regexpCapture("([^(]*+).*", 1) + } } -} -/** - * A free (non-member) function. - */ -class FreeFunction extends Function { - FreeFunction() { not this instanceof Method } + /** + * A free (non-member) function. + */ + class FreeFunction extends Function { + FreeFunction() { not this instanceof Method } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/IfConfigDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/IfConfigDeclImpl.qll index d5f825c31f281..395409992d5ae 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/IfConfigDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/IfConfigDeclImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.decl.IfConfigDecl -class IfConfigDecl extends Generated::IfConfigDecl { - override string toString() { result = "#if ..." } +module Impl { + class IfConfigDecl extends Generated::IfConfigDecl { + override string toString() { result = "#if ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/ImportDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/ImportDeclImpl.qll index 08f5820f103bc..2e0aa369bd175 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/ImportDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/ImportDeclImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.decl.ImportDecl -class ImportDecl extends Generated::ImportDecl { - override string toString() { result = "import ..." } +module Impl { + class ImportDecl extends Generated::ImportDecl { + override string toString() { result = "import ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/InitializerImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/InitializerImpl.qll index 2b2c903cfcb2c..3e52508cce1de 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/InitializerImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/InitializerImpl.qll @@ -3,15 +3,17 @@ private import codeql.swift.elements.decl.Method private import codeql.swift.elements.type.FunctionType private import codeql.swift.elements.type.OptionalType -/** - * An initializer of a class, struct, enum or protocol. - */ -class Initializer extends Generated::Initializer, Method { - override string toString() { result = this.getSelfParam().getType() + "." + super.toString() } +module Impl { + /** + * An initializer of a class, struct, enum or protocol. + */ + class Initializer extends Generated::Initializer { + override string toString() { result = this.getSelfParam().getType() + "." + super.toString() } - /** Holds if this initializer returns an optional type. Failable initializers are written as `init?`. */ - predicate isFailable() { - this.getInterfaceType().(FunctionType).getResult().(FunctionType).getResult() instanceof - OptionalType + /** Holds if this initializer returns an optional type. Failable initializers are written as `init?`. */ + predicate isFailable() { + this.getInterfaceType().(FunctionType).getResult().(FunctionType).getResult() instanceof + OptionalType + } } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/MissingMemberDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/MissingMemberDeclImpl.qll index a89fb9c67561e..51c9744ceea8d 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/MissingMemberDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/MissingMemberDeclImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.decl.MissingMemberDecl -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * A placeholder for missing declarations that can arise on object deserialization. - */ -class MissingMemberDecl extends Generated::MissingMemberDecl { - override string toString() { result = this.getName() + " (missing)" } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * A placeholder for missing declarations that can arise on object deserialization. + */ + class MissingMemberDecl extends Generated::MissingMemberDecl { + override string toString() { result = this.getName() + " (missing)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/NominalTypeDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/NominalTypeDeclImpl.qll index 4b337322818f9..826505f0a97e2 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/NominalTypeDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/NominalTypeDeclImpl.qll @@ -1,6 +1,8 @@ private import codeql.swift.generated.decl.NominalTypeDecl -/** - * A class, struct, enum or protocol. - */ -class NominalTypeDecl extends Generated::NominalTypeDecl { } +module Impl { + /** + * A class, struct, enum or protocol. + */ + class NominalTypeDecl extends Generated::NominalTypeDecl { } +} diff --git a/swift/ql/lib/codeql/swift/elements/decl/OperatorDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/OperatorDeclImpl.qll index b5e13c9f2ac47..cee4d691c89f6 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/OperatorDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/OperatorDeclImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.decl.OperatorDecl -class OperatorDecl extends Generated::OperatorDecl { - override string toString() { result = this.getName() } +module Impl { + class OperatorDecl extends Generated::OperatorDecl { + override string toString() { result = this.getName() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/ParamDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/ParamDeclImpl.qll index 93b749d988102..f5fcd04f6b2b3 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/ParamDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/ParamDeclImpl.qll @@ -1,24 +1,26 @@ private import codeql.swift.generated.decl.ParamDecl private import codeql.swift.elements.Callable -class ParamDecl extends Generated::ParamDecl { - /** Gets the function which declares this parameter. */ - Callable getDeclaringFunction() { result.getAParam() = this } +module Impl { + class ParamDecl extends Generated::ParamDecl { + /** Gets the function which declares this parameter. */ + Callable getDeclaringFunction() { result.getAParam() = this } - /** - * Gets the index of this parameter in its declaring function's parameter list, - * or -1 if this is `self`. - */ - int getIndex() { exists(Callable func | func.getParam(result) = this) } -} + /** + * Gets the index of this parameter in its declaring function's parameter list, + * or -1 if this is `self`. + */ + int getIndex() { exists(Callable func | func.getParam(result) = this) } + } -/** A `self` parameter. */ -class SelfParamDecl extends ParamDecl { - Callable call; + /** A `self` parameter. */ + class SelfParamDecl extends ParamDecl { + Callable call; - SelfParamDecl() { call.getSelfParam() = this } + SelfParamDecl() { call.getSelfParam() = this } - override Callable getDeclaringFunction() { result = call } + override Callable getDeclaringFunction() { result = call } - override int getIndex() { result = -1 } + override int getIndex() { result = -1 } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/PatternBindingDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/PatternBindingDeclImpl.qll index b8b04651684d7..5cca53c3d4825 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/PatternBindingDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/PatternBindingDeclImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.decl.PatternBindingDecl -class PatternBindingDecl extends Generated::PatternBindingDecl { - override string toString() { result = "var ... = ..." } +module Impl { + class PatternBindingDecl extends Generated::PatternBindingDecl { + override string toString() { result = "var ... = ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/PoundDiagnosticDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/PoundDiagnosticDeclImpl.qll index ce435d3eb6277..b7e9caab00aeb 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/PoundDiagnosticDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/PoundDiagnosticDeclImpl.qll @@ -1,17 +1,19 @@ private import codeql.swift.generated.decl.PoundDiagnosticDecl -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * A diagnostic directive, which is either `#error` or `#warning`. - */ -class PoundDiagnosticDecl extends Generated::PoundDiagnosticDecl { - override string toString() { - this.isError() and result = "#error(...)" - or - this.isWarning() and result = "#warning(...)" - } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * A diagnostic directive, which is either `#error` or `#warning`. + */ + class PoundDiagnosticDecl extends Generated::PoundDiagnosticDecl { + override string toString() { + this.isError() and result = "#error(...)" + or + this.isWarning() and result = "#warning(...)" + } - predicate isError() { this.getKind() = 1 } + predicate isError() { this.getKind() = 1 } - predicate isWarning() { this.getKind() = 2 } + predicate isWarning() { this.getKind() = 2 } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/PrecedenceGroupDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/PrecedenceGroupDeclImpl.qll index 3125054ea8ba0..1f85a0d563d3c 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/PrecedenceGroupDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/PrecedenceGroupDeclImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.decl.PrecedenceGroupDecl -class PrecedenceGroupDecl extends Generated::PrecedenceGroupDecl { - override string toString() { result = "precedencegroup ..." } +module Impl { + class PrecedenceGroupDecl extends Generated::PrecedenceGroupDecl { + override string toString() { result = "precedencegroup ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/SelfParamDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/SelfParamDecl.qll new file mode 100644 index 0000000000000..0a3c1374b6198 --- /dev/null +++ b/swift/ql/lib/codeql/swift/elements/decl/SelfParamDecl.qll @@ -0,0 +1,3 @@ +private import ParamDeclImpl + +final class SelfParamDecl = Impl::SelfParamDecl; diff --git a/swift/ql/lib/codeql/swift/elements/decl/SetObserver.qll b/swift/ql/lib/codeql/swift/elements/decl/SetObserver.qll new file mode 100644 index 0000000000000..19367186d8afc --- /dev/null +++ b/swift/ql/lib/codeql/swift/elements/decl/SetObserver.qll @@ -0,0 +1,9 @@ +private import Accessor + +final class WillSetObserver extends Accessor { + WillSetObserver() { this.isWillSet() } +} + +class DidSetObserver extends Accessor { + DidSetObserver() { this.isDidSet() } +} diff --git a/swift/ql/lib/codeql/swift/elements/decl/SubscriptDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/SubscriptDeclImpl.qll index 3cb0e84498973..32a9633405446 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/SubscriptDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/SubscriptDeclImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.decl.SubscriptDecl -class SubscriptDecl extends Generated::SubscriptDecl { - override string toString() { result = "subscript ..." } +module Impl { + class SubscriptDecl extends Generated::SubscriptDecl { + override string toString() { result = "subscript ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/TopLevelCodeDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/TopLevelCodeDeclImpl.qll index cf421c65b39bf..f3f8e0683be25 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/TopLevelCodeDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/TopLevelCodeDeclImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.decl.TopLevelCodeDecl -class TopLevelCodeDecl extends Generated::TopLevelCodeDecl { - override string toString() { result = this.getBody().toString() } +module Impl { + class TopLevelCodeDecl extends Generated::TopLevelCodeDecl { + override string toString() { result = this.getBody().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/TypeAliasDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/TypeAliasDeclImpl.qll index 96b7dc19737b5..14b5f9c944d72 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/TypeAliasDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/TypeAliasDeclImpl.qll @@ -1,10 +1,12 @@ private import codeql.swift.generated.decl.TypeAliasDecl -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * A declaration of a type alias to another type. For example: - * ``` - * typealias MyInt = Int - * ``` - */ -class TypeAliasDecl extends Generated::TypeAliasDecl { } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * A declaration of a type alias to another type. For example: + * ``` + * typealias MyInt = Int + * ``` + */ + class TypeAliasDecl extends Generated::TypeAliasDecl { } +} diff --git a/swift/ql/lib/codeql/swift/elements/decl/TypeDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/TypeDeclImpl.qll index 15c6bd1609c6d..1ddadd790ffec 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/TypeDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/TypeDeclImpl.qll @@ -2,113 +2,118 @@ private import codeql.swift.generated.decl.TypeDecl private import codeql.swift.elements.type.AnyGenericType private import swift -/** - * A Swift type declaration, for example a class, struct, enum or protocol - * declaration. - * - * Type declarations are distinct from types. A type declaration represents - * the code that declares a type, for example: - * ``` - * class MyClass { - * ... - * } - * ``` - * Not all types have type declarations, for example built-in types do not - * have type declarations. - */ -class TypeDecl extends Generated::TypeDecl { - override string toString() { result = this.getName() } - +module Impl { /** - * Gets the `index`th base type of this type declaration (0-based). + * A Swift type declaration, for example a class, struct, enum or protocol + * declaration. * - * This is the same as `getImmediateInheritedType`. - * DEPRECATED: either use `getImmediateInheritedType` or unindexed `getABaseType`. - */ - deprecated Type getImmediateBaseType(int index) { result = this.getImmediateInheritedType(index) } - - /** - * Gets the `index`th base type of this type declaration (0-based). - * This is the same as `getInheritedType`. - * DEPRECATED: use `getInheritedType` or unindexed `getABaseType`. - */ - deprecated Type getBaseType(int index) { result = this.getInheritedType(index) } - - /** - * Gets any of the base types of this type declaration. Expands protocols added in - * extensions and expands type aliases. For example in the following code, `B` has - * base type `A`: + * Type declarations are distinct from types. A type declaration represents + * the code that declares a type, for example: * ``` - * typealias A_alias = A - * - * class B : A_alias {} + * class MyClass { + * ... + * } * ``` + * Not all types have type declarations, for example built-in types do not + * have type declarations. */ - Type getABaseType() { - // direct base type - result = this.getAnInheritedType().getUnderlyingType() - or - // protocol added in an extension of the type - exists(ExtensionDecl ed | - ed.getExtendedTypeDecl() = this and - ed.getAProtocol().getType() = result - ) - } + class TypeDecl extends Generated::TypeDecl { + override string toString() { result = this.getName() } - /** - * Gets the declaration of the `index`th base type of this type declaration (0-based). - * DEPRECATED: The index is not very meaningful here. Use `getABaseTypeDecl`. - */ - deprecated TypeDecl getBaseTypeDecl(int i) { - result = this.getBaseType(i).(AnyGenericType).getDeclaration() - } + /** + * Gets the `index`th base type of this type declaration (0-based). + * + * This is the same as `getImmediateInheritedType`. + * DEPRECATED: either use `getImmediateInheritedType` or unindexed `getABaseType`. + */ + deprecated Type getImmediateBaseType(int index) { + result = this.getImmediateInheritedType(index) + } - /** - * Gets the declaration of any of the base types of this type declaration. Expands - * protocols added in extensions and expands type aliases. For example in the following - * code, `B` has base type `A`. - * ``` - * typealias A_alias = A - * - * class B : A_alias {} - * ``` - */ - TypeDecl getABaseTypeDecl() { result = this.getABaseType().(AnyGenericType).getDeclaration() } + /** + * Gets the `index`th base type of this type declaration (0-based). + * This is the same as `getInheritedType`. + * DEPRECATED: use `getInheritedType` or unindexed `getABaseType`. + */ + deprecated Type getBaseType(int index) { result = this.getInheritedType(index) } - /** - * Gets the declaration of any type derived from this type declaration. Expands protocols - * added in extensions and expands type aliases. For example in the following code, `B` - * is derived from `A`. - * ``` - * typealias A_alias = A - * - * class B : A_alias {} - * ``` - */ - TypeDecl getADerivedTypeDecl() { result.getABaseTypeDecl() = this } + /** + * Gets any of the base types of this type declaration. Expands protocols added in + * extensions and expands type aliases. For example in the following code, `B` has + * base type `A`: + * ``` + * typealias A_alias = A + * + * class B : A_alias {} + * ``` + */ + Type getABaseType() { + // direct base type + result = this.getAnInheritedType().getUnderlyingType() + or + // protocol added in an extension of the type + exists(ExtensionDecl ed | + ed.getExtendedTypeDecl() = this and + ed.getAProtocol().getType() = result + ) + } - /** - * Gets the full name of this `TypeDecl`. For example in: - * ```swift - * struct A { - * struct B { - * // ... - * } - * } - * ``` - * The name and full name of `A` is `A`. The name of `B` is `B`, but the - * full name of `B` is `A.B`. - */ - cached - string getFullName() { - not this.getEnclosingDecl() instanceof TypeDecl and - not count(this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl()) = 1 and - result = this.getName() - or - result = this.getEnclosingDecl().(TypeDecl).getFullName() + "." + this.getName() - or - result = - unique(NominalTypeDecl td | td = this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl()) - .getFullName() + "." + this.getName() + /** + * Gets the declaration of the `index`th base type of this type declaration (0-based). + * DEPRECATED: The index is not very meaningful here. Use `getABaseTypeDecl`. + */ + deprecated TypeDecl getBaseTypeDecl(int i) { + result = this.getBaseType(i).(AnyGenericType).getDeclaration() + } + + /** + * Gets the declaration of any of the base types of this type declaration. Expands + * protocols added in extensions and expands type aliases. For example in the following + * code, `B` has base type `A`. + * ``` + * typealias A_alias = A + * + * class B : A_alias {} + * ``` + */ + TypeDecl getABaseTypeDecl() { result = this.getABaseType().(AnyGenericType).getDeclaration() } + + /** + * Gets the declaration of any type derived from this type declaration. Expands protocols + * added in extensions and expands type aliases. For example in the following code, `B` + * is derived from `A`. + * ``` + * typealias A_alias = A + * + * class B : A_alias {} + * ``` + */ + TypeDecl getADerivedTypeDecl() { result.getABaseTypeDecl() = this } + + /** + * Gets the full name of this `TypeDecl`. For example in: + * ```swift + * struct A { + * struct B { + * // ... + * } + * } + * ``` + * The name and full name of `A` is `A`. The name of `B` is `B`, but the + * full name of `B` is `A.B`. + */ + cached + string getFullName() { + not this.getEnclosingDecl() instanceof TypeDecl and + not count(this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl()) = 1 and + result = this.getName() + or + result = this.getEnclosingDecl().(TypeDecl).getFullName() + "." + this.getName() + or + result = + unique(NominalTypeDecl td | + td = this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl() + ).getFullName() + "." + this.getName() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/ValueDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/ValueDeclImpl.qll index 4598815fcec78..a0cf7640911f9 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/ValueDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/ValueDeclImpl.qll @@ -2,22 +2,24 @@ private import codeql.swift.generated.decl.ValueDecl private import codeql.swift.elements.decl.CapturedDecl private import codeql.swift.elements.expr.DeclRefExpr -/** - * A declaration that introduces a value with a type. - */ -class ValueDecl extends Generated::ValueDecl { +module Impl { /** - * Gets a capture of this declaration in the scope of a closure. + * A declaration that introduces a value with a type. */ - CapturedDecl asCapturedDecl() { result.getDecl() = this } + class ValueDecl extends Generated::ValueDecl { + /** + * Gets a capture of this declaration in the scope of a closure. + */ + CapturedDecl asCapturedDecl() { result.getDecl() = this } - /** - * Holds if this declaration is captured by a closure. - */ - predicate isCaptured() { exists(this.asCapturedDecl()) } + /** + * Holds if this declaration is captured by a closure. + */ + predicate isCaptured() { exists(this.asCapturedDecl()) } - /** - * Gets an expression that references this declaration. - */ - DeclRefExpr getAnAccess() { result.getDecl() = this } + /** + * Gets an expression that references this declaration. + */ + DeclRefExpr getAnAccess() { result.getDecl() = this } + } } diff --git a/swift/ql/lib/codeql/swift/elements/decl/VarDeclImpl.qll b/swift/ql/lib/codeql/swift/elements/decl/VarDeclImpl.qll index 7f479a9341e0d..0a28fec7e57cb 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/VarDeclImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/VarDeclImpl.qll @@ -1,56 +1,58 @@ private import codeql.swift.generated.decl.VarDecl private import codeql.swift.elements.decl.Decl -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * A declaration of a variable such as - * * a local variable in a function: - * ``` - * func foo() { - * var x = 42 // <- - * let y = "hello" // <- - * ... - * } - * ``` - * * a member of a `struct` or `class`: - * ``` - * struct S { - * var size : Int // <- - * } - * ``` - * * ... - */ -class VarDecl extends Generated::VarDecl { - override string toString() { result = this.getName() } -} - -/** - * A field declaration. That is, a variable declaration that is a member of a - * class, struct, enum or protocol. - */ -class FieldDecl extends VarDecl { - FieldDecl() { this = any(Decl ctx).getAMember() } - +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** - * Holds if this field is called `fieldName` and is a member of a - * class, struct, extension, enum or protocol called `typeName`. + * A declaration of a variable such as + * * a local variable in a function: + * ``` + * func foo() { + * var x = 42 // <- + * let y = "hello" // <- + * ... + * } + * ``` + * * a member of a `struct` or `class`: + * ``` + * struct S { + * var size : Int // <- + * } + * ``` + * * ... */ - cached - predicate hasQualifiedName(string typeName, string fieldName) { - this.getName() = fieldName and - exists(Decl d | - d.asNominalTypeDecl().getFullName() = typeName and - d.getAMember() = this - ) + class VarDecl extends Generated::VarDecl { + override string toString() { result = this.getName() } } /** - * Holds if this field is called `fieldName` and is a member of a - * class, struct, extension, enum or protocol called `typeName` in a module - * called `moduleName`. + * A field declaration. That is, a variable declaration that is a member of a + * class, struct, enum or protocol. */ - predicate hasQualifiedName(string moduleName, string typeName, string fieldName) { - this.hasQualifiedName(typeName, fieldName) and - this.getModule().getFullName() = moduleName + class FieldDecl extends VarDecl { + FieldDecl() { this = any(Decl ctx).getAMember() } + + /** + * Holds if this field is called `fieldName` and is a member of a + * class, struct, extension, enum or protocol called `typeName`. + */ + cached + predicate hasQualifiedName(string typeName, string fieldName) { + this.getName() = fieldName and + exists(Decl d | + d.asNominalTypeDecl().getFullName() = typeName and + d.getAMember() = this + ) + } + + /** + * Holds if this field is called `fieldName` and is a member of a + * class, struct, extension, enum or protocol called `typeName` in a module + * called `moduleName`. + */ + predicate hasQualifiedName(string moduleName, string typeName, string fieldName) { + this.hasQualifiedName(typeName, fieldName) and + this.getModule().getFullName() = moduleName + } } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ApplyExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ApplyExprImpl.qll index e90937cf15cb6..ec5b88b6bf324 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ApplyExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ApplyExprImpl.qll @@ -6,54 +6,56 @@ private import codeql.swift.elements.expr.DotSyntaxBaseIgnoredExpr private import codeql.swift.elements.expr.AutoClosureExpr private import codeql.swift.elements.decl.Method -class ApplyExpr extends Generated::ApplyExpr { - Callable getStaticTarget() { result = this.getFunction().(DeclRefExpr).getDecl() } - - /** Gets the method qualifier, if this is applying a method */ - Expr getQualifier() { none() } - - /** - * Gets the argument of this `ApplyExpr` called `label` (if any). - */ - final Argument getArgumentWithLabel(string label) { - result = this.getAnArgument() and - result.getLabel() = label +module Impl { + class ApplyExpr extends Generated::ApplyExpr { + Callable getStaticTarget() { result = this.getFunction().(DeclRefExpr).getDecl() } + + /** Gets the method qualifier, if this is applying a method */ + Expr getQualifier() { none() } + + /** + * Gets the argument of this `ApplyExpr` called `label` (if any). + */ + final Argument getArgumentWithLabel(string label) { + result = this.getAnArgument() and + result.getLabel() = label + } + + override string toString() { + result = "call to " + this.getStaticTarget().toString() + or + not exists(this.getStaticTarget()) and + result = "call to ..." + } } - override string toString() { - result = "call to " + this.getStaticTarget().toString() - or - not exists(this.getStaticTarget()) and - result = "call to ..." - } -} + class MethodApplyExpr extends ApplyExpr { + private MethodLookupExpr method; -class MethodApplyExpr extends ApplyExpr { - private MethodLookupExpr method; + MethodApplyExpr() { method = this.getFunction() } - MethodApplyExpr() { method = this.getFunction() } + override Method getStaticTarget() { result = method.getMethod() } - override Method getStaticTarget() { result = method.getMethod() } - - override Expr getQualifier() { result = method.getBase() } -} + override Expr getQualifier() { result = method.getBase() } + } -private class PartialDotSyntaxBaseIgnoredApplyExpr extends ApplyExpr { - private DotSyntaxBaseIgnoredExpr expr; + private class PartialDotSyntaxBaseIgnoredApplyExpr extends ApplyExpr { + private DotSyntaxBaseIgnoredExpr expr; - PartialDotSyntaxBaseIgnoredApplyExpr() { expr = this.getFunction() } + PartialDotSyntaxBaseIgnoredApplyExpr() { expr = this.getFunction() } - override AutoClosureExpr getStaticTarget() { result = expr.getSubExpr() } + override AutoClosureExpr getStaticTarget() { result = expr.getSubExpr() } - override Expr getQualifier() { result = expr.getQualifier() } + override Expr getQualifier() { result = expr.getQualifier() } - override string toString() { result = "call to " + expr } -} + override string toString() { result = "call to " + expr } + } -private class FullDotSyntaxBaseIgnoredApplyExpr extends ApplyExpr { - private PartialDotSyntaxBaseIgnoredApplyExpr expr; + private class FullDotSyntaxBaseIgnoredApplyExpr extends ApplyExpr { + private PartialDotSyntaxBaseIgnoredApplyExpr expr; - FullDotSyntaxBaseIgnoredApplyExpr() { expr = this.getFunction() } + FullDotSyntaxBaseIgnoredApplyExpr() { expr = this.getFunction() } - override AutoClosureExpr getStaticTarget() { result = expr.getStaticTarget().getExpr() } + override AutoClosureExpr getStaticTarget() { result = expr.getStaticTarget().getExpr() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ArgumentImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ArgumentImpl.qll index d95e410f0815c..dd46a84a21d3c 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ArgumentImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ArgumentImpl.qll @@ -1,10 +1,12 @@ private import codeql.swift.generated.expr.Argument private import codeql.swift.elements.expr.ApplyExpr -class Argument extends Generated::Argument { - override string toString() { result = this.getLabel() + ": " + this.getExpr().toString() } +module Impl { + class Argument extends Generated::Argument { + override string toString() { result = this.getLabel() + ": " + this.getExpr().toString() } - int getIndex() { any(ApplyExpr apply).getArgument(result) = this } + int getIndex() { any(ApplyExpr apply).getArgument(result) = this } - ApplyExpr getApplyExpr() { result.getAnArgument() = this } + ApplyExpr getApplyExpr() { result.getAnArgument() = this } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ArrayExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ArrayExprImpl.qll index 1beef5e34b8ca..e2b04c7c01762 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ArrayExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ArrayExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.ArrayExpr -class ArrayExpr extends Generated::ArrayExpr { - override string toString() { result = "[...]" } +module Impl { + class ArrayExpr extends Generated::ArrayExpr { + override string toString() { result = "[...]" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/AssignExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/AssignExprImpl.qll index 809297b315163..39684d6ced74d 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/AssignExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/AssignExprImpl.qll @@ -1,254 +1,228 @@ private import codeql.swift.generated.expr.AssignExpr private import codeql.swift.elements.expr.BinaryExpr -/** - * An assignment expression. For example: - * ``` - * x = 0 - * y += 1 - * z <<= 1 - * ``` - */ -class Assignment extends Expr { - Assignment() { - this instanceof AssignExpr or - this instanceof AssignArithmeticOperationEx or - this instanceof AssignBitwiseOperationEx or - this instanceof AssignPointwiseOperationEx +module Impl { + /** + * An assignment expression. For example: + * ``` + * x = 0 + * y += 1 + * z <<= 1 + * ``` + */ + abstract class Assignment extends Expr { + /** + * Gets the destination of this assignment. For example `x` in: + * ``` + * x = y + * ``` + */ + Expr getDest() { + result = this.(AssignExpr).getDest() or + result = this.(AssignOperation).getLeftOperand() + } + + /** + * Gets the source of this assignment. For example `y` in: + * ``` + * x = y + * ``` + */ + Expr getSource() { + result = this.(AssignExpr).getSource() or + result = this.(AssignOperation).getRightOperand() + } + + /** + * Holds if this assignment expression uses an overflow operator, that is, + * an operator that truncates overflow rather than reporting an error. + * ``` + * x &+= y + * ``` + */ + predicate hasOverflowOperator() { + this.(AssignOperation).getOperator().getName() = + ["&*=(_:_:)", "&+=(_:_:)", "&-=(_:_:)", "&<<=(_:_:)", "&>>=(_:_:)"] + } } /** - * Gets the destination of this assignment. For example `x` in: + * A simple assignment expression using the `=` operator: * ``` - * x = y + * x = 0 * ``` */ - Expr getDest() { - result = this.(AssignExpr).getDest() or - result = this.(AssignOperation).getLeftOperand() + class AssignExpr extends Generated::AssignExpr { + override string toString() { result = " ... = ..." } } /** - * Gets the source of this assignment. For example `y` in: + * An assignment expression apart from `=`. For example: * ``` - * x = y + * x += 1 + * y &= z * ``` */ - Expr getSource() { - result = this.(AssignExpr).getSource() or - result = this.(AssignOperation).getRightOperand() - } + abstract class AssignOperation extends Assignment, BinaryExpr { } /** - * Holds if this assignment expression uses an overflow operator, that is, - * an operator that truncates overflow rather than reporting an error. + * An arithmetic assignment expression. For example: * ``` - * x &+= y + * x += 1 + * y *= z * ``` */ - predicate hasOverflowOperator() { - this.(AssignOperation).getOperator().getName() = - ["&*=(_:_:)", "&+=(_:_:)", "&-=(_:_:)", "&<<=(_:_:)", "&>>=(_:_:)"] - } -} + abstract class AssignArithmeticOperation extends AssignOperation { } -/** - * A simple assignment expression using the `=` operator: - * ``` - * x = 0 - * ``` - */ -class AssignExpr extends Generated::AssignExpr { - override string toString() { result = " ... = ..." } -} + /** + * A bitwise assignment expression. For example: + * ``` + * x &= y + * z <<= 1 + * ``` + */ + abstract class AssignBitwiseOperation extends AssignOperation { } -/** - * An assignment expression apart from `=`. For example: - * ``` - * x += 1 - * y &= z - * ``` - */ -class AssignOperation extends Assignment, BinaryExpr { - AssignOperation() { - this instanceof AssignArithmeticOperationEx or - this instanceof AssignBitwiseOperationEx or - this instanceof AssignPointwiseOperationEx - } -} + /** + * A pointwise assignment expression. For example: + * ``` + * x .&= y + * ``` + */ + abstract class AssignPointwiseOperation extends AssignOperation { } -/** - * An arithmetic assignment expression. For example: - * ``` - * x += 1 - * y *= z - * ``` - */ -class AssignArithmeticOperation extends AssignOperation instanceof AssignArithmeticOperationEx { } - -/** - * Private abstract class, extended to define the scope of `AssignArithmeticOperation`. - */ -abstract private class AssignArithmeticOperationEx extends BinaryExpr { } - -/** - * A bitwise assignment expression. For example: - * ``` - * x &= y - * z <<= 1 - * ``` - */ -class AssignBitwiseOperation extends AssignOperation instanceof AssignBitwiseOperationEx { } - -/** - * Private abstract class, extended to define the scope of `AssignBitwiseOperation`. - */ -abstract private class AssignBitwiseOperationEx extends BinaryExpr { } - -/** - * A pointwise assignment expression. For example: - * ``` - * x .&= y - * ``` - */ -class AssignPointwiseOperation extends AssignOperation instanceof AssignPointwiseOperationEx { } - -/** - * Private abstract class, extended to define the scope of `AssignPointwiseOperation`. - */ -abstract private class AssignPointwiseOperationEx extends BinaryExpr { } - -/** - * An addition assignment expression: - * ``` - * a += b - * a &+= b - * ``` - */ -class AssignAddExpr extends AssignArithmeticOperationEx { - AssignAddExpr() { this.getOperator().getName() = ["+=(_:_:)", "&+=(_:_:)"] } -} + /** + * An addition assignment expression: + * ``` + * a += b + * a &+= b + * ``` + */ + class AssignAddExpr extends AssignArithmeticOperation { + AssignAddExpr() { this.getOperator().getName() = ["+=(_:_:)", "&+=(_:_:)"] } + } -/** - * A subtraction assignment expression: - * ``` - * a -= b - * a &-= b - * ``` - */ -class AssignSubExpr extends AssignArithmeticOperationEx { - AssignSubExpr() { this.getOperator().getName() = ["-=(_:_:)", "&-=(_:_:)"] } -} + /** + * A subtraction assignment expression: + * ``` + * a -= b + * a &-= b + * ``` + */ + class AssignSubExpr extends AssignArithmeticOperation { + AssignSubExpr() { this.getOperator().getName() = ["-=(_:_:)", "&-=(_:_:)"] } + } -/** - * A multiplication assignment expression: - * ``` - * a *= b - * a &*= b - * ``` - */ -class AssignMulExpr extends AssignArithmeticOperationEx { - AssignMulExpr() { this.getOperator().getName() = ["*=(_:_:)", "&*=(_:_:)"] } -} + /** + * A multiplication assignment expression: + * ``` + * a *= b + * a &*= b + * ``` + */ + class AssignMulExpr extends AssignArithmeticOperation { + AssignMulExpr() { this.getOperator().getName() = ["*=(_:_:)", "&*=(_:_:)"] } + } -/** - * A division assignment expression: - * ``` - * a /= b - * ``` - */ -class AssignDivExpr extends AssignArithmeticOperationEx { - AssignDivExpr() { this.getOperator().getName() = "/=(_:_:)" } -} + /** + * A division assignment expression: + * ``` + * a /= b + * ``` + */ + class AssignDivExpr extends AssignArithmeticOperation { + AssignDivExpr() { this.getOperator().getName() = "/=(_:_:)" } + } -/** - * A remainder assignment expression: - * ``` - * a %= b - * ``` - */ -class AssignRemExpr extends AssignArithmeticOperationEx { - AssignRemExpr() { this.getOperator().getName() = "%=(_:_:)" } -} + /** + * A remainder assignment expression: + * ``` + * a %= b + * ``` + */ + class AssignRemExpr extends AssignArithmeticOperation { + AssignRemExpr() { this.getOperator().getName() = "%=(_:_:)" } + } -/** - * A left-shift assignment expression: - * ``` - * a <<= b - * a &<<= b - * ``` - */ -class AssignLShiftExpr extends AssignBitwiseOperationEx { - AssignLShiftExpr() { this.getOperator().getName() = ["<<=(_:_:)", "&<<=(_:_:)"] } -} + /** + * A left-shift assignment expression: + * ``` + * a <<= b + * a &<<= b + * ``` + */ + class AssignLShiftExpr extends AssignBitwiseOperation { + AssignLShiftExpr() { this.getOperator().getName() = ["<<=(_:_:)", "&<<=(_:_:)"] } + } -/** - * A right-shift assignment expression: - * ``` - * a >>= b - * a &>>= b - * ``` - */ -class AssignRShiftExpr extends AssignBitwiseOperationEx { - AssignRShiftExpr() { this.getOperator().getName() = [">>=(_:_:)", "&>>=(_:_:)"] } -} + /** + * A right-shift assignment expression: + * ``` + * a >>= b + * a &>>= b + * ``` + */ + class AssignRShiftExpr extends AssignBitwiseOperation { + AssignRShiftExpr() { this.getOperator().getName() = [">>=(_:_:)", "&>>=(_:_:)"] } + } -/** - * A bitwise-and assignment expression: - * ``` - * a &= b - * ``` - */ -class AssignAndExpr extends AssignBitwiseOperationEx { - AssignAndExpr() { this.getOperator().getName() = "&=(_:_:)" } -} + /** + * A bitwise-and assignment expression: + * ``` + * a &= b + * ``` + */ + class AssignAndExpr extends AssignBitwiseOperation { + AssignAndExpr() { this.getOperator().getName() = "&=(_:_:)" } + } -/** - * A bitwise-or assignment expression: - * ``` - * a |= b - * ``` - */ -class AssignOrExpr extends AssignBitwiseOperationEx { - AssignOrExpr() { this.getOperator().getName() = "|=(_:_:)" } -} + /** + * A bitwise-or assignment expression: + * ``` + * a |= b + * ``` + */ + class AssignOrExpr extends AssignBitwiseOperation { + AssignOrExpr() { this.getOperator().getName() = "|=(_:_:)" } + } -/** - * A bitwise exclusive-or assignment expression: - * ``` - * a ^= b - * ``` - */ -class AssignXorExpr extends AssignBitwiseOperationEx { - AssignXorExpr() { this.getOperator().getName() = "^=(_:_:)" } -} + /** + * A bitwise exclusive-or assignment expression: + * ``` + * a ^= b + * ``` + */ + class AssignXorExpr extends AssignBitwiseOperation { + AssignXorExpr() { this.getOperator().getName() = "^=(_:_:)" } + } -/** - * A pointwise bitwise-and assignment expression: - * ``` - * a .&= b - * ``` - */ -class AssignPointwiseAndExpr extends AssignPointwiseOperationEx { - AssignPointwiseAndExpr() { this.getOperator().getName() = ".&=(_:_:)" } -} + /** + * A pointwise bitwise-and assignment expression: + * ``` + * a .&= b + * ``` + */ + class AssignPointwiseAndExpr extends AssignPointwiseOperation { + AssignPointwiseAndExpr() { this.getOperator().getName() = ".&=(_:_:)" } + } -/** - * A pointwise bitwise-or assignment expression: - * ``` - * a .|= b - * ``` - */ -class AssignPointwiseOrExpr extends AssignPointwiseOperationEx { - AssignPointwiseOrExpr() { this.getOperator().getName() = ".|=(_:_:)" } -} + /** + * A pointwise bitwise-or assignment expression: + * ``` + * a .|= b + * ``` + */ + class AssignPointwiseOrExpr extends AssignPointwiseOperation { + AssignPointwiseOrExpr() { this.getOperator().getName() = ".|=(_:_:)" } + } -/** - * A pointwise bitwise exclusive-or assignment expression: - * ``` - * a .^= b - * ``` - */ -class AssignPointwiseXorExpr extends AssignPointwiseOperationEx { - AssignPointwiseXorExpr() { this.getOperator().getName() = ".^=(_:_:)" } + /** + * A pointwise bitwise exclusive-or assignment expression: + * ``` + * a .^= b + * ``` + */ + class AssignPointwiseXorExpr extends AssignPointwiseOperation { + AssignPointwiseXorExpr() { this.getOperator().getName() = ".^=(_:_:)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/Assignment.qll b/swift/ql/lib/codeql/swift/elements/expr/Assignment.qll new file mode 100644 index 0000000000000..687bd415c46ab --- /dev/null +++ b/swift/ql/lib/codeql/swift/elements/expr/Assignment.qll @@ -0,0 +1,37 @@ +private import AssignExprImpl + +final class Assignment = Impl::Assignment; + +final class AssignOperation = Impl::AssignOperation; + +final class AssignArithmeticOperation = Impl::AssignArithmeticOperation; + +final class AssignBitwiseOperation = Impl::AssignBitwiseOperation; + +final class AssignPointwiseOperation = Impl::AssignPointwiseOperation; + +final class AssignAddExpr = Impl::AssignAddExpr; + +final class AssignSubExpr = Impl::AssignSubExpr; + +final class AssignMulExpr = Impl::AssignMulExpr; + +final class AssignDivExpr = Impl::AssignDivExpr; + +final class AssignRemExpr = Impl::AssignRemExpr; + +final class AssignLShiftExpr = Impl::AssignLShiftExpr; + +final class AssignRShiftExpr = Impl::AssignRShiftExpr; + +final class AssignAndExpr = Impl::AssignAndExpr; + +final class AssignOrExpr = Impl::AssignOrExpr; + +final class AssignXorExpr = Impl::AssignXorExpr; + +final class AssignPointwiseAndExpr = Impl::AssignPointwiseAndExpr; + +final class AssignPointwiseOrExpr = Impl::AssignPointwiseOrExpr; + +final class AssignPointwiseXorExpr = Impl::AssignPointwiseXorExpr; diff --git a/swift/ql/lib/codeql/swift/elements/expr/AutoClosureExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/AutoClosureExprImpl.qll index 6061db1fdf74c..69633e2dcc7fe 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/AutoClosureExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/AutoClosureExprImpl.qll @@ -2,29 +2,31 @@ private import codeql.swift.generated.expr.AutoClosureExpr private import codeql.swift.elements.stmt.ReturnStmt private import codeql.swift.elements.expr.Expr -/** - * A Swift autoclosure expression, that is, a closure automatically generated - * around an argument when the parameter has the `@autoclosure` attribute or - * for the right-hand operand of short-circuiting logical operations. For - * example, there is an `AutoClosureExpr` around the value `0` in: - * ``` - * func myFunction(_ expr: @autoclosure () -> Int) { - * ... - * } - * - * myFunction(0) - * ``` - */ -class AutoClosureExpr extends Generated::AutoClosureExpr { +module Impl { /** - * Gets the implicit return statement generated by this autoclosure expression. + * A Swift autoclosure expression, that is, a closure automatically generated + * around an argument when the parameter has the `@autoclosure` attribute or + * for the right-hand operand of short-circuiting logical operations. For + * example, there is an `AutoClosureExpr` around the value `0` in: + * ``` + * func myFunction(_ expr: @autoclosure () -> Int) { + * ... + * } + * + * myFunction(0) + * ``` */ - ReturnStmt getReturn() { result = unique( | | this.getBody().getAnElement()) } + class AutoClosureExpr extends Generated::AutoClosureExpr { + /** + * Gets the implicit return statement generated by this autoclosure expression. + */ + ReturnStmt getReturn() { result = unique( | | this.getBody().getAnElement()) } - /** - * Gets the expression returned by this autoclosure expression. - */ - Expr getExpr() { result = this.getReturn().getResult() } + /** + * Gets the expression returned by this autoclosure expression. + */ + Expr getExpr() { result = this.getReturn().getResult() } - override string toString() { result = this.getBody().toString() } + override string toString() { result = this.getBody().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/AwaitExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/AwaitExprImpl.qll index 9aed11c780348..afae7e0bc5bc4 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/AwaitExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/AwaitExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.AwaitExpr -class AwaitExpr extends Generated::AwaitExpr { - override string toString() { result = "await ..." } +module Impl { + class AwaitExpr extends Generated::AwaitExpr { + override string toString() { result = "await ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/BinaryExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/BinaryExprImpl.qll index 88355ad2d6067..e823c08375d87 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/BinaryExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/BinaryExprImpl.qll @@ -2,35 +2,37 @@ private import codeql.swift.generated.expr.BinaryExpr private import codeql.swift.elements.expr.Expr private import codeql.swift.elements.decl.Function -/** - * A Swift binary expression, that is, an expression that appears between its - * two operands. For example: - * ``` - * x + y - * ``` - */ -class BinaryExpr extends Generated::BinaryExpr { +module Impl { /** - * Gets the left operand (left expression) of this binary expression. + * A Swift binary expression, that is, an expression that appears between its + * two operands. For example: + * ``` + * x + y + * ``` */ - Expr getLeftOperand() { result = this.getArgument(0).getExpr() } + class BinaryExpr extends Generated::BinaryExpr { + /** + * Gets the left operand (left expression) of this binary expression. + */ + Expr getLeftOperand() { result = this.getArgument(0).getExpr() } - /** - * Gets the right operand (right expression) of this binary expression. - */ - Expr getRightOperand() { result = this.getArgument(1).getExpr() } + /** + * Gets the right operand (right expression) of this binary expression. + */ + Expr getRightOperand() { result = this.getArgument(1).getExpr() } - /** - * Gets the operator of this binary expression (the function that is called). - */ - Function getOperator() { result = this.getStaticTarget() } + /** + * Gets the operator of this binary expression (the function that is called). + */ + Function getOperator() { result = this.getStaticTarget() } - /** - * Gets an operand of this binary expression (left or right). - */ - Expr getAnOperand() { result = [this.getLeftOperand(), this.getRightOperand()] } + /** + * Gets an operand of this binary expression (left or right). + */ + Expr getAnOperand() { result = [this.getLeftOperand(), this.getRightOperand()] } - override string toString() { result = "... " + this.getFunction().toString() + " ..." } + override string toString() { result = "... " + this.getFunction().toString() + " ..." } - override Function getStaticTarget() { result = super.getStaticTarget() } + override Function getStaticTarget() { result = super.getStaticTarget() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/BindOptionalExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/BindOptionalExprImpl.qll index 44a82c661ed3c..3a50de5166e0a 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/BindOptionalExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/BindOptionalExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.BindOptionalExpr -class BindOptionalExpr extends Generated::BindOptionalExpr { - override string toString() { result = "...?" } +module Impl { + class BindOptionalExpr extends Generated::BindOptionalExpr { + override string toString() { result = "...?" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/BooleanLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/BooleanLiteralExprImpl.qll index 552dbaf880824..abb23239bb2e0 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/BooleanLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/BooleanLiteralExprImpl.qll @@ -1,13 +1,15 @@ private import codeql.swift.generated.expr.BooleanLiteralExpr -/** - * A boolean literal. For example `true` in: - * ``` - * let x = true - * ``` - */ -class BooleanLiteralExpr extends Generated::BooleanLiteralExpr { - override string toString() { result = this.getValue().toString() } +module Impl { + /** + * A boolean literal. For example `true` in: + * ``` + * let x = true + * ``` + */ + class BooleanLiteralExpr extends Generated::BooleanLiteralExpr { + override string toString() { result = this.getValue().toString() } - override string getValueString() { result = this.getValue().toString() } + override string getValueString() { result = this.getValue().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/BuiltinLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/BuiltinLiteralExprImpl.qll index 22de6008e968c..f2d9433e71106 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/BuiltinLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/BuiltinLiteralExprImpl.qll @@ -4,12 +4,14 @@ private import codeql.swift.generated.expr.BuiltinLiteralExpr -/** - * A Swift literal of a kind that is built in to the Swift language. - */ -class BuiltinLiteralExpr extends Generated::BuiltinLiteralExpr { +module Impl { /** - * Gets the value of this literal expression (as a string). + * A Swift literal of a kind that is built in to the Swift language. */ - string getValueString() { none() } + class BuiltinLiteralExpr extends Generated::BuiltinLiteralExpr { + /** + * Gets the value of this literal expression (as a string). + */ + string getValueString() { none() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/CaptureListExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/CaptureListExprImpl.qll index 834684d017304..05cb4ff9725ea 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/CaptureListExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/CaptureListExprImpl.qll @@ -1,11 +1,13 @@ private import codeql.swift.generated.expr.CaptureListExpr private import codeql.swift.elements.pattern.NamedPattern -class CaptureListExpr extends Generated::CaptureListExpr { - override string toString() { result = this.getClosureBody().toString() } +module Impl { + class CaptureListExpr extends Generated::CaptureListExpr { + override string toString() { result = this.getClosureBody().toString() } - override VarDecl getVariable(int index) { - // all capture binding declarations consist of a single named pattern - result = this.getBindingDecl(index).getPattern(0).(NamedPattern).getVarDecl() + override VarDecl getVariable(int index) { + // all capture binding declarations consist of a single named pattern + result = this.getBindingDecl(index).getPattern(0).(NamedPattern).getVarDecl() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ClosureExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ClosureExprImpl.qll index 4b542d9f38d8c..198f22c32e015 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ClosureExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ClosureExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.ClosureExpr -class ClosureExpr extends Generated::ClosureExpr { - override string toString() { result = "{ ... }" } +module Impl { + class ClosureExpr extends Generated::ClosureExpr { + override string toString() { result = "{ ... }" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DeclRefExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DeclRefExprImpl.qll index 8493f85d3c72d..0429b61613073 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DeclRefExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DeclRefExprImpl.qll @@ -1,23 +1,25 @@ private import codeql.swift.generated.expr.DeclRefExpr private import codeql.swift.elements.decl.CapturedDecl -/** - * An expression that references or accesses a declaration. - */ -class DeclRefExpr extends Generated::DeclRefExpr { - override string toString() { - if exists(this.getDecl().toString()) - then result = this.getDecl().toString() - else result = "(unknown declaration)" - } - +module Impl { /** - * Gets the closure capture referenced by this expression, if any. + * An expression that references or accesses a declaration. */ - CapturedDecl getCapturedDecl() { result.getAnAccess() = this } + class DeclRefExpr extends Generated::DeclRefExpr { + override string toString() { + if exists(this.getDecl().toString()) + then result = this.getDecl().toString() + else result = "(unknown declaration)" + } - /** - * Holds if this expression references a closure capture. - */ - predicate hasCapturedDecl() { exists(this.getCapturedDecl()) } + /** + * Gets the closure capture referenced by this expression, if any. + */ + CapturedDecl getCapturedDecl() { result.getAnAccess() = this } + + /** + * Holds if this expression references a closure capture. + */ + predicate hasCapturedDecl() { exists(this.getCapturedDecl()) } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DefaultArgumentExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DefaultArgumentExprImpl.qll index 452beb072c126..21481301dfb91 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DefaultArgumentExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DefaultArgumentExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.DefaultArgumentExpr -class DefaultArgumentExpr extends Generated::DefaultArgumentExpr { - override string toString() { result = "default " + this.getParamDecl().getName() } +module Impl { + class DefaultArgumentExpr extends Generated::DefaultArgumentExpr { + override string toString() { result = "default " + this.getParamDecl().getName() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DictionaryExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DictionaryExprImpl.qll index 4e98d5ac3fa0c..92517497864d0 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DictionaryExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DictionaryExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.DictionaryExpr -class DictionaryExpr extends Generated::DictionaryExpr { - override string toString() { result = "[...]" } +module Impl { + class DictionaryExpr extends Generated::DictionaryExpr { + override string toString() { result = "[...]" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DifferentiableFunctionExtractOriginalExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DifferentiableFunctionExtractOriginalExprImpl.qll index db77a4a3e841b..78ba648cfbcf7 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DifferentiableFunctionExtractOriginalExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DifferentiableFunctionExtractOriginalExprImpl.qll @@ -1,4 +1,6 @@ private import codeql.swift.generated.expr.DifferentiableFunctionExtractOriginalExpr -class DifferentiableFunctionExtractOriginalExpr extends Generated::DifferentiableFunctionExtractOriginalExpr -{ } +module Impl { + class DifferentiableFunctionExtractOriginalExpr extends Generated::DifferentiableFunctionExtractOriginalExpr + { } +} diff --git a/swift/ql/lib/codeql/swift/elements/expr/DiscardAssignmentExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DiscardAssignmentExprImpl.qll index 1a8bd47e69d57..5516e13db11df 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DiscardAssignmentExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DiscardAssignmentExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.DiscardAssignmentExpr -class DiscardAssignmentExpr extends Generated::DiscardAssignmentExpr { - override string toString() { result = "_" } +module Impl { + class DiscardAssignmentExpr extends Generated::DiscardAssignmentExpr { + override string toString() { result = "_" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DotSelfExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DotSelfExprImpl.qll index 378672d9b8fd0..b9652363eb3bc 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DotSelfExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DotSelfExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.DotSelfExpr -class DotSelfExpr extends Generated::DotSelfExpr { - override string toString() { result = ".self" } +module Impl { + class DotSelfExpr extends Generated::DotSelfExpr { + override string toString() { result = ".self" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DotSyntaxBaseIgnoredExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DotSyntaxBaseIgnoredExprImpl.qll index b6993f9e28f1b..3e9a72b37e04a 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DotSyntaxBaseIgnoredExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DotSyntaxBaseIgnoredExprImpl.qll @@ -4,38 +4,40 @@ private import codeql.swift.elements.expr.CallExpr private import codeql.swift.elements.expr.TypeExpr private import codeql.swift.elements.decl.Method -/** - * An expression representing a partially applied lookup of an instance property via the receiver's type object. - * - * An example is the sub-expression `SomeClass.instanceMethod` of - * `SomeClass.instanceMethod(someInstance)(arg, ...)`. - * - * Internally, the Swift compiler desugars this AST node type into a closure expression of the form - * `{ (someInstance: SomeClass) in { (arg, ...) in someInstance.instanceMethod(arg, ...) } }`, - * which in turn can be accessed using the `getSubExpr/0` predicate. - */ -class DotSyntaxBaseIgnoredExpr extends Generated::DotSyntaxBaseIgnoredExpr { - override string toString() { - result = - any(string base | - if exists(this.getQualifier().(TypeExpr).getTypeRepr().toString()) - then base = this.getQualifier().(TypeExpr).getTypeRepr().toString() + "." - else base = "." - ) + this.getMethod() - } - +module Impl { /** - * Gets the underlying instance method that is called when the result of this - * expression is fully applied. + * An expression representing a partially applied lookup of an instance property via the receiver's type object. + * + * An example is the sub-expression `SomeClass.instanceMethod` of + * `SomeClass.instanceMethod(someInstance)(arg, ...)`. + * + * Internally, the Swift compiler desugars this AST node type into a closure expression of the form + * `{ (someInstance: SomeClass) in { (arg, ...) in someInstance.instanceMethod(arg, ...) } }`, + * which in turn can be accessed using the `getSubExpr/0` predicate. */ - Method getMethod() { - result = - this.getSubExpr() - .(AutoClosureExpr) - .getExpr() - .(AutoClosureExpr) - .getExpr() - .(CallExpr) - .getStaticTarget() + class DotSyntaxBaseIgnoredExpr extends Generated::DotSyntaxBaseIgnoredExpr { + override string toString() { + result = + any(string base | + if exists(this.getQualifier().(TypeExpr).getTypeRepr().toString()) + then base = this.getQualifier().(TypeExpr).getTypeRepr().toString() + "." + else base = "." + ) + this.getMethod() + } + + /** + * Gets the underlying instance method that is called when the result of this + * expression is fully applied. + */ + Method getMethod() { + result = + this.getSubExpr() + .(AutoClosureExpr) + .getExpr() + .(AutoClosureExpr) + .getExpr() + .(CallExpr) + .getStaticTarget() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DynamicMemberRefExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DynamicMemberRefExprImpl.qll index 2de645bc4e2b8..7f03f564d0faa 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DynamicMemberRefExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DynamicMemberRefExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.DynamicMemberRefExpr -class DynamicMemberRefExpr extends Generated::DynamicMemberRefExpr { - override string toString() { result = "." + this.getMember().toString() } +module Impl { + class DynamicMemberRefExpr extends Generated::DynamicMemberRefExpr { + override string toString() { result = "." + this.getMember().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DynamicSubscriptExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DynamicSubscriptExprImpl.qll index e054e54f17ff3..fd18ae9f56792 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DynamicSubscriptExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DynamicSubscriptExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.DynamicSubscriptExpr -class DynamicSubscriptExpr extends Generated::DynamicSubscriptExpr { - override string toString() { result = this.getMember().toString() + "[...]" } +module Impl { + class DynamicSubscriptExpr extends Generated::DynamicSubscriptExpr { + override string toString() { result = this.getMember().toString() + "[...]" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/DynamicTypeExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/DynamicTypeExprImpl.qll index 27f2bf489277b..2ed7a8734e227 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/DynamicTypeExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/DynamicTypeExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.DynamicTypeExpr -class DynamicTypeExpr extends Generated::DynamicTypeExpr { - override string toString() { result = "type(of: ...)" } +module Impl { + class DynamicTypeExpr extends Generated::DynamicTypeExpr { + override string toString() { result = "type(of: ...)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/EnumIsCaseExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/EnumIsCaseExprImpl.qll index ae1ea5a0b3d73..941591e77fa61 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/EnumIsCaseExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/EnumIsCaseExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.EnumIsCaseExpr -class EnumIsCaseExpr extends Generated::EnumIsCaseExpr { - override string toString() { result = "... is " + this.getElement().toString() } +module Impl { + class EnumIsCaseExpr extends Generated::EnumIsCaseExpr { + override string toString() { result = "... is " + this.getElement().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ExplicitCastExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ExplicitCastExprImpl.qll index ff608b58ba9c8..9e961502ccd1a 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ExplicitCastExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ExplicitCastExprImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.expr.ExplicitCastExpr -class ExplicitCastExpr extends Generated::ExplicitCastExpr { - override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } +module Impl { + class ExplicitCastExpr extends Generated::ExplicitCastExpr { + override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } - override string toString() { result = "(" + this.getType() + ") ..." } + override string toString() { result = "(" + this.getType() + ") ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ExplicitClosureExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ExplicitClosureExprImpl.qll index d7700f85b2917..573b2fc99115a 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ExplicitClosureExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ExplicitClosureExprImpl.qll @@ -1,8 +1,10 @@ private import codeql.swift.generated.expr.ExplicitClosureExpr -/** - * A Swift explicit closure expr, that is, a closure written using - * `{ ... -> ... in ... }` syntax rather than automatically generated by the - * compiler. - */ -class ExplicitClosureExpr extends Generated::ExplicitClosureExpr { } +module Impl { + /** + * A Swift explicit closure expr, that is, a closure written using + * `{ ... -> ... in ... }` syntax rather than automatically generated by the + * compiler. + */ + class ExplicitClosureExpr extends Generated::ExplicitClosureExpr { } +} diff --git a/swift/ql/lib/codeql/swift/elements/expr/ExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ExprImpl.qll index f348dbe1815aa..d3de2b05c7f38 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ExprImpl.qll @@ -1,27 +1,29 @@ private import codeql.swift.generated.expr.Expr -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * The base class for all expressions in Swift. - */ -class Expr extends Generated::Expr { - final override Expr getResolveStep() { this.convertsFrom(result) } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * The base class for all expressions in Swift. + */ + class Expr extends Generated::Expr { + final override Expr getResolveStep() { this.convertsFrom(result) } - predicate convertsFrom(Expr e) { none() } // overridden by subclasses + predicate convertsFrom(Expr e) { none() } // overridden by subclasses - Expr getConversion() { result.convertsFrom(this) } + Expr getConversion() { result.convertsFrom(this) } - Expr getConversion(int n) { - n = 0 and result = this.getConversion() - or - result = this.getConversion(n - 1).getConversion() - } + Expr getConversion(int n) { + n = 0 and result = this.getConversion() + or + result = this.getConversion(n - 1).getConversion() + } - predicate isConversion() { this.convertsFrom(_) } + predicate isConversion() { this.convertsFrom(_) } - predicate hasConversions() { exists(this.getConversion()) } + predicate hasConversions() { exists(this.getConversion()) } - Expr getFullyConverted() { result = this.getFullyUnresolved() } + Expr getFullyConverted() { result = this.getFullyUnresolved() } - Expr getUnconverted() { result = this.resolve() } + Expr getUnconverted() { result = this.resolve() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/FloatLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/FloatLiteralExprImpl.qll index 527a55c6d231a..c7a7f1c714f40 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/FloatLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/FloatLiteralExprImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.expr.FloatLiteralExpr -class FloatLiteralExpr extends Generated::FloatLiteralExpr { - override string toString() { result = this.getStringValue() } +module Impl { + class FloatLiteralExpr extends Generated::FloatLiteralExpr { + override string toString() { result = this.getStringValue() } - override string getValueString() { result = this.getStringValue() } + override string getValueString() { result = this.getStringValue() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ForceTryExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ForceTryExprImpl.qll index 36e3a395d09bf..2f53e51381516 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ForceTryExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ForceTryExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.ForceTryExpr -class ForceTryExpr extends Generated::ForceTryExpr { - override string toString() { result = "try! ..." } +module Impl { + class ForceTryExpr extends Generated::ForceTryExpr { + override string toString() { result = "try! ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ForceValueExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ForceValueExprImpl.qll index c54455ce7b79b..84e89108c9499 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ForceValueExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ForceValueExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.ForceValueExpr -class ForceValueExpr extends Generated::ForceValueExpr { - override string toString() { result = "...!" } +module Impl { + class ForceValueExpr extends Generated::ForceValueExpr { + override string toString() { result = "...!" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/IdentityExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/IdentityExprImpl.qll index ecfe0dd3e1af7..f51b49e2def08 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/IdentityExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/IdentityExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.IdentityExpr -class IdentityExpr extends Generated::IdentityExpr { - override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } +module Impl { + class IdentityExpr extends Generated::IdentityExpr { + override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/IfExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/IfExprImpl.qll index 3afcc992089ab..359d3ff509456 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/IfExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/IfExprImpl.qll @@ -1,13 +1,15 @@ private import codeql.swift.generated.expr.IfExpr -class IfExpr extends Generated::IfExpr { - Expr getBranch(boolean b) { - b = true and - result = this.getThenExpr() - or - b = false and - result = this.getElseExpr() - } +module Impl { + class IfExpr extends Generated::IfExpr { + Expr getBranch(boolean b) { + b = true and + result = this.getThenExpr() + or + b = false and + result = this.getElseExpr() + } - override string toString() { result = "... ? ... : ..." } + override string toString() { result = "... ? ... : ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ImplicitConversionExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ImplicitConversionExprImpl.qll index 37138ed372427..f4ab0120cf877 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ImplicitConversionExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ImplicitConversionExprImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.expr.ImplicitConversionExpr -class ImplicitConversionExpr extends Generated::ImplicitConversionExpr { - override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } +module Impl { + class ImplicitConversionExpr extends Generated::ImplicitConversionExpr { + override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } - override string toString() { result = "(" + this.getType().toString() + ") ..." } + override string toString() { result = "(" + this.getType().toString() + ") ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/InOutExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/InOutExprImpl.qll index 7326cabfdd939..54acc229a957f 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/InOutExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/InOutExprImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.expr.InOutExpr -class InOutExpr extends Generated::InOutExpr { - override string toString() { result = "&..." } +module Impl { + class InOutExpr extends Generated::InOutExpr { + override string toString() { result = "&..." } - override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } + override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/IntegerLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/IntegerLiteralExprImpl.qll index 45b442ca5cf70..3256c7cd9b361 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/IntegerLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/IntegerLiteralExprImpl.qll @@ -1,13 +1,15 @@ private import codeql.swift.generated.expr.IntegerLiteralExpr -/** - * An integer literal. For example `1` in: - * ``` - * let x = 1 - * ``` - */ -class IntegerLiteralExpr extends Generated::IntegerLiteralExpr { - override string toString() { result = this.getStringValue() } +module Impl { + /** + * An integer literal. For example `1` in: + * ``` + * let x = 1 + * ``` + */ + class IntegerLiteralExpr extends Generated::IntegerLiteralExpr { + override string toString() { result = this.getStringValue() } - override string getValueString() { result = this.getStringValue() } + override string getValueString() { result = this.getStringValue() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/InterpolatedStringLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/InterpolatedStringLiteralExprImpl.qll index f21b4492e8eba..01e2ab92c2ab3 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/InterpolatedStringLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/InterpolatedStringLiteralExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.InterpolatedStringLiteralExpr -class InterpolatedStringLiteralExpr extends Generated::InterpolatedStringLiteralExpr { - override string toString() { result = "\"...\"" } +module Impl { + class InterpolatedStringLiteralExpr extends Generated::InterpolatedStringLiteralExpr { + override string toString() { result = "\"...\"" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/IsExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/IsExprImpl.qll index 8eae10827e2cd..69a5855b017ac 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/IsExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/IsExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.IsExpr -class IsExpr extends Generated::IsExpr { - override string toString() { result = "... is ..." } +module Impl { + class IsExpr extends Generated::IsExpr { + override string toString() { result = "... is ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/KeyPathApplicationExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/KeyPathApplicationExprImpl.qll index 1f996cf1e7d50..f94532ccbcd95 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/KeyPathApplicationExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/KeyPathApplicationExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.KeyPathApplicationExpr -class KeyPathApplicationExpr extends Generated::KeyPathApplicationExpr { - override string toString() { result = "\\...[...]" } +module Impl { + class KeyPathApplicationExpr extends Generated::KeyPathApplicationExpr { + override string toString() { result = "\\...[...]" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/KeyPathDotExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/KeyPathDotExprImpl.qll index 535d393e05774..105644cfed0eb 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/KeyPathDotExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/KeyPathDotExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.KeyPathDotExpr -class KeyPathDotExpr extends Generated::KeyPathDotExpr { - override string toString() { result = "\\...." } +module Impl { + class KeyPathDotExpr extends Generated::KeyPathDotExpr { + override string toString() { result = "\\...." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/KeyPathExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/KeyPathExprImpl.qll index 889fa973f76a1..88a526cc32401 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/KeyPathExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/KeyPathExprImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.expr.KeyPathExpr -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * A key-path expression. - */ -class KeyPathExpr extends Generated::KeyPathExpr { - override string toString() { result = "#keyPath(...)" } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * A key-path expression. + */ + class KeyPathExpr extends Generated::KeyPathExpr { + override string toString() { result = "#keyPath(...)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/LazyInitializationExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/LazyInitializationExprImpl.qll index 43ecade877969..ed81fc84c287a 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/LazyInitializationExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/LazyInitializationExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.LazyInitializationExpr -class LazyInitializationExpr extends Generated::LazyInitializationExpr { - override string toString() { result = this.getSubExpr().toString() } +module Impl { + class LazyInitializationExpr extends Generated::LazyInitializationExpr { + override string toString() { result = this.getSubExpr().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/LiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/LiteralExprImpl.qll index 632d65b8e0f6c..a85174c4b6362 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/LiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/LiteralExprImpl.qll @@ -4,9 +4,11 @@ private import codeql.swift.generated.expr.LiteralExpr -/** - * A Swift literal. - * - * This is the root class for all literals. - */ -class LiteralExpr extends Generated::LiteralExpr { } +module Impl { + /** + * A Swift literal. + * + * This is the root class for all literals. + */ + class LiteralExpr extends Generated::LiteralExpr { } +} diff --git a/swift/ql/lib/codeql/swift/elements/expr/MagicIdentifierLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/MagicIdentifierLiteralExprImpl.qll index acbff48d149d8..3e561f5f5b038 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/MagicIdentifierLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/MagicIdentifierLiteralExprImpl.qll @@ -1,13 +1,15 @@ private import codeql.swift.generated.expr.MagicIdentifierLiteralExpr -/** - * An identifier literal that is expanded at compile time. For example `#file` in: - * ``` - * let x = #file - * ``` - */ -class MagicIdentifierLiteralExpr extends Generated::MagicIdentifierLiteralExpr { - override string toString() { result = "#..." } +module Impl { + /** + * An identifier literal that is expanded at compile time. For example `#file` in: + * ``` + * let x = #file + * ``` + */ + class MagicIdentifierLiteralExpr extends Generated::MagicIdentifierLiteralExpr { + override string toString() { result = "#..." } - override string getValueString() { none() } // TODO: value not yet extracted + override string getValueString() { none() } // TODO: value not yet extracted + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/MakeTemporarilyEscapableExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/MakeTemporarilyEscapableExprImpl.qll index a38e5b3ad293e..e9e036bf055ed 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/MakeTemporarilyEscapableExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/MakeTemporarilyEscapableExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.MakeTemporarilyEscapableExpr -class MakeTemporarilyEscapableExpr extends Generated::MakeTemporarilyEscapableExpr { - override string toString() { result = this.getSubExpr().toString() } +module Impl { + class MakeTemporarilyEscapableExpr extends Generated::MakeTemporarilyEscapableExpr { + override string toString() { result = this.getSubExpr().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/MemberRefExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/MemberRefExprImpl.qll index acbe3cb943c2f..1304062a7a9ed 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/MemberRefExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/MemberRefExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.MemberRefExpr -class MemberRefExpr extends Generated::MemberRefExpr { - override string toString() { result = "." + this.getMember().toString() } +module Impl { + class MemberRefExpr extends Generated::MemberRefExpr { + override string toString() { result = "." + this.getMember().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/MethodApplyExpr.qll b/swift/ql/lib/codeql/swift/elements/expr/MethodApplyExpr.qll new file mode 100644 index 0000000000000..ab5bdf561cbd8 --- /dev/null +++ b/swift/ql/lib/codeql/swift/elements/expr/MethodApplyExpr.qll @@ -0,0 +1,3 @@ +private import ApplyExprImpl + +final class MethodApplyExpr = Impl::MethodApplyExpr; diff --git a/swift/ql/lib/codeql/swift/elements/expr/MethodCallExpr.qll b/swift/ql/lib/codeql/swift/elements/expr/MethodCallExpr.qll index 9bffe97d12962..ac5aa3e2248a0 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/MethodCallExpr.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/MethodCallExpr.qll @@ -1,4 +1,4 @@ -private import ApplyExprExt +private import MethodApplyExpr private import codeql.swift.elements.expr.CallExpr private import codeql.swift.elements.expr.ApplyExpr private import codeql.swift.elements.expr.SuperRefExpr diff --git a/swift/ql/lib/codeql/swift/elements/expr/MethodLookupExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/MethodLookupExprImpl.qll index ba036ddafcf1f..3818817adae11 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/MethodLookupExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/MethodLookupExprImpl.qll @@ -7,25 +7,27 @@ private import codeql.swift.elements.decl.Method private import codeql.swift.generated.Raw private import codeql.swift.generated.Synth -class MethodLookupExpr extends Generated::MethodLookupExpr { - override string toString() { result = "." + this.getMember().toString() } +module Impl { + class MethodLookupExpr extends Generated::MethodLookupExpr { + override string toString() { result = "." + this.getMember().toString() } - override Expr getImmediateBase() { - result = Synth::convertExprFromRaw(this.getUnderlying().getBase()) - } + override Expr getImmediateBase() { + result = Synth::convertExprFromRaw(this.getUnderlying().getBase()) + } - override Decl getMember() { - result = this.getMethodRef().(DeclRefExpr).getDecl() - or - result = this.getMethodRef().(OtherInitializerRefExpr).getInitializer() - } + override Decl getMember() { + result = this.getMethodRef().(DeclRefExpr).getDecl() + or + result = this.getMethodRef().(OtherInitializerRefExpr).getInitializer() + } - override Expr getImmediateMethodRef() { - result = Synth::convertExprFromRaw(this.getUnderlying().getFunction()) - } + override Expr getImmediateMethodRef() { + result = Synth::convertExprFromRaw(this.getUnderlying().getFunction()) + } - Method getMethod() { result = this.getMember() } + Method getMethod() { result = this.getMember() } - cached - private Raw::SelfApplyExpr getUnderlying() { this = Synth::TMethodLookupExpr(result) } + cached + private Raw::SelfApplyExpr getUnderlying() { this = Synth::TMethodLookupExpr(result) } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/NilLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/NilLiteralExprImpl.qll index 6f264279f1e25..a80b29f1ab758 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/NilLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/NilLiteralExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.NilLiteralExpr -class NilLiteralExpr extends Generated::NilLiteralExpr { - override string toString() { result = "nil" } +module Impl { + class NilLiteralExpr extends Generated::NilLiteralExpr { + override string toString() { result = "nil" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ObjCSelectorExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ObjCSelectorExprImpl.qll index f57555858dabc..9d96b84a2f045 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ObjCSelectorExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ObjCSelectorExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.ObjCSelectorExpr -class ObjCSelectorExpr extends Generated::ObjCSelectorExpr { - override string toString() { result = "#selector(...)" } +module Impl { + class ObjCSelectorExpr extends Generated::ObjCSelectorExpr { + override string toString() { result = "#selector(...)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ObjectLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ObjectLiteralExprImpl.qll index 183bdb49310d8..2d29e1a0cf530 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ObjectLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ObjectLiteralExprImpl.qll @@ -1,25 +1,27 @@ private import codeql.swift.generated.expr.ObjectLiteralExpr -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * An instance of `#fileLiteral`, `#imageLiteral` or `#colorLiteral` expressions, which are used in playgrounds. - */ -class ObjectLiteralExpr extends Generated::ObjectLiteralExpr { } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * An instance of `#fileLiteral`, `#imageLiteral` or `#colorLiteral` expressions, which are used in playgrounds. + */ + class ObjectLiteralExpr extends Generated::ObjectLiteralExpr { } -class FileLiteralExpr extends ObjectLiteralExpr { - FileLiteralExpr() { this.getKind() = 0 } + class FileLiteralExpr extends ObjectLiteralExpr { + FileLiteralExpr() { this.getKind() = 0 } - override string toString() { result = "#fileLiteral(...)" } -} + override string toString() { result = "#fileLiteral(...)" } + } -class ImageLiteralExpr extends ObjectLiteralExpr { - ImageLiteralExpr() { this.getKind() = 1 } + class ImageLiteralExpr extends ObjectLiteralExpr { + ImageLiteralExpr() { this.getKind() = 1 } - override string toString() { result = "#imageLiteral(...)" } -} + override string toString() { result = "#imageLiteral(...)" } + } -class ColorLiteralExpr extends ObjectLiteralExpr { - ColorLiteralExpr() { this.getKind() = 2 } + class ColorLiteralExpr extends ObjectLiteralExpr { + ColorLiteralExpr() { this.getKind() = 2 } - override string toString() { result = "#colorLiteral(...)" } + override string toString() { result = "#colorLiteral(...)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/OneWayExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/OneWayExprImpl.qll index 27efdd4d402eb..f69a19547fe77 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/OneWayExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/OneWayExprImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.expr.OneWayExpr -class OneWayExpr extends Generated::OneWayExpr { - override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } +module Impl { + class OneWayExpr extends Generated::OneWayExpr { + override predicate convertsFrom(Expr e) { e = this.getImmediateSubExpr() } - override string toString() { result = this.getSubExpr().toString() } + override string toString() { result = this.getSubExpr().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/OptionalTryExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/OptionalTryExprImpl.qll index 98388c788588f..2e92c82e5a30a 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/OptionalTryExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/OptionalTryExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.OptionalTryExpr -class OptionalTryExpr extends Generated::OptionalTryExpr { - override string toString() { result = "try? ..." } +module Impl { + class OptionalTryExpr extends Generated::OptionalTryExpr { + override string toString() { result = "try? ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/OtherInitializerRefExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/OtherInitializerRefExprImpl.qll index 088dd30f486b1..50c9355f438ef 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/OtherInitializerRefExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/OtherInitializerRefExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.OtherInitializerRefExpr -class OtherInitializerRefExpr extends Generated::OtherInitializerRefExpr { - override string toString() { result = this.getInitializer().toString() } +module Impl { + class OtherInitializerRefExpr extends Generated::OtherInitializerRefExpr { + override string toString() { result = this.getInitializer().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/ParenExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/ParenExprImpl.qll index 072f47dd1bd9a..0db93aeb20c2c 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/ParenExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/ParenExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.ParenExpr -class ParenExpr extends Generated::ParenExpr { - override string toString() { result = "(...)" } +module Impl { + class ParenExpr extends Generated::ParenExpr { + override string toString() { result = "(...)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/PostfixUnaryExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/PostfixUnaryExprImpl.qll index 1358f385fc94d..26a303d6f462e 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/PostfixUnaryExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/PostfixUnaryExprImpl.qll @@ -2,21 +2,23 @@ private import codeql.swift.generated.expr.PostfixUnaryExpr private import codeql.swift.elements.expr.Expr private import codeql.swift.elements.decl.Function -/** - * A Swift postfix unary expression, that is, a unary expression that appears - * after its operand. For example: - * ``` - * x! - * ``` - */ -class PostfixUnaryExpr extends Generated::PostfixUnaryExpr { +module Impl { /** - * Gets the operand (expression) of this postfix unary expression. + * A Swift postfix unary expression, that is, a unary expression that appears + * after its operand. For example: + * ``` + * x! + * ``` */ - Expr getOperand() { result = this.getAnArgument().getExpr() } + class PostfixUnaryExpr extends Generated::PostfixUnaryExpr { + /** + * Gets the operand (expression) of this postfix unary expression. + */ + Expr getOperand() { result = this.getAnArgument().getExpr() } - /** - * Gets the operator of this postfix unary expression (the function that is called). - */ - Function getOperator() { result = this.getStaticTarget() } + /** + * Gets the operator of this postfix unary expression (the function that is called). + */ + Function getOperator() { result = this.getStaticTarget() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/PrefixUnaryExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/PrefixUnaryExprImpl.qll index 64b01eb263970..18dda27d4d59c 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/PrefixUnaryExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/PrefixUnaryExprImpl.qll @@ -2,23 +2,25 @@ private import codeql.swift.generated.expr.PrefixUnaryExpr private import codeql.swift.elements.expr.Expr private import codeql.swift.elements.decl.Function -/** - * A Swift prefix unary expression, that is, a unary expression that appears - * before its operand. For example: - * ``` - * -x - * ``` - */ -class PrefixUnaryExpr extends Generated::PrefixUnaryExpr { +module Impl { /** - * Gets the operand (expression) of this prefix unary expression. + * A Swift prefix unary expression, that is, a unary expression that appears + * before its operand. For example: + * ``` + * -x + * ``` */ - Expr getOperand() { result = this.getAnArgument().getExpr() } + class PrefixUnaryExpr extends Generated::PrefixUnaryExpr { + /** + * Gets the operand (expression) of this prefix unary expression. + */ + Expr getOperand() { result = this.getAnArgument().getExpr() } - /** - * Gets the operator of this prefix unary expression (the function that is called). - */ - Function getOperator() { result = this.getStaticTarget() } + /** + * Gets the operator of this prefix unary expression (the function that is called). + */ + Function getOperator() { result = this.getStaticTarget() } - override Function getStaticTarget() { result = super.getStaticTarget() } + override Function getStaticTarget() { result = super.getStaticTarget() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/RebindSelfInInitializerExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/RebindSelfInInitializerExprImpl.qll index 25d20434189e0..7b74336ceedf7 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/RebindSelfInInitializerExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/RebindSelfInInitializerExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.RebindSelfInInitializerExpr -class RebindSelfInInitializerExpr extends Generated::RebindSelfInInitializerExpr { - override string toString() { result = "self = ..." } +module Impl { + class RebindSelfInInitializerExpr extends Generated::RebindSelfInInitializerExpr { + override string toString() { result = "self = ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/RegexLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/RegexLiteralExprImpl.qll index af8e18e42ee37..8d2271838aef1 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/RegexLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/RegexLiteralExprImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.expr.RegexLiteralExpr -// the following QLdoc is generated: if you need to edit it, do it in the schema file -/** - * A regular expression literal which is checked at compile time, for example `/a(a|b)*b/`. - */ -class RegexLiteralExpr extends Generated::RegexLiteralExpr { - override string toString() { result = this.getPattern() } +module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file + /** + * A regular expression literal which is checked at compile time, for example `/a(a|b)*b/`. + */ + class RegexLiteralExpr extends Generated::RegexLiteralExpr { + override string toString() { result = this.getPattern() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/StringLiteralExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/StringLiteralExprImpl.qll index c3ead49febbed..3e8f6e7592ec0 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/StringLiteralExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/StringLiteralExprImpl.qll @@ -1,13 +1,15 @@ private import codeql.swift.generated.expr.StringLiteralExpr -/** - * A string literal. For example `"abc"` in: - * ``` - * let x = "abc" - * ``` - */ -class StringLiteralExpr extends Generated::StringLiteralExpr { - override string toString() { result = this.getValue() } +module Impl { + /** + * A string literal. For example `"abc"` in: + * ``` + * let x = "abc" + * ``` + */ + class StringLiteralExpr extends Generated::StringLiteralExpr { + override string toString() { result = this.getValue() } - override string getValueString() { result = this.getValue() } + override string getValueString() { result = this.getValue() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/SubscriptExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/SubscriptExprImpl.qll index 143e18523f823..34e19ccfe61c4 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/SubscriptExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/SubscriptExprImpl.qll @@ -1,19 +1,21 @@ private import codeql.swift.generated.expr.SubscriptExpr -class SubscriptExpr extends Generated::SubscriptExpr { - Argument getFirstArgument() { - exists(int i | - result = this.getArgument(i) and - not exists(this.getArgument(i - 1)) - ) - } +module Impl { + class SubscriptExpr extends Generated::SubscriptExpr { + Argument getFirstArgument() { + exists(int i | + result = this.getArgument(i) and + not exists(this.getArgument(i - 1)) + ) + } - Argument getLastArgument() { - exists(int i | - result = this.getArgument(i) and - not exists(this.getArgument(i + 1)) - ) - } + Argument getLastArgument() { + exists(int i | + result = this.getArgument(i) and + not exists(this.getArgument(i + 1)) + ) + } - override string toString() { result = "...[...]" } + override string toString() { result = "...[...]" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/SuperRefExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/SuperRefExprImpl.qll index 5931f68488b21..d1afe5938967f 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/SuperRefExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/SuperRefExprImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.expr.SuperRefExpr private import codeql.swift.elements.decl.Method -/** A reference to `super`. */ -class SuperRefExpr extends Generated::SuperRefExpr { - override string toString() { result = "super" } +module Impl { + /** A reference to `super`. */ + class SuperRefExpr extends Generated::SuperRefExpr { + override string toString() { result = "super" } - Method getDeclaringMethod() { this.getSelf() = result.getSelfParam() } + Method getDeclaringMethod() { this.getSelf() = result.getSelfParam() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/TapExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/TapExprImpl.qll index 9dc8f0a44a424..2d109e0f2b625 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/TapExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/TapExprImpl.qll @@ -1,11 +1,13 @@ private import codeql.swift.generated.expr.TapExpr -/** - * A `TapExpr` is an internal expression generated by the Swift compiler. - * - * If `e` is a `TapExpr`, the semantics of evaluating `e` is: - * 1. Create a local variable `e.getVar()` and assign it the value `e.getSubExpr()`. - * 2. Execute `e.getBody()` which potentially modifies the local variable. - * 3. Return the value of the local variable. - */ -class TapExpr extends Generated::TapExpr { } +module Impl { + /** + * A `TapExpr` is an internal expression generated by the Swift compiler. + * + * If `e` is a `TapExpr`, the semantics of evaluating `e` is: + * 1. Create a local variable `e.getVar()` and assign it the value `e.getSubExpr()`. + * 2. Execute `e.getBody()` which potentially modifies the local variable. + * 3. Return the value of the local variable. + */ + class TapExpr extends Generated::TapExpr { } +} diff --git a/swift/ql/lib/codeql/swift/elements/expr/TryExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/TryExprImpl.qll index 88f3955ba45e4..b372e4f22e7b9 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/TryExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/TryExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.TryExpr -class TryExpr extends Generated::TryExpr { - override string toString() { result = "try ..." } +module Impl { + class TryExpr extends Generated::TryExpr { + override string toString() { result = "try ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/TupleElementExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/TupleElementExprImpl.qll index d2dd365234af5..18ff29f6832d6 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/TupleElementExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/TupleElementExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.TupleElementExpr -class TupleElementExpr extends Generated::TupleElementExpr { - override string toString() { result = "." + this.getIndex() } +module Impl { + class TupleElementExpr extends Generated::TupleElementExpr { + override string toString() { result = "." + this.getIndex() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/TupleExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/TupleExprImpl.qll index 0431ad5eb58fe..f2322ef2de1f3 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/TupleExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/TupleExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.TupleExpr -class TupleExpr extends Generated::TupleExpr { - override string toString() { result = "(...)" } +module Impl { + class TupleExpr extends Generated::TupleExpr { + override string toString() { result = "(...)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/TypeExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/TypeExprImpl.qll index 1930c055f1c98..d2e3ad63ebeeb 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/TypeExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/TypeExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.TypeExpr -class TypeExpr extends Generated::TypeExpr { - override string toString() { result = this.getType().toString() } +module Impl { + class TypeExpr extends Generated::TypeExpr { + override string toString() { result = this.getType().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/UnresolvedDeclRefExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/UnresolvedDeclRefExprImpl.qll index 879ca417e7b25..92a534e9226ff 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/UnresolvedDeclRefExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/UnresolvedDeclRefExprImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.expr.UnresolvedDeclRefExpr -class UnresolvedDeclRefExpr extends Generated::UnresolvedDeclRefExpr { - override string toString() { - result = this.getName() + " (unresolved)" - or - not this.hasName() and result = "(unresolved)" +module Impl { + class UnresolvedDeclRefExpr extends Generated::UnresolvedDeclRefExpr { + override string toString() { + result = this.getName() + " (unresolved)" + or + not this.hasName() and result = "(unresolved)" + } } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/UnresolvedDotExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/UnresolvedDotExprImpl.qll index 82dcc0b4eec68..4ecd37ad0f72f 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/UnresolvedDotExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/UnresolvedDotExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.UnresolvedDotExpr -class UnresolvedDotExpr extends Generated::UnresolvedDotExpr { - override string toString() { result = "... ." + this.getName() } +module Impl { + class UnresolvedDotExpr extends Generated::UnresolvedDotExpr { + override string toString() { result = "... ." + this.getName() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/expr/VarargExpansionExprImpl.qll b/swift/ql/lib/codeql/swift/elements/expr/VarargExpansionExprImpl.qll index 2547237c1e8ab..98ceee8e8e7b6 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/VarargExpansionExprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/VarargExpansionExprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.expr.VarargExpansionExpr -class VarargExpansionExpr extends Generated::VarargExpansionExpr { - override string toString() { result = this.getSubExpr().toString() } +module Impl { + class VarargExpansionExpr extends Generated::VarargExpansionExpr { + override string toString() { result = this.getSubExpr().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/AnyPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/AnyPatternImpl.qll index 0f57e9c7f832c..98e755da2c618 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/AnyPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/AnyPatternImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.pattern.AnyPattern -class AnyPattern extends Generated::AnyPattern { - override string toString() { result = "_" } +module Impl { + class AnyPattern extends Generated::AnyPattern { + override string toString() { result = "_" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/BindingPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/BindingPatternImpl.qll index 9f0cd057c3d6f..b896afe519020 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/BindingPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/BindingPatternImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.pattern.BindingPattern -class BindingPattern extends Generated::BindingPattern { - final override Pattern getResolveStep() { result = this.getImmediateSubPattern() } +module Impl { + class BindingPattern extends Generated::BindingPattern { + final override Pattern getResolveStep() { result = this.getImmediateSubPattern() } - override string toString() { result = "let ..." } + override string toString() { result = "let ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/BoolPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/BoolPatternImpl.qll index bbe3e57291f7e..471993c4b3b8b 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/BoolPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/BoolPatternImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.pattern.BoolPattern -class BoolPattern extends Generated::BoolPattern { - override string toString() { result = this.getValue().toString() } +module Impl { + class BoolPattern extends Generated::BoolPattern { + override string toString() { result = this.getValue().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/EnumElementPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/EnumElementPatternImpl.qll index 7321341abf2f9..c46a0b85a0886 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/EnumElementPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/EnumElementPatternImpl.qll @@ -1,22 +1,24 @@ private import codeql.swift.generated.pattern.EnumElementPattern private import codeql.swift.elements.pattern.TuplePattern -class EnumElementPattern extends Generated::EnumElementPattern { - /** - * Gets the `i`th element (0-based) of this enum element's tuple - * sub-pattern, if any, or the sub-pattern itself if it is not a tuple pattern. - */ - Pattern getSubPattern(int i) { - result = this.getSubPattern().(TuplePattern).getElement(i) - or - not this.getSubPattern() instanceof TuplePattern and - result = this.getSubPattern() and - i = 0 - } +module Impl { + class EnumElementPattern extends Generated::EnumElementPattern { + /** + * Gets the `i`th element (0-based) of this enum element's tuple + * sub-pattern, if any, or the sub-pattern itself if it is not a tuple pattern. + */ + Pattern getSubPattern(int i) { + result = this.getSubPattern().(TuplePattern).getElement(i) + or + not this.getSubPattern() instanceof TuplePattern and + result = this.getSubPattern() and + i = 0 + } - override string toString() { - if this.hasSubPattern() - then result = "." + this.getElement().toString() + "(...)" - else result = "." + this.getElement().toString() + override string toString() { + if this.hasSubPattern() + then result = "." + this.getElement().toString() + "(...)" + else result = "." + this.getElement().toString() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/ExprPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/ExprPatternImpl.qll index 16e0d3f024bfe..e313a5ce10da0 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/ExprPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/ExprPatternImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.pattern.ExprPattern -class ExprPattern extends Generated::ExprPattern { - override string toString() { result = "=~ ..." } +module Impl { + class ExprPattern extends Generated::ExprPattern { + override string toString() { result = "=~ ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/IsPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/IsPatternImpl.qll index c594952d83f53..9fb6e84cc2388 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/IsPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/IsPatternImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.pattern.IsPattern -class IsPattern extends Generated::IsPattern { - override string toString() { result = "... is ..." } +module Impl { + class IsPattern extends Generated::IsPattern { + override string toString() { result = "... is ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/NamedPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/NamedPatternImpl.qll index 689ebb8ab2953..fc6ebb52e7a6e 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/NamedPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/NamedPatternImpl.qll @@ -1,24 +1,26 @@ private import codeql.swift.generated.pattern.NamedPattern private import codeql.swift.elements.decl.VarDecl -/** - * A pattern that corresponds to a fresh variable binding. - * - * For example, `x` as in `if case let .some(x) = ...` is a `NamedPattern`, - * whereas `y` as in `if case .some(y) = ...` is instead an `ExprPattern`. - */ -class NamedPattern extends Generated::NamedPattern { +module Impl { /** - * Holds if this named pattern has a corresponding `VarDecl`, which is currently always true. + * A pattern that corresponds to a fresh variable binding. * - * DEPRECATED: unless there was a compilation error, this will always hold. + * For example, `x` as in `if case let .some(x) = ...` is a `NamedPattern`, + * whereas `y` as in `if case .some(y) = ...` is instead an `ExprPattern`. */ - deprecated predicate hasVarDecl() { exists(this.getVarDecl()) } + class NamedPattern extends Generated::NamedPattern { + /** + * Holds if this named pattern has a corresponding `VarDecl`, which is currently always true. + * + * DEPRECATED: unless there was a compilation error, this will always hold. + */ + deprecated predicate hasVarDecl() { exists(this.getVarDecl()) } - /** - * Gets the name of the variable bound by this pattern. - */ - string getName() { result = this.getVarDecl().getName() } + /** + * Gets the name of the variable bound by this pattern. + */ + string getName() { result = this.getVarDecl().getName() } - override string toString() { result = this.getName() } + override string toString() { result = this.getName() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/OptionalSomePatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/OptionalSomePatternImpl.qll index 870e24766a091..1c8aee702b009 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/OptionalSomePatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/OptionalSomePatternImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.pattern.OptionalSomePattern -class OptionalSomePattern extends Generated::OptionalSomePattern { - override string toString() { result = "let ...?" } +module Impl { + class OptionalSomePattern extends Generated::OptionalSomePattern { + override string toString() { result = "let ...?" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/ParenPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/ParenPatternImpl.qll index 40ffc318df1e7..fd5c9ab544317 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/ParenPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/ParenPatternImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.pattern.ParenPattern -class ParenPattern extends Generated::ParenPattern { - final override Pattern getResolveStep() { result = this.getImmediateSubPattern() } +module Impl { + class ParenPattern extends Generated::ParenPattern { + final override Pattern getResolveStep() { result = this.getImmediateSubPattern() } - override string toString() { result = "(...)" } + override string toString() { result = "(...)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/PatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/PatternImpl.qll index 5136ee7123441..173254b84b3b4 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/PatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/PatternImpl.qll @@ -18,94 +18,96 @@ private import codeql.swift.elements.decl.PatternBindingDecl private import codeql.swift.elements.decl.EnumElementDecl private import codeql.swift.generated.ParentChild -/** - * A syntactic construct that can be matched against an expression, - * occurring in switch cases, conditions, and variable bindings. - */ -class Pattern extends Generated::Pattern { +module Impl { /** - * Gets the expression that this top-level pattern is matched against, if any. - * - * For example, in `switch e { case p: ... }`, the pattern `p` - * is immediately matched against the expression `e`. + * A syntactic construct that can be matched against an expression, + * occurring in switch cases, conditions, and variable bindings. */ - Expr getImmediateMatchingExpr() { - exists(ConditionElement c | - c.getPattern() = this and - result = c.getInitializer() - ) - or - exists(SwitchStmt s | - s.getExpr() = result and - s.getACase().getALabel().getPattern() = this - ) - or - exists(PatternBindingDecl v, int i | - v.getPattern(i) = pragma[only_bind_out](this) and - result = v.getInit(i) - ) - } + class Pattern extends Generated::Pattern { + /** + * Gets the expression that this top-level pattern is matched against, if any. + * + * For example, in `switch e { case p: ... }`, the pattern `p` + * is immediately matched against the expression `e`. + */ + Expr getImmediateMatchingExpr() { + exists(ConditionElement c | + c.getPattern() = this and + result = c.getInitializer() + ) + or + exists(SwitchStmt s | + s.getExpr() = result and + s.getACase().getALabel().getPattern() = this + ) + or + exists(PatternBindingDecl v, int i | + v.getPattern(i) = pragma[only_bind_out](this) and + result = v.getInit(i) + ) + } - /** - * Gets the expression that this pattern is matched against, if any. - * The expression and the pattern need not be top-level children of - * a pattern-matching construct, but they must match each other syntactically. - * - * For example, in `switch .some(e) { case let .some(p): ... }`, the pattern `p` - * is matched against the expression `e`. - */ - pragma[nomagic] - Expr getMatchingExpr() { - result = this.getImmediateMatchingExpr() - or - exists(Pattern p | p.getMatchingExpr() = result | - this = p.(IsPattern).getSubPattern() + /** + * Gets the expression that this pattern is matched against, if any. + * The expression and the pattern need not be top-level children of + * a pattern-matching construct, but they must match each other syntactically. + * + * For example, in `switch .some(e) { case let .some(p): ... }`, the pattern `p` + * is matched against the expression `e`. + */ + pragma[nomagic] + Expr getMatchingExpr() { + result = this.getImmediateMatchingExpr() or - this = p.(OptionalSomePattern).getSubPattern() + exists(Pattern p | p.getMatchingExpr() = result | + this = p.(IsPattern).getSubPattern() + or + this = p.(OptionalSomePattern).getSubPattern() + or + this = p.(TypedPattern).getSubPattern() + ) or - this = p.(TypedPattern).getSubPattern() - ) - or - exists(TuplePattern p, TupleExpr e, int i | - p.getMatchingExpr() = e and - this = p.getElement(i) and - result = e.getElement(i) - ) - or - exists(EnumElementPattern p, EnumElementExpr e, int i | - p.getMatchingExpr() = e and - this = p.getSubPattern(i) and - result = e.getArgument(i).getExpr() and - p.getElement() = e.getElement() - ) - } + exists(TuplePattern p, TupleExpr e, int i | + p.getMatchingExpr() = e and + this = p.getElement(i) and + result = e.getElement(i) + ) + or + exists(EnumElementPattern p, EnumElementExpr e, int i | + p.getMatchingExpr() = e and + this = p.getSubPattern(i) and + result = e.getArgument(i).getExpr() and + p.getElement() = e.getElement() + ) + } - /** Holds if this pattern is matched against an expression. */ - final predicate hasMatchingExpr() { exists(this.getMatchingExpr()) } + /** Holds if this pattern is matched against an expression. */ + final predicate hasMatchingExpr() { exists(this.getMatchingExpr()) } - /** - * Gets the parent pattern of this pattern, if any. - */ - final Pattern getEnclosingPattern() { - result = this.getFullyUnresolved().(Pattern).getImmediateEnclosingPattern() - } + /** + * Gets the parent pattern of this pattern, if any. + */ + final Pattern getEnclosingPattern() { + result = this.getFullyUnresolved().(Pattern).getImmediateEnclosingPattern() + } - /** - * Gets the parent pattern of this pattern, if any. - */ - Pattern getImmediateEnclosingPattern() { - this = result.(EnumElementPattern).getImmediateSubPattern() - or - this = result.(OptionalSomePattern).getImmediateSubPattern() - or - this = result.(TuplePattern).getImmediateElement(_) - or - this = result.(BindingPattern).getImmediateSubPattern() - or - this = result.(IsPattern).getImmediateSubPattern() - or - this = result.(ParenPattern).getImmediateSubPattern() - or - this = result.(TypedPattern).getImmediateSubPattern() + /** + * Gets the parent pattern of this pattern, if any. + */ + Pattern getImmediateEnclosingPattern() { + this = result.(EnumElementPattern).getImmediateSubPattern() + or + this = result.(OptionalSomePattern).getImmediateSubPattern() + or + this = result.(TuplePattern).getImmediateElement(_) + or + this = result.(BindingPattern).getImmediateSubPattern() + or + this = result.(IsPattern).getImmediateSubPattern() + or + this = result.(ParenPattern).getImmediateSubPattern() + or + this = result.(TypedPattern).getImmediateSubPattern() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/TuplePatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/TuplePatternImpl.qll index 03579631ca0a7..6ed969e4a106c 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/TuplePatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/TuplePatternImpl.qll @@ -1,14 +1,16 @@ private import codeql.swift.generated.pattern.TuplePattern -class TuplePattern extends Generated::TuplePattern { - Pattern getFirstElement() { result = this.getElement(0) } +module Impl { + class TuplePattern extends Generated::TuplePattern { + Pattern getFirstElement() { result = this.getElement(0) } - Pattern getLastElement() { - exists(int i | - result = this.getElement(i) and - not exists(this.getElement(i + 1)) - ) - } + Pattern getLastElement() { + exists(int i | + result = this.getElement(i) and + not exists(this.getElement(i + 1)) + ) + } - override string toString() { result = "(...)" } + override string toString() { result = "(...)" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/pattern/TypedPatternImpl.qll b/swift/ql/lib/codeql/swift/elements/pattern/TypedPatternImpl.qll index 852437a60f1f2..49b905f8d643d 100644 --- a/swift/ql/lib/codeql/swift/elements/pattern/TypedPatternImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/pattern/TypedPatternImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.pattern.TypedPattern -class TypedPattern extends Generated::TypedPattern { - override string toString() { - if exists(this.getSubPattern()) then result = "... as ..." else result = "is ..." +module Impl { + class TypedPattern extends Generated::TypedPattern { + override string toString() { + if exists(this.getSubPattern()) then result = "... as ..." else result = "is ..." + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/BraceStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/BraceStmtImpl.qll index 87bbfac852863..6f4cdbd377423 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/BraceStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/BraceStmtImpl.qll @@ -1,33 +1,35 @@ private import codeql.swift.generated.stmt.BraceStmt -class BraceStmt extends Generated::BraceStmt { - AstNode getFirstElement() { result = this.getElement(0) } +module Impl { + class BraceStmt extends Generated::BraceStmt { + AstNode getFirstElement() { result = this.getElement(0) } - AstNode getLastElement() { - exists(int i | - result = this.getElement(i) and - not exists(this.getElement(i + 1)) - ) - } + AstNode getLastElement() { + exists(int i | + result = this.getElement(i) and + not exists(this.getElement(i + 1)) + ) + } - override string toString() { result = "{ ... }" } + override string toString() { result = "{ ... }" } - override AstNode getImmediateElement(int index) { - result = - rank[index + 1](AstNode element, int i | - element = super.getImmediateElement(i) and - not element instanceof VarDecl - | - element order by i - ) - } + override AstNode getImmediateElement(int index) { + result = + rank[index + 1](AstNode element, int i | + element = super.getImmediateElement(i) and + not element instanceof VarDecl + | + element order by i + ) + } - override VarDecl getVariable(int index) { - result = - rank[index + 1](VarDecl variable, int i | - variable = super.getImmediateElement(i) - | - variable order by i - ) + override VarDecl getVariable(int index) { + result = + rank[index + 1](VarDecl variable, int i | + variable = super.getImmediateElement(i) + | + variable order by i + ) + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/BreakStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/BreakStmtImpl.qll index a92663eb72474..6f1b58aecd4e8 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/BreakStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/BreakStmtImpl.qll @@ -1,10 +1,12 @@ private import codeql.swift.generated.stmt.BreakStmt -class BreakStmt extends Generated::BreakStmt { - override string toString() { - result = "break " + this.getTargetName() - or - not this.hasTargetName() and - result = "break" +module Impl { + class BreakStmt extends Generated::BreakStmt { + override string toString() { + result = "break " + this.getTargetName() + or + not this.hasTargetName() and + result = "break" + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/CaseLabelItemImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/CaseLabelItemImpl.qll index bdd176d322a86..003d2b342b162 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/CaseLabelItemImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/CaseLabelItemImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.stmt.CaseLabelItem -class CaseLabelItem extends Generated::CaseLabelItem { - override string toString() { - if this.hasGuard() - then result = this.getPattern().toString() + " where ..." - else result = this.getPattern().toString() +module Impl { + class CaseLabelItem extends Generated::CaseLabelItem { + override string toString() { + if this.hasGuard() + then result = this.getPattern().toString() + " where ..." + else result = this.getPattern().toString() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/CaseStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/CaseStmtImpl.qll index 6236178ebb38b..17b9b64621444 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/CaseStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/CaseStmtImpl.qll @@ -1,14 +1,16 @@ private import codeql.swift.generated.stmt.CaseStmt -class CaseStmt extends Generated::CaseStmt { - CaseLabelItem getFirstLabel() { result = this.getLabel(0) } +module Impl { + class CaseStmt extends Generated::CaseStmt { + CaseLabelItem getFirstLabel() { result = this.getLabel(0) } - CaseLabelItem getLastLabel() { - exists(int i | - result = this.getLabel(i) and - not exists(this.getLabel(i + 1)) - ) - } + CaseLabelItem getLastLabel() { + exists(int i | + result = this.getLabel(i) and + not exists(this.getLabel(i + 1)) + ) + } - override string toString() { result = "case ..." } + override string toString() { result = "case ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/ConditionElementImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/ConditionElementImpl.qll index 2ee722f58a213..72740933998de 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/ConditionElementImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/ConditionElementImpl.qll @@ -1,12 +1,14 @@ private import codeql.swift.generated.stmt.ConditionElement private import codeql.swift.elements.AstNode -class ConditionElement extends Generated::ConditionElement { - override string toString() { - result = this.getBoolean().toString() - or - result = this.getPattern().toString() + " = ... " - or - result = this.getAvailability().toString() +module Impl { + class ConditionElement extends Generated::ConditionElement { + override string toString() { + result = this.getBoolean().toString() + or + result = this.getPattern().toString() + " = ... " + or + result = this.getAvailability().toString() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/ContinueStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/ContinueStmtImpl.qll index 44311720dd631..58747a44e4205 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/ContinueStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/ContinueStmtImpl.qll @@ -1,10 +1,12 @@ private import codeql.swift.generated.stmt.ContinueStmt -class ContinueStmt extends Generated::ContinueStmt { - override string toString() { - result = "continue " + this.getTargetName() - or - not this.hasTargetName() and - result = "continue" +module Impl { + class ContinueStmt extends Generated::ContinueStmt { + override string toString() { + result = "continue " + this.getTargetName() + or + not this.hasTargetName() and + result = "continue" + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/DeferStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/DeferStmtImpl.qll index 2f10e41750662..97e565d4160f8 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/DeferStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/DeferStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.DeferStmt -class DeferStmt extends Generated::DeferStmt { - override string toString() { result = "defer { ... }" } +module Impl { + class DeferStmt extends Generated::DeferStmt { + override string toString() { result = "defer { ... }" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/DoCatchStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/DoCatchStmtImpl.qll index 3795087b97bd8..20fb2b8ddbc39 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/DoCatchStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/DoCatchStmtImpl.qll @@ -1,14 +1,16 @@ private import codeql.swift.generated.stmt.DoCatchStmt -class DoCatchStmt extends Generated::DoCatchStmt { - CaseStmt getFirstCatch() { result = this.getCatch(0) } +module Impl { + class DoCatchStmt extends Generated::DoCatchStmt { + CaseStmt getFirstCatch() { result = this.getCatch(0) } - CaseStmt getLastCatch() { - exists(int i | - result = this.getCatch(i) and - not exists(this.getCatch(i + 1)) - ) - } + CaseStmt getLastCatch() { + exists(int i | + result = this.getCatch(i) and + not exists(this.getCatch(i + 1)) + ) + } - override string toString() { result = "do { ... } catch { ... }" } + override string toString() { result = "do { ... } catch { ... }" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/DoStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/DoStmtImpl.qll index 275f5dd53adbd..0e43521181fa5 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/DoStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/DoStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.DoStmt -class DoStmt extends Generated::DoStmt { - override string toString() { result = "do { ... }" } +module Impl { + class DoStmt extends Generated::DoStmt { + override string toString() { result = "do { ... }" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/FailStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/FailStmtImpl.qll index 8fa73e170c8cf..9ab2240102eb1 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/FailStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/FailStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.FailStmt -class FailStmt extends Generated::FailStmt { - override string toString() { result = "fail" } +module Impl { + class FailStmt extends Generated::FailStmt { + override string toString() { result = "fail" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/FallthroughStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/FallthroughStmtImpl.qll index 8ee330c72f900..85fa9e95a6550 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/FallthroughStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/FallthroughStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.FallthroughStmt -class FallthroughStmt extends Generated::FallthroughStmt { - override string toString() { result = "fallthrough" } +module Impl { + class FallthroughStmt extends Generated::FallthroughStmt { + override string toString() { result = "fallthrough" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/ForEachStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/ForEachStmtImpl.qll index e42f13e5664bb..bc8d67d013358 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/ForEachStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/ForEachStmtImpl.qll @@ -1,14 +1,16 @@ private import codeql.swift.generated.stmt.ForEachStmt -class ForEachStmt extends Generated::ForEachStmt { - override string toString() { - if this.hasWhere() - then result = "for ... in ... where ... { ... }" - else result = "for ... in ... { ... }" - } +module Impl { + class ForEachStmt extends Generated::ForEachStmt { + override string toString() { + if this.hasWhere() + then result = "for ... in ... where ... { ... }" + else result = "for ... in ... { ... }" + } - /** - * Gets the sequence which this statement is iterating over. - */ - final Expr getSequence() { result = this.getIteratorVar().getInit(0) } + /** + * Gets the sequence which this statement is iterating over. + */ + final Expr getSequence() { result = this.getIteratorVar().getInit(0) } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/GuardStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/GuardStmtImpl.qll index f3566ec40749b..d2281c8ef592c 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/GuardStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/GuardStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.GuardStmt -class GuardStmt extends Generated::GuardStmt { - override string toString() { result = "guard ... else { ... }" } +module Impl { + class GuardStmt extends Generated::GuardStmt { + override string toString() { result = "guard ... else { ... }" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/IfStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/IfStmtImpl.qll index 79da7b2441414..8d13496319821 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/IfStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/IfStmtImpl.qll @@ -1,22 +1,24 @@ private import codeql.swift.generated.stmt.IfStmt private import codeql.swift.elements.stmt.ConditionElement -class IfStmt extends Generated::IfStmt { - ConditionElement getACondition() { result = this.getCondition(_) } +module Impl { + class IfStmt extends Generated::IfStmt { + ConditionElement getACondition() { result = this.getCondition(_) } - ConditionElement getCondition(int i) { result = this.getCondition().getElement(i) } + ConditionElement getCondition(int i) { result = this.getCondition().getElement(i) } - Stmt getBranch(boolean b) { - b = true and - result = this.getThen() - or - b = false and - result = this.getElse() - } + Stmt getBranch(boolean b) { + b = true and + result = this.getThen() + or + b = false and + result = this.getElse() + } - override string toString() { - if this.hasElse() - then result = "if ... then { ... } else { ... }" - else result = "if ... then { ... }" + override string toString() { + if this.hasElse() + then result = "if ... then { ... } else { ... }" + else result = "if ... then { ... }" + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/LabeledStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/LabeledStmtImpl.qll index 1d31de51b8839..677e21f3e5ba0 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/LabeledStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/LabeledStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.LabeledStmt -class LabeledStmt extends Generated::LabeledStmt { - override string toString() { result = this.getLabel() + ": ..." } +module Impl { + class LabeledStmt extends Generated::LabeledStmt { + override string toString() { result = this.getLabel() + ": ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/PoundAssertStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/PoundAssertStmtImpl.qll index ed35a59f8ee72..e7d208998d4b8 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/PoundAssertStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/PoundAssertStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.PoundAssertStmt -class PoundAssertStmt extends Generated::PoundAssertStmt { - override string toString() { result = "#assert ..." } +module Impl { + class PoundAssertStmt extends Generated::PoundAssertStmt { + override string toString() { result = "#assert ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/RepeatWhileStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/RepeatWhileStmtImpl.qll index a21ed2c89ec62..867aee0d5de04 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/RepeatWhileStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/RepeatWhileStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.RepeatWhileStmt -class RepeatWhileStmt extends Generated::RepeatWhileStmt { - override string toString() { result = "repeat { ... } while ... " } +module Impl { + class RepeatWhileStmt extends Generated::RepeatWhileStmt { + override string toString() { result = "repeat { ... } while ... " } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/ReturnStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/ReturnStmtImpl.qll index 9ee511913b130..d53eb3d0eee06 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/ReturnStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/ReturnStmtImpl.qll @@ -1,7 +1,9 @@ private import codeql.swift.generated.stmt.ReturnStmt -class ReturnStmt extends Generated::ReturnStmt { - override string toString() { - if this.hasResult() then result = "return ..." else result = "return" +module Impl { + class ReturnStmt extends Generated::ReturnStmt { + override string toString() { + if this.hasResult() then result = "return ..." else result = "return" + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/StmtConditionImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/StmtConditionImpl.qll index 8344a631eeeeb..dd0e3ed1be5c3 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/StmtConditionImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/StmtConditionImpl.qll @@ -1,12 +1,14 @@ private import codeql.swift.generated.stmt.StmtCondition -class StmtCondition extends Generated::StmtCondition { - ConditionElement getFirstElement() { result = this.getElement(0) } +module Impl { + class StmtCondition extends Generated::StmtCondition { + ConditionElement getFirstElement() { result = this.getElement(0) } - ConditionElement getLastElement() { - exists(int i | - result = this.getElement(i) and - not exists(this.getElement(i + 1)) - ) + ConditionElement getLastElement() { + exists(int i | + result = this.getElement(i) and + not exists(this.getElement(i + 1)) + ) + } } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/SwitchStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/SwitchStmtImpl.qll index 41c531b2311f6..850f857bdccb2 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/SwitchStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/SwitchStmtImpl.qll @@ -1,14 +1,16 @@ private import codeql.swift.generated.stmt.SwitchStmt -class SwitchStmt extends Generated::SwitchStmt { - CaseStmt getFirstCase() { result = this.getCase(0) } +module Impl { + class SwitchStmt extends Generated::SwitchStmt { + CaseStmt getFirstCase() { result = this.getCase(0) } - CaseStmt getLastCase() { - exists(int i | - result = this.getCase(i) and - not exists(this.getCase(i + 1)) - ) - } + CaseStmt getLastCase() { + exists(int i | + result = this.getCase(i) and + not exists(this.getCase(i + 1)) + ) + } - override string toString() { result = "switch " + this.getExpr().toString() + " { ... }" } + override string toString() { result = "switch " + this.getExpr().toString() + " { ... }" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/ThrowStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/ThrowStmtImpl.qll index 74c5058c2d01e..2865061216d61 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/ThrowStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/ThrowStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.ThrowStmt -class ThrowStmt extends Generated::ThrowStmt { - override string toString() { result = "throw ..." } +module Impl { + class ThrowStmt extends Generated::ThrowStmt { + override string toString() { result = "throw ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/WhileStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/WhileStmtImpl.qll index 89eec1e4c64e0..9359c6ccd20ab 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/WhileStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/WhileStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.WhileStmt -class WhileStmt extends Generated::WhileStmt { - override string toString() { result = "while ... { ... }" } +module Impl { + class WhileStmt extends Generated::WhileStmt { + override string toString() { result = "while ... { ... }" } + } } diff --git a/swift/ql/lib/codeql/swift/elements/stmt/YieldStmtImpl.qll b/swift/ql/lib/codeql/swift/elements/stmt/YieldStmtImpl.qll index 9c830c5e655a0..aeb1623d9bb71 100644 --- a/swift/ql/lib/codeql/swift/elements/stmt/YieldStmtImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/stmt/YieldStmtImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.stmt.YieldStmt -class YieldStmt extends Generated::YieldStmt { - override string toString() { result = "yield ..." } +module Impl { + class YieldStmt extends Generated::YieldStmt { + override string toString() { result = "yield ..." } + } } diff --git a/swift/ql/lib/codeql/swift/elements/type/DynamicSelfTypeImpl.qll b/swift/ql/lib/codeql/swift/elements/type/DynamicSelfTypeImpl.qll index 53455f43e2a6f..2a325f96e0618 100644 --- a/swift/ql/lib/codeql/swift/elements/type/DynamicSelfTypeImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/type/DynamicSelfTypeImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.type.DynamicSelfType -class DynamicSelfType extends Generated::DynamicSelfType { - override Type getResolveStep() { - // The type of qualifiers in a Swift constructor is assigned the type `Self` by the Swift compiler - // This `getResolveStep` replaces that `Self` type with the type of the enclosing class. - result = this.getImmediateStaticSelfType() +module Impl { + class DynamicSelfType extends Generated::DynamicSelfType { + override Type getResolveStep() { + // The type of qualifiers in a Swift constructor is assigned the type `Self` by the Swift compiler + // This `getResolveStep` replaces that `Self` type with the type of the enclosing class. + result = this.getImmediateStaticSelfType() + } } } diff --git a/swift/ql/lib/codeql/swift/elements/type/LValueTypeImpl.qll b/swift/ql/lib/codeql/swift/elements/type/LValueTypeImpl.qll index d6b4048bdd772..844e0f639a9be 100644 --- a/swift/ql/lib/codeql/swift/elements/type/LValueTypeImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/type/LValueTypeImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.type.LValueType -class LValueType extends Generated::LValueType { - override Type getResolveStep() { result = this.getImmediateObjectType() } +module Impl { + class LValueType extends Generated::LValueType { + override Type getResolveStep() { result = this.getImmediateObjectType() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/type/NominalTypeImpl.qll b/swift/ql/lib/codeql/swift/elements/type/NominalTypeImpl.qll index bea26b684865d..291d90bdb5290 100644 --- a/swift/ql/lib/codeql/swift/elements/type/NominalTypeImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/type/NominalTypeImpl.qll @@ -1,6 +1,8 @@ private import codeql.swift.generated.type.NominalType -/** - * A class, struct, enum or protocol. - */ -class NominalType extends Generated::NominalType { } +module Impl { + /** + * A class, struct, enum or protocol. + */ + class NominalType extends Generated::NominalType { } +} diff --git a/swift/ql/lib/codeql/swift/elements/type/TupleTypeImpl.qll b/swift/ql/lib/codeql/swift/elements/type/TupleTypeImpl.qll index 13f50a5d0d4cd..1c09edb5bfa5f 100644 --- a/swift/ql/lib/codeql/swift/elements/type/TupleTypeImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/type/TupleTypeImpl.qll @@ -1,9 +1,11 @@ private import codeql.swift.generated.type.TupleType -/** - * A tuple type, for example: - * ``` - * (Int, String) - * ``` - */ -class TupleType extends Generated::TupleType { } +module Impl { + /** + * A tuple type, for example: + * ``` + * (Int, String) + * ``` + */ + class TupleType extends Generated::TupleType { } +} diff --git a/swift/ql/lib/codeql/swift/elements/type/TypeAliasTypeImpl.qll b/swift/ql/lib/codeql/swift/elements/type/TypeAliasTypeImpl.qll index d9e9e4e2cbe33..8f16e9a406e77 100644 --- a/swift/ql/lib/codeql/swift/elements/type/TypeAliasTypeImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/type/TypeAliasTypeImpl.qll @@ -1,22 +1,24 @@ private import codeql.swift.elements.type.Type private import codeql.swift.generated.type.TypeAliasType -/** - * A type alias to another type. For example: - * ``` - * typealias MyInt = Int - * ``` - */ -class TypeAliasType extends Generated::TypeAliasType { +module Impl { /** - * Gets the aliased type of this type alias type. - * - * For example the aliased type of `MyInt` in the following code is `Int`: + * A type alias to another type. For example: * ``` * typealias MyInt = Int * ``` */ - Type getAliasedType() { result = this.getDecl().getAliasedType() } + class TypeAliasType extends Generated::TypeAliasType { + /** + * Gets the aliased type of this type alias type. + * + * For example the aliased type of `MyInt` in the following code is `Int`: + * ``` + * typealias MyInt = Int + * ``` + */ + Type getAliasedType() { result = this.getDecl().getAliasedType() } - override Type getUnderlyingType() { result = this.getAliasedType().getUnderlyingType() } + override Type getUnderlyingType() { result = this.getAliasedType().getUnderlyingType() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/type/TypeImpl.qll b/swift/ql/lib/codeql/swift/elements/type/TypeImpl.qll index b5d30140e83c5..625d5b5312df8 100644 --- a/swift/ql/lib/codeql/swift/elements/type/TypeImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/type/TypeImpl.qll @@ -1,66 +1,68 @@ private import codeql.swift.generated.type.Type private import codeql.swift.elements.type.AnyGenericType -/** - * A Swift type. - * - * This QL class is the root of the Swift type hierarchy. - */ -class Type extends Generated::Type { - override string toString() { result = this.getFullName() } - +module Impl { /** - * Gets the name of this type. + * A Swift type. + * + * This QL class is the root of the Swift type hierarchy. */ - override string getName() { - // replace anything that looks like a full name `a.b.c` with just the - // short name `c`, by removing the `a.` and `b.` parts. Note that this - // has to be robust for tuple type names such as `(a, b.c)`. - result = super.getName().regexpReplaceAll("[^(),. ]++\\.(?!\\.)", "") - } + class Type extends Generated::Type { + override string toString() { result = this.getFullName() } - /** - * Gets the full name of this `Type`. For example in: - * ```swift - * struct A { - * struct B { - * // ... - * } - * } - * ``` - * The name and full name of `A` is `A`. The name of `B` is `B`, but the - * full name of `B` is `A.B`. - */ - string getFullName() { result = super.getName() } + /** + * Gets the name of this type. + */ + override string getName() { + // replace anything that looks like a full name `a.b.c` with just the + // short name `c`, by removing the `a.` and `b.` parts. Note that this + // has to be robust for tuple type names such as `(a, b.c)`. + result = super.getName().regexpReplaceAll("[^(),. ]++\\.(?!\\.)", "") + } - /** - * Gets this type after any type aliases have been resolved. For example in - * the following code, the underlying type of `MyInt` is `Int`: - * ``` - * typealias MyInt = Int - * ``` - */ - Type getUnderlyingType() { result = this } + /** + * Gets the full name of this `Type`. For example in: + * ```swift + * struct A { + * struct B { + * // ... + * } + * } + * ``` + * The name and full name of `A` is `A`. The name of `B` is `B`, but the + * full name of `B` is `A.B`. + */ + string getFullName() { result = super.getName() } - /** - * Gets any base type of this type. Expands protocols added in extensions and expands - * type aliases. For example in the following code, `B` has base type `A`: - * ``` - * typealias A_alias = A - * - * class B : A_alias {} - * ``` - */ - Type getABaseType() { result = this.(AnyGenericType).getDeclaration().getABaseType() } + /** + * Gets this type after any type aliases have been resolved. For example in + * the following code, the underlying type of `MyInt` is `Int`: + * ``` + * typealias MyInt = Int + * ``` + */ + Type getUnderlyingType() { result = this } - /** - * Gets a type derived from this type. Expands type aliases, for example in the following - * code, `B` derives from type `A`. - * ``` - * typealias A_alias = A - * - * class B : A_alias {} - * ``` - */ - Type getADerivedType() { result.getABaseType() = this } + /** + * Gets any base type of this type. Expands protocols added in extensions and expands + * type aliases. For example in the following code, `B` has base type `A`: + * ``` + * typealias A_alias = A + * + * class B : A_alias {} + * ``` + */ + Type getABaseType() { result = this.(AnyGenericType).getDeclaration().getABaseType() } + + /** + * Gets a type derived from this type. Expands type aliases, for example in the following + * code, `B` derives from type `A`. + * ``` + * typealias A_alias = A + * + * class B : A_alias {} + * ``` + */ + Type getADerivedType() { result.getABaseType() = this } + } } diff --git a/swift/ql/lib/codeql/swift/elements/type/TypeReprImpl.qll b/swift/ql/lib/codeql/swift/elements/type/TypeReprImpl.qll index ad870d4a868c4..98b4b0f05283a 100644 --- a/swift/ql/lib/codeql/swift/elements/type/TypeReprImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/type/TypeReprImpl.qll @@ -1,5 +1,7 @@ private import codeql.swift.generated.type.TypeRepr -class TypeRepr extends Generated::TypeRepr { - override string toString() { result = this.getType().toString() } +module Impl { + class TypeRepr extends Generated::TypeRepr { + override string toString() { result = this.getType().toString() } + } } diff --git a/swift/ql/lib/codeql/swift/elements/type/VariadicSequenceTypeImpl.qll b/swift/ql/lib/codeql/swift/elements/type/VariadicSequenceTypeImpl.qll index 3e64b313c9c05..8f35271cb8b78 100644 --- a/swift/ql/lib/codeql/swift/elements/type/VariadicSequenceTypeImpl.qll +++ b/swift/ql/lib/codeql/swift/elements/type/VariadicSequenceTypeImpl.qll @@ -1,12 +1,14 @@ private import codeql.swift.generated.type.VariadicSequenceType -/** - * A variadic sequence type, that is, an array-like type that holds - * variadic arguments. For example the type `Int...` of `args` in: - * ``` - * func myVarargsFunction(args: Int...) { - * ... - * } - * ``` - */ -class VariadicSequenceType extends Generated::VariadicSequenceType { } +module Impl { + /** + * A variadic sequence type, that is, an array-like type that holds + * variadic arguments. For example the type `Int...` of `args` in: + * ``` + * func myVarargsFunction(args: Int...) { + * ... + * } + * ``` + */ + class VariadicSequenceType extends Generated::VariadicSequenceType { } +} diff --git a/swift/ql/lib/swift.qll b/swift/ql/lib/swift.qll index 2ea5d3774f3f9..73c25f0185512 100644 --- a/swift/ql/lib/swift.qll +++ b/swift/ql/lib/swift.qll @@ -2,15 +2,22 @@ import codeql.swift.elements import codeql.swift.elements.expr.ArithmeticOperation +import codeql.swift.elements.expr.Assignment import codeql.swift.elements.expr.BitwiseOperation import codeql.swift.elements.expr.LogicalOperation import codeql.swift.elements.expr.NilCoalescingExpr import codeql.swift.elements.expr.InitializerLookupExpr +import codeql.swift.elements.expr.MethodApplyExpr import codeql.swift.elements.expr.MethodCallExpr import codeql.swift.elements.expr.InitializerCallExpr import codeql.swift.elements.expr.SelfRefExpr import codeql.swift.elements.expr.EnumElementExpr +import codeql.swift.elements.decl.FieldDecl +import codeql.swift.elements.decl.FreeFunction import codeql.swift.elements.decl.Method import codeql.swift.elements.decl.ClassOrStructDecl +import codeql.swift.elements.decl.SelfParamDecl +import codeql.swift.elements.decl.SetObserver import codeql.swift.elements.type.NumericType +import codeql.swift.elements.SingleLineComment import codeql.swift.Unit