Skip to content

Commit 458fb3a

Browse files
committed
Swift: fix printing of unextracted entities
This was still printing explicitly ignored classes.
1 parent 30bbae3 commit 458fb3a

File tree

2 files changed

+41
-19
lines changed

2 files changed

+41
-19
lines changed
Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#include <iostream>
2+
#include <vector>
3+
#include <map>
24

35
#include "swift/extractor/translators/DeclTranslator.h"
46
#include "swift/extractor/translators/ExprTranslator.h"
@@ -8,37 +10,35 @@
810

911
using namespace codeql;
1012

11-
#define CHECK_CLASS(KIND, CLASS, PARENT) \
12-
if (!detail::HasTranslate##CLASS##KIND<KIND##Translator>::value && \
13-
!detail::HasTranslate##PARENT<KIND##Translator>::value) { \
14-
std::cout << " " #CLASS #KIND "\n"; \
15-
}
16-
1713
int main() {
18-
std::cout << "Unextracted Decls:\n";
14+
std::map<const char*, std::vector<const char*>> unextracted;
15+
16+
#define CHECK_CLASS(KIND, CLASS, PARENT) \
17+
if (KIND##Translator::getPolicyFor##CLASS##KIND() == TranslatorPolicy::emitUnknown) { \
18+
unextracted[#KIND].push_back(#CLASS #KIND); \
19+
}
1920

2021
#define DECL(CLASS, PARENT) CHECK_CLASS(Decl, CLASS, PARENT)
2122
#include "swift/AST/DeclNodes.def"
2223

23-
std::cout << "\nUnextracted Stmts:\n";
24-
2524
#define STMT(CLASS, PARENT) CHECK_CLASS(Stmt, CLASS, PARENT)
2625
#include "swift/AST/StmtNodes.def"
2726

28-
std::cout << "\nUnextracted Exprs:\n";
29-
3027
#define EXPR(CLASS, PARENT) CHECK_CLASS(Expr, CLASS, PARENT)
3128
#include "swift/AST/ExprNodes.def"
3229

33-
std::cout << "\nUnextracted Patterns:\n";
34-
3530
#define PATTERN(CLASS, PARENT) CHECK_CLASS(Pattern, CLASS, PARENT)
3631
#include "swift/AST/PatternNodes.def"
3732

38-
std::cout << "\nUnextracted Types:\n";
39-
4033
#define TYPE(CLASS, PARENT) CHECK_CLASS(Type, CLASS, PARENT)
4134
#include "swift/AST/TypeNodes.def"
4235

36+
for (const auto& [kind, classes] : unextracted) {
37+
std::cout << "Unextracted " << kind << " subclasses:\n";
38+
for (auto cls : classes) {
39+
std::cout << " " << cls << '\n';
40+
}
41+
std::cout << '\n';
42+
}
4343
return 0;
4444
}

swift/extractor/translators/TranslatorBase.h

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@ DEFINE_TRANSLATE_CHECKER(TypeRepr, , )
5858
#include "swift/AST/TypeReprNodes.def"
5959
} // namespace detail
6060

61+
enum class TranslatorPolicy {
62+
ignore,
63+
translate,
64+
translateParent,
65+
emitUnknown,
66+
};
67+
6168
// we want to override the default swift visitor behaviour of chaining calls to immediate
6269
// superclasses by default and instead provide our own TBD default (using the exact type).
6370
// Moreover, if the implementation class has translate##CLASS##KIND (that uses generated C++
@@ -66,15 +73,30 @@ DEFINE_TRANSLATE_CHECKER(TypeRepr, , )
6673
// A special case is for explicitly ignored classes marked with void, which we should never
6774
// encounter.
6875
#define DEFINE_VISIT(KIND, CLASS, PARENT) \
69-
void visit##CLASS##KIND(swift::CLASS##KIND* e) { \
76+
public: \
77+
static constexpr TranslatorPolicy getPolicyFor##CLASS##KIND() { \
7078
if constexpr (std::is_same_v<CLASS##KIND##Tag, void>) { \
79+
return TranslatorPolicy::ignore; \
80+
} else if constexpr (detail::HasTranslate##CLASS##KIND<CrtpSubclass>::value) { \
81+
return TranslatorPolicy::translate; \
82+
} else if constexpr (detail::HasTranslate##PARENT<CrtpSubclass>::value) { \
83+
return TranslatorPolicy::translateParent; \
84+
} else { \
85+
return TranslatorPolicy::emitUnknown; \
86+
} \
87+
} \
88+
\
89+
private: \
90+
void visit##CLASS##KIND(swift::CLASS##KIND* e) { \
91+
constexpr auto policy = getPolicyFor##CLASS##KIND(); \
92+
if constexpr (policy == TranslatorPolicy::ignore) { \
7193
std::cerr << "Unexpected " #CLASS #KIND "\n"; \
7294
return; \
73-
} else if constexpr (detail::HasTranslate##CLASS##KIND<CrtpSubclass>::value) { \
95+
} else if constexpr (policy == TranslatorPolicy::translate) { \
7496
dispatcher.emit(static_cast<CrtpSubclass*>(this)->translate##CLASS##KIND(*e)); \
75-
} else if constexpr (detail::HasTranslate##PARENT<CrtpSubclass>::value) { \
97+
} else if constexpr (policy == TranslatorPolicy::translateParent) { \
7698
dispatcher.emit(static_cast<CrtpSubclass*>(this)->translate##PARENT(*e)); \
77-
} else { \
99+
} else if constexpr (policy == TranslatorPolicy::emitUnknown) { \
78100
dispatcher.emitUnknown(e); \
79101
} \
80102
}

0 commit comments

Comments
 (0)