Initial batch of AST matchers. (#953)

Also fixes an issue where llvm casts wouldn't work on AstNode.
This commit is contained in:
Geoff Romer
2021-11-23 12:34:55 -08:00
committed by GitHub
parent ec2f8e64e2
commit 6ae85bd13a
10 changed files with 733 additions and 23 deletions
+37
View File
@@ -7,6 +7,7 @@
#include "executable_semantics/ast/ast_rtti.h"
#include "executable_semantics/ast/source_location.h"
#include "llvm/Support/Casting.h"
namespace Carbon {
@@ -71,4 +72,40 @@ class AstNode {
} // namespace Carbon
// Ensure that LLVM casts from AstNode use dynamic_cast, because static_cast
// doesn't work with a virtual base class.
namespace llvm {
template <typename To>
struct cast_convert_val<To, const Carbon::AstNode*, const Carbon::AstNode*> {
using ResultType = typename cast_retty<To, const Carbon::AstNode*>::ret_type;
static ResultType doit(const Carbon::AstNode* node) {
return dynamic_cast<ResultType>(node);
}
};
template <typename To>
struct cast_convert_val<To, Carbon::AstNode*, Carbon::AstNode*> {
using ResultType = typename cast_retty<To, Carbon::AstNode*>::ret_type;
static ResultType doit(Carbon::AstNode* node) {
return dynamic_cast<ResultType>(node);
}
};
template <typename To>
struct cast_convert_val<To, const Carbon::AstNode, const Carbon::AstNode> {
using ResultType = typename cast_retty<To, const Carbon::AstNode>::ret_type;
static ResultType doit(const Carbon::AstNode& node) {
return dynamic_cast<ResultType>(node);
}
};
template <typename To>
struct cast_convert_val<To, Carbon::AstNode, Carbon::AstNode> {
using ResultType = typename cast_retty<To, Carbon::AstNode>::ret_type;
static ResultType doit(Carbon::AstNode& node) {
return dynamic_cast<ResultType>(node);
}
};
} // namespace llvm
#endif // EXECUTABLE_SEMANTICS_AST_AST_NODE_H_