Swift: extract DynamicMemberRefExpr

This commit is contained in:
Paolo Tranquilli
2022-11-09 16:21:46 +01:00
parent 4770ad3177
commit e2bdef2fba
10 changed files with 47 additions and 4 deletions

View File

@@ -543,5 +543,11 @@ codeql::OverloadedDeclRefExpr ExprTranslator::translateOverloadedDeclRefExpr(
entry.possible_declarations = dispatcher.fetchRepeatedLabels(expr.getDecls());
return entry;
}
codeql::DynamicMemberRefExpr ExprTranslator::translateDynamicMemberRefExpr(
const swift::DynamicMemberRefExpr& expr) {
auto entry = createExprEntry(expr);
fillLookupExpr(expr, entry);
return entry;
}
} // namespace codeql

View File

@@ -105,6 +105,8 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
codeql::ObjectLiteralExpr translateObjectLiteralExpr(const swift::ObjectLiteralExpr& expr);
codeql::OverloadedDeclRefExpr translateOverloadedDeclRefExpr(
const swift::OverloadedDeclRefExpr& expr);
codeql::DynamicMemberRefExpr translateDynamicMemberRefExpr(
const swift::DynamicMemberRefExpr& expr);
private:
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,

View File

@@ -0,0 +1 @@
| dynamic_member_ref.swift:12:1:12:3 | .foo(_:) | getBase: | dynamic_member_ref.swift:12:1:12:1 | OpaqueValueExpr |

View File

@@ -0,0 +1,10 @@
// generated by codegen/codegen.py
import codeql.swift.elements
import TestUtils
from DynamicMemberRefExpr x, Expr getBase
where
toBeTested(x) and
not x.isUnknown() and
getBase = x.getBase()
select x, "getBase:", getBase

View File

@@ -0,0 +1 @@
| dynamic_member_ref.swift:12:1:12:3 | .foo(_:) | dynamic_member_ref.swift:6:9:6:28 | foo(_:) |

View File

@@ -0,0 +1,7 @@
// generated by codegen/codegen.py
import codeql.swift.elements
import TestUtils
from DynamicMemberRefExpr x
where toBeTested(x) and not x.isUnknown()
select x, x.getMember()

View File

@@ -0,0 +1 @@
| dynamic_member_ref.swift:12:1:12:3 | .foo(_:) | ((Int) -> ())? |

View File

@@ -0,0 +1,7 @@
// generated by codegen/codegen.py
import codeql.swift.elements
import TestUtils
from DynamicMemberRefExpr x
where toBeTested(x) and not x.isUnknown()
select x, x.getType()

View File

@@ -1,4 +0,0 @@
// generated by codegen/codegen.py
After a swift source file is added in this directory and codegen/codegen.py is run again, test queries
will appear and this file will be deleted

View File

@@ -0,0 +1,12 @@
//codeql-extractor-options: -enable-objc-interop
//codeql-extractor-expected-status: 1
// Successful compilation would require importing Foundation for `@objc`
class A {
@objc func foo(_ : Int) {}
};
class B {}
var x : AnyObject = B()
x.foo!(17)