|
28 | 28 |
|
29 | 29 | #include "converter/lex.h" |
30 | 30 | #include "converter/mapper.h" |
| 31 | +#include "converter/rules/decls.h" |
31 | 32 | #include "converter/rules/registry.h" |
32 | 33 |
|
33 | 34 | // https://doc.rust-lang.org/reference/keywords.html |
@@ -222,45 +223,6 @@ clang::Expr *SubscriptedArray(clang::Expr *base) { |
222 | 223 | } |
223 | 224 |
|
224 | 225 | // TODO: this will be gone when the AST matcher lands |
225 | | -std::tuple<clang::MemberExpr *, clang::RecordDecl *, std::string> |
226 | | -ReplaceNonUniformLibcField(clang::MemberExpr *expr) { |
227 | | - // Example: ::struct stat::st_mtim::tv_sec -> ::libc::stat::st_mtime |
228 | | - struct Mapping { |
229 | | - const char *record; |
230 | | - const char *inner_field; |
231 | | - const char *leaf_field; |
232 | | - const char *replacement; |
233 | | - }; |
234 | | - static constexpr Mapping kFields[] = { |
235 | | - {"stat", "st_mtim", "tv_sec", "st_mtime"}, // Linux |
236 | | - {"stat", "st_mtimespec", "tv_sec", "st_mtime"}, // macOS |
237 | | - {"in6_addr", "__in6_u", "__u6_addr8", "s6_addr"}, |
238 | | - }; |
239 | | - |
240 | | - auto getNamedIdentifierOrNull = [](auto *decl) { |
241 | | - return decl && decl->getDeclName().isIdentifier() ? decl : nullptr; |
242 | | - }; |
243 | | - |
244 | | - if (auto leaf = getNamedIdentifierOrNull(expr->getMemberDecl())) { |
245 | | - if (auto inner = clang::dyn_cast<clang::MemberExpr>( |
246 | | - expr->getBase()->IgnoreParenImpCasts())) { |
247 | | - if (auto field = getNamedIdentifierOrNull( |
248 | | - clang::dyn_cast<clang::FieldDecl>(inner->getMemberDecl()))) { |
249 | | - if (getNamedIdentifierOrNull(field->getParent())) { |
250 | | - for (const auto &m : kFields) { |
251 | | - if (field->getParent()->getName() == m.record && |
252 | | - field->getName() == m.inner_field && |
253 | | - leaf->getName() == m.leaf_field) { |
254 | | - return {inner, field->getParent(), m.replacement}; |
255 | | - } |
256 | | - } |
257 | | - } |
258 | | - } |
259 | | - } |
260 | | - } |
261 | | - return {nullptr, nullptr, ""}; |
262 | | -} |
263 | | - |
264 | 226 | bool IsStringLiteralExpr(const clang::Expr *expr) { |
265 | 227 | const auto *stripped = expr->IgnoreParens()->IgnoreImplicit(); |
266 | 228 | return clang::isa<clang::StringLiteral>(stripped) || |
@@ -1883,7 +1845,10 @@ BuildUnifiedArgs(clang::Expr *expr, clang::Expr **args, unsigned num_args) { |
1883 | 1845 | if (auto *mcall = clang::dyn_cast<clang::CXXMemberCallExpr>(expr)) { |
1884 | 1846 | all_args.push_back(mcall->getImplicitObjectArgument()); |
1885 | 1847 | } else if (auto *member = clang::dyn_cast<clang::MemberExpr>(expr)) { |
1886 | | - all_args.push_back(member->getBase()); |
| 1848 | + auto *base = RuleDecls::GetMacroMemberBase( |
| 1849 | + member->getMemberDecl()->getASTContext().getSourceManager(), member); |
| 1850 | + all_args.push_back( |
| 1851 | + const_cast<clang::Expr *>(base ? base : member->getBase())); |
1887 | 1852 | } |
1888 | 1853 | for (unsigned i = 0; i < num_args; ++i) { |
1889 | 1854 | all_args.push_back(args[i]); |
|
0 commit comments