mirror of
https://github.com/github/codeql.git
synced 2026-05-01 19:55:15 +02:00
Swift: subsume IterableDeclContext into Decl [hand-written]
This commit is contained in:
@@ -354,7 +354,7 @@ void DeclTranslator::fillTypeDecl(const swift::TypeDecl& decl, codeql::TypeDecl&
|
||||
}
|
||||
|
||||
void DeclTranslator::fillIterableDeclContext(const swift::IterableDeclContext& decl,
|
||||
codeql::IterableDeclContext& entry) {
|
||||
codeql::Decl& entry) {
|
||||
entry.members = dispatcher.fetchRepeatedLabels(decl.getAllMembers());
|
||||
}
|
||||
|
||||
|
||||
@@ -55,8 +55,7 @@ class DeclTranslator : public AstTranslatorBase<DeclTranslator> {
|
||||
codeql::AbstractFunctionDecl& entry);
|
||||
void fillOperatorDecl(const swift::OperatorDecl& decl, codeql::OperatorDecl& entry);
|
||||
void fillTypeDecl(const swift::TypeDecl& decl, codeql::TypeDecl& entry);
|
||||
void fillIterableDeclContext(const swift::IterableDeclContext& decl,
|
||||
codeql::IterableDeclContext& entry);
|
||||
void fillIterableDeclContext(const swift::IterableDeclContext& decl, codeql::Decl& entry);
|
||||
void fillVarDecl(const swift::VarDecl& decl, codeql::VarDecl& entry);
|
||||
void fillNominalTypeDecl(const swift::NominalTypeDecl& decl, codeql::NominalTypeDecl& entry);
|
||||
void fillGenericContext(const swift::GenericContext& decl, codeql::GenericContext& entry);
|
||||
|
||||
@@ -424,7 +424,7 @@ private Element interpretElement0(
|
||||
)
|
||||
or
|
||||
// Member functions
|
||||
exists(NominalTypeDecl nomTypeDecl, IterableDeclContext decl, MethodDecl method |
|
||||
exists(NominalTypeDecl nomTypeDecl, Decl decl, MethodDecl method |
|
||||
method.getName() = name and
|
||||
method = decl.getAMember() and
|
||||
nomTypeDecl.getFullName() = type and
|
||||
@@ -432,25 +432,25 @@ private Element interpretElement0(
|
||||
result = method
|
||||
|
|
||||
subtypes = true and
|
||||
decl.getNominalTypeDecl() = nomTypeDecl.getADerivedTypeDecl*()
|
||||
decl.asNominalTypeDecl() = nomTypeDecl.getADerivedTypeDecl*()
|
||||
or
|
||||
subtypes = false and
|
||||
decl.getNominalTypeDecl() = nomTypeDecl
|
||||
decl.asNominalTypeDecl() = nomTypeDecl
|
||||
)
|
||||
or
|
||||
// Fields
|
||||
signature = "" and
|
||||
exists(NominalTypeDecl nomTypeDecl, IterableDeclContext decl, FieldDecl field |
|
||||
exists(NominalTypeDecl nomTypeDecl, Decl decl, FieldDecl field |
|
||||
field.getName() = name and
|
||||
field = decl.getAMember() and
|
||||
nomTypeDecl.getFullName() = type and
|
||||
result = field
|
||||
|
|
||||
subtypes = true and
|
||||
decl.getNominalTypeDecl() = nomTypeDecl.getADerivedTypeDecl*()
|
||||
decl.asNominalTypeDecl() = nomTypeDecl.getADerivedTypeDecl*()
|
||||
or
|
||||
subtypes = false and
|
||||
decl.getNominalTypeDecl() = nomTypeDecl
|
||||
decl.asNominalTypeDecl() = nomTypeDecl
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,22 @@
|
||||
private import codeql.swift.generated.decl.Decl
|
||||
private import codeql.swift.elements.decl.NominalTypeDecl
|
||||
private import codeql.swift.elements.decl.ExtensionDecl
|
||||
|
||||
class Decl extends Generated::Decl {
|
||||
override string toString() { result = super.toString() }
|
||||
|
||||
/**
|
||||
* Gets the `NominalTypeDecl` corresponding to this `Decl`, if any. This
|
||||
* resolves an `ExtensionDecl` to the `NominalTypeDecl` that it extends.
|
||||
*/
|
||||
NominalTypeDecl asNominalTypeDecl() {
|
||||
result = this
|
||||
or
|
||||
result = this.(ExtensionDecl).getExtendedTypeDecl()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the declaration that declares this declaration as a member, if any.
|
||||
*/
|
||||
Decl getDeclaringDecl() { this = result.getAMember() }
|
||||
}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
private import codeql.swift.generated.decl.IterableDeclContext
|
||||
private import codeql.swift.elements.decl.NominalTypeDecl
|
||||
private import codeql.swift.elements.decl.ExtensionDecl
|
||||
|
||||
/**
|
||||
* A nominal type (class, struct, enum or protocol) or extension.
|
||||
*/
|
||||
class IterableDeclContext extends Generated::IterableDeclContext {
|
||||
/**
|
||||
* Gets the `NominalTypeDecl` corresponding to this `IterableDeclContext`
|
||||
* resolving an extension to the extended type declaration.
|
||||
*/
|
||||
NominalTypeDecl getNominalTypeDecl() {
|
||||
result = this.(NominalTypeDecl)
|
||||
or
|
||||
result = this.(ExtensionDecl).getExtendedTypeDecl()
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
private import swift
|
||||
|
||||
private Decl getAMember(IterableDeclContext ctx) {
|
||||
private Decl getAMember(Decl ctx) {
|
||||
ctx.getAMember() = result
|
||||
or
|
||||
exists(VarDecl var |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
private import codeql.swift.generated.decl.VarDecl
|
||||
private import codeql.swift.elements.expr.DeclRefExpr
|
||||
private import codeql.swift.elements.decl.IterableDeclContext
|
||||
private import codeql.swift.elements.decl.Decl
|
||||
|
||||
class VarDecl extends Generated::VarDecl {
|
||||
override string toString() { result = this.getName() }
|
||||
@@ -9,5 +9,5 @@ class VarDecl extends Generated::VarDecl {
|
||||
}
|
||||
|
||||
class FieldDecl extends VarDecl {
|
||||
FieldDecl() { this = any(IterableDeclContext ctx).getAMember() }
|
||||
FieldDecl() { this = any(Decl ctx).getAMember() }
|
||||
}
|
||||
|
||||
@@ -77,6 +77,7 @@ class Type(Element):
|
||||
@group("decl")
|
||||
class Decl(AstNode):
|
||||
module: "ModuleDecl"
|
||||
members: list["Decl"] | child
|
||||
|
||||
@group("expr")
|
||||
class Expr(AstNode):
|
||||
@@ -95,14 +96,10 @@ class Stmt(AstNode):
|
||||
class GenericContext(Element):
|
||||
generic_type_params: list["GenericTypeParamDecl"] | child
|
||||
|
||||
@group("decl")
|
||||
class IterableDeclContext(Element):
|
||||
members: list[Decl] | child
|
||||
|
||||
class EnumCaseDecl(Decl):
|
||||
elements: list["EnumElementDecl"]
|
||||
|
||||
class ExtensionDecl(GenericContext, IterableDeclContext, Decl):
|
||||
class ExtensionDecl(GenericContext, Decl):
|
||||
extended_type_decl: "NominalTypeDecl"
|
||||
protocols: list["ProtocolDecl"]
|
||||
|
||||
@@ -303,7 +300,7 @@ class ConcreteVarDecl(VarDecl):
|
||||
class GenericTypeParamDecl(AbstractTypeParamDecl):
|
||||
pass
|
||||
|
||||
class NominalTypeDecl(GenericTypeDecl, IterableDeclContext):
|
||||
class NominalTypeDecl(GenericTypeDecl):
|
||||
type: Type
|
||||
|
||||
class OpaqueTypeDecl(GenericTypeDecl):
|
||||
|
||||
Reference in New Issue
Block a user