Merge pull request #10386 from github/redsun82/swift-do-not-extract-inactive-ifconfig-clauses

Swift: do not extract unresolved things from `IfConfigDecl`
This commit is contained in:
Mathias Vorreiter Pedersen
2022-09-20 15:57:47 +01:00
committed by GitHub
55 changed files with 222 additions and 378 deletions

View File

@@ -17,6 +17,9 @@ Element:
_pragma: cpp_skip # this is emitted using trap entries directly
_pragma: qltest_skip
UnresolvedElement:
_pragma: [ qltest_collapse_hierarchy, qltest_skip ]
File:
name: string
_pragma: qltest_collapse_hierarchy
@@ -27,7 +30,7 @@ DbFile:
UnknownFile:
_extends: File
_synth:
on: {}
on: { }
Locatable:
location:
@@ -41,7 +44,7 @@ Location:
start_column: int
end_line: int
end_column: int
_pragma: [qltest_skip, qltest_collapse_hierarchy]
_pragma: [ qltest_skip, qltest_collapse_hierarchy ]
DbLocation:
_extends: Location
@@ -49,7 +52,7 @@ DbLocation:
UnknownLocation:
_extends: Location
_synth:
on: {}
on: { }
Comment:
_extends: Locatable
@@ -179,7 +182,9 @@ TypeVariableType:
_extends: Type
UnresolvedType:
_extends: Type
_extends:
- Type
- UnresolvedElement
ClassDecl:
_extends: NominalTypeDecl
@@ -209,7 +214,7 @@ Stmt:
TypeRepr:
_extends: AstNode
type: Type? # type can be absent on unresolved entities
type: Type
FunctionType:
_extends: AnyFunctionType
@@ -299,15 +304,7 @@ EnumCaseDecl:
IfConfigDecl:
_extends: Decl
_children:
clauses: IfConfigClause*
IfConfigClause:
_extends: Locatable
_children:
condition: Expr?
elements: AstNode*
is_active: predicate
_dir: decl
active_elements: AstNode*
ImportDecl:
_extends: Decl
@@ -581,28 +578,36 @@ TypeExpr:
type_repr: TypeRepr?
UnresolvedDeclRefExpr:
_extends: Expr
_extends:
- Expr
- UnresolvedElement
name: string?
UnresolvedDotExpr:
_extends: Expr
_extends:
- Expr
- UnresolvedElement
_children:
base: Expr
name: string
UnresolvedMemberExpr:
_extends: Expr
_extends:
- Expr
- UnresolvedElement
name: string
_pragma: qltest_skip # we should really never extract these
UnresolvedPatternExpr:
_extends: Expr
_extends:
- Expr
- UnresolvedElement
_children:
sub_pattern: Pattern
UnresolvedSpecializeExpr:
_extends: Expr
_pragma: qltest_skip # we should really never extract these
_extends:
- Expr
- UnresolvedElement
VarargExpansionExpr:
_extends: Expr
@@ -864,7 +869,9 @@ ParenExpr:
_extends: IdentityExpr
UnresolvedMemberChainResultExpr:
_extends: IdentityExpr
_extends:
- IdentityExpr
- UnresolvedElement
AnyHashableErasureExpr:
_extends: ImplicitConversionExpr
@@ -960,7 +967,9 @@ UnevaluatedInstanceExpr:
_extends: ImplicitConversionExpr
UnresolvedTypeConversionExpr:
_extends: ImplicitConversionExpr
_extends:
- ImplicitConversionExpr
- UnresolvedElement
BuiltinLiteralExpr:
_extends: LiteralExpr

View File

@@ -29,7 +29,6 @@ class SwiftDispatcher {
const swift::Pattern*,
const swift::TypeRepr*,
const swift::TypeBase*,
const swift::IfConfigClause*,
FilePath>;
template <typename E>
@@ -323,7 +322,6 @@ class SwiftDispatcher {
// as we don't expect `nullptr` here. However `swift::ASTVisitor` and `swift::TypeVisitor` do not
// accept const pointers
virtual void visit(swift::Decl* decl) = 0;
virtual void visit(const swift::IfConfigClause* clause) = 0;
virtual void visit(swift::Stmt* stmt) = 0;
virtual void visit(const swift::StmtCondition* cond) = 0;
virtual void visit(const swift::StmtConditionElement* cond) = 0;

View File

@@ -49,7 +49,6 @@ MAP_TAG(Argument);
#include <swift/AST/ExprNodes.def>
MAP_TAG(Decl);
MAP_TAG(IfConfigClause);
#define ABSTRACT_DECL(CLASS, PARENT) MAP_SUBTAG(CLASS##Decl, PARENT)
#define DECL(CLASS, PARENT) ABSTRACT_DECL(CLASS, PARENT)
#include <swift/AST/DeclNodes.def>

View File

@@ -380,15 +380,9 @@ void DeclVisitor::fillAbstractStorageDecl(const swift::AbstractStorageDecl& decl
codeql::IfConfigDecl DeclVisitor::translateIfConfigDecl(const swift::IfConfigDecl& decl) {
auto entry = createEntry(decl);
entry.clauses = dispatcher_.fetchRepeatedLabels(decl.getClauses());
return entry;
}
codeql::IfConfigClause DeclVisitor::translateIfConfigClause(const swift::IfConfigClause& clause) {
auto entry = dispatcher_.createEntry(clause);
entry.condition = dispatcher_.fetchOptionalLabel(clause.Cond);
entry.elements = dispatcher_.fetchRepeatedLabels(clause.Elements);
entry.is_active = clause.isActive;
if (auto activeClause = decl.getActiveClause()) {
entry.active_elements = dispatcher_.fetchRepeatedLabels(activeClause->Elements);
}
return entry;
}

View File

@@ -16,10 +16,6 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
using AstVisitorBase<DeclVisitor>::AstVisitorBase;
using AstVisitorBase<DeclVisitor>::visit;
void visit(const swift::IfConfigClause* clause) {
dispatcher_.emit(translateIfConfigClause(*clause));
}
std::optional<codeql::ConcreteFuncDecl> translateFuncDecl(const swift::FuncDecl& decl);
std::optional<codeql::ConstructorDecl> translateConstructorDecl(
const swift::ConstructorDecl& decl);
@@ -50,7 +46,6 @@ class DeclVisitor : public AstVisitorBase<DeclVisitor> {
codeql::ImportDecl translateImportDecl(const swift::ImportDecl& decl);
std::optional<codeql::ModuleDecl> translateModuleDecl(const swift::ModuleDecl& decl);
codeql::IfConfigDecl translateIfConfigDecl(const swift::IfConfigDecl& decl);
codeql::IfConfigClause translateIfConfigClause(const swift::IfConfigClause& clause);
private:
std::string mangledName(const swift::ValueDecl& decl);

View File

@@ -22,7 +22,6 @@ class SwiftVisitor : private SwiftDispatcher {
private:
void visit(swift::Decl* decl) override { declVisitor.visit(decl); }
void visit(const swift::IfConfigClause* clause) override { declVisitor.visit(clause); }
void visit(swift::Stmt* stmt) override { stmtVisitor.visit(stmt); }
void visit(const swift::StmtCondition* cond) override {
emit(stmtVisitor.translateStmtCondition(*cond));

View File

@@ -11,7 +11,7 @@ void TypeVisitor::visit(swift::TypeBase* type) {
codeql::TypeRepr TypeVisitor::translateTypeRepr(const swift::TypeRepr& typeRepr, swift::Type type) {
auto entry = dispatcher_.createEntry(typeRepr);
entry.type = dispatcher_.fetchOptionalLabel(type);
entry.type = dispatcher_.fetchLabel(type);
return entry;
}

View File

@@ -10,6 +10,7 @@ import codeql.swift.elements.Locatable
import codeql.swift.elements.Location
import codeql.swift.elements.UnknownFile
import codeql.swift.elements.UnknownLocation
import codeql.swift.elements.UnresolvedElement
import codeql.swift.elements.decl.AbstractFunctionDecl
import codeql.swift.elements.decl.AbstractStorageDecl
import codeql.swift.elements.decl.AbstractTypeParamDecl
@@ -29,7 +30,6 @@ import codeql.swift.elements.decl.FuncDecl
import codeql.swift.elements.decl.GenericContext
import codeql.swift.elements.decl.GenericTypeDecl
import codeql.swift.elements.decl.GenericTypeParamDecl
import codeql.swift.elements.decl.IfConfigClause
import codeql.swift.elements.decl.IfConfigDecl
import codeql.swift.elements.decl.ImportDecl
import codeql.swift.elements.decl.InfixOperatorDecl

View File

@@ -0,0 +1,4 @@
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
private import codeql.swift.generated.UnresolvedElement
class UnresolvedElement extends UnresolvedElementBase { }

View File

@@ -1,4 +0,0 @@
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
private import codeql.swift.generated.decl.IfConfigClause
class IfConfigClause extends IfConfigClauseBase { }

View File

@@ -1,4 +0,0 @@
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
private import codeql.swift.generated.Raw
predicate constructIfConfigClause(Raw::IfConfigClause id) { any() }

View File

@@ -120,6 +120,21 @@ private module Impl {
)
}
private Element getImmediateChildOfUnresolvedElement(
UnresolvedElement e, int index, string partialPredicateCall
) {
exists(int b, int bElement, int n |
b = 0 and
bElement = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfElement(e, i, _)) | i) and
n = bElement and
(
none()
or
result = getImmediateChildOfElement(e, index - b, partialPredicateCall)
)
)
}
private Element getImmediateChildOfAnyFunctionType(
AnyFunctionType e, int index, string partialPredicateCall
) {
@@ -332,28 +347,6 @@ private module Impl {
)
}
private Element getImmediateChildOfIfConfigClause(
IfConfigClause e, int index, string partialPredicateCall
) {
exists(int b, int bLocatable, int n, int nCondition, int nElement |
b = 0 and
bLocatable = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLocatable(e, i, _)) | i) and
n = bLocatable and
nCondition = n + 1 and
nElement = nCondition + 1 + max(int i | i = -1 or exists(e.getImmediateElement(i)) | i) and
(
none()
or
result = getImmediateChildOfLocatable(e, index - b, partialPredicateCall)
or
index = n and result = e.getImmediateCondition() and partialPredicateCall = "Condition()"
or
result = e.getImmediateElement(index - nCondition) and
partialPredicateCall = "Element(" + (index - nCondition).toString() + ")"
)
)
}
private Element getImmediateChildOfInOutType(InOutType e, int index, string partialPredicateCall) {
exists(int b, int bType, int n |
b = 0 and
@@ -585,14 +578,18 @@ private module Impl {
private Element getImmediateChildOfUnresolvedType(
UnresolvedType e, int index, string partialPredicateCall
) {
exists(int b, int bType, int n |
exists(int b, int bType, int bUnresolvedElement, int n |
b = 0 and
bType = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfType(e, i, _)) | i) and
n = bType and
bUnresolvedElement =
bType + 1 + max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
n = bUnresolvedElement and
(
none()
or
result = getImmediateChildOfType(e, index - b, partialPredicateCall)
or
result = getImmediateChildOfUnresolvedElement(e, index - bType, partialPredicateCall)
)
)
}
@@ -1763,18 +1760,18 @@ private module Impl {
private Element getImmediateChildOfIfConfigDecl(
IfConfigDecl e, int index, string partialPredicateCall
) {
exists(int b, int bDecl, int n, int nClause |
exists(int b, int bDecl, int n, int nActiveElement |
b = 0 and
bDecl = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfDecl(e, i, _)) | i) and
n = bDecl and
nClause = n + 1 + max(int i | i = -1 or exists(e.getImmediateClause(i)) | i) and
nActiveElement = n + 1 + max(int i | i = -1 or exists(e.getImmediateActiveElement(i)) | i) and
(
none()
or
result = getImmediateChildOfDecl(e, index - b, partialPredicateCall)
or
result = e.getImmediateClause(index - n) and
partialPredicateCall = "Clause(" + (index - n).toString() + ")"
result = e.getImmediateActiveElement(index - n) and
partialPredicateCall = "ActiveElement(" + (index - n).toString() + ")"
)
)
}
@@ -2652,14 +2649,18 @@ private module Impl {
private Element getImmediateChildOfUnresolvedDeclRefExpr(
UnresolvedDeclRefExpr e, int index, string partialPredicateCall
) {
exists(int b, int bExpr, int n |
exists(int b, int bExpr, int bUnresolvedElement, int n |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
n = bExpr and
bUnresolvedElement =
bExpr + 1 + max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
n = bUnresolvedElement and
(
none()
or
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
or
result = getImmediateChildOfUnresolvedElement(e, index - bExpr, partialPredicateCall)
)
)
}
@@ -2667,16 +2668,20 @@ private module Impl {
private Element getImmediateChildOfUnresolvedDotExpr(
UnresolvedDotExpr e, int index, string partialPredicateCall
) {
exists(int b, int bExpr, int n, int nBase |
exists(int b, int bExpr, int bUnresolvedElement, int n, int nBase |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
n = bExpr and
bUnresolvedElement =
bExpr + 1 + max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
n = bUnresolvedElement and
nBase = n + 1 and
(
none()
or
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
or
result = getImmediateChildOfUnresolvedElement(e, index - bExpr, partialPredicateCall)
or
index = n and result = e.getImmediateBase() and partialPredicateCall = "Base()"
)
)
@@ -2685,14 +2690,18 @@ private module Impl {
private Element getImmediateChildOfUnresolvedMemberExpr(
UnresolvedMemberExpr e, int index, string partialPredicateCall
) {
exists(int b, int bExpr, int n |
exists(int b, int bExpr, int bUnresolvedElement, int n |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
n = bExpr and
bUnresolvedElement =
bExpr + 1 + max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
n = bUnresolvedElement and
(
none()
or
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
or
result = getImmediateChildOfUnresolvedElement(e, index - bExpr, partialPredicateCall)
)
)
}
@@ -2700,16 +2709,20 @@ private module Impl {
private Element getImmediateChildOfUnresolvedPatternExpr(
UnresolvedPatternExpr e, int index, string partialPredicateCall
) {
exists(int b, int bExpr, int n, int nSubPattern |
exists(int b, int bExpr, int bUnresolvedElement, int n, int nSubPattern |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
n = bExpr and
bUnresolvedElement =
bExpr + 1 + max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
n = bUnresolvedElement and
nSubPattern = n + 1 and
(
none()
or
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
or
result = getImmediateChildOfUnresolvedElement(e, index - bExpr, partialPredicateCall)
or
index = n and result = e.getImmediateSubPattern() and partialPredicateCall = "SubPattern()"
)
)
@@ -2718,14 +2731,18 @@ private module Impl {
private Element getImmediateChildOfUnresolvedSpecializeExpr(
UnresolvedSpecializeExpr e, int index, string partialPredicateCall
) {
exists(int b, int bExpr, int n |
exists(int b, int bExpr, int bUnresolvedElement, int n |
b = 0 and
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
n = bExpr and
bUnresolvedElement =
bExpr + 1 + max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
n = bUnresolvedElement and
(
none()
or
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
or
result = getImmediateChildOfUnresolvedElement(e, index - bExpr, partialPredicateCall)
)
)
}
@@ -4126,15 +4143,21 @@ private module Impl {
private Element getImmediateChildOfUnresolvedMemberChainResultExpr(
UnresolvedMemberChainResultExpr e, int index, string partialPredicateCall
) {
exists(int b, int bIdentityExpr, int n |
exists(int b, int bIdentityExpr, int bUnresolvedElement, int n |
b = 0 and
bIdentityExpr =
b + 1 + max(int i | i = -1 or exists(getImmediateChildOfIdentityExpr(e, i, _)) | i) and
n = bIdentityExpr and
bUnresolvedElement =
bIdentityExpr + 1 +
max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
n = bUnresolvedElement and
(
none()
or
result = getImmediateChildOfIdentityExpr(e, index - b, partialPredicateCall)
or
result =
getImmediateChildOfUnresolvedElement(e, index - bIdentityExpr, partialPredicateCall)
)
)
}
@@ -4142,16 +4165,23 @@ private module Impl {
private Element getImmediateChildOfUnresolvedTypeConversionExpr(
UnresolvedTypeConversionExpr e, int index, string partialPredicateCall
) {
exists(int b, int bImplicitConversionExpr, int n |
exists(int b, int bImplicitConversionExpr, int bUnresolvedElement, int n |
b = 0 and
bImplicitConversionExpr =
b + 1 +
max(int i | i = -1 or exists(getImmediateChildOfImplicitConversionExpr(e, i, _)) | i) and
n = bImplicitConversionExpr and
bUnresolvedElement =
bImplicitConversionExpr + 1 +
max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
n = bUnresolvedElement and
(
none()
or
result = getImmediateChildOfImplicitConversionExpr(e, index - b, partialPredicateCall)
or
result =
getImmediateChildOfUnresolvedElement(e, index - bImplicitConversionExpr,
partialPredicateCall)
)
)
}
@@ -4796,8 +4826,6 @@ private module Impl {
or
result = getImmediateChildOfExistentialType(e, index, partialAccessor)
or
result = getImmediateChildOfIfConfigClause(e, index, partialAccessor)
or
result = getImmediateChildOfInOutType(e, index, partialAccessor)
or
result = getImmediateChildOfLValueType(e, index, partialAccessor)

View File

@@ -49,6 +49,8 @@ module Raw {
Type getCanonicalType() { types(this, _, result) }
}
class UnresolvedElement extends @unresolved_element, Element { }
class AnyFunctionType extends @any_function_type, Type {
Type getResult() { any_function_types(this, result) }
@@ -129,16 +131,6 @@ module Raw {
Type getConstraint() { existential_types(this, result) }
}
class IfConfigClause extends @if_config_clause, Locatable {
override string toString() { result = "IfConfigClause" }
Expr getCondition() { if_config_clause_conditions(this, result) }
AstNode getElement(int index) { if_config_clause_elements(this, index, result) }
predicate isActive() { if_config_clause_is_active(this) }
}
class InOutType extends @in_out_type, Type {
override string toString() { result = "InOutType" }
@@ -203,7 +195,7 @@ module Raw {
override string toString() { result = "TypeVariableType" }
}
class UnresolvedType extends @unresolved_type, Type {
class UnresolvedType extends @unresolved_type, Type, UnresolvedElement {
override string toString() { result = "UnresolvedType" }
}
@@ -327,7 +319,7 @@ module Raw {
class TypeRepr extends @type_repr, AstNode {
override string toString() { result = "TypeRepr" }
Type getType() { type_repr_types(this, result) }
Type getType() { type_reprs(this, result) }
}
class UnboundGenericType extends @unbound_generic_type, AnyGenericType {
@@ -587,7 +579,7 @@ module Raw {
class IfConfigDecl extends @if_config_decl, Decl {
override string toString() { result = "IfConfigDecl" }
IfConfigClause getClause(int index) { if_config_decl_clauses(this, index, result) }
AstNode getActiveElement(int index) { if_config_decl_active_elements(this, index, result) }
}
class IfExpr extends @if_expr, Expr {
@@ -880,13 +872,13 @@ module Raw {
Type getBaseType() { unary_syntax_sugar_types(this, result) }
}
class UnresolvedDeclRefExpr extends @unresolved_decl_ref_expr, Expr {
class UnresolvedDeclRefExpr extends @unresolved_decl_ref_expr, Expr, UnresolvedElement {
override string toString() { result = "UnresolvedDeclRefExpr" }
string getName() { unresolved_decl_ref_expr_names(this, result) }
}
class UnresolvedDotExpr extends @unresolved_dot_expr, Expr {
class UnresolvedDotExpr extends @unresolved_dot_expr, Expr, UnresolvedElement {
override string toString() { result = "UnresolvedDotExpr" }
Expr getBase() { unresolved_dot_exprs(this, result, _) }
@@ -894,19 +886,19 @@ module Raw {
string getName() { unresolved_dot_exprs(this, _, result) }
}
class UnresolvedMemberExpr extends @unresolved_member_expr, Expr {
class UnresolvedMemberExpr extends @unresolved_member_expr, Expr, UnresolvedElement {
override string toString() { result = "UnresolvedMemberExpr" }
string getName() { unresolved_member_exprs(this, result) }
}
class UnresolvedPatternExpr extends @unresolved_pattern_expr, Expr {
class UnresolvedPatternExpr extends @unresolved_pattern_expr, Expr, UnresolvedElement {
override string toString() { result = "UnresolvedPatternExpr" }
Pattern getSubPattern() { unresolved_pattern_exprs(this, result) }
}
class UnresolvedSpecializeExpr extends @unresolved_specialize_expr, Expr {
class UnresolvedSpecializeExpr extends @unresolved_specialize_expr, Expr, UnresolvedElement {
override string toString() { result = "UnresolvedSpecializeExpr" }
}
@@ -1311,12 +1303,13 @@ module Raw {
override string toString() { result = "UnevaluatedInstanceExpr" }
}
class UnresolvedMemberChainResultExpr extends @unresolved_member_chain_result_expr, IdentityExpr {
class UnresolvedMemberChainResultExpr extends @unresolved_member_chain_result_expr, IdentityExpr,
UnresolvedElement {
override string toString() { result = "UnresolvedMemberChainResultExpr" }
}
class UnresolvedTypeConversionExpr extends @unresolved_type_conversion_expr,
ImplicitConversionExpr {
ImplicitConversionExpr, UnresolvedElement {
override string toString() { result = "UnresolvedTypeConversionExpr" }
}

View File

@@ -22,7 +22,6 @@ module Synth {
TEnumElementDecl(Raw::EnumElementDecl id) { constructEnumElementDecl(id) } or
TExtensionDecl(Raw::ExtensionDecl id) { constructExtensionDecl(id) } or
TGenericTypeParamDecl(Raw::GenericTypeParamDecl id) { constructGenericTypeParamDecl(id) } or
TIfConfigClause(Raw::IfConfigClause id) { constructIfConfigClause(id) } or
TIfConfigDecl(Raw::IfConfigDecl id) { constructIfConfigDecl(id) } or
TImportDecl(Raw::ImportDecl id) { constructImportDecl(id) } or
TInfixOperatorDecl(Raw::InfixOperatorDecl id) { constructInfixOperatorDecl(id) } or
@@ -315,10 +314,15 @@ module Synth {
class TFile = TDbFile or TUnknownFile;
class TLocatable = TArgument or TAstNode or TComment or TConditionElement or TIfConfigClause;
class TLocatable = TArgument or TAstNode or TComment or TConditionElement;
class TLocation = TDbLocation or TUnknownLocation;
class TUnresolvedElement =
TUnresolvedDeclRefExpr or TUnresolvedDotExpr or TUnresolvedMemberChainResultExpr or
TUnresolvedMemberExpr or TUnresolvedPatternExpr or TUnresolvedSpecializeExpr or
TUnresolvedType or TUnresolvedTypeConversionExpr;
class TAbstractFunctionDecl = TConstructorDecl or TDestructorDecl or TFuncDecl;
class TAbstractStorageDecl = TSubscriptDecl or TVarDecl;
@@ -526,9 +530,6 @@ module Synth {
result = TGenericTypeParamDecl(e)
}
cached
TIfConfigClause convertIfConfigClauseFromRaw(Raw::Element e) { result = TIfConfigClause(e) }
cached
TIfConfigDecl convertIfConfigDeclFromRaw(Raw::Element e) { result = TIfConfigDecl(e) }
@@ -1420,6 +1421,8 @@ module Synth {
result = convertLocationFromRaw(e)
or
result = convertTypeFromRaw(e)
or
result = convertUnresolvedElementFromRaw(e)
}
cached
@@ -1438,8 +1441,6 @@ module Synth {
result = convertCommentFromRaw(e)
or
result = convertConditionElementFromRaw(e)
or
result = convertIfConfigClauseFromRaw(e)
}
cached
@@ -1449,6 +1450,25 @@ module Synth {
result = convertUnknownLocationFromRaw(e)
}
cached
TUnresolvedElement convertUnresolvedElementFromRaw(Raw::Element e) {
result = convertUnresolvedDeclRefExprFromRaw(e)
or
result = convertUnresolvedDotExprFromRaw(e)
or
result = convertUnresolvedMemberChainResultExprFromRaw(e)
or
result = convertUnresolvedMemberExprFromRaw(e)
or
result = convertUnresolvedPatternExprFromRaw(e)
or
result = convertUnresolvedSpecializeExprFromRaw(e)
or
result = convertUnresolvedTypeFromRaw(e)
or
result = convertUnresolvedTypeConversionExprFromRaw(e)
}
cached
TAbstractFunctionDecl convertAbstractFunctionDeclFromRaw(Raw::Element e) {
result = convertConstructorDeclFromRaw(e)
@@ -2188,9 +2208,6 @@ module Synth {
e = TGenericTypeParamDecl(result)
}
cached
Raw::Element convertIfConfigClauseToRaw(TIfConfigClause e) { e = TIfConfigClause(result) }
cached
Raw::Element convertIfConfigDeclToRaw(TIfConfigDecl e) { e = TIfConfigDecl(result) }
@@ -3080,6 +3097,8 @@ module Synth {
result = convertLocationToRaw(e)
or
result = convertTypeToRaw(e)
or
result = convertUnresolvedElementToRaw(e)
}
cached
@@ -3098,8 +3117,6 @@ module Synth {
result = convertCommentToRaw(e)
or
result = convertConditionElementToRaw(e)
or
result = convertIfConfigClauseToRaw(e)
}
cached
@@ -3109,6 +3126,25 @@ module Synth {
result = convertUnknownLocationToRaw(e)
}
cached
Raw::Element convertUnresolvedElementToRaw(TUnresolvedElement e) {
result = convertUnresolvedDeclRefExprToRaw(e)
or
result = convertUnresolvedDotExprToRaw(e)
or
result = convertUnresolvedMemberChainResultExprToRaw(e)
or
result = convertUnresolvedMemberExprToRaw(e)
or
result = convertUnresolvedPatternExprToRaw(e)
or
result = convertUnresolvedSpecializeExprToRaw(e)
or
result = convertUnresolvedTypeToRaw(e)
or
result = convertUnresolvedTypeConversionExprToRaw(e)
}
cached
Raw::Element convertAbstractFunctionDeclToRaw(TAbstractFunctionDecl e) {
result = convertConstructorDeclToRaw(e)

View File

@@ -14,7 +14,6 @@ import codeql.swift.elements.decl.EnumDeclConstructor
import codeql.swift.elements.decl.EnumElementDeclConstructor
import codeql.swift.elements.decl.ExtensionDeclConstructor
import codeql.swift.elements.decl.GenericTypeParamDeclConstructor
import codeql.swift.elements.decl.IfConfigClauseConstructor
import codeql.swift.elements.decl.IfConfigDeclConstructor
import codeql.swift.elements.decl.ImportDeclConstructor
import codeql.swift.elements.decl.InfixOperatorDeclConstructor

View File

@@ -0,0 +1,6 @@
// generated by codegen/codegen.py
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.Element
class UnresolvedElementBase extends Synth::TUnresolvedElement, Element { }

View File

@@ -1,36 +0,0 @@
// generated by codegen/codegen.py
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.AstNode
import codeql.swift.elements.expr.Expr
import codeql.swift.elements.Locatable
class IfConfigClauseBase extends Synth::TIfConfigClause, Locatable {
override string getAPrimaryQlClass() { result = "IfConfigClause" }
Expr getImmediateCondition() {
result =
Synth::convertExprFromRaw(Synth::convertIfConfigClauseToRaw(this)
.(Raw::IfConfigClause)
.getCondition())
}
final Expr getCondition() { result = getImmediateCondition().resolve() }
final predicate hasCondition() { exists(getCondition()) }
AstNode getImmediateElement(int index) {
result =
Synth::convertAstNodeFromRaw(Synth::convertIfConfigClauseToRaw(this)
.(Raw::IfConfigClause)
.getElement(index))
}
final AstNode getElement(int index) { result = getImmediateElement(index).resolve() }
final AstNode getAnElement() { result = getElement(_) }
final int getNumberOfElements() { result = count(getAnElement()) }
predicate isActive() { Synth::convertIfConfigClauseToRaw(this).(Raw::IfConfigClause).isActive() }
}

View File

@@ -1,22 +1,22 @@
// generated by codegen/codegen.py
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.AstNode
import codeql.swift.elements.decl.Decl
import codeql.swift.elements.decl.IfConfigClause
class IfConfigDeclBase extends Synth::TIfConfigDecl, Decl {
override string getAPrimaryQlClass() { result = "IfConfigDecl" }
IfConfigClause getImmediateClause(int index) {
AstNode getImmediateActiveElement(int index) {
result =
Synth::convertIfConfigClauseFromRaw(Synth::convertIfConfigDeclToRaw(this)
Synth::convertAstNodeFromRaw(Synth::convertIfConfigDeclToRaw(this)
.(Raw::IfConfigDecl)
.getClause(index))
.getActiveElement(index))
}
final IfConfigClause getClause(int index) { result = getImmediateClause(index).resolve() }
final AstNode getActiveElement(int index) { result = getImmediateActiveElement(index).resolve() }
final IfConfigClause getAClause() { result = getClause(_) }
final AstNode getAnActiveElement() { result = getActiveElement(_) }
final int getNumberOfClauses() { result = count(getAClause()) }
final int getNumberOfActiveElements() { result = count(getAnActiveElement()) }
}

View File

@@ -2,8 +2,9 @@
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.expr.Expr
import codeql.swift.elements.UnresolvedElement
class UnresolvedDeclRefExprBase extends Synth::TUnresolvedDeclRefExpr, Expr {
class UnresolvedDeclRefExprBase extends Synth::TUnresolvedDeclRefExpr, Expr, UnresolvedElement {
override string getAPrimaryQlClass() { result = "UnresolvedDeclRefExpr" }
string getName() {

View File

@@ -2,8 +2,9 @@
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.expr.Expr
import codeql.swift.elements.UnresolvedElement
class UnresolvedDotExprBase extends Synth::TUnresolvedDotExpr, Expr {
class UnresolvedDotExprBase extends Synth::TUnresolvedDotExpr, Expr, UnresolvedElement {
override string getAPrimaryQlClass() { result = "UnresolvedDotExpr" }
Expr getImmediateBase() {

View File

@@ -2,8 +2,9 @@
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.expr.IdentityExpr
import codeql.swift.elements.UnresolvedElement
class UnresolvedMemberChainResultExprBase extends Synth::TUnresolvedMemberChainResultExpr,
IdentityExpr {
IdentityExpr, UnresolvedElement {
override string getAPrimaryQlClass() { result = "UnresolvedMemberChainResultExpr" }
}

View File

@@ -2,8 +2,9 @@
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.expr.Expr
import codeql.swift.elements.UnresolvedElement
class UnresolvedMemberExprBase extends Synth::TUnresolvedMemberExpr, Expr {
class UnresolvedMemberExprBase extends Synth::TUnresolvedMemberExpr, Expr, UnresolvedElement {
override string getAPrimaryQlClass() { result = "UnresolvedMemberExpr" }
string getName() {

View File

@@ -3,8 +3,9 @@ private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.expr.Expr
import codeql.swift.elements.pattern.Pattern
import codeql.swift.elements.UnresolvedElement
class UnresolvedPatternExprBase extends Synth::TUnresolvedPatternExpr, Expr {
class UnresolvedPatternExprBase extends Synth::TUnresolvedPatternExpr, Expr, UnresolvedElement {
override string getAPrimaryQlClass() { result = "UnresolvedPatternExpr" }
Pattern getImmediateSubPattern() {

View File

@@ -2,7 +2,8 @@
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.expr.Expr
import codeql.swift.elements.UnresolvedElement
class UnresolvedSpecializeExprBase extends Synth::TUnresolvedSpecializeExpr, Expr {
class UnresolvedSpecializeExprBase extends Synth::TUnresolvedSpecializeExpr, Expr, UnresolvedElement {
override string getAPrimaryQlClass() { result = "UnresolvedSpecializeExpr" }
}

View File

@@ -2,8 +2,9 @@
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.expr.ImplicitConversionExpr
import codeql.swift.elements.UnresolvedElement
class UnresolvedTypeConversionExprBase extends Synth::TUnresolvedTypeConversionExpr,
ImplicitConversionExpr {
ImplicitConversionExpr, UnresolvedElement {
override string getAPrimaryQlClass() { result = "UnresolvedTypeConversionExpr" }
}

View File

@@ -12,6 +12,4 @@ class TypeReprBase extends Synth::TTypeRepr, AstNode {
}
final Type getType() { result = getImmediateType().resolve() }
final predicate hasType() { exists(getType()) }
}

View File

@@ -2,7 +2,8 @@
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.type.Type
import codeql.swift.elements.UnresolvedElement
class UnresolvedTypeBase extends Synth::TUnresolvedType, Type {
class UnresolvedTypeBase extends Synth::TUnresolvedType, Type, UnresolvedElement {
override string getAPrimaryQlClass() { result = "UnresolvedType" }
}

View File

@@ -20,6 +20,7 @@ sourceLocationPrefix(
| @locatable
| @location
| @type
| @unresolved_element
;
#keyset[id]
@@ -27,6 +28,17 @@ element_is_unknown(
int id: @element ref
);
@unresolved_element =
@unresolved_decl_ref_expr
| @unresolved_dot_expr
| @unresolved_member_chain_result_expr
| @unresolved_member_expr
| @unresolved_pattern_expr
| @unresolved_specialize_expr
| @unresolved_type
| @unresolved_type_conversion_expr
;
@file =
@db_file
| @unknown_file
@@ -51,7 +63,6 @@ unknown_files(
| @ast_node
| @comment
| @condition_element
| @if_config_clause
;
#keyset[id]
@@ -520,12 +531,7 @@ expr_types( //dir=expr
;
type_reprs( //dir=type
unique int id: @type_repr
);
#keyset[id]
type_repr_types( //dir=type
int id: @type_repr ref,
unique int id: @type_repr,
int type_: @type ref
);
@@ -680,32 +686,10 @@ if_config_decls( //dir=decl
);
#keyset[id, index]
if_config_decl_clauses( //dir=decl
if_config_decl_active_elements( //dir=decl
int id: @if_config_decl ref,
int index: int ref,
int clause: @if_config_clause ref
);
if_config_clauses( //dir=decl
unique int id: @if_config_clause
);
#keyset[id]
if_config_clause_conditions( //dir=decl
int id: @if_config_clause ref,
int condition: @expr ref
);
#keyset[id, index]
if_config_clause_elements( //dir=decl
int id: @if_config_clause ref,
int index: int ref,
int element: @ast_node ref
);
#keyset[id]
if_config_clause_is_active( //dir=decl
int id: @if_config_clause ref
int active_element: @ast_node ref
);
import_decls( //dir=decl

View File

@@ -1,6 +0,0 @@
| if_config.swift:1:1:1:1 | IfConfigClause | isActive: | no |
| if_config.swift:4:1:4:1 | IfConfigClause | isActive: | no |
| if_config.swift:7:1:7:1 | IfConfigClause | isActive: | yes |
| if_config_active.swift:3:1:3:1 | IfConfigClause | isActive: | yes |
| if_config_active.swift:6:1:6:1 | IfConfigClause | isActive: | no |
| if_config_active.swift:9:1:9:1 | IfConfigClause | isActive: | no |

View File

@@ -1,10 +0,0 @@
// generated by codegen/codegen.py
import codeql.swift.elements
import TestUtils
from IfConfigClause x, string isActive
where
toBeTested(x) and
not x.isUnknown() and
if x.isActive() then isActive = "yes" else isActive = "no"
select x, "isActive:", isActive

View File

@@ -1,4 +0,0 @@
| if_config.swift:1:1:1:1 | IfConfigClause | if_config.swift:1:5:1:5 | FOO (unresolved) |
| if_config.swift:4:1:4:1 | IfConfigClause | if_config.swift:4:9:4:19 | call to ... |
| if_config_active.swift:3:1:3:1 | IfConfigClause | if_config_active.swift:3:5:3:5 | FOO (unresolved) |
| if_config_active.swift:6:1:6:1 | IfConfigClause | if_config_active.swift:6:9:6:17 | call to ... |

View File

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

View File

@@ -1,18 +0,0 @@
| if_config.swift:1:1:1:1 | IfConfigClause | 0 | if_config.swift:2:1:2:16 | { ... } |
| if_config.swift:1:1:1:1 | IfConfigClause | 1 | if_config.swift:2:5:2:5 | foo |
| if_config.swift:1:1:1:1 | IfConfigClause | 2 | if_config.swift:3:1:3:12 | { ... } |
| if_config.swift:4:1:4:1 | IfConfigClause | 0 | if_config.swift:5:1:5:16 | { ... } |
| if_config.swift:4:1:4:1 | IfConfigClause | 1 | if_config.swift:5:5:5:5 | bar |
| if_config.swift:4:1:4:1 | IfConfigClause | 2 | if_config.swift:6:1:6:12 | { ... } |
| if_config.swift:7:1:7:1 | IfConfigClause | 0 | if_config.swift:8:1:8:16 | { ... } |
| if_config.swift:7:1:7:1 | IfConfigClause | 1 | if_config.swift:8:5:8:5 | baz |
| if_config.swift:7:1:7:1 | IfConfigClause | 2 | if_config.swift:9:1:9:12 | { ... } |
| if_config_active.swift:3:1:3:1 | IfConfigClause | 0 | if_config_active.swift:4:1:4:16 | { ... } |
| if_config_active.swift:3:1:3:1 | IfConfigClause | 1 | if_config_active.swift:4:5:4:5 | foo |
| if_config_active.swift:3:1:3:1 | IfConfigClause | 2 | if_config_active.swift:5:1:5:12 | { ... } |
| if_config_active.swift:6:1:6:1 | IfConfigClause | 0 | if_config_active.swift:7:1:7:16 | { ... } |
| if_config_active.swift:6:1:6:1 | IfConfigClause | 1 | if_config_active.swift:7:5:7:5 | bar |
| if_config_active.swift:6:1:6:1 | IfConfigClause | 2 | if_config_active.swift:8:1:8:12 | { ... } |
| if_config_active.swift:9:1:9:1 | IfConfigClause | 0 | if_config_active.swift:10:1:10:16 | { ... } |
| if_config_active.swift:9:1:9:1 | IfConfigClause | 1 | if_config_active.swift:10:5:10:5 | baz |
| if_config_active.swift:9:1:9:1 | IfConfigClause | 2 | if_config_active.swift:11:1:11:12 | { ... } |

View File

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

View File

@@ -1,10 +0,0 @@
#if FOO
var foo: Int = 1
print("foo")
#elseif os(watchOS)
var bar: Int = 2
print("bar")
#else
var baz: Int = 3
print("baz")
#endif

View File

@@ -1,12 +0,0 @@
//codeql-extractor-options: -D FOO
#if FOO
var foo: Int = 1
print("foo")
#elseif os(macOS)
var bar: Int = 2
print("bar")
#else
var baz: Int = 3
print("baz")
#endif

View File

@@ -0,0 +1,3 @@
| if_config.swift:1:1:10:1 | #if ... | 0 | if_config.swift:8:1:8:16 | { ... } |
| if_config.swift:1:1:10:1 | #if ... | 1 | if_config.swift:8:5:8:5 | baz |
| if_config.swift:1:1:10:1 | #if ... | 2 | if_config.swift:9:1:9:12 | { ... } |

View File

@@ -4,4 +4,4 @@ import TestUtils
from IfConfigDecl x, int index
where toBeTested(x) and not x.isUnknown()
select x, index, x.getClause(index)
select x, index, x.getActiveElement(index)

View File

@@ -3,4 +3,3 @@
| import.swift:3:12:3:32 | import ... | getModule: | file://:0:0:0:0 | import | isExported: | yes |
| import.swift:4:1:4:19 | import ... | getModule: | file://:0:0:0:0 | import | isExported: | no |
| import.swift:5:1:5:23 | import ... | getModule: | file://:0:0:0:0 | import | isExported: | no |
| import.swift:7:1:7:8 | import ... | getModule: | file://:0:0:0:0 | import | isExported: | no |

View File

@@ -1,10 +0,0 @@
| unresolved_decl_ref.swift:4:5:4:5 | FOO (unresolved) |
| unresolved_decl_ref.swift:4:9:4:9 | && (unresolved) |
| unresolved_decl_ref.swift:4:12:4:12 | os (unresolved) |
| unresolved_decl_ref.swift:4:15:4:15 | Windows (unresolved) |
| unresolved_decl_ref.swift:5:1:5:1 | print (unresolved) |
| unresolved_decl_ref.swift:6:9:6:9 | BAR (unresolved) |
| unresolved_decl_ref.swift:6:13:6:13 | \|\| (unresolved) |
| unresolved_decl_ref.swift:6:16:6:16 | arch (unresolved) |
| unresolved_decl_ref.swift:6:21:6:21 | i386 (unresolved) |
| unresolved_decl_ref.swift:9:1:9:1 | print (unresolved) |

View File

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

View File

@@ -1,10 +0,0 @@
| unresolved_decl_ref.swift:4:5:4:5 | FOO (unresolved) | FOO |
| unresolved_decl_ref.swift:4:9:4:9 | && (unresolved) | && |
| unresolved_decl_ref.swift:4:12:4:12 | os (unresolved) | os |
| unresolved_decl_ref.swift:4:15:4:15 | Windows (unresolved) | Windows |
| unresolved_decl_ref.swift:5:1:5:1 | print (unresolved) | print |
| unresolved_decl_ref.swift:6:9:6:9 | BAR (unresolved) | BAR |
| unresolved_decl_ref.swift:6:13:6:13 | \|\| (unresolved) | \|\| |
| unresolved_decl_ref.swift:6:16:6:16 | arch (unresolved) | arch |
| unresolved_decl_ref.swift:6:21:6:21 | i386 (unresolved) | i386 |
| unresolved_decl_ref.swift:9:1:9:1 | print (unresolved) | print |

View File

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

View File

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

View File

@@ -1,10 +0,0 @@
//codeql-extractor-options: -D BAR
// conditions and inactive branches in conditional compilation blocks are not resolved
#if FOO && os(Windows)
print(1)
#elseif BAR || arch(i386)
print(2)
#else
print(3)
#endif

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

@@ -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

@@ -1 +0,0 @@
| unresolved_pattern_expr.swift:2:19:2:19 | UnresolvedPatternExpr | getSubPattern: | unresolved_pattern_expr.swift:2:19:2:19 | x |

View File

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

View File

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

View File

@@ -1,5 +0,0 @@
#if FOO
if case let .some(x) = 42 {
print(x)
}
#endif

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

@@ -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