Swift: subsume IterableDeclContext into Decl [hand-written]

This commit is contained in:
Nora Dimitrijević
2023-01-09 14:58:56 -05:00
parent 6c0b50c696
commit f96c18a6db
8 changed files with 31 additions and 36 deletions

View File

@@ -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());
}

View File

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

View File

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

View File

@@ -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() }
}

View File

@@ -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()
}
}

View File

@@ -1,6 +1,6 @@
private import swift
private Decl getAMember(IterableDeclContext ctx) {
private Decl getAMember(Decl ctx) {
ctx.getAMember() = result
or
exists(VarDecl var |

View File

@@ -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() }
}

View File

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