Skip to content

Commit 60c1505

Browse files
committed
Swift: address review comments
1 parent ffcb382 commit 60c1505

File tree

6 files changed

+44
-35
lines changed

6 files changed

+44
-35
lines changed

swift/extractor/SwiftExtractor.cpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,22 @@ static fs::path getFilename(swift::ModuleDecl& module,
7878
return resolvePath(filename);
7979
}
8080

81-
static llvm::SmallVector<swift::Decl*> getTopLevelDecls(swift::ModuleDecl& module,
82-
swift::SourceFile* primaryFile,
83-
const swift::Decl* lazyDeclaration) {
84-
llvm::SmallVector<swift::Decl*> ret;
81+
static llvm::SmallVector<const swift::Decl*> getTopLevelDecls(swift::ModuleDecl& module,
82+
swift::SourceFile* primaryFile,
83+
const swift::Decl* lazyDeclaration) {
84+
llvm::SmallVector<const swift::Decl*> ret;
8585
if (lazyDeclaration) {
86-
ret.push_back(const_cast<swift::Decl*>(lazyDeclaration));
86+
ret.push_back(lazyDeclaration);
8787
return ret;
8888
}
8989
ret.push_back(&module);
90+
llvm::SmallVector<swift::Decl*> topLevelDecls;
9091
if (primaryFile) {
91-
primaryFile->getTopLevelDecls(ret);
92+
primaryFile->getTopLevelDecls(topLevelDecls);
9293
} else {
93-
module.getTopLevelDecls(ret);
94+
module.getTopLevelDecls(topLevelDecls);
9495
}
96+
ret.insert(ret.end(), topLevelDecls.data(), topLevelDecls.data() + topLevelDecls.size());
9597
return ret;
9698
}
9799

@@ -100,7 +102,7 @@ static TrapType getTrapType(swift::SourceFile* primaryFile, const swift::Decl* l
100102
return TrapType::source;
101103
}
102104
if (lazyDeclaration) {
103-
return TrapType::lazy_declarations;
105+
return TrapType::lazy_declaration;
104106
}
105107
return TrapType::module;
106108
}
@@ -199,10 +201,12 @@ void codeql::extractSwiftFiles(SwiftExtractorState& state, swift::CompilerInstan
199201
continue;
200202
}
201203
archiveFile(state.configuration, *sourceFile);
202-
encounteredModules = extractDeclarations(state, compiler, *module, sourceFile, nullptr);
204+
encounteredModules =
205+
extractDeclarations(state, compiler, *module, sourceFile, /*lazy declaration*/ nullptr);
203206
}
204207
if (!isFromSourceFile) {
205-
encounteredModules = extractDeclarations(state, compiler, *module, nullptr, nullptr);
208+
encounteredModules = extractDeclarations(state, compiler, *module, /*source file*/ nullptr,
209+
/*lazy declaration*/ nullptr);
206210
}
207211
for (auto encountered : encounteredModules) {
208212
if (state.encounteredModules.count(encountered) == 0) {
@@ -214,23 +218,22 @@ void codeql::extractSwiftFiles(SwiftExtractorState& state, swift::CompilerInstan
214218
}
215219

216220
static void cleanupPendingDeclarations(SwiftExtractorState& state) {
217-
std::vector<const swift::Decl*> worklist;
218-
std::copy(std::begin(state.pendingDeclarations), std::end(state.pendingDeclarations),
219-
std::back_inserter(worklist));
220-
221+
std::vector<const swift::Decl*> worklist(std::begin(state.pendingDeclarations),
222+
std::end(state.pendingDeclarations));
221223
for (auto decl : worklist) {
222224
if (state.emittedDeclarations.count(decl)) {
223225
state.pendingDeclarations.erase(decl);
224226
}
225227
}
226228
}
229+
227230
static void extractLazy(SwiftExtractorState& state, swift::CompilerInstance& compiler) {
228231
cleanupPendingDeclarations(state);
229-
std::vector<const swift::Decl*> worklist;
230-
std::copy(std::begin(state.pendingDeclarations), std::end(state.pendingDeclarations),
231-
std::back_inserter(worklist));
232+
std::vector<const swift::Decl*> worklist(std::begin(state.pendingDeclarations),
233+
std::end(state.pendingDeclarations));
232234
for (auto pending : worklist) {
233-
extractDeclarations(state, compiler, *pending->getModuleContext(), nullptr, pending);
235+
extractDeclarations(state, compiler, *pending->getModuleContext(), /*source file*/ nullptr,
236+
pending);
234237
}
235238
}
236239

swift/extractor/config/SwiftExtractorState.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@ struct SwiftExtractorState {
2525
// The path for the modules outputted by the underlying frontend run, ignoring path redirection
2626
std::vector<std::filesystem::path> originalOutputModules;
2727

28+
// All lazy named declarations that were already emitted
2829
std::unordered_set<const swift::Decl*> emittedDeclarations;
30+
31+
// Lazy named declarations that were not yet emitted and will be emitted each one separately
2932
std::unordered_set<const swift::Decl*> pendingDeclarations;
3033
};
3134

swift/extractor/infra/SwiftDispatcher.h

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,6 @@ class SwiftDispatcher {
6060
return std::move(encounteredModules);
6161
}
6262

63-
void extractedDeclaration(const swift::Decl* decl) {
64-
swift::ModuleDecl* module = decl->getModuleContext();
65-
if (module->isBuiltinModule() || module->getName().str() == "__ObjC") {
66-
state.emittedDeclarations.insert(decl);
67-
}
68-
}
69-
void skippedDeclaration(const swift::Decl* decl) {
70-
swift::ModuleDecl* module = decl->getModuleContext();
71-
if (module->isBuiltinModule() || module->getName().str() == "__ObjC") {
72-
state.pendingDeclarations.insert(decl);
73-
}
74-
}
75-
7663
template <typename Entry>
7764
void emit(Entry&& entry) {
7865
bool valid = true;
@@ -264,7 +251,23 @@ class SwiftDispatcher {
264251
locationExtractor.attachLocation(sourceManager, comment, entry.id);
265252
}
266253

254+
void extractedDeclaration(const swift::Decl& decl) {
255+
if (isLazyDeclaration(decl)) {
256+
state.emittedDeclarations.insert(&decl);
257+
}
258+
}
259+
void skippedDeclaration(const swift::Decl& decl) {
260+
if (isLazyDeclaration(decl)) {
261+
state.pendingDeclarations.insert(&decl);
262+
}
263+
}
264+
267265
private:
266+
bool isLazyDeclaration(const swift::Decl& decl) {
267+
swift::ModuleDecl* module = decl.getModuleContext();
268+
return module->isBuiltinModule() || module->getName().str() == "__ObjC";
269+
}
270+
268271
template <typename T, typename = void>
269272
struct HasSize : std::false_type {};
270273

swift/extractor/infra/TargetDomains.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ static const char* typeToStr(TrapType type) {
1313
return "invocations";
1414
case TrapType::linkage:
1515
return "linkage";
16-
case TrapType::lazy_declarations:
16+
case TrapType::lazy_declaration:
1717
return "lazy_decls";
1818
default:
1919
return "";

swift/extractor/infra/TargetDomains.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ enum class TrapType {
1212
module,
1313
invocation,
1414
linkage,
15-
lazy_declarations,
15+
lazy_declaration,
1616
};
1717

1818
std::filesystem::path getTrapPath(const SwiftExtractorState& state,

swift/extractor/translators/DeclTranslator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ class DeclTranslator : public AstTranslatorBase<DeclTranslator> {
7171
std::optional<TrapClassOf<D>> entry;
7272
auto id = dispatcher.assignNewLabel(decl, mangledName(decl));
7373
if (dispatcher.shouldEmitDeclBody(decl)) {
74-
dispatcher.extractedDeclaration(&decl);
74+
dispatcher.extractedDeclaration(decl);
7575
entry.emplace(id);
7676
fillDecl(decl, *entry);
7777
} else {
78-
dispatcher.skippedDeclaration(&decl);
78+
dispatcher.skippedDeclaration(decl);
7979
}
8080
return entry;
8181
}

0 commit comments

Comments
 (0)