mirror of
https://github.com/github/codeql.git
synced 2026-04-24 16:25:15 +02:00
Merge pull request #12580 from github/redsun82/swift-more-precise-successfully-extracted-query
Swift: make `SuccessfullyExtractedFiles.ql` more precise
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
||||
description: Revert adding file_is_successfully_extracted
|
||||
compatibility: full
|
||||
file_is_successfully_extracted.rel: delete
|
||||
@@ -30,10 +30,15 @@ void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceMa
|
||||
trap.emit(LocatableLocationsTrap{locatableLabel, entry.id});
|
||||
}
|
||||
|
||||
void SwiftLocationExtractor::emitFile(swift::SourceFile* file) {
|
||||
TrapLabel<FileTag> SwiftLocationExtractor::emitFile(swift::SourceFile* file) {
|
||||
if (file) {
|
||||
fetchFileLabel(resolvePath(file->getFilename()));
|
||||
return emitFile(std::string_view{file->getFilename()});
|
||||
}
|
||||
return undefined_label;
|
||||
}
|
||||
|
||||
TrapLabel<FileTag> SwiftLocationExtractor::emitFile(const std::filesystem::path& file) {
|
||||
return fetchFileLabel(resolvePath(file));
|
||||
}
|
||||
|
||||
void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager,
|
||||
|
||||
@@ -18,7 +18,8 @@ class SwiftLocationExtractor {
|
||||
public:
|
||||
explicit SwiftLocationExtractor(TrapDomain& trap) : trap(trap) {}
|
||||
|
||||
void emitFile(swift::SourceFile* file);
|
||||
TrapLabel<FileTag> emitFile(swift::SourceFile* file);
|
||||
TrapLabel<FileTag> emitFile(const std::filesystem::path& file);
|
||||
|
||||
template <typename Locatable>
|
||||
void attachLocation(const swift::SourceManager& sourceManager,
|
||||
|
||||
@@ -95,6 +95,14 @@ class Observer : public swift::FrontendObserver {
|
||||
codeql::extractExtractLazyDeclarations(state, compiler);
|
||||
}
|
||||
|
||||
void markSuccessfullyExtractedFiles() {
|
||||
codeql::SwiftLocationExtractor locExtractor{invocationTrap};
|
||||
for (const auto& src : state.sourceFiles) {
|
||||
auto fileLabel = locExtractor.emitFile(src);
|
||||
invocationTrap.emit(codeql::FileIsSuccessfullyExtractedTrap{fileLabel});
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
codeql::SwiftExtractorState state;
|
||||
codeql::TrapDomain invocationTrap{invocationTrapDomain(state)};
|
||||
@@ -195,5 +203,9 @@ int main(int argc, char** argv) {
|
||||
int frontend_rc = swift::performFrontend(configuration.frontendOptions, "swift-extractor",
|
||||
(void*)main, &observer);
|
||||
|
||||
if (frontend_rc == 0) {
|
||||
observer.markSuccessfullyExtractedFiles();
|
||||
}
|
||||
|
||||
return frontend_rc;
|
||||
}
|
||||
|
||||
@@ -378,14 +378,14 @@ ql/lib/codeql/swift/generated/DbLocation.qll b9baea963d9fa82068986512c0649d10508
|
||||
ql/lib/codeql/swift/generated/Diagnostics.qll d2ee2db55e932dcaee95fcc1164a51ffbe1a78d86ee0f50aabb299b458462afe 566d554d579cadde26dc4d1d6b1750ca800511201b737b629f15b6f873af3733
|
||||
ql/lib/codeql/swift/generated/Element.qll 9caf84a1da2509f5b01a22d6597126c573ae63ec3e8c6af6fd6fcc7ead0b4e82 70deb2238509d5ed660369bf763c796065d92efd732469088cdf67f68bacd796
|
||||
ql/lib/codeql/swift/generated/ErrorElement.qll 4b032abe8ffb71376a29c63e470a52943ace2527bf7b433c97a8bf716f9ad102 4f2b1be162a5c275e3264dbc51bf98bce8846d251be8490a0d4b16cbc85f630f
|
||||
ql/lib/codeql/swift/generated/File.qll 61454459f5f1ae378bd4970ad1da4f39f3e696bac8a5eebdd162f131995c5316 3e6805f8858cd55dd0e0d0e5aeab923d6a55292dbf98b0029db1ae0208efe684
|
||||
ql/lib/codeql/swift/generated/File.qll f88c485883dd9b2b4a366080e098372912e03fb3177e5cae58aa4449c2b03399 0333c49e3a11c48e6146a7f492ee31ac022d80150fc3f8bfafc3c8f94d66ff76
|
||||
ql/lib/codeql/swift/generated/Locatable.qll bdc98b9fb7788f44a4bf7e487ee5bd329473409950a8e9f116d61995615ad849 0b36b4fe45e2aa195e4bb70c50ea95f32f141b8e01e5f23466c6427dd9ab88fb
|
||||
ql/lib/codeql/swift/generated/Location.qll 851766e474cdfdfa67da42e0031fc42dd60196ff5edd39d82f08d3e32deb84c1 b29b2c37672f5acff15f1d3c5727d902f193e51122327b31bd27ec5f877bca3b
|
||||
ql/lib/codeql/swift/generated/OtherAvailabilitySpec.qll 0e26a203b26ff0581b7396b0c6d1606feec5cc32477f676585cdec4911af91c5 0e26a203b26ff0581b7396b0c6d1606feec5cc32477f676585cdec4911af91c5
|
||||
ql/lib/codeql/swift/generated/ParentChild.qll 87c955fbd71e8c720b306b8dc43db354a120a4f984404f83b4dfea4dc8969380 6f7464ecd8ca04b6aa261139b36a162e5b0636237d514b8431ef4f97a1c603dc
|
||||
ql/lib/codeql/swift/generated/ParentChild.qll 0ac2139b8b2e172858262d80950a0212b21fe46bf6af7259d9058fb7193f8242 6f7464ecd8ca04b6aa261139b36a162e5b0636237d514b8431ef4f97a1c603dc
|
||||
ql/lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll f82d9ca416fe8bd59b5531b65b1c74c9f317b3297a6101544a11339a1cffce38 7f5c6d3309e66c134107afe55bae76dfc9a72cb7cdd6d4c3706b6b34cee09fa0
|
||||
ql/lib/codeql/swift/generated/PureSynthConstructors.qll 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98
|
||||
ql/lib/codeql/swift/generated/Raw.qll 180dc0f5d34c2e88eb864dca9ef4be0a768583fdad98e737716e031caa355a39 8561938ad09551dc45ad6b3946d599fce1839985a6f61cee63a6dd463dd14a12
|
||||
ql/lib/codeql/swift/generated/Raw.qll efe60f045f8a4aecedd7bfe8110c0c10539bcdcb9f17f342cf560c8d065e6aff 261825907250bb4ddeba8ccce0df29b45f13c6fb338eb41a06ea6b43e7aa9788
|
||||
ql/lib/codeql/swift/generated/Synth.qll af02e0b49fe7b488592687996cc74d9525d4e3fbc9d324820b310b356f4d2612 5c740a660721173e9e4e45eb701d373ca19ff14d61cdaea309b65871e0deea90
|
||||
ql/lib/codeql/swift/generated/SynthConstructors.qll a1b3ca33017f82124286ccad317a05484fee144fb9c3cdd2e500ce38e5efcec4 a1b3ca33017f82124286ccad317a05484fee144fb9c3cdd2e500ce38e5efcec4
|
||||
ql/lib/codeql/swift/generated/UnknownFile.qll 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6
|
||||
@@ -661,7 +661,7 @@ ql/test/extractor-tests/generated/AvailabilityInfo/AvailabilityInfo.ql 6e06e2226
|
||||
ql/test/extractor-tests/generated/AvailabilityInfo/AvailabilityInfo_getSpec.ql 44ccccad28d8648aa3349d9290bd1478bb021797c26bc2f8c1e3de14a42be3bd aefab61b6fa1c06c5c79d337cffb61335dca74ef9906deba12f7eaea42f9ac14
|
||||
ql/test/extractor-tests/generated/Comment/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
ql/test/extractor-tests/generated/Diagnostics/Diagnostics.ql 6a4a9480cc929381e0337b181e5ac519a7abc6d597ebe24fb6701acf79ced86f 199c5bf8bd38e161d989e0e4db1ea1d3ddcb4d7cf571afd9112ce3ed8d9b8d2a
|
||||
ql/test/extractor-tests/generated/File/File.ql ab0968ae31b749da2b66462bd04e4dfb30604dba405a84594b575abfc4fa4c35 bcc0ff648b28c5ecd567e196e700272883756bbcc65296bbb880a979e3162628
|
||||
ql/test/extractor-tests/generated/File/File.ql 17a26e4f8aeaf3d4a38e6eb18f5d965cd62b63671b84edcd068808b4f3a999df 009a1338750bf95f715b303ac3e6a6e827c82aec2068299a97b0585ce76e9239
|
||||
ql/test/extractor-tests/generated/OtherAvailabilitySpec/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
ql/test/extractor-tests/generated/PlatformVersionAvailabilitySpec/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl.ql 5c017af7e6b16ee68990eec12affe81eb114338bac4d445f4b231fe0f110eccc db86c828a892b0acd150a780914e7e48c280cad473d3680a453bdee03aee1e9d
|
||||
|
||||
@@ -9,5 +9,12 @@ module Generated {
|
||||
* Gets the name of this file.
|
||||
*/
|
||||
string getName() { result = Synth::convertFileToRaw(this).(Raw::File).getName() }
|
||||
|
||||
/**
|
||||
* Holds if this file is successfully extracted.
|
||||
*/
|
||||
predicate isSuccessfullyExtracted() {
|
||||
Synth::convertFileToRaw(this).(Raw::File).isSuccessfullyExtracted()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,11 @@ module Raw {
|
||||
* Gets the name of this file.
|
||||
*/
|
||||
string getName() { files(this, result) }
|
||||
|
||||
/**
|
||||
* Holds if this file is successfully extracted.
|
||||
*/
|
||||
predicate isSuccessfullyExtracted() { file_is_successfully_extracted(this) }
|
||||
}
|
||||
|
||||
class Locatable extends @locatable, Element {
|
||||
|
||||
@@ -72,6 +72,11 @@ files(
|
||||
string name: string ref
|
||||
);
|
||||
|
||||
#keyset[id]
|
||||
file_is_successfully_extracted(
|
||||
int id: @file ref
|
||||
);
|
||||
|
||||
@locatable =
|
||||
@argument
|
||||
| @ast_node
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
class Element extends @element {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
from Element file, string filename
|
||||
where
|
||||
db_files(file) and
|
||||
files(file, filename) and
|
||||
filename.matches("%.swift") and
|
||||
not exists(Element error, Element loc |
|
||||
diagnostics(error, _, 4) and
|
||||
locatable_locations(error, loc) and
|
||||
locations(loc, file, _, _, _, _)
|
||||
)
|
||||
select file
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
||||
description: Add file_is_successfully_extracted
|
||||
compatibility: backwards
|
||||
file_is_successfully_extracted.rel: run file_is_successfully_extracted.ql
|
||||
@@ -9,7 +9,5 @@
|
||||
import swift
|
||||
|
||||
from File f
|
||||
where
|
||||
not exists(CompilerError e | e.getFile() = f) and
|
||||
f.getBaseName().regexpMatch(".*\\.swift\\z")
|
||||
where f.isSuccessfullyExtracted()
|
||||
select f, "File successfully extracted."
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
| empty.swift:0:0:0:0 | empty.swift | DbFile | getName: | empty.swift |
|
||||
| file://:0:0:0:0 | | UnknownFile | getName: | |
|
||||
| non_empty.swift:0:0:0:0 | non_empty.swift | DbFile | getName: | non_empty.swift |
|
||||
| empty.swift:0:0:0:0 | empty.swift | DbFile | getName: | empty.swift | isSuccessfullyExtracted: | yes |
|
||||
| error.swift:0:0:0:0 | error.swift | DbFile | getName: | error.swift | isSuccessfullyExtracted: | no |
|
||||
| file://:0:0:0:0 | | UnknownFile | getName: | | isSuccessfullyExtracted: | no |
|
||||
| non_empty.swift:0:0:0:0 | non_empty.swift | DbFile | getName: | non_empty.swift | isSuccessfullyExtracted: | yes |
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
import codeql.swift.elements
|
||||
import TestUtils
|
||||
|
||||
from File x, string getName
|
||||
from File x, string getName, string isSuccessfullyExtracted
|
||||
where
|
||||
toBeTested(x) and
|
||||
not x.isUnknown() and
|
||||
getName = x.getName()
|
||||
select x, x.getPrimaryQlClasses(), "getName:", getName
|
||||
getName = x.getName() and
|
||||
if x.isSuccessfullyExtracted()
|
||||
then isSuccessfullyExtracted = "yes"
|
||||
else isSuccessfullyExtracted = "no"
|
||||
select x, x.getPrimaryQlClasses(), "getName:", getName, "isSuccessfullyExtracted:",
|
||||
isSuccessfullyExtracted
|
||||
|
||||
2
swift/ql/test/extractor-tests/generated/File/error.swift
Normal file
2
swift/ql/test/extractor-tests/generated/File/error.swift
Normal file
@@ -0,0 +1,2 @@
|
||||
//codeql-extractor-expected-status: 1
|
||||
#error("Uh oh")
|
||||
@@ -20,6 +20,7 @@ class Element:
|
||||
@qltest.collapse_hierarchy
|
||||
class File(Element):
|
||||
name: string
|
||||
is_successfully_extracted: predicate | cpp.skip
|
||||
|
||||
@qltest.skip
|
||||
@qltest.collapse_hierarchy
|
||||
|
||||
Reference in New Issue
Block a user