mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Swift: generate getParent implementation
By explicitly marking children in the `schema.yml` file, an internal `getAChild` predicate is implemented, that is in turn used in `AstNode` to implement `getParent`. This is yet to be used in the control flow library to replace the hand-rolled implementation. A further, more complex step is to use the same information to fully generate the core implementation of `PrintAst` (including the accessor string). This will be done later. The `parent` tests use the same swift code as the extractor tests, and this is currently enforced by `sync-files.py`. Notice that `qltest.sh` had to be modified to deal with multiple files, which was not working yet.
This commit is contained in:
@@ -25,7 +25,7 @@ repos:
|
||||
|
||||
- id: sync-files
|
||||
name: Fix files required to be identical
|
||||
files: \.(qll?|qhelp)$
|
||||
files: \.(qll?|qhelp|swift)$
|
||||
language: system
|
||||
entry: python3 config/sync-files.py --latest
|
||||
pass_filenames: false
|
||||
|
||||
@@ -566,5 +566,21 @@
|
||||
"Typo database": [
|
||||
"javascript/ql/src/Expressions/TypoDatabase.qll",
|
||||
"ql/ql/src/codeql_ql/style/TypoDatabase.qll"
|
||||
],
|
||||
"Swift declarations test file": [
|
||||
"swift/ql/test/extractor-tests/declarations/declarations.swift",
|
||||
"swift/ql/test/library-tests/parent/declarations.swift"
|
||||
],
|
||||
"Swift statements test file": [
|
||||
"swift/ql/test/extractor-tests/statements/statements.swift",
|
||||
"swift/ql/test/library-tests/parent/statements.swift"
|
||||
],
|
||||
"Swift expressions test file": [
|
||||
"swift/ql/test/extractor-tests/expressions/expressions.swift",
|
||||
"swift/ql/test/library-tests/parent/expressions.swift"
|
||||
],
|
||||
"Swift patterns test file": [
|
||||
"swift/ql/test/extractor-tests/patterns/patterns.swift",
|
||||
"swift/ql/test/library-tests/parent/patterns.swift"
|
||||
]
|
||||
}
|
||||
@@ -19,6 +19,7 @@ def get_ql_property(cls: schema.Class, prop: schema.Property):
|
||||
type=prop.type,
|
||||
tablename=inflection.tableize(cls.name),
|
||||
tableparams=["this"] + ["result" if p is prop else "_" for p in cls.properties if p.is_single],
|
||||
is_child=prop.is_child,
|
||||
)
|
||||
elif prop.is_repeated:
|
||||
return ql.Property(
|
||||
@@ -28,6 +29,7 @@ def get_ql_property(cls: schema.Class, prop: schema.Property):
|
||||
tablename=inflection.tableize(f"{cls.name}_{prop.name}"),
|
||||
tableparams=["this", "index", "result"],
|
||||
is_optional=prop.is_optional,
|
||||
is_child=prop.is_child,
|
||||
)
|
||||
elif prop.is_optional:
|
||||
return ql.Property(
|
||||
@@ -36,6 +38,7 @@ def get_ql_property(cls: schema.Class, prop: schema.Property):
|
||||
tablename=inflection.tableize(f"{cls.name}_{prop.name}"),
|
||||
tableparams=["this", "result"],
|
||||
is_optional=True,
|
||||
is_child=prop.is_child,
|
||||
)
|
||||
elif prop.is_predicate:
|
||||
return ql.Property(
|
||||
|
||||
@@ -22,6 +22,7 @@ class Property:
|
||||
local_var: str = "x"
|
||||
is_optional: bool = False
|
||||
is_predicate: bool = False
|
||||
is_child: bool = False
|
||||
|
||||
def __post_init__(self):
|
||||
if self.tableparams:
|
||||
|
||||
@@ -19,6 +19,7 @@ class Property:
|
||||
|
||||
name: str
|
||||
type: str = None
|
||||
is_child: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -62,17 +63,18 @@ class Schema:
|
||||
includes: Set[str] = field(default_factory=set)
|
||||
|
||||
|
||||
def _parse_property(name, type):
|
||||
def _parse_property(name: str, type: str, is_child: bool = False):
|
||||
assert not (is_child and type[0].islower()), f"children must have class type, got {type} for {name}"
|
||||
if type.endswith("?*"):
|
||||
return RepeatedOptionalProperty(name, type[:-2])
|
||||
return RepeatedOptionalProperty(name, type[:-2], is_child=is_child)
|
||||
elif type.endswith("*"):
|
||||
return RepeatedProperty(name, type[:-1])
|
||||
return RepeatedProperty(name, type[:-1], is_child=is_child)
|
||||
elif type.endswith("?"):
|
||||
return OptionalProperty(name, type[:-1])
|
||||
return OptionalProperty(name, type[:-1], is_child=is_child)
|
||||
elif type == "predicate":
|
||||
return PredicateProperty(name)
|
||||
else:
|
||||
return SingleProperty(name, type)
|
||||
return SingleProperty(name, type, is_child=is_child)
|
||||
|
||||
|
||||
class _DirSelector:
|
||||
@@ -109,6 +111,8 @@ def load(path):
|
||||
classes[base].derived.add(name)
|
||||
elif k == "_dir":
|
||||
cls.dir = pathlib.Path(v)
|
||||
elif k == "_children":
|
||||
cls.properties.extend(_parse_property(kk, vv, is_child=True) for kk, vv in v.items())
|
||||
if not cls.bases and cls.name != root_class_name:
|
||||
cls.bases.add(root_class_name)
|
||||
classes[root_class_name].derived.add(name)
|
||||
|
||||
@@ -52,6 +52,7 @@ AstNode:
|
||||
|
||||
ConditionElement:
|
||||
_extends: Locatable
|
||||
_children:
|
||||
boolean: Expr?
|
||||
pattern: Pattern?
|
||||
initializer: Expr?
|
||||
@@ -247,6 +248,7 @@ TypeAliasType:
|
||||
|
||||
EnumCaseDecl:
|
||||
_extends: Decl
|
||||
_children:
|
||||
elements: EnumElementDecl*
|
||||
|
||||
IfConfigDecl:
|
||||
@@ -264,6 +266,7 @@ OperatorDecl:
|
||||
|
||||
PatternBindingDecl:
|
||||
_extends: Decl
|
||||
_children:
|
||||
inits: Expr?*
|
||||
patterns: Pattern*
|
||||
|
||||
@@ -275,6 +278,7 @@ PrecedenceGroupDecl:
|
||||
|
||||
TopLevelCodeDecl:
|
||||
_extends: Decl
|
||||
_children:
|
||||
body: BraceStmt
|
||||
|
||||
ValueDecl:
|
||||
@@ -286,6 +290,7 @@ AbstractClosureExpr:
|
||||
|
||||
AnyTryExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
AppliedPropertyWrapperExpr:
|
||||
@@ -293,11 +298,13 @@ AppliedPropertyWrapperExpr:
|
||||
|
||||
Argument:
|
||||
label: string
|
||||
_children:
|
||||
expr: Expr
|
||||
_dir: expr
|
||||
|
||||
ApplyExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
function: Expr
|
||||
arguments: Argument*
|
||||
|
||||
@@ -306,15 +313,18 @@ ArrowExpr:
|
||||
|
||||
AssignExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
dest: Expr
|
||||
source: Expr
|
||||
|
||||
BindOptionalExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
CaptureListExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
binding_decls: PatternBindingDecl*
|
||||
closure_body: ClosureExpr
|
||||
|
||||
@@ -343,11 +353,13 @@ DiscardAssignmentExpr:
|
||||
|
||||
DotSyntaxBaseIgnoredExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
qualifier: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
DynamicTypeExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
base_expr: Expr
|
||||
|
||||
EditorPlaceholderExpr:
|
||||
@@ -355,6 +367,7 @@ EditorPlaceholderExpr:
|
||||
|
||||
EnumIsCaseExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
type_repr: TypeRepr
|
||||
element: EnumElementDecl
|
||||
@@ -364,32 +377,39 @@ ErrorExpr:
|
||||
|
||||
ExplicitCastExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
ForceValueExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
IdentityExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
IfExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
condition: Expr
|
||||
then_expr: Expr
|
||||
else_expr: Expr
|
||||
|
||||
ImplicitConversionExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
InOutExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
KeyPathApplicationExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
base: Expr
|
||||
key_path: Expr
|
||||
|
||||
@@ -398,11 +418,13 @@ KeyPathDotExpr:
|
||||
|
||||
KeyPathExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
parsed_root: Expr?
|
||||
parsed_path: Expr?
|
||||
|
||||
LazyInitializerExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
LiteralExpr:
|
||||
@@ -410,22 +432,26 @@ LiteralExpr:
|
||||
|
||||
LookupExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
base_expr: Expr
|
||||
member: Decl
|
||||
|
||||
MakeTemporarilyEscapableExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
escaping_closure: OpaqueValueExpr
|
||||
nonescaping_closure: Expr
|
||||
sub_expr: Expr
|
||||
|
||||
ObjCSelectorExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
method: AbstractFunctionDecl
|
||||
|
||||
OneWayExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
OpaqueValueExpr:
|
||||
@@ -433,12 +459,14 @@ OpaqueValueExpr:
|
||||
|
||||
OpenExistentialExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
existential: Expr
|
||||
opaque_expr: OpaqueValueExpr
|
||||
|
||||
OptionalEvaluationExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
OtherConstructorDeclRefExpr:
|
||||
@@ -452,6 +480,7 @@ PropertyWrapperValuePlaceholderExpr:
|
||||
|
||||
RebindSelfInConstructorExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
self: VarDecl
|
||||
|
||||
@@ -464,21 +493,25 @@ SuperRefExpr:
|
||||
|
||||
TapExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr?
|
||||
var: VarDecl
|
||||
body: BraceStmt
|
||||
var: VarDecl
|
||||
|
||||
TupleElementExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
index: int
|
||||
|
||||
TupleExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
elements: Expr*
|
||||
|
||||
TypeExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
type_repr: TypeRepr?
|
||||
|
||||
UnresolvedDeclRefExpr:
|
||||
@@ -498,6 +531,7 @@ UnresolvedSpecializeExpr:
|
||||
|
||||
VarargExpansionExpr:
|
||||
_extends: Expr
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
AnyPattern:
|
||||
@@ -505,6 +539,7 @@ AnyPattern:
|
||||
|
||||
BindingPattern:
|
||||
_extends: Pattern
|
||||
_children:
|
||||
sub_pattern: Pattern
|
||||
|
||||
BoolPattern:
|
||||
@@ -514,10 +549,12 @@ BoolPattern:
|
||||
EnumElementPattern:
|
||||
_extends: Pattern
|
||||
element: EnumElementDecl
|
||||
_children:
|
||||
sub_pattern: Pattern?
|
||||
|
||||
ExprPattern:
|
||||
_extends: Pattern
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
IsPattern:
|
||||
@@ -531,23 +568,28 @@ NamedPattern:
|
||||
|
||||
OptionalSomePattern:
|
||||
_extends: Pattern
|
||||
_children:
|
||||
sub_pattern: Pattern
|
||||
|
||||
ParenPattern:
|
||||
_extends: Pattern
|
||||
_children:
|
||||
sub_pattern: Pattern
|
||||
|
||||
TuplePattern:
|
||||
_extends: Pattern
|
||||
_children:
|
||||
elements: Pattern*
|
||||
|
||||
TypedPattern:
|
||||
_extends: Pattern
|
||||
_children:
|
||||
sub_pattern: Pattern
|
||||
type_repr: TypeRepr?
|
||||
|
||||
BraceStmt:
|
||||
_extends: Stmt
|
||||
_children:
|
||||
elements: AstNode*
|
||||
|
||||
BreakStmt:
|
||||
@@ -557,12 +599,14 @@ BreakStmt:
|
||||
|
||||
CaseStmt:
|
||||
_extends: Stmt
|
||||
_children:
|
||||
body: Stmt
|
||||
labels: CaseLabelItem*
|
||||
variables: VarDecl*
|
||||
|
||||
CaseLabelItem:
|
||||
_extends: AstNode
|
||||
_children:
|
||||
pattern: Pattern
|
||||
guard: Expr?
|
||||
_dir: stmt
|
||||
@@ -574,6 +618,7 @@ ContinueStmt:
|
||||
|
||||
DeferStmt:
|
||||
_extends: Stmt
|
||||
_children:
|
||||
body: BraceStmt
|
||||
|
||||
FailStmt:
|
||||
@@ -593,14 +638,17 @@ PoundAssertStmt:
|
||||
|
||||
ReturnStmt:
|
||||
_extends: Stmt
|
||||
_children:
|
||||
result: Expr?
|
||||
|
||||
ThrowStmt:
|
||||
_extends: Stmt
|
||||
_children:
|
||||
sub_expr: Expr
|
||||
|
||||
YieldStmt:
|
||||
_extends: Stmt
|
||||
_children:
|
||||
results: Expr*
|
||||
|
||||
BoundGenericType:
|
||||
@@ -657,16 +705,19 @@ AbstractFunctionDecl:
|
||||
- GenericContext
|
||||
- ValueDecl
|
||||
name: string
|
||||
_children:
|
||||
body: BraceStmt?
|
||||
params: ParamDecl*
|
||||
|
||||
AbstractStorageDecl:
|
||||
_extends: ValueDecl
|
||||
_children:
|
||||
accessor_decls: AccessorDecl*
|
||||
|
||||
EnumElementDecl:
|
||||
_extends: ValueDecl
|
||||
name: string
|
||||
_children:
|
||||
params: ParamDecl*
|
||||
|
||||
TypeDecl:
|
||||
@@ -676,10 +727,12 @@ TypeDecl:
|
||||
|
||||
AutoClosureExpr:
|
||||
_extends: AbstractClosureExpr
|
||||
_children:
|
||||
body: BraceStmt
|
||||
|
||||
ClosureExpr:
|
||||
_extends: AbstractClosureExpr
|
||||
_children:
|
||||
body: BraceStmt
|
||||
|
||||
ForceTryExpr:
|
||||
@@ -705,14 +758,17 @@ PrefixUnaryExpr:
|
||||
|
||||
SelfApplyExpr:
|
||||
_extends: ApplyExpr
|
||||
_children:
|
||||
base_expr: Expr
|
||||
|
||||
ArrayExpr:
|
||||
_extends: CollectionExpr
|
||||
_children:
|
||||
elements: Expr*
|
||||
|
||||
DictionaryExpr:
|
||||
_extends: CollectionExpr
|
||||
_children:
|
||||
elements: Expr*
|
||||
|
||||
CheckedCastExpr:
|
||||
@@ -832,6 +888,7 @@ BuiltinLiteralExpr:
|
||||
InterpolatedStringLiteralExpr:
|
||||
_extends: LiteralExpr
|
||||
interpolation_expr: OpaqueValueExpr?
|
||||
_children:
|
||||
interpolation_count_expr: Expr?
|
||||
literal_capacity_expr: Expr?
|
||||
appending_expr: TapExpr?
|
||||
@@ -857,6 +914,7 @@ MemberRefExpr:
|
||||
SubscriptExpr:
|
||||
_extends:
|
||||
- LookupExpr
|
||||
_children:
|
||||
arguments: Argument*
|
||||
has_direct_to_storage_semantics: predicate
|
||||
has_direct_to_implementation_semantics: predicate
|
||||
@@ -867,15 +925,18 @@ OverloadedDeclRefExpr:
|
||||
|
||||
DoCatchStmt:
|
||||
_extends: LabeledStmt
|
||||
_children:
|
||||
body: Stmt
|
||||
catches: CaseStmt*
|
||||
|
||||
DoStmt:
|
||||
_extends: LabeledStmt
|
||||
_children:
|
||||
body: BraceStmt
|
||||
|
||||
ForEachStmt:
|
||||
_extends: LabeledStmt
|
||||
_children:
|
||||
pattern: Pattern
|
||||
sequence: Expr
|
||||
where: Expr?
|
||||
@@ -883,20 +944,24 @@ ForEachStmt:
|
||||
|
||||
LabeledConditionalStmt:
|
||||
_extends: LabeledStmt
|
||||
_children:
|
||||
condition: StmtCondition
|
||||
|
||||
StmtCondition:
|
||||
_extends: AstNode
|
||||
_children:
|
||||
elements: ConditionElement*
|
||||
_dir: stmt
|
||||
|
||||
RepeatWhileStmt:
|
||||
_extends: LabeledStmt
|
||||
_children:
|
||||
condition: Expr
|
||||
body: Stmt
|
||||
|
||||
SwitchStmt:
|
||||
_extends: LabeledStmt
|
||||
_children:
|
||||
expr: Expr
|
||||
cases: CaseStmt*
|
||||
|
||||
@@ -943,6 +1008,7 @@ SubscriptDecl:
|
||||
_extends:
|
||||
- AbstractStorageDecl
|
||||
- GenericContext
|
||||
_children:
|
||||
params: ParamDecl*
|
||||
element_type: Type
|
||||
|
||||
@@ -1006,15 +1072,18 @@ DynamicSubscriptExpr:
|
||||
|
||||
GuardStmt:
|
||||
_extends: LabeledConditionalStmt
|
||||
_children:
|
||||
body: BraceStmt
|
||||
|
||||
IfStmt:
|
||||
_extends: LabeledConditionalStmt
|
||||
_children:
|
||||
then: Stmt
|
||||
else: Stmt?
|
||||
|
||||
WhileStmt:
|
||||
_extends: LabeledConditionalStmt
|
||||
_children:
|
||||
body: Stmt
|
||||
|
||||
AccessorDecl:
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
// generated by {{generator}}
|
||||
|
||||
{{^root}}
|
||||
import codeql.swift.elements.Element
|
||||
{{/root}}
|
||||
{{#imports}}
|
||||
import {{.}}
|
||||
{{/imports}}
|
||||
@@ -19,10 +22,26 @@ class {{name}}Base extends {{db_id}}{{#bases}}, {{.}}{{/bases}} {
|
||||
or
|
||||
result = getResolveStep().resolve()
|
||||
}
|
||||
|
||||
{{name}}Base getAChild() { none() } // overridden by subclasses, internal use only
|
||||
{{/root}}
|
||||
{{#final}}
|
||||
override string getAPrimaryQlClass() { result = "{{name}}" }
|
||||
{{/final}}
|
||||
{{^root}}
|
||||
|
||||
cached override Element getAChild() {
|
||||
none()
|
||||
{{#bases}}
|
||||
or result = {{.}}.super.getAChild()
|
||||
{{/bases}}
|
||||
{{#properties}}
|
||||
{{#is_child}}
|
||||
or result = {{getter}}({{#is_repeated}}_{{/is_repeated}})
|
||||
{{/is_child}}
|
||||
{{/properties}}
|
||||
}
|
||||
{{/root}}
|
||||
{{#properties}}
|
||||
|
||||
{{type}} {{getter}}({{#is_repeated}}int index{{/is_repeated}}) {
|
||||
|
||||
@@ -99,44 +99,47 @@ def test_single_properties(opts, input, renderer):
|
||||
}
|
||||
|
||||
|
||||
def test_optional_property(opts, input, renderer):
|
||||
@pytest.mark.parametrize("is_child", [False, True])
|
||||
def test_optional_property(opts, input, renderer, is_child):
|
||||
input.classes = [
|
||||
schema.Class("MyObject", properties=[schema.OptionalProperty("foo", "bar")]),
|
||||
schema.Class("MyObject", properties=[schema.OptionalProperty("foo", "bar", is_child=is_child)]),
|
||||
]
|
||||
assert generate(opts, renderer) == {
|
||||
import_file(): ql.ImportList([stub_import_prefix + "MyObject"]),
|
||||
stub_path() / "MyObject.qll": ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql_output_path() / "MyObject.qll": ql.Class(name="MyObject", final=True, properties=[
|
||||
ql.Property(singular="Foo", type="bar", tablename="my_object_foos", tableparams=["this", "result"],
|
||||
is_optional=True),
|
||||
is_optional=True, is_child=is_child),
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
def test_repeated_property(opts, input, renderer):
|
||||
@pytest.mark.parametrize("is_child", [False, True])
|
||||
def test_repeated_property(opts, input, renderer, is_child):
|
||||
input.classes = [
|
||||
schema.Class("MyObject", properties=[schema.RepeatedProperty("foo", "bar")]),
|
||||
schema.Class("MyObject", properties=[schema.RepeatedProperty("foo", "bar", is_child=is_child)]),
|
||||
]
|
||||
assert generate(opts, renderer) == {
|
||||
import_file(): ql.ImportList([stub_import_prefix + "MyObject"]),
|
||||
stub_path() / "MyObject.qll": ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql_output_path() / "MyObject.qll": ql.Class(name="MyObject", final=True, properties=[
|
||||
ql.Property(singular="Foo", plural="Foos", type="bar", tablename="my_object_foos",
|
||||
tableparams=["this", "index", "result"]),
|
||||
tableparams=["this", "index", "result"], is_child=is_child),
|
||||
])
|
||||
}
|
||||
|
||||
|
||||
def test_repeated_optional_property(opts, input, renderer):
|
||||
@pytest.mark.parametrize("is_child", [False, True])
|
||||
def test_repeated_optional_property(opts, input, renderer, is_child):
|
||||
input.classes = [
|
||||
schema.Class("MyObject", properties=[schema.RepeatedOptionalProperty("foo", "bar")]),
|
||||
schema.Class("MyObject", properties=[schema.RepeatedOptionalProperty("foo", "bar", is_child=is_child)]),
|
||||
]
|
||||
assert generate(opts, renderer) == {
|
||||
import_file(): ql.ImportList([stub_import_prefix + "MyObject"]),
|
||||
stub_path() / "MyObject.qll": ql.Stub(name="MyObject", base_import=gen_import_prefix + "MyObject"),
|
||||
ql_output_path() / "MyObject.qll": ql.Class(name="MyObject", final=True, properties=[
|
||||
ql.Property(singular="Foo", plural="Foos", type="bar", tablename="my_object_foos",
|
||||
tableparams=["this", "index", "result"], is_optional=True),
|
||||
tableparams=["this", "index", "result"], is_optional=True, is_child=is_child),
|
||||
])
|
||||
}
|
||||
|
||||
@@ -155,9 +158,10 @@ def test_predicate_property(opts, input, renderer):
|
||||
}
|
||||
|
||||
|
||||
def test_single_class_property(opts, input, renderer):
|
||||
@pytest.mark.parametrize("is_child", [False, True])
|
||||
def test_single_class_property(opts, input, renderer, is_child):
|
||||
input.classes = [
|
||||
schema.Class("MyObject", properties=[schema.SingleProperty("foo", "Bar")]),
|
||||
schema.Class("MyObject", properties=[schema.SingleProperty("foo", "Bar", is_child=is_child)]),
|
||||
schema.Class("Bar"),
|
||||
]
|
||||
assert generate(opts, renderer) == {
|
||||
@@ -166,7 +170,8 @@ def test_single_class_property(opts, input, renderer):
|
||||
stub_path() / "Bar.qll": ql.Stub(name="Bar", base_import=gen_import_prefix + "Bar"),
|
||||
ql_output_path() / "MyObject.qll": ql.Class(
|
||||
name="MyObject", final=True, imports=[stub_import_prefix + "Bar"], properties=[
|
||||
ql.Property(singular="Foo", type="Bar", tablename="my_objects", tableparams=["this", "result"]),
|
||||
ql.Property(singular="Foo", type="Bar", tablename="my_objects", tableparams=["this", "result"],
|
||||
is_child=is_child),
|
||||
],
|
||||
),
|
||||
ql_output_path() / "Bar.qll": ql.Class(name="Bar", final=True)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
|
||||
from swift.codegen.test.utils import *
|
||||
|
||||
root_name = schema.root_class_name
|
||||
@@ -167,5 +169,39 @@ Element:
|
||||
]
|
||||
|
||||
|
||||
def test_children(load):
|
||||
ret = load("""
|
||||
A:
|
||||
a: string
|
||||
b: B*
|
||||
_children:
|
||||
c: C
|
||||
d: D*
|
||||
e: E?
|
||||
f: F?*
|
||||
""")
|
||||
assert ret.classes == [
|
||||
schema.Class(root_name, derived={'A'}),
|
||||
schema.Class('A', bases={root_name}, properties=[
|
||||
schema.SingleProperty('a', 'string'),
|
||||
schema.RepeatedProperty('b', 'B'),
|
||||
schema.SingleProperty('c', 'C', is_child=True),
|
||||
schema.RepeatedProperty('d', 'D', is_child=True),
|
||||
schema.OptionalProperty('e', 'E', is_child=True),
|
||||
schema.RepeatedOptionalProperty('f', 'F', is_child=True),
|
||||
]),
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("type", ["string", "int", "boolean", "predicate"])
|
||||
def test_builtin_and_predicate_children_not_allowed(load, type):
|
||||
with pytest.raises(AssertionError):
|
||||
load(f"""
|
||||
A:
|
||||
_children:
|
||||
x: {type}
|
||||
""")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(pytest.main([__file__] + sys.argv[1:]))
|
||||
|
||||
@@ -313,7 +313,7 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
|
||||
auto varLabel = dispatcher_.fetchLabel(expr->getVar());
|
||||
auto bodyLabel = dispatcher_.fetchLabel(expr->getBody());
|
||||
|
||||
dispatcher_.emit(TapExprsTrap{label, varLabel, bodyLabel});
|
||||
dispatcher_.emit(TapExprsTrap{label, bodyLabel, varLabel});
|
||||
if (auto subExpr = expr->getSubExpr()) {
|
||||
dispatcher_.emit(TapExprSubExprsTrap{label, dispatcher_.fetchLabel(subExpr)});
|
||||
}
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
|
||||
private import codeql.swift.generated.AstNode
|
||||
|
||||
class AstNode extends AstNodeBase { }
|
||||
class AstNode extends AstNodeBase {
|
||||
AstNode getParent() {
|
||||
result = unique(AstNode x | this = x.getAChild() and not exists(x.getResolveStep()) | x)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
private import codeql.swift.generated.Element
|
||||
|
||||
class Element extends ElementBase {
|
||||
private predicate resolvesTo(Element e) { e.getResolveStep() = this }
|
||||
private predicate resolvesFrom(Element e) { e.getResolveStep() = this }
|
||||
|
||||
override string toString() { result = getPrimaryQlClasses() }
|
||||
|
||||
Element getFullyUnresolved() {
|
||||
not this.resolvesTo(_) and result = this
|
||||
not this.resolvesFrom(_) and result = this
|
||||
or
|
||||
exists(Element e |
|
||||
this.resolvesTo(e) and
|
||||
this.resolvesFrom(e) and
|
||||
result = e.getFullyUnresolved()
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.Locatable
|
||||
|
||||
class AstNodeBase extends @ast_node, Locatable { }
|
||||
class AstNodeBase extends @ast_node, Locatable {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Locatable.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,5 +14,7 @@ class ElementBase extends @element {
|
||||
result = getResolveStep().resolve()
|
||||
}
|
||||
|
||||
ElementBase getAChild() { none() } // overridden by subclasses, internal use only
|
||||
|
||||
predicate isUnknown() { element_is_unknown(this) }
|
||||
}
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.Element
|
||||
|
||||
class FileBase extends @file, Element {
|
||||
override string getAPrimaryQlClass() { result = "File" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Element.super.getAChild()
|
||||
}
|
||||
|
||||
string getName() { files(this, result) }
|
||||
}
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.Location
|
||||
|
||||
class LocatableBase extends @locatable, Element {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Element.super.getAChild()
|
||||
}
|
||||
|
||||
Location getLocation() {
|
||||
exists(Location x |
|
||||
locatables(this, x) and
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.File
|
||||
|
||||
class LocationBase extends @location, Element {
|
||||
override string getAPrimaryQlClass() { result = "Location" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Element.super.getAChild()
|
||||
}
|
||||
|
||||
File getFile() {
|
||||
exists(File x |
|
||||
locations(this, x, _, _, _, _) and
|
||||
|
||||
@@ -1,10 +1,20 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.stmt.BraceStmt
|
||||
import codeql.swift.elements.decl.GenericContext
|
||||
import codeql.swift.elements.decl.ParamDecl
|
||||
import codeql.swift.elements.decl.ValueDecl
|
||||
|
||||
class AbstractFunctionDeclBase extends @abstract_function_decl, GenericContext, ValueDecl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = GenericContext.super.getAChild() or
|
||||
result = ValueDecl.super.getAChild() or
|
||||
result = getBody() or
|
||||
result = getParam(_)
|
||||
}
|
||||
|
||||
string getName() { abstract_function_decls(this, result) }
|
||||
|
||||
BraceStmt getBody() {
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.AccessorDecl
|
||||
import codeql.swift.elements.decl.ValueDecl
|
||||
|
||||
class AbstractStorageDeclBase extends @abstract_storage_decl, ValueDecl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ValueDecl.super.getAChild() or
|
||||
result = getAccessorDecl(_)
|
||||
}
|
||||
|
||||
AccessorDecl getAccessorDecl(int index) {
|
||||
exists(AccessorDecl x |
|
||||
abstract_storage_decl_accessor_decls(this, index, x) and
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.TypeDecl
|
||||
|
||||
class AbstractTypeParamDeclBase extends @abstract_type_param_decl, TypeDecl { }
|
||||
class AbstractTypeParamDeclBase extends @abstract_type_param_decl, TypeDecl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = TypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,16 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.FuncDecl
|
||||
|
||||
class AccessorDeclBase extends @accessor_decl, FuncDecl {
|
||||
override string getAPrimaryQlClass() { result = "AccessorDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = FuncDecl.super.getAChild()
|
||||
}
|
||||
|
||||
predicate isGetter() { accessor_decl_is_getter(this) }
|
||||
|
||||
predicate isSetter() { accessor_decl_is_setter(this) }
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.AbstractTypeParamDecl
|
||||
|
||||
class AssociatedTypeDeclBase extends @associated_type_decl, AbstractTypeParamDecl {
|
||||
override string getAPrimaryQlClass() { result = "AssociatedTypeDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractTypeParamDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.NominalTypeDecl
|
||||
|
||||
class ClassDeclBase extends @class_decl, NominalTypeDecl {
|
||||
override string getAPrimaryQlClass() { result = "ClassDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = NominalTypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.FuncDecl
|
||||
|
||||
class ConcreteFuncDeclBase extends @concrete_func_decl, FuncDecl {
|
||||
override string getAPrimaryQlClass() { result = "ConcreteFuncDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = FuncDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.VarDecl
|
||||
|
||||
class ConcreteVarDeclBase extends @concrete_var_decl, VarDecl {
|
||||
override string getAPrimaryQlClass() { result = "ConcreteVarDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = VarDecl.super.getAChild()
|
||||
}
|
||||
|
||||
int getIntroducerInt() { concrete_var_decls(this, result) }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.AbstractFunctionDecl
|
||||
|
||||
class ConstructorDeclBase extends @constructor_decl, AbstractFunctionDecl {
|
||||
override string getAPrimaryQlClass() { result = "ConstructorDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractFunctionDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.AstNode
|
||||
|
||||
class DeclBase extends @decl, AstNode { }
|
||||
class DeclBase extends @decl, AstNode {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AstNode.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.AbstractFunctionDecl
|
||||
|
||||
class DestructorDeclBase extends @destructor_decl, AbstractFunctionDecl {
|
||||
override string getAPrimaryQlClass() { result = "DestructorDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractFunctionDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
import codeql.swift.elements.decl.EnumElementDecl
|
||||
|
||||
class EnumCaseDeclBase extends @enum_case_decl, Decl {
|
||||
override string getAPrimaryQlClass() { result = "EnumCaseDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild() or
|
||||
result = getElement(_)
|
||||
}
|
||||
|
||||
EnumElementDecl getElement(int index) {
|
||||
exists(EnumElementDecl x |
|
||||
enum_case_decl_elements(this, index, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.NominalTypeDecl
|
||||
|
||||
class EnumDeclBase extends @enum_decl, NominalTypeDecl {
|
||||
override string getAPrimaryQlClass() { result = "EnumDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = NominalTypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.ParamDecl
|
||||
import codeql.swift.elements.decl.ValueDecl
|
||||
|
||||
class EnumElementDeclBase extends @enum_element_decl, ValueDecl {
|
||||
override string getAPrimaryQlClass() { result = "EnumElementDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ValueDecl.super.getAChild() or
|
||||
result = getParam(_)
|
||||
}
|
||||
|
||||
string getName() { enum_element_decls(this, result) }
|
||||
|
||||
ParamDecl getParam(int index) {
|
||||
|
||||
@@ -1,8 +1,17 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
import codeql.swift.elements.decl.GenericContext
|
||||
import codeql.swift.elements.decl.IterableDeclContext
|
||||
|
||||
class ExtensionDeclBase extends @extension_decl, Decl, GenericContext, IterableDeclContext {
|
||||
override string getAPrimaryQlClass() { result = "ExtensionDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild() or
|
||||
result = GenericContext.super.getAChild() or
|
||||
result = IterableDeclContext.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.AbstractFunctionDecl
|
||||
|
||||
class FuncDeclBase extends @func_decl, AbstractFunctionDecl { }
|
||||
class FuncDeclBase extends @func_decl, AbstractFunctionDecl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractFunctionDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.GenericTypeParamDecl
|
||||
|
||||
class GenericContextBase extends @generic_context, Element {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Element.super.getAChild()
|
||||
}
|
||||
|
||||
GenericTypeParamDecl getGenericTypeParam(int index) {
|
||||
exists(GenericTypeParamDecl x |
|
||||
generic_context_generic_type_params(this, index, x) and
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.GenericContext
|
||||
import codeql.swift.elements.decl.TypeDecl
|
||||
|
||||
class GenericTypeDeclBase extends @generic_type_decl, GenericContext, TypeDecl { }
|
||||
class GenericTypeDeclBase extends @generic_type_decl, GenericContext, TypeDecl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = GenericContext.super.getAChild() or
|
||||
result = TypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.AbstractTypeParamDecl
|
||||
|
||||
class GenericTypeParamDeclBase extends @generic_type_param_decl, AbstractTypeParamDecl {
|
||||
override string getAPrimaryQlClass() { result = "GenericTypeParamDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractTypeParamDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
|
||||
class IfConfigDeclBase extends @if_config_decl, Decl {
|
||||
override string getAPrimaryQlClass() { result = "IfConfigDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
|
||||
class ImportDeclBase extends @import_decl, Decl {
|
||||
override string getAPrimaryQlClass() { result = "ImportDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.OperatorDecl
|
||||
import codeql.swift.elements.decl.PrecedenceGroupDecl
|
||||
|
||||
class InfixOperatorDeclBase extends @infix_operator_decl, OperatorDecl {
|
||||
override string getAPrimaryQlClass() { result = "InfixOperatorDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = OperatorDecl.super.getAChild()
|
||||
}
|
||||
|
||||
PrecedenceGroupDecl getPrecedenceGroup() {
|
||||
exists(PrecedenceGroupDecl x |
|
||||
infix_operator_decl_precedence_groups(this, x) and
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
import codeql.swift.elements.Element
|
||||
|
||||
class IterableDeclContextBase extends @iterable_decl_context, Element {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Element.super.getAChild()
|
||||
}
|
||||
|
||||
Decl getMember(int index) {
|
||||
exists(Decl x |
|
||||
iterable_decl_context_members(this, index, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
|
||||
class MissingMemberDeclBase extends @missing_member_decl, Decl {
|
||||
override string getAPrimaryQlClass() { result = "MissingMemberDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.TypeDecl
|
||||
|
||||
class ModuleDeclBase extends @module_decl, TypeDecl {
|
||||
override string getAPrimaryQlClass() { result = "ModuleDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = TypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,17 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.GenericTypeDecl
|
||||
import codeql.swift.elements.decl.IterableDeclContext
|
||||
import codeql.swift.elements.type.Type
|
||||
|
||||
class NominalTypeDeclBase extends @nominal_type_decl, GenericTypeDecl, IterableDeclContext {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = GenericTypeDecl.super.getAChild() or
|
||||
result = IterableDeclContext.super.getAChild()
|
||||
}
|
||||
|
||||
Type getType() {
|
||||
exists(Type x |
|
||||
nominal_type_decls(this, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.GenericTypeDecl
|
||||
|
||||
class OpaqueTypeDeclBase extends @opaque_type_decl, GenericTypeDecl {
|
||||
override string getAPrimaryQlClass() { result = "OpaqueTypeDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = GenericTypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
|
||||
class OperatorDeclBase extends @operator_decl, Decl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild()
|
||||
}
|
||||
|
||||
string getName() { operator_decls(this, result) }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.VarDecl
|
||||
|
||||
class ParamDeclBase extends @param_decl, VarDecl {
|
||||
override string getAPrimaryQlClass() { result = "ParamDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = VarDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
import codeql.swift.elements.expr.Expr
|
||||
import codeql.swift.elements.pattern.Pattern
|
||||
@@ -6,6 +7,14 @@ import codeql.swift.elements.pattern.Pattern
|
||||
class PatternBindingDeclBase extends @pattern_binding_decl, Decl {
|
||||
override string getAPrimaryQlClass() { result = "PatternBindingDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild() or
|
||||
result = getInit(_) or
|
||||
result = getPattern(_)
|
||||
}
|
||||
|
||||
Expr getInit(int index) {
|
||||
exists(Expr x |
|
||||
pattern_binding_decl_inits(this, index, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.OperatorDecl
|
||||
|
||||
class PostfixOperatorDeclBase extends @postfix_operator_decl, OperatorDecl {
|
||||
override string getAPrimaryQlClass() { result = "PostfixOperatorDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = OperatorDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
|
||||
class PoundDiagnosticDeclBase extends @pound_diagnostic_decl, Decl {
|
||||
override string getAPrimaryQlClass() { result = "PoundDiagnosticDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
|
||||
class PrecedenceGroupDeclBase extends @precedence_group_decl, Decl {
|
||||
override string getAPrimaryQlClass() { result = "PrecedenceGroupDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.OperatorDecl
|
||||
|
||||
class PrefixOperatorDeclBase extends @prefix_operator_decl, OperatorDecl {
|
||||
override string getAPrimaryQlClass() { result = "PrefixOperatorDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = OperatorDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.NominalTypeDecl
|
||||
|
||||
class ProtocolDeclBase extends @protocol_decl, NominalTypeDecl {
|
||||
override string getAPrimaryQlClass() { result = "ProtocolDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = NominalTypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.NominalTypeDecl
|
||||
|
||||
class StructDeclBase extends @struct_decl, NominalTypeDecl {
|
||||
override string getAPrimaryQlClass() { result = "StructDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = NominalTypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.AbstractStorageDecl
|
||||
import codeql.swift.elements.decl.GenericContext
|
||||
import codeql.swift.elements.decl.ParamDecl
|
||||
@@ -7,6 +8,14 @@ import codeql.swift.elements.type.Type
|
||||
class SubscriptDeclBase extends @subscript_decl, AbstractStorageDecl, GenericContext {
|
||||
override string getAPrimaryQlClass() { result = "SubscriptDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractStorageDecl.super.getAChild() or
|
||||
result = GenericContext.super.getAChild() or
|
||||
result = getParam(_)
|
||||
}
|
||||
|
||||
ParamDecl getParam(int index) {
|
||||
exists(ParamDecl x |
|
||||
subscript_decl_params(this, index, x) and
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.stmt.BraceStmt
|
||||
import codeql.swift.elements.decl.Decl
|
||||
|
||||
class TopLevelCodeDeclBase extends @top_level_code_decl, Decl {
|
||||
override string getAPrimaryQlClass() { result = "TopLevelCodeDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild() or
|
||||
result = getBody()
|
||||
}
|
||||
|
||||
BraceStmt getBody() {
|
||||
exists(BraceStmt x |
|
||||
top_level_code_decls(this, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.GenericTypeDecl
|
||||
|
||||
class TypeAliasDeclBase extends @type_alias_decl, GenericTypeDecl {
|
||||
override string getAPrimaryQlClass() { result = "TypeAliasDecl" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = GenericTypeDecl.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.type.Type
|
||||
import codeql.swift.elements.decl.ValueDecl
|
||||
|
||||
class TypeDeclBase extends @type_decl, ValueDecl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ValueDecl.super.getAChild()
|
||||
}
|
||||
|
||||
string getName() { type_decls(this, result) }
|
||||
|
||||
Type getBaseType(int index) {
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
import codeql.swift.elements.type.Type
|
||||
|
||||
class ValueDeclBase extends @value_decl, Decl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Decl.super.getAChild()
|
||||
}
|
||||
|
||||
Type getInterfaceType() {
|
||||
exists(Type x |
|
||||
value_decls(this, x) and
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.AbstractStorageDecl
|
||||
import codeql.swift.elements.expr.Expr
|
||||
import codeql.swift.elements.pattern.Pattern
|
||||
import codeql.swift.elements.type.Type
|
||||
|
||||
class VarDeclBase extends @var_decl, AbstractStorageDecl {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractStorageDecl.super.getAChild()
|
||||
}
|
||||
|
||||
string getName() { var_decls(this, result, _) }
|
||||
|
||||
Type getType() {
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class AbstractClosureExprBase extends @abstract_closure_expr, Expr { }
|
||||
class AbstractClosureExprBase extends @abstract_closure_expr, Expr {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class AnyHashableErasureExprBase extends @any_hashable_erasure_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "AnyHashableErasureExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class AnyTryExprBase extends @any_try_expr, Expr {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild() or
|
||||
result = getSubExpr()
|
||||
}
|
||||
|
||||
Expr getSubExpr() {
|
||||
exists(Expr x |
|
||||
any_try_exprs(this, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class AppliedPropertyWrapperExprBase extends @applied_property_wrapper_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "AppliedPropertyWrapperExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,17 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Argument
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class ApplyExprBase extends @apply_expr, Expr {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild() or
|
||||
result = getFunction() or
|
||||
result = getArgument(_)
|
||||
}
|
||||
|
||||
Expr getFunction() {
|
||||
exists(Expr x |
|
||||
apply_exprs(this, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class ArchetypeToSuperExprBase extends @archetype_to_super_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "ArchetypeToSuperExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class ArgumentBase extends @argument, Element {
|
||||
override string getAPrimaryQlClass() { result = "Argument" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Element.super.getAChild() or
|
||||
result = getExpr()
|
||||
}
|
||||
|
||||
string getLabel() { arguments(this, result, _) }
|
||||
|
||||
Expr getExpr() {
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.CollectionExpr
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class ArrayExprBase extends @array_expr, CollectionExpr {
|
||||
override string getAPrimaryQlClass() { result = "ArrayExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = CollectionExpr.super.getAChild() or
|
||||
result = getElement(_)
|
||||
}
|
||||
|
||||
Expr getElement(int index) {
|
||||
exists(Expr x |
|
||||
array_expr_elements(this, index, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class ArrayToPointerExprBase extends @array_to_pointer_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "ArrayToPointerExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class ArrowExprBase extends @arrow_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "ArrowExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class AssignExprBase extends @assign_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "AssignExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild() or
|
||||
result = getDest() or
|
||||
result = getSource()
|
||||
}
|
||||
|
||||
Expr getDest() {
|
||||
exists(Expr x |
|
||||
assign_exprs(this, x, _) and
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.AbstractClosureExpr
|
||||
import codeql.swift.elements.stmt.BraceStmt
|
||||
|
||||
class AutoClosureExprBase extends @auto_closure_expr, AbstractClosureExpr {
|
||||
override string getAPrimaryQlClass() { result = "AutoClosureExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractClosureExpr.super.getAChild() or
|
||||
result = getBody()
|
||||
}
|
||||
|
||||
BraceStmt getBody() {
|
||||
exists(BraceStmt x |
|
||||
auto_closure_exprs(this, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.IdentityExpr
|
||||
|
||||
class AwaitExprBase extends @await_expr, IdentityExpr {
|
||||
override string getAPrimaryQlClass() { result = "AwaitExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = IdentityExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ApplyExpr
|
||||
|
||||
class BinaryExprBase extends @binary_expr, ApplyExpr {
|
||||
override string getAPrimaryQlClass() { result = "BinaryExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ApplyExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,17 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class BindOptionalExprBase extends @bind_optional_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "BindOptionalExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild() or
|
||||
result = getSubExpr()
|
||||
}
|
||||
|
||||
Expr getSubExpr() {
|
||||
exists(Expr x |
|
||||
bind_optional_exprs(this, x) and
|
||||
|
||||
@@ -1,8 +1,15 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.BuiltinLiteralExpr
|
||||
|
||||
class BooleanLiteralExprBase extends @boolean_literal_expr, BuiltinLiteralExpr {
|
||||
override string getAPrimaryQlClass() { result = "BooleanLiteralExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = BuiltinLiteralExpr.super.getAChild()
|
||||
}
|
||||
|
||||
boolean getValue() { boolean_literal_exprs(this, result) }
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class BridgeFromObjCExprBase extends @bridge_from_obj_c_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "BridgeFromObjCExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class BridgeToObjCExprBase extends @bridge_to_obj_c_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "BridgeToObjCExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.LiteralExpr
|
||||
|
||||
class BuiltinLiteralExprBase extends @builtin_literal_expr, LiteralExpr { }
|
||||
class BuiltinLiteralExprBase extends @builtin_literal_expr, LiteralExpr {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = LiteralExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ApplyExpr
|
||||
|
||||
class CallExprBase extends @call_expr, ApplyExpr {
|
||||
override string getAPrimaryQlClass() { result = "CallExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ApplyExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ClosureExpr
|
||||
import codeql.swift.elements.expr.Expr
|
||||
import codeql.swift.elements.decl.PatternBindingDecl
|
||||
@@ -6,6 +7,14 @@ import codeql.swift.elements.decl.PatternBindingDecl
|
||||
class CaptureListExprBase extends @capture_list_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "CaptureListExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild() or
|
||||
result = getBindingDecl(_) or
|
||||
result = getClosureBody()
|
||||
}
|
||||
|
||||
PatternBindingDecl getBindingDecl(int index) {
|
||||
exists(PatternBindingDecl x |
|
||||
capture_list_expr_binding_decls(this, index, x) and
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ExplicitCastExpr
|
||||
|
||||
class CheckedCastExprBase extends @checked_cast_expr, ExplicitCastExpr { }
|
||||
class CheckedCastExprBase extends @checked_cast_expr, ExplicitCastExpr {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ExplicitCastExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class ClassMetatypeToObjectExprBase extends @class_metatype_to_object_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "ClassMetatypeToObjectExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.AbstractClosureExpr
|
||||
import codeql.swift.elements.stmt.BraceStmt
|
||||
|
||||
class ClosureExprBase extends @closure_expr, AbstractClosureExpr {
|
||||
override string getAPrimaryQlClass() { result = "ClosureExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = AbstractClosureExpr.super.getAChild() or
|
||||
result = getBody()
|
||||
}
|
||||
|
||||
BraceStmt getBody() {
|
||||
exists(BraceStmt x |
|
||||
closure_exprs(this, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class CodeCompletionExprBase extends @code_completion_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "CodeCompletionExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ExplicitCastExpr
|
||||
|
||||
class CoerceExprBase extends @coerce_expr, ExplicitCastExpr {
|
||||
override string getAPrimaryQlClass() { result = "CoerceExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ExplicitCastExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class CollectionExprBase extends @collection_expr, Expr { }
|
||||
class CollectionExprBase extends @collection_expr, Expr {
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class CollectionUpcastConversionExprBase extends @collection_upcast_conversion_expr,
|
||||
ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "CollectionUpcastConversionExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class ConditionalBridgeFromObjCExprBase extends @conditional_bridge_from_obj_c_expr,
|
||||
ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "ConditionalBridgeFromObjCExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.CheckedCastExpr
|
||||
|
||||
class ConditionalCheckedCastExprBase extends @conditional_checked_cast_expr, CheckedCastExpr {
|
||||
override string getAPrimaryQlClass() { result = "ConditionalCheckedCastExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = CheckedCastExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.SelfApplyExpr
|
||||
|
||||
class ConstructorRefCallExprBase extends @constructor_ref_call_expr, SelfApplyExpr {
|
||||
override string getAPrimaryQlClass() { result = "ConstructorRefCallExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = SelfApplyExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class CovariantFunctionConversionExprBase extends @covariant_function_conversion_expr,
|
||||
ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "CovariantFunctionConversionExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class CovariantReturnConversionExprBase extends @covariant_return_conversion_expr,
|
||||
ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "CovariantReturnConversionExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.decl.Decl
|
||||
import codeql.swift.elements.expr.Expr
|
||||
import codeql.swift.elements.type.Type
|
||||
@@ -6,6 +7,12 @@ import codeql.swift.elements.type.Type
|
||||
class DeclRefExprBase extends @decl_ref_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "DeclRefExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild()
|
||||
}
|
||||
|
||||
Decl getDecl() {
|
||||
exists(Decl x |
|
||||
decl_ref_exprs(this, x) and
|
||||
|
||||
@@ -1,10 +1,17 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
import codeql.swift.elements.decl.ParamDecl
|
||||
|
||||
class DefaultArgumentExprBase extends @default_argument_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "DefaultArgumentExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild()
|
||||
}
|
||||
|
||||
ParamDecl getParamDecl() {
|
||||
exists(ParamDecl x |
|
||||
default_argument_exprs(this, x, _) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class DerivedToBaseExprBase extends @derived_to_base_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "DerivedToBaseExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class DestructureTupleExprBase extends @destructure_tuple_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "DestructureTupleExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.CollectionExpr
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class DictionaryExprBase extends @dictionary_expr, CollectionExpr {
|
||||
override string getAPrimaryQlClass() { result = "DictionaryExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = CollectionExpr.super.getAChild() or
|
||||
result = getElement(_)
|
||||
}
|
||||
|
||||
Expr getElement(int index) {
|
||||
exists(Expr x |
|
||||
dictionary_expr_elements(this, index, x) and
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class DifferentiableFunctionExprBase extends @differentiable_function_expr, ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "DifferentiableFunctionExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.ImplicitConversionExpr
|
||||
|
||||
class DifferentiableFunctionExtractOriginalExprBase extends @differentiable_function_extract_original_expr,
|
||||
ImplicitConversionExpr {
|
||||
override string getAPrimaryQlClass() { result = "DifferentiableFunctionExtractOriginalExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = ImplicitConversionExpr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements.Element
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
class DiscardAssignmentExprBase extends @discard_assignment_expr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "DiscardAssignmentExpr" }
|
||||
|
||||
cached
|
||||
override Element getAChild() {
|
||||
none() or
|
||||
result = Expr.super.getAChild()
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user