#include #include #include #include #include "swift/extractor/trap/TrapDomain.h" #include "swift/extractor/trap/generated/TrapEntries.h" #include "swift/extractor/trap/generated/TrapClasses.h" #include "swift/extractor/infra/SwiftLocationExtractor.h" #include "swift/extractor/infra/file/Path.h" #include "swift/extractor/infra/SwiftMangledName.h" using namespace codeql; void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, swift::SourceLoc start, swift::SourceLoc end, TrapLabel locatableLabel) { if (!start.isValid() || !end.isValid()) { // invalid locations seem to come from entities synthesized by the compiler return; } auto file = resolvePath(sourceManager.getDisplayNameForLoc(start)); DbLocation entry{{}}; entry.file = fetchFileLabel(file); std::tie(entry.start_line, entry.start_column) = sourceManager.getLineAndColumnInBuffer(start); std::tie(entry.end_line, entry.end_column) = sourceManager.getLineAndColumnInBuffer(end); SwiftMangledName locName{"loc", entry.file, ':', entry.start_line, ':', entry.start_column, ':', entry.end_line, ':', entry.end_column}; entry.id = trap.createTypedLabel(locName); trap.emit(entry); trap.emit(LocatableLocationsTrap{locatableLabel, entry.id}); } TrapLabel SwiftLocationExtractor::emitFile(swift::SourceFile* file) { if (file) { return emitFile(std::string_view{file->getFilename()}); } return undefined_label; } TrapLabel SwiftLocationExtractor::emitFile(const std::filesystem::path& file) { return fetchFileLabel(resolvePath(file)); } void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, const swift::SourceRange& range, TrapLabel locatableLabel) { attachLocationImpl(sourceManager, range.Start, range.End, locatableLabel); } void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, const swift::CapturedValue* capture, TrapLabel locatableLabel) { attachLocationImpl(sourceManager, capture->getLoc(), locatableLabel); } void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, const swift::IfConfigClause* clause, TrapLabel locatableLabel) { attachLocationImpl(sourceManager, clause->Loc, locatableLabel); } void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, const swift::AvailabilitySpec* spec, TrapLabel locatableLabel) { attachLocationImpl(sourceManager, spec->getSourceRange(), locatableLabel); } void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, const swift::KeyPathExpr::Component* component, TrapLabel locatableLabel) { attachLocationImpl(sourceManager, component->getSourceRange().Start, component->getSourceRange().End, locatableLabel); } void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, const swift::Token* token, TrapLabel locatableLabel) { attachLocationImpl(sourceManager, token->getRange().getStart(), token->getRange().getEnd(), locatableLabel); } void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, swift::SourceLoc loc, TrapLabel locatableLabel) { attachLocationImpl(sourceManager, loc, loc, locatableLabel); } void SwiftLocationExtractor::attachLocationImpl(const swift::SourceManager& sourceManager, const swift::DiagnosticInfo* diagInfo, TrapLabel locatableLabel) { attachLocationImpl(sourceManager, diagInfo->Loc, locatableLabel); } TrapLabel SwiftLocationExtractor::fetchFileLabel(const std::filesystem::path& file) { if (store.count(file)) { return store[file]; } DbFile entry({}); entry.id = trap.createTypedLabel({"file_", file.string()}); entry.name = file.string(); trap.emit(entry); store[file] = entry.id; return entry.id; }