Swift: extract MacroDecl

This commit is contained in:
Alex Denisov
2023-11-15 13:06:02 +01:00
parent 803ed20962
commit 8b126fe51a
45 changed files with 706 additions and 10 deletions

View File

@@ -36,7 +36,8 @@ class SwiftDispatcher {
const swift::TypeBase*,
const swift::CapturedValue*,
const swift::PoundAvailableInfo*,
const swift::AvailabilitySpec*>;
const swift::AvailabilitySpec*,
const swift::MacroRoleAttr*>;
public:
// all references and pointers passed as parameters to this constructor are supposed to outlive
@@ -334,6 +335,7 @@ class SwiftDispatcher {
virtual void visit(const swift::TypeRepr* typeRepr, swift::Type type) = 0;
virtual void visit(const swift::TypeBase* type) = 0;
virtual void visit(const swift::CapturedValue* capture) = 0;
virtual void visit(const swift::MacroRoleAttr* attr) = 0;
template <typename T>
requires(!std::derived_from<T, swift::TypeRepr>) void visit(const T* e, swift::Type) { visit(e); }

View File

@@ -28,6 +28,13 @@ concept HasStartAndEndLoc = requires(T e) {
}
&&!(HasSourceRange<T>);
template <typename T>
concept HasLAndRParenLoc = requires(T e) {
e.getLParenLoc();
e.getRParenLoc();
}
&&!(HasSourceRange<T>)&&!(HasStartAndEndLoc<T>);
template <typename T>
concept HasOneLoc = requires(T e) {
e.getLoc();
@@ -50,6 +57,13 @@ swift::SourceRange getSourceRange(const HasStartAndEndLoc auto& locatable) {
return {locatable.getStartLoc()};
}
swift::SourceRange getSourceRange(const HasLAndRParenLoc auto& locatable) {
if (locatable.getLParenLoc() && locatable.getRParenLoc()) {
return {locatable.getLParenLoc(), locatable.getRParenLoc()};
}
return {locatable.getLParenLoc()};
}
swift::SourceRange getSourceRange(const HasOneLoc auto& locatable) {
return {locatable.getLoc()};
}

View File

@@ -228,7 +228,7 @@ MAP(swift::Decl, DeclTag)
MAP(swift::FuncDecl, AccessorOrNamedFunctionTag)
MAP_CONCRETE(swift::FuncDecl, NamedFunctionTag)
MAP(swift::AccessorDecl, AccessorTag)
MAP(swift::MacroDecl, void) // TODO (introduced in 5.8)
MAP(swift::MacroDecl, MacroDeclTag)
MAP(swift::EnumElementDecl, EnumElementDeclTag)
MAP(swift::ExtensionDecl, ExtensionDeclTag)
MAP(swift::TopLevelCodeDecl, TopLevelCodeDeclTag)
@@ -350,6 +350,7 @@ MAP(swift::AvailabilitySpec, AvailabilitySpecTag)
MAP(swift::OtherPlatformAvailabilitySpec, OtherAvailabilitySpecTag)
MAP(swift::PoundAvailableInfo, AvailabilityInfoTag)
MAP(swift::MacroRoleAttr, MacroRoleTag)
// clang-format on
#undef MAP

View File

@@ -374,4 +374,32 @@ codeql::CapturedDecl DeclTranslator::translateCapturedValue(const swift::Capture
entry.is_escaping = !capture.isNoEscape();
return entry;
}
codeql::MacroDecl DeclTranslator::translateMacroDecl(const swift::MacroDecl& decl) {
auto entry = createEntry(decl);
fillValueDecl(decl, entry);
fillGenericContext(decl, entry);
entry.name = constructName(decl.getName());
for (auto attr : decl.getAttrs().getAttributes<swift::MacroRoleAttr>()) {
entry.roles.emplace_back(dispatcher.fetchLabel(attr));
}
if (decl.getParameterList()) {
for (auto param : *decl.getParameterList()) {
entry.parameters.emplace_back(dispatcher.fetchLabel(param));
}
}
return entry;
}
codeql::MacroRole DeclTranslator::translateMacroRoleAttr(const swift::MacroRoleAttr& attr) {
auto entry = dispatcher.createEntry(attr);
entry.kind = static_cast<uint32_t>(attr.getMacroRole());
entry.macro_syntax = static_cast<uint8_t>(attr.getMacroSyntax());
entry.conformances = dispatcher.fetchRepeatedLabels(attr.getConformances());
for (auto& declName : attr.getNames()) {
entry.names.emplace_back(constructName(declName.getName()));
}
return entry;
}
} // namespace codeql

View File

@@ -49,6 +49,8 @@ class DeclTranslator : public AstTranslatorBase<DeclTranslator> {
codeql::PoundDiagnosticDecl translatePoundDiagnosticDecl(const swift::PoundDiagnosticDecl& decl);
codeql::MissingMemberDecl translateMissingMemberDecl(const swift::MissingMemberDecl& decl);
codeql::CapturedDecl translateCapturedValue(const swift::CapturedValue& capture);
codeql::MacroDecl translateMacroDecl(const swift::MacroDecl& decl);
codeql::MacroRole translateMacroRoleAttr(const swift::MacroRoleAttr& attr);
private:
void fillFunction(const swift::AbstractFunctionDecl& decl, codeql::Function& entry);

View File

@@ -53,6 +53,8 @@ class SwiftVisitor : private SwiftDispatcher {
declTranslator.translateAndEmit(*capture);
}
void visit(const swift::MacroRoleAttr* attr) override { declTranslator.translateAndEmit(*attr); }
DeclTranslator declTranslator{*this};
ExprTranslator exprTranslator{*this};
StmtTranslator stmtTranslator{*this};

View File

@@ -89,6 +89,10 @@ class AstTranslatorBase : private swift::ASTVisitor<CrtpSubclass>,
dispatcher.emit(static_cast<CrtpSubclass*>(this)->translateCapturedValue(e));
}
void translateAndEmit(const swift::MacroRoleAttr& attr) {
dispatcher.emit(static_cast<CrtpSubclass*>(this)->translateMacroRoleAttr(attr));
}
private:
friend class swift::ASTVisitor<CrtpSubclass>;

View File

@@ -8,6 +8,7 @@ lib/codeql/swift/elements/DbLocationConstructor.qll f98d927f2cc2b0b5de51eee3e0b6
lib/codeql/swift/elements/DiagnosticsConstructor.qll 5212997161b95b0b10e7707843c9d3f9bf760af7a8646f26c5793507b5162224 2b9fbc9d84048d3dffa782db049e1ecdaaa1696744515e28ac4421ab265a5f67
lib/codeql/swift/elements/ErrorElement.qll 04ae29b98554b888ac180be66ffb47d157de85d27c9de50bbc5e065e20559f7f 558d0f0bb3a8fea91456aeb395cf7aaf8ff5d253f19defbc05caecec35b70e19
lib/codeql/swift/elements/KeyPathComponentConstructor.qll ff71795157639520f56ce99ed49bf25486c125a0f27a3bb3ba2c8492feca13b2 5875187267cf91e37426d817a6c0c5e7ba9ddb0bd840ad358338ba003e0a877c
lib/codeql/swift/elements/MacroRoleConstructor.qll c45c189fd441e2c23b1c94dec9f357192f5e392051e0becf52c020d830e38e54 e281ef4ba76a6e4b2b689e00f542ef585cec7a540911ccd7fbb59f3232f08a3d
lib/codeql/swift/elements/OtherAvailabilitySpecConstructor.qll c5638ae4f3993c7a111fb2a516667190642c1948f18806cf29f78b7067021d10 cc93ac54741ba952b32385db0fe072576a9c8697cd793bcb8faed98f0fb6bda0
lib/codeql/swift/elements/PlatformVersionAvailabilitySpecConstructor.qll 015280737e71fe1084da6056410fd73dc4473a3b3296d0e46c0ca64f07dd5b7f c735c42e45ebdc308a1f02ff15d65d4d1154071e55645a9ae763d6c021d7f601
lib/codeql/swift/elements/UnspecifiedElementConstructor.qll f7e232dae7362d0c3f9f33f952d9106da3d273f16b124008919fba6e40a944b6 eb30f05ae09f2c7bc93d758c0870b63f16bf61d0d2446ed827250f89772596ab
@@ -36,6 +37,8 @@ lib/codeql/swift/elements/decl/ImportDeclConstructor.qll 1876052c283d9701cf2e2c9
lib/codeql/swift/elements/decl/InfixOperatorDecl.qll f3028c9d9da2770b120498dc558f9a447b10e996f6f00c7b7456af2d8b31e314 218a02bb2f10bd7f0add10943a11ba77cb3e416b4cf2e68b7530f825d896ffed
lib/codeql/swift/elements/decl/InfixOperatorDeclConstructor.qll 92dc3ac72c1d7b88b61cf9faa8048e6ba3e9af8b17d3bfe91919394e252e2595 d70cc9989101ce7268a6959cbcc8bf8a1e08f69a4c8734a6d85bf6abc668ddea
lib/codeql/swift/elements/decl/InitializerConstructor.qll 0741961a1e5d65bf906ae5f2b8e745da30d215624faaca092dd869b33b82db39 72d0c8fc3d6c53923ae7b3f7c2d9eccb556352df69e5fd5566b8cec9eb0c4ee6
lib/codeql/swift/elements/decl/MacroDecl.qll 462681b26fbb12700b98691cf7d2f8c4b44401d4ac2cd2960861f304575336c9 62919ba629a041884d6228ac856d3c01a0a45c285d51eadce0a748faa5e78cbc
lib/codeql/swift/elements/decl/MacroDeclConstructor.qll fa08d8ba96541d43db4c6908fff8c8f06dce8a40d5eeaba607e20daf16df0a20 b5c1bbd697b5f309afb684e224066ff499bba5e66a1172b9269f7a579420ec40
lib/codeql/swift/elements/decl/MissingMemberDeclConstructor.qll f7c299d55d8f14386cade490155cdc7edbe26ef67796a273cc7779d740f5e3a9 377f1fdd4f798506adb297cdc80545b5842acfe33a2187b9dfe2442f59b3120d
lib/codeql/swift/elements/decl/ModuleDecl.qll 11e54958739679424525e889de7f0b9f1074e7e123482ee94ac45ab261e33ef8 73917bd8a2985d1d1bfa72e3db20978b56ec30a679cf8fc6c3af3ee54994fb41
lib/codeql/swift/elements/decl/ModuleDeclConstructor.qll 51106eb585219a6211a354c4a4ae9ac0dfa088e412145e1218eff1e31f82bf4d f05597e555014a58381b75b44b05b00a03a99e7ce54faf606df1128c1a5bbfd8
@@ -383,7 +386,7 @@ lib/codeql/swift/elements/type/UnresolvedTypeConstructor.qll 7f75d489b4d7ce65cae
lib/codeql/swift/elements/type/VariadicSequenceTypeConstructor.qll fc74a5a2a2effa28ef24509b20ee4373d97cf6e8c71840121bb031c6adedf584 c9b2effc1d01c13c5e6a74a111122fa79a2f6554dda3cb016d68ba397e566ec4
lib/codeql/swift/elements/type/WeakStorageType.qll edd13dd97b53040684409e187c1f975bcada6807c919e1345d8977144dbebb6f 9434c044d264a7f5f503a6422c106c9b8fedf74aaae314174473a29ea6ed17b9
lib/codeql/swift/elements/type/WeakStorageTypeConstructor.qll 5fdce3716aba6318522174a2c455a63480970222ae81c732fb19c6dd3ae2d271 60ea79d6943e129deba0deccb566cf9d73f78398b0f7f0212674d91287d6b2ae
lib/codeql/swift/elements.qll a3e46884bac3428bdec439ba97c65a69fea02e30b074b585f8db378844215fe3 a3e46884bac3428bdec439ba97c65a69fea02e30b074b585f8db378844215fe3
lib/codeql/swift/elements.qll 34a49e70c33620aae14b9370dc6fdc702fbf292c206d9ebfaa23c8e7680480df 34a49e70c33620aae14b9370dc6fdc702fbf292c206d9ebfaa23c8e7680480df
lib/codeql/swift/generated/AstNode.qll e00d6a46b16891778531a73722ae0b5842f849328e24aebe88bc30ac9fe438c2 40eaa0072d3ffecbff48d2baf88111daa86ef0f937abf24f032f2495739ef661
lib/codeql/swift/generated/AvailabilityInfo.qll e90fbfc3ec6830390e12a4695698d6efd8da4fa6a8a4189f466489a6dd103586 d9545da9e5d0c160679a4147001b4b1c664d9cb85ae1a169dd639c35046d274d
lib/codeql/swift/generated/AvailabilitySpec.qll 469bbd39d38dc68f1f6fb2e0766cc25b2f813c804fec44962910d5f7777632a2 57a953a8d5cf7031283393af1b3cfbc7f5941c9062e77950b32e5b5c6ae6b191
@@ -398,13 +401,14 @@ lib/codeql/swift/generated/File.qll 1d40b7ffa3a9ecba1820d30ddf6b173d76842a625704
lib/codeql/swift/generated/KeyPathComponent.qll 55629a20538d7e8f4f4d4c7484e8bcfdb943857121c3d683bde0a0ff0863f778 2def63385783c17b390971a9916b4934c69c40653bb78bdf07ea7cc6f5f52b73
lib/codeql/swift/generated/Locatable.qll 41f040643ea146c8044be49fddea89bdd79efd2469617c863a4b2da0b1af3364 9a964dcbc7f5ffce2ee006ce0c9a9a99a988976fcd0446af2ba1b202911d7396
lib/codeql/swift/generated/Location.qll 5b37ecde83a871ef2089cf33e4743fc02d9cf8c676aafd9f157c59ffdb776d6b 076d8d3d2313931e8287d196854acf259700124d9c8bc591a6d36017f314260a
lib/codeql/swift/generated/MacroRole.qll b01e4d423f6eceb9cab1717082d19896d0e5b83955bc4169f0c0f8a99e4e59e7 0f523aadb1fb5a980712b2fcc39624bcb65a5ee95e3f49120894d26b3dcf8eba
lib/codeql/swift/generated/OtherAvailabilitySpec.qll 31f3667ab0dc5f93230ba876b4101898d2a5a4af306925082305eff3ad9c9c0e 31f3667ab0dc5f93230ba876b4101898d2a5a4af306925082305eff3ad9c9c0e
lib/codeql/swift/generated/ParentChild.qll a00f7eecdc91d98ad421c6d883bf2cc6e92c213befdcc494bf8ad25f2c5d4ae2 cd2c70e5940a302108319bdc16d25f49df3165be5b94fa825b64b9b5771f117d
lib/codeql/swift/generated/ParentChild.qll fffa8748471139e0143521443cb7bf566db136f932e80e1917e7ab7140389835 c7768c3ad33fb1934b7b8955d09fe1d2978187e8d1f59a9ba0595f5bcb884d2d
lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll 3483726f6db9d978e40db75068d6a9ecad8f7c06516157fce783b26424bea729 864fedf2901de91f662a6d75a2eb7e26ed1a2a1a875a2b3c4e699dc7e7c4605e
lib/codeql/swift/generated/PureSynthConstructors.qll 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229
lib/codeql/swift/generated/Raw.qll f15f0b35be65adb8027e17b5fd5478eabb5000ee887dafc5c40d8abd03ced3e3 75fc6fbb74e0720b736c13ec3627247c49f8201df929647cdb2985282abf23c1
lib/codeql/swift/generated/Synth.qll 93565d0244a9f5bf4ba3f19a0ffabef4b8dc48703c580b905ffeac716eea5445 74d977cfe6fbb3d90579dc45b40254549e686d91eb16999c9e69fec18ab7df28
lib/codeql/swift/generated/SynthConstructors.qll fbbf618c54843d86b4c38d7b27e12cce7661b49ce52573f791dd8fcb4bbd40f5 fbbf618c54843d86b4c38d7b27e12cce7661b49ce52573f791dd8fcb4bbd40f5
lib/codeql/swift/generated/Raw.qll ed777881152f9adc3f0554f84c4ec1dc26aef7867d8c584b289c0a68ab6a03ad b460429a17b7db7edae1584147e8f019ffbff30b276b4327fef02840f428c40d
lib/codeql/swift/generated/Synth.qll 62abfaec75a308f222d8a7b8bb3260a1226977c253e87dbf9fc74f6e35398f53 c45d3237d9bdfb11d0372a5a1997d794a94a7eeeba3938d234bbbf802dacd9ad
lib/codeql/swift/generated/SynthConstructors.qll 73604e68bac553fe06b52aa768cd5f876b3cf85ee88bca96f7e2e4db76ef997f 73604e68bac553fe06b52aa768cd5f876b3cf85ee88bca96f7e2e4db76ef997f
lib/codeql/swift/generated/UnknownFile.qll 5922b351b55d5becac0c1ad67b8d601bcc9499dce9ee4093b607101e7e299104 5922b351b55d5becac0c1ad67b8d601bcc9499dce9ee4093b607101e7e299104
lib/codeql/swift/generated/UnknownLocation.qll 67b8605ff5aaa0f3a8588fee2527eba5ec4e322562159c9af3d53486b7954ee9 67b8605ff5aaa0f3a8588fee2527eba5ec4e322562159c9af3d53486b7954ee9
lib/codeql/swift/generated/UnspecifiedElement.qll 01182fee4d5c86b551e89c79d0d645f5e85c0aeeeae9dcafcbd7721c3eb3cc14 cb95ab2b13da080ada10e0a3bd1b00577541c4bfe699cbd19ef45f1e00e7c651
@@ -430,6 +434,7 @@ lib/codeql/swift/generated/decl/IfConfigDecl.qll 7c160c739f00cfa5b506ea06e5b968b
lib/codeql/swift/generated/decl/ImportDecl.qll fca6efd0f76e6779e1aedab02ab18c3c359b78b35c4757dbe9f30d5cb5a58373 fa1155ea071654121022b5753ae8185e2e1f53fdf518eb0937d7c02f42250a57
lib/codeql/swift/generated/decl/InfixOperatorDecl.qll 7d4f13a54691dbc11e0702c79d92fdc8ab2e92e890c36ab908f3b5f170f42134 0c75e5c414fd9da7c4c79bff24034c00f84a1cd62f8a541b92ea9743a3f1a6b7
lib/codeql/swift/generated/decl/Initializer.qll cf970fa52ff6f24916f3aa46f395370c2de2066f43f19cccfad4223f43114822 cf970fa52ff6f24916f3aa46f395370c2de2066f43f19cccfad4223f43114822
lib/codeql/swift/generated/decl/MacroDecl.qll 41d526611ace3dac100ec6e7969ff0b3ff40b39ee11da0a80fb8cda35144c44c 57b84c79ea34f0c6b2144feeef03c834aea168fe07a680cc57c350bcd1bb2883
lib/codeql/swift/generated/decl/MissingMemberDecl.qll 35f756c8b1c0f476b5317815fa2891059982fa6f34f9a483678c3deaf54648f2 afba98cc7d80b2f17f8b575a8daf3467203fe245bcf3898cbdcff1cfc629b000
lib/codeql/swift/generated/decl/ModuleDecl.qll b30a949eff21cedb15eb601de28faf28ac10bdca1aad4d805781f75084ecfbcb ace22912ea4cba2ffa2c33cf622bffa0c70e0c9fd30dd655057ac743339d1efe
lib/codeql/swift/generated/decl/NamedFunction.qll 4305c3ae8b50eb9e4999bc3ec313f08b8e852737f138dcd6f2afa62e6ffeb0bf 4305c3ae8b50eb9e4999bc3ec313f08b8e852737f138dcd6f2afa62e6ffeb0bf
@@ -749,6 +754,14 @@ test/extractor-tests/generated/decl/ImportDecl/ImportDecl_getImportedModule.ql 0
test/extractor-tests/generated/decl/ImportDecl/ImportDecl_getMember.ql 6d48d3a93bc96dba3bda71ec9d9d6282615c2228a58da6167c169fafaedb3e17 8560b23d0f52b845c81727ce09c0b2f9647965c83d7de165e8cd3d91be5bdd42
test/extractor-tests/generated/decl/InfixOperatorDecl/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
test/extractor-tests/generated/decl/Initializer/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
test/extractor-tests/generated/decl/MacroDecl/MacroDecl.ql 16900baee88fe4d7d4f88369e7455783b8c2058ee48a2af2136d1d778098854e 6dae3ea092d1810c301ed57841c5c93a5ee0d8f8187552d078ce26a74c1e4630
test/extractor-tests/generated/decl/MacroDecl/MacroDecl_getGenericTypeParam.ql ae35558863fc444ca6a034d74e90583a779a2edb755c523d33693a8ab418718f 2031af476afa267b71fe22071f7e9ec97d4872812d333ff733055b7b29ff8386
test/extractor-tests/generated/decl/MacroDecl/MacroDecl_getMember.ql 4abbe22e4c2b94b8f5d009386c93710e7a003d7faef7d044481fcb47cc85e85e 9a57fab9011773cfa77db44b1eedf7e2277380640161d708af9d4df6280df3d3
test/extractor-tests/generated/decl/MacroDecl/MacroDecl_getParameter.ql 449716b575d0a4caa69cabafeba289d328e12054a1f7aac77d0dd5c47904971f 9649a62096d5fc17e71e527bc1299cbf6a1f38d21f685c86469bc6c83a62268a
test/extractor-tests/generated/decl/MacroDecl/MacroDecl_getRole.ql d861b3ac12e38826d6e9ac72b7e6f2b82b4328e6e02bf26ea496635501cd1722 c2b606a39dd68dbeea4709d4c868a66db7ffae720f4163540f6d1e0aaeaafc11
test/extractor-tests/generated/decl/MacroDecl/MacroRole.ql cd8c70998a177f14e1b10eb214ffefd62b2c4a7839dc845bf155ddb0888dd4a7 cdad06e902ab61005dcb552d1340754a12fc18a9256f49dd6fb3ccbd34605ef2
test/extractor-tests/generated/decl/MacroDecl/MacroRole_getConformance.ql d36aeb229667a5b0153534872523ed84e28cdb9f8400d1f3051c15227e05c793 dc18b70f2e65edc86f12179ba3756dbfc3802dc87f875c2e11d97359b180c767
test/extractor-tests/generated/decl/MacroDecl/MacroRole_getName.ql fa339f428f572873f76ace1dea80e643a198bd435a8ce6cc0f38cac870e590f7 fa1a87d0f0a71684c927cb7049efb627eeb42f4d436bcaef196b01e12d0e4aa7
test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.ql d096e82574438b1e6d646b8762217dc74f9f9c40b01d642ef6a0286a55ecad9d 3eae6049885efcd3ffd6117af31cd12d792492b1591a88444a8e4a7fa31ac187
test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl_getAnExportedModule.ql 321619519c5cffefda78f11f2c85a199af76fccbfcc51126c7a558ba12fdfd80 30e48eb820ba9d7f3ec30bf4536c0f84280c5f2ca8c63427f6b77d74a092e68b
test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl_getAnImportedModule.ql 65fae5b1a7db3a11fd837ed78c663e8907306c36695ae73e4e29559755276fbe 3ddef1a7af7a636e66674fadb3e727ad18655a9ecb4c73fd3d6aca202f1191fb

13
swift/ql/.gitattributes generated vendored
View File

@@ -10,6 +10,7 @@
/lib/codeql/swift/elements/DiagnosticsConstructor.qll linguist-generated
/lib/codeql/swift/elements/ErrorElement.qll linguist-generated
/lib/codeql/swift/elements/KeyPathComponentConstructor.qll linguist-generated
/lib/codeql/swift/elements/MacroRoleConstructor.qll linguist-generated
/lib/codeql/swift/elements/OtherAvailabilitySpecConstructor.qll linguist-generated
/lib/codeql/swift/elements/PlatformVersionAvailabilitySpecConstructor.qll linguist-generated
/lib/codeql/swift/elements/UnspecifiedElementConstructor.qll linguist-generated
@@ -38,6 +39,8 @@
/lib/codeql/swift/elements/decl/InfixOperatorDecl.qll linguist-generated
/lib/codeql/swift/elements/decl/InfixOperatorDeclConstructor.qll linguist-generated
/lib/codeql/swift/elements/decl/InitializerConstructor.qll linguist-generated
/lib/codeql/swift/elements/decl/MacroDecl.qll linguist-generated
/lib/codeql/swift/elements/decl/MacroDeclConstructor.qll linguist-generated
/lib/codeql/swift/elements/decl/MissingMemberDeclConstructor.qll linguist-generated
/lib/codeql/swift/elements/decl/ModuleDecl.qll linguist-generated
/lib/codeql/swift/elements/decl/ModuleDeclConstructor.qll linguist-generated
@@ -400,6 +403,7 @@
/lib/codeql/swift/generated/KeyPathComponent.qll linguist-generated
/lib/codeql/swift/generated/Locatable.qll linguist-generated
/lib/codeql/swift/generated/Location.qll linguist-generated
/lib/codeql/swift/generated/MacroRole.qll linguist-generated
/lib/codeql/swift/generated/OtherAvailabilitySpec.qll linguist-generated
/lib/codeql/swift/generated/ParentChild.qll linguist-generated
/lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll linguist-generated
@@ -432,6 +436,7 @@
/lib/codeql/swift/generated/decl/ImportDecl.qll linguist-generated
/lib/codeql/swift/generated/decl/InfixOperatorDecl.qll linguist-generated
/lib/codeql/swift/generated/decl/Initializer.qll linguist-generated
/lib/codeql/swift/generated/decl/MacroDecl.qll linguist-generated
/lib/codeql/swift/generated/decl/MissingMemberDecl.qll linguist-generated
/lib/codeql/swift/generated/decl/ModuleDecl.qll linguist-generated
/lib/codeql/swift/generated/decl/NamedFunction.qll linguist-generated
@@ -751,6 +756,14 @@
/test/extractor-tests/generated/decl/ImportDecl/ImportDecl_getMember.ql linguist-generated
/test/extractor-tests/generated/decl/InfixOperatorDecl/MISSING_SOURCE.txt linguist-generated
/test/extractor-tests/generated/decl/Initializer/MISSING_SOURCE.txt linguist-generated
/test/extractor-tests/generated/decl/MacroDecl/MacroDecl.ql linguist-generated
/test/extractor-tests/generated/decl/MacroDecl/MacroDecl_getGenericTypeParam.ql linguist-generated
/test/extractor-tests/generated/decl/MacroDecl/MacroDecl_getMember.ql linguist-generated
/test/extractor-tests/generated/decl/MacroDecl/MacroDecl_getParameter.ql linguist-generated
/test/extractor-tests/generated/decl/MacroDecl/MacroDecl_getRole.ql linguist-generated
/test/extractor-tests/generated/decl/MacroDecl/MacroRole.ql linguist-generated
/test/extractor-tests/generated/decl/MacroDecl/MacroRole_getConformance.ql linguist-generated
/test/extractor-tests/generated/decl/MacroDecl/MacroRole_getName.ql linguist-generated
/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl.ql linguist-generated
/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl_getAnExportedModule.ql linguist-generated
/test/extractor-tests/generated/decl/ModuleDecl/ModuleDecl_getAnImportedModule.ql linguist-generated

View File

@@ -17,6 +17,7 @@ import codeql.swift.elements.File
import codeql.swift.elements.KeyPathComponent
import codeql.swift.elements.Locatable
import codeql.swift.elements.Location
import codeql.swift.elements.MacroRole
import codeql.swift.elements.OtherAvailabilitySpec
import codeql.swift.elements.PlatformVersionAvailabilitySpec
import codeql.swift.elements.UnknownFile
@@ -43,6 +44,7 @@ import codeql.swift.elements.decl.IfConfigDecl
import codeql.swift.elements.decl.ImportDecl
import codeql.swift.elements.decl.InfixOperatorDecl
import codeql.swift.elements.decl.Initializer
import codeql.swift.elements.decl.MacroDecl
import codeql.swift.elements.decl.MissingMemberDecl
import codeql.swift.elements.decl.ModuleDecl
import codeql.swift.elements.decl.NamedFunction

View File

@@ -0,0 +1,35 @@
/**
* This module provides a hand-modifiable wrapper around the generated class `MacroRole`.
*/
private import codeql.swift.generated.MacroRole
class MacroRole extends Generated::MacroRole {
string getKindName() {
this.getKind() = 1 and result = "expression"
or
this.getKind() = 2 and result = "declaration"
or
this.getKind() = 4 and result = "accessor"
or
this.getKind() = 8 and result = "memberAttribute"
or
this.getKind() = 16 and result = "member"
or
this.getKind() = 32 and result = "peer"
or
this.getKind() = 64 and result = "conformance"
or
this.getKind() = 128 and result = "codeItem"
or
this.getKind() = 256 and result = "extension"
}
string getMacroSyntaxName() {
this.getMacroSyntax() = 0 and result = "#freestanding"
or
this.getMacroSyntax() = 1 and result = "@attached"
}
override string toString() { result = this.getMacroSyntaxName() + "(" + this.getKindName() + ")" }
}

View File

@@ -0,0 +1,14 @@
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
/**
* This module defines the hook used internally to tweak the characteristic predicate of
* `MacroRole` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.swift.generated.Raw
/**
* The characteristic predicate of `MacroRole` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructMacroRole(Raw::MacroRole id) { any() }

View File

@@ -0,0 +1,8 @@
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
/**
* This module provides a hand-modifiable wrapper around the generated class `MacroDecl`.
*/
private import codeql.swift.generated.decl.MacroDecl
class MacroDecl extends Generated::MacroDecl { }

View File

@@ -0,0 +1,14 @@
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
/**
* This module defines the hook used internally to tweak the characteristic predicate of
* `MacroDecl` synthesized instances.
* INTERNAL: Do not use.
*/
private import codeql.swift.generated.Raw
/**
* The characteristic predicate of `MacroDecl` synthesized instances.
* INTERNAL: Do not use.
*/
predicate constructMacroDecl(Raw::MacroDecl id) { any() }

View File

@@ -0,0 +1,83 @@
// generated by codegen/codegen.py
/**
* This module provides the generated definition of `MacroRole`.
* INTERNAL: Do not import directly.
*/
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.AstNode
import codeql.swift.elements.expr.TypeExpr
module Generated {
/**
* The role of a macro.
* INTERNAL: Do not reference the `Generated::MacroRole` class directly.
* Use the subclass `MacroRole`, where the following predicates are available.
*/
class MacroRole extends Synth::TMacroRole, AstNode {
override string getAPrimaryQlClass() { result = "MacroRole" }
/**
* Gets the kind of this macro role (declaration, expression, member, etc.).
*/
int getKind() { result = Synth::convertMacroRoleToRaw(this).(Raw::MacroRole).getKind() }
/**
* Gets the #freestanding or @attached.
*/
int getMacroSyntax() {
result = Synth::convertMacroRoleToRaw(this).(Raw::MacroRole).getMacroSyntax()
}
/**
* Gets the `index`th conformance of this macro role (0-based).
*
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
* behavior of both the `Immediate` and non-`Immediate` versions.
*/
TypeExpr getImmediateConformance(int index) {
result =
Synth::convertTypeExprFromRaw(Synth::convertMacroRoleToRaw(this)
.(Raw::MacroRole)
.getConformance(index))
}
/**
* Gets the `index`th conformance of this macro role (0-based).
*/
final TypeExpr getConformance(int index) {
exists(TypeExpr immediate |
immediate = this.getImmediateConformance(index) and
result = immediate.resolve()
)
}
/**
* Gets any of the conformances of this macro role.
*/
final TypeExpr getAConformance() { result = this.getConformance(_) }
/**
* Gets the number of conformances of this macro role.
*/
final int getNumberOfConformances() { result = count(int i | exists(this.getConformance(i))) }
/**
* Gets the `index`th name of this macro role (0-based).
*/
string getName(int index) {
result = Synth::convertMacroRoleToRaw(this).(Raw::MacroRole).getName(index)
}
/**
* Gets any of the names of this macro role.
*/
final string getAName() { result = this.getName(_) }
/**
* Gets the number of names of this macro role.
*/
final int getNumberOfNames() { result = count(int i | exists(this.getName(i))) }
}
}

View File

@@ -245,6 +245,19 @@ private module Impl {
)
}
private Element getImmediateChildOfMacroRole(MacroRole e, int index, string partialPredicateCall) {
exists(int b, int bAstNode, int n |
b = 0 and
bAstNode = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfAstNode(e, i, _)) | i) and
n = bAstNode and
(
none()
or
result = getImmediateChildOfAstNode(e, index - b, partialPredicateCall)
)
)
}
private Element getImmediateChildOfUnspecifiedElement(
UnspecifiedElement e, int index, string partialPredicateCall
) {
@@ -605,6 +618,25 @@ private module Impl {
)
}
private Element getImmediateChildOfMacroDecl(MacroDecl e, int index, string partialPredicateCall) {
exists(int b, int bGenericContext, int bValueDecl, int n |
b = 0 and
bGenericContext =
b + 1 + max(int i | i = -1 or exists(getImmediateChildOfGenericContext(e, i, _)) | i) and
bValueDecl =
bGenericContext + 1 +
max(int i | i = -1 or exists(getImmediateChildOfValueDecl(e, i, _)) | i) and
n = bValueDecl and
(
none()
or
result = getImmediateChildOfGenericContext(e, index - b, partialPredicateCall)
or
result = getImmediateChildOfValueDecl(e, index - bGenericContext, partialPredicateCall)
)
)
}
private Element getImmediateChildOfPostfixOperatorDecl(
PostfixOperatorDecl e, int index, string partialPredicateCall
) {
@@ -5050,6 +5082,8 @@ private module Impl {
or
result = getImmediateChildOfKeyPathComponent(e, index, partialAccessor)
or
result = getImmediateChildOfMacroRole(e, index, partialAccessor)
or
result = getImmediateChildOfUnspecifiedElement(e, index, partialAccessor)
or
result = getImmediateChildOfOtherAvailabilitySpec(e, index, partialAccessor)
@@ -5080,6 +5114,8 @@ private module Impl {
or
result = getImmediateChildOfInfixOperatorDecl(e, index, partialAccessor)
or
result = getImmediateChildOfMacroDecl(e, index, partialAccessor)
or
result = getImmediateChildOfPostfixOperatorDecl(e, index, partialAccessor)
or
result = getImmediateChildOfPrefixOperatorDecl(e, index, partialAccessor)

View File

@@ -246,6 +246,34 @@ module Raw {
Type getComponentType() { key_path_components(this, _, result) }
}
/**
* INTERNAL: Do not use.
* The role of a macro.
*/
class MacroRole extends @macro_role, AstNode {
override string toString() { result = "MacroRole" }
/**
* Gets the kind of this macro role (declaration, expression, member, etc.).
*/
int getKind() { macro_roles(this, result, _) }
/**
* Gets the #freestanding or @attached.
*/
int getMacroSyntax() { macro_roles(this, _, result) }
/**
* Gets the `index`th conformance of this macro role (0-based).
*/
TypeExpr getConformance(int index) { macro_role_conformances(this, index, result) }
/**
* Gets the `index`th name of this macro role (0-based).
*/
string getName(int index) { macro_role_names(this, index, result) }
}
/**
* INTERNAL: Do not use.
*/
@@ -557,6 +585,38 @@ module Raw {
PrecedenceGroupDecl getPrecedenceGroup() { infix_operator_decl_precedence_groups(this, result) }
}
/**
* INTERNAL: Do not use.
* A declaration of a macro. Some examples:
*
* ```
* @freestanding(declaration)
* macro A() = #externalMacro(module: "A", type: "A")
* @freestanding(expression)
* macro B() = Builtin.B
* @attached(member)
* macro C() = C.C
* ```
*/
class MacroDecl extends @macro_decl, GenericContext, ValueDecl {
override string toString() { result = "MacroDecl" }
/**
* Gets the name of this macro.
*/
string getName() { macro_decls(this, result) }
/**
* Gets the `index`th parameter of this macro (0-based).
*/
ParamDecl getParameter(int index) { macro_decl_parameters(this, index, result) }
/**
* Gets the `index`th role of this macro (0-based).
*/
MacroRole getRole(int index) { macro_decl_roles(this, index, result) }
}
/**
* INTERNAL: Do not use.
*/

View File

@@ -39,6 +39,10 @@ module Synth {
* INTERNAL: Do not use.
*/
TKeyPathComponent(Raw::KeyPathComponent id) { constructKeyPathComponent(id) } or
/**
* INTERNAL: Do not use.
*/
TMacroRole(Raw::MacroRole id) { constructMacroRole(id) } or
/**
* INTERNAL: Do not use.
*/
@@ -121,6 +125,10 @@ module Synth {
* INTERNAL: Do not use.
*/
TInitializer(Raw::Initializer id) { constructInitializer(id) } or
/**
* INTERNAL: Do not use.
*/
TMacroDecl(Raw::MacroDecl id) { constructMacroDecl(id) } or
/**
* INTERNAL: Do not use.
*/
@@ -1061,7 +1069,7 @@ module Synth {
*/
class TAstNode =
TAvailabilityInfo or TAvailabilitySpec or TCaseLabelItem or TConditionElement or TDecl or
TExpr or TKeyPathComponent or TPattern or TStmt or TStmtCondition or TTypeRepr;
TExpr or TKeyPathComponent or TMacroRole or TPattern or TStmt or TStmtCondition or TTypeRepr;
/**
* INTERNAL: Do not use.
@@ -1128,7 +1136,8 @@ module Synth {
/**
* INTERNAL: Do not use.
*/
class TGenericContext = TExtensionDecl or TFunction or TGenericTypeDecl or TSubscriptDecl;
class TGenericContext =
TExtensionDecl or TFunction or TGenericTypeDecl or TMacroDecl or TSubscriptDecl;
/**
* INTERNAL: Do not use.
@@ -1153,7 +1162,8 @@ module Synth {
/**
* INTERNAL: Do not use.
*/
class TValueDecl = TAbstractStorageDecl or TEnumElementDecl or TFunction or TTypeDecl;
class TValueDecl =
TAbstractStorageDecl or TEnumElementDecl or TFunction or TMacroDecl or TTypeDecl;
/**
* INTERNAL: Do not use.
@@ -1427,6 +1437,13 @@ module Synth {
cached
TKeyPathComponent convertKeyPathComponentFromRaw(Raw::Element e) { result = TKeyPathComponent(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TMacroRole`, if possible.
*/
cached
TMacroRole convertMacroRoleFromRaw(Raw::Element e) { result = TMacroRole(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TOtherAvailabilitySpec`, if possible.
@@ -1579,6 +1596,13 @@ module Synth {
cached
TInitializer convertInitializerFromRaw(Raw::Element e) { result = TInitializer(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TMacroDecl`, if possible.
*/
cached
TMacroDecl convertMacroDeclFromRaw(Raw::Element e) { result = TMacroDecl(e) }
/**
* INTERNAL: Do not use.
* Converts a raw element to a synthesized `TMissingMemberDecl`, if possible.
@@ -3319,6 +3343,8 @@ module Synth {
or
result = convertKeyPathComponentFromRaw(e)
or
result = convertMacroRoleFromRaw(e)
or
result = convertPatternFromRaw(e)
or
result = convertStmtFromRaw(e)
@@ -3528,6 +3554,8 @@ module Synth {
or
result = convertGenericTypeDeclFromRaw(e)
or
result = convertMacroDeclFromRaw(e)
or
result = convertSubscriptDeclFromRaw(e)
}
@@ -3597,6 +3625,8 @@ module Synth {
or
result = convertFunctionFromRaw(e)
or
result = convertMacroDeclFromRaw(e)
or
result = convertTypeDeclFromRaw(e)
}
@@ -4352,6 +4382,13 @@ module Synth {
cached
Raw::Element convertKeyPathComponentToRaw(TKeyPathComponent e) { e = TKeyPathComponent(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TMacroRole` to a raw DB element, if possible.
*/
cached
Raw::Element convertMacroRoleToRaw(TMacroRole e) { e = TMacroRole(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TOtherAvailabilitySpec` to a raw DB element, if possible.
@@ -4504,6 +4541,13 @@ module Synth {
cached
Raw::Element convertInitializerToRaw(TInitializer e) { e = TInitializer(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TMacroDecl` to a raw DB element, if possible.
*/
cached
Raw::Element convertMacroDeclToRaw(TMacroDecl e) { e = TMacroDecl(result) }
/**
* INTERNAL: Do not use.
* Converts a synthesized `TMissingMemberDecl` to a raw DB element, if possible.
@@ -6242,6 +6286,8 @@ module Synth {
or
result = convertKeyPathComponentToRaw(e)
or
result = convertMacroRoleToRaw(e)
or
result = convertPatternToRaw(e)
or
result = convertStmtToRaw(e)
@@ -6451,6 +6497,8 @@ module Synth {
or
result = convertGenericTypeDeclToRaw(e)
or
result = convertMacroDeclToRaw(e)
or
result = convertSubscriptDeclToRaw(e)
}
@@ -6520,6 +6568,8 @@ module Synth {
or
result = convertFunctionToRaw(e)
or
result = convertMacroDeclToRaw(e)
or
result = convertTypeDeclToRaw(e)
}

View File

@@ -9,6 +9,7 @@ import codeql.swift.elements.DbFileConstructor
import codeql.swift.elements.DbLocationConstructor
import codeql.swift.elements.DiagnosticsConstructor
import codeql.swift.elements.KeyPathComponentConstructor
import codeql.swift.elements.MacroRoleConstructor
import codeql.swift.elements.OtherAvailabilitySpecConstructor
import codeql.swift.elements.PlatformVersionAvailabilitySpecConstructor
import codeql.swift.elements.UnspecifiedElementConstructor
@@ -27,6 +28,7 @@ import codeql.swift.elements.decl.IfConfigDeclConstructor
import codeql.swift.elements.decl.ImportDeclConstructor
import codeql.swift.elements.decl.InfixOperatorDeclConstructor
import codeql.swift.elements.decl.InitializerConstructor
import codeql.swift.elements.decl.MacroDeclConstructor
import codeql.swift.elements.decl.MissingMemberDeclConstructor
import codeql.swift.elements.decl.ModuleDeclConstructor
import codeql.swift.elements.decl.NamedFunctionConstructor

View File

@@ -0,0 +1,77 @@
// generated by codegen/codegen.py
/**
* This module provides the generated definition of `MacroDecl`.
* INTERNAL: Do not import directly.
*/
private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw
import codeql.swift.elements.decl.GenericContext
import codeql.swift.elements.MacroRole
import codeql.swift.elements.decl.ParamDecl
import codeql.swift.elements.decl.ValueDecl
module Generated {
/**
* A declaration of a macro. Some examples:
*
* ```
* @freestanding(declaration)
* macro A() = #externalMacro(module: "A", type: "A")
* @freestanding(expression)
* macro B() = Builtin.B
* @attached(member)
* macro C() = C.C
* ```
* INTERNAL: Do not reference the `Generated::MacroDecl` class directly.
* Use the subclass `MacroDecl`, where the following predicates are available.
*/
class MacroDecl extends Synth::TMacroDecl, GenericContext, ValueDecl {
override string getAPrimaryQlClass() { result = "MacroDecl" }
/**
* Gets the name of this macro.
*/
string getName() { result = Synth::convertMacroDeclToRaw(this).(Raw::MacroDecl).getName() }
/**
* Gets the `index`th parameter of this macro (0-based).
*/
ParamDecl getParameter(int index) {
result =
Synth::convertParamDeclFromRaw(Synth::convertMacroDeclToRaw(this)
.(Raw::MacroDecl)
.getParameter(index))
}
/**
* Gets any of the parameters of this macro.
*/
final ParamDecl getAParameter() { result = this.getParameter(_) }
/**
* Gets the number of parameters of this macro.
*/
final int getNumberOfParameters() { result = count(int i | exists(this.getParameter(i))) }
/**
* Gets the `index`th role of this macro (0-based).
*/
MacroRole getRole(int index) {
result =
Synth::convertMacroRoleFromRaw(Synth::convertMacroDeclToRaw(this)
.(Raw::MacroDecl)
.getRole(index))
}
/**
* Gets any of the roles of this macro.
*/
final MacroRole getARole() { result = this.getRole(_) }
/**
* Gets the number of roles of this macro.
*/
final int getNumberOfRoles() { result = count(int i | exists(this.getRole(i))) }
}
}

View File

@@ -113,6 +113,7 @@ locations(
| @decl
| @expr
| @key_path_component
| @macro_role
| @pattern
| @stmt
| @stmt_condition
@@ -199,6 +200,26 @@ key_path_component_decl_refs(
int decl_ref: @value_decl_or_none ref
);
macro_roles(
unique int id: @macro_role,
int kind: int ref,
int macro_syntax: int ref
);
#keyset[id, index]
macro_role_conformances(
int id: @macro_role ref,
int index: int ref,
int conformance: @type_expr_or_none ref
);
#keyset[id, index]
macro_role_names(
int id: @macro_role ref,
int index: int ref,
string name: string ref
);
unspecified_elements(
unique int id: @unspecified_element,
string property: string ref,
@@ -266,6 +287,7 @@ decl_members( //dir=decl
@extension_decl
| @function
| @generic_type_decl
| @macro_decl
| @subscript_decl
;
@@ -401,6 +423,7 @@ top_level_code_decls( //dir=decl
@abstract_storage_decl
| @enum_element_decl
| @function
| @macro_decl
| @type_decl
;
@@ -450,6 +473,25 @@ infix_operator_decl_precedence_groups( //dir=decl
int precedence_group: @precedence_group_decl_or_none ref
);
macro_decls( //dir=decl
unique int id: @macro_decl,
string name: string ref
);
#keyset[id, index]
macro_decl_parameters( //dir=decl
int id: @macro_decl ref,
int index: int ref,
int parameter: @param_decl_or_none ref
);
#keyset[id, index]
macro_decl_roles( //dir=decl
int id: @macro_decl ref,
int index: int ref,
int role: @macro_role_or_none ref
);
postfix_operator_decls( //dir=decl
unique int id: @postfix_operator_decl
);
@@ -2614,6 +2656,11 @@ variadic_sequence_types( //dir=type
| @unspecified_element
;
@macro_role_or_none =
@macro_role
| @unspecified_element
;
@module_decl_or_none =
@module_decl
| @unspecified_element
@@ -2694,6 +2741,11 @@ variadic_sequence_types( //dir=type
| @unspecified_element
;
@type_expr_or_none =
@type_expr
| @unspecified_element
;
@type_repr_or_none =
@type_repr
| @unspecified_element

View File

@@ -16,6 +16,8 @@ predicate toBeTested(Element e) {
or
e instanceof PackArchetypeType
or
e instanceof MacroRole
or
exists(ModuleDecl m |
m = e and
not m.isBuiltinModule() and

View File

@@ -1,3 +1,13 @@
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(declaration)
#-----| [MacroRole] #freestanding(declaration)
closures.swift:
# 1| [NamedFunction] hello()
# 1| InterfaceType = () -> String

View File

@@ -0,0 +1,3 @@
| test.swift:2:1:2:50 | MacroDecl | getNumberOfGenericTypeParams: | 0 | getModule: | file://:0:0:0:0 | test | getNumberOfMembers: | 0 | getInterfaceType: | () -> () | getName: | A() | getNumberOfParameters: | 0 | getNumberOfRoles: | 1 |
| test.swift:4:1:4:15 | MacroDecl | getNumberOfGenericTypeParams: | 0 | getModule: | file://:0:0:0:0 | test | getNumberOfMembers: | 0 | getInterfaceType: | () -> () | getName: | B() | getNumberOfParameters: | 0 | getNumberOfRoles: | 1 |
| test.swift:7:1:7:15 | MacroDecl | getNumberOfGenericTypeParams: | 0 | getModule: | file://:0:0:0:0 | test | getNumberOfMembers: | 0 | getInterfaceType: | () -> () | getName: | C() | getNumberOfParameters: | 0 | getNumberOfRoles: | 2 |

View File

@@ -0,0 +1,20 @@
// generated by codegen/codegen.py
import codeql.swift.elements
import TestUtils
from
MacroDecl x, int getNumberOfGenericTypeParams, ModuleDecl getModule, int getNumberOfMembers,
Type getInterfaceType, string getName, int getNumberOfParameters, int getNumberOfRoles
where
toBeTested(x) and
not x.isUnknown() and
getNumberOfGenericTypeParams = x.getNumberOfGenericTypeParams() and
getModule = x.getModule() and
getNumberOfMembers = x.getNumberOfMembers() and
getInterfaceType = x.getInterfaceType() and
getName = x.getName() and
getNumberOfParameters = x.getNumberOfParameters() and
getNumberOfRoles = x.getNumberOfRoles()
select x, "getNumberOfGenericTypeParams:", getNumberOfGenericTypeParams, "getModule:", getModule,
"getNumberOfMembers:", getNumberOfMembers, "getInterfaceType:", getInterfaceType, "getName:",
getName, "getNumberOfParameters:", getNumberOfParameters, "getNumberOfRoles:", getNumberOfRoles

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,4 @@
| test.swift:2:1:2:50 | MacroDecl | 0 | test.swift:1:14:1:26 | #freestanding(declaration) |
| test.swift:4:1:4:15 | MacroDecl | 0 | test.swift:3:14:3:25 | #freestanding(expression) |
| test.swift:7:1:7:15 | MacroDecl | 0 | test.swift:6:10:6:20 | @attached(extension) |
| test.swift:7:1:7:15 | MacroDecl | 1 | test.swift:5:10:5:17 | @attached(member) |

View File

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

View File

@@ -0,0 +1,14 @@
| file://:0:0:0:0 | #freestanding(declaration) | getKind: | 2 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(declaration) | getKind: | 2 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| file://:0:0:0:0 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| test.swift:1:14:1:26 | #freestanding(declaration) | getKind: | 2 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| test.swift:3:14:3:25 | #freestanding(expression) | getKind: | 1 | getMacroSyntax: | 0 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| test.swift:5:10:5:17 | @attached(member) | getKind: | 16 | getMacroSyntax: | 1 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |
| test.swift:6:10:6:20 | @attached(extension) | getKind: | 256 | getMacroSyntax: | 1 | getNumberOfConformances: | 0 | getNumberOfNames: | 0 |

View File

@@ -0,0 +1,14 @@
// generated by codegen/codegen.py
import codeql.swift.elements
import TestUtils
from MacroRole x, int getKind, int getMacroSyntax, int getNumberOfConformances, int getNumberOfNames
where
toBeTested(x) and
not x.isUnknown() and
getKind = x.getKind() and
getMacroSyntax = x.getMacroSyntax() and
getNumberOfConformances = x.getNumberOfConformances() and
getNumberOfNames = x.getNumberOfNames()
select x, "getKind:", getKind, "getMacroSyntax:", getMacroSyntax, "getNumberOfConformances:",
getNumberOfConformances, "getNumberOfNames:", getNumberOfNames

View File

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

View File

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

View File

@@ -0,0 +1,7 @@
@freestanding(declaration)
macro A() = #externalMacro(module: "A", type: "A")
@freestanding(expression)
macro B() = B.B
@attached(member)
@attached(extension)
macro C() = C.C

View File

@@ -1,3 +1,13 @@
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(declaration)
#-----| [MacroRole] #freestanding(declaration)
v5.8.swift:
# 1| [Comment] // https://github.com/apple/swift/blob/main/CHANGELOG.md#swift-58
# 1|

View File

@@ -1,3 +1,13 @@
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(declaration)
#-----| [MacroRole] #freestanding(declaration)
cfg.swift:
# 1| [TopLevelCodeDecl] { ... }
# 1| getBody(): [BraceStmt] { ... }

View File

@@ -1,3 +1,13 @@
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(declaration)
#-----| [MacroRole] #freestanding(declaration)
methodlookup.swift:
# 1| [ClassDecl] Foo
# 2| getMember(0): [Initializer] Foo.init()

View File

@@ -1,3 +1,13 @@
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(expression)
#-----| [MacroRole] #freestanding(declaration)
#-----| [MacroRole] #freestanding(declaration)
chained_conversion.swift:
# 1| [NamedFunction] foo(x:)
# 1| InterfaceType = (inout Int) -> Int?

View File

@@ -1361,3 +1361,31 @@ class BorrowExpr(IdentityExpr):
```
"""
pass
@qltest.test_with('MacroDecl')
class MacroRole(AstNode):
"""
The role of a macro.
"""
kind: int | doc("kind of this macro role (declaration, expression, member, etc.)")
macro_syntax: int | doc("#freestanding or @attached")
conformances: list[TypeExpr] | doc("conformances of this macro role")
names: list[string] | doc("names of this macro role")
class MacroDecl(GenericContext, ValueDecl):
"""
A declaration of a macro. Some examples:
```
@freestanding(declaration)
macro A() = #externalMacro(module: "A", type: "A")
@freestanding(expression)
macro B() = Builtin.B
@attached(member)
macro C() = C.C
```
"""
name: string | doc("name of this macro")
parameters: list[ParamDecl] | doc("parameters of this macro")
roles: list[MacroRole] | doc("roles of this macro")
pass