| 1648 | //END Visitor |
| 1649 | |
| 1650 | CXChildVisitResult visitCursor(CXCursor cursor, CXCursor parent, CXClientData data) |
| 1651 | { |
| 1652 | auto *visitor = static_cast<Visitor*>(data); |
| 1653 | |
| 1654 | const auto kind = clang_getCursorKind(cursor); |
| 1655 | |
| 1656 | auto location = clang_getCursorLocation(cursor); |
| 1657 | CXFile file; |
| 1658 | clang_getFileLocation(location, &file, nullptr, nullptr, nullptr); |
| 1659 | if (!ClangUtils::isFileEqual(file, visitor->m_file)) { |
| 1660 | // don't skip MemberRefExpr with invalid location, see also: |
| 1661 | // http://lists.cs.uiuc.edu/pipermail/cfe-dev/2015-May/043114.html |
| 1662 | const auto invalidMemberRefExpr = !file && kind == CXCursor_MemberRefExpr; |
| 1663 | // also don't skip unexposed declarations, which may e.g. be an `extern "C"` directive |
| 1664 | const auto unexposedDecl = file && kind == CXCursor_UnexposedDecl; |
| 1665 | // newer clang properly reports LinkageSpec instead of UnexposedDecl |
| 1666 | const auto linkageSpec = file && kind == CXCursor_LinkageSpec; |
| 1667 | if (!invalidMemberRefExpr && !unexposedDecl && !linkageSpec) { |
| 1668 | return CXChildVisit_Continue; |
| 1669 | } |
| 1670 | } |
| 1671 | |
| 1672 | #define UseCursorKind(CursorKind, ...) case CursorKind: return visitor->dispatchCursor<CursorKind>(__VA_ARGS__); |
| 1673 | switch (kind) |
| 1674 | { |
| 1675 | UseCursorKind(CXCursor_UnexposedDecl, cursor, parent); |
| 1676 | UseCursorKind(CXCursor_StructDecl, cursor, parent); |
| 1677 | UseCursorKind(CXCursor_UnionDecl, cursor, parent); |
| 1678 | UseCursorKind(CXCursor_ClassDecl, cursor, parent); |
| 1679 | UseCursorKind(CXCursor_EnumDecl, cursor, parent); |
| 1680 | UseCursorKind(CXCursor_FieldDecl, cursor, parent); |
| 1681 | UseCursorKind(CXCursor_EnumConstantDecl, cursor, parent); |
| 1682 | UseCursorKind(CXCursor_FunctionDecl, cursor, parent); |
| 1683 | UseCursorKind(CXCursor_VarDecl, cursor, parent); |
| 1684 | UseCursorKind(CXCursor_TypeAliasDecl, cursor, parent); |
| 1685 | UseCursorKind(CXCursor_TypedefDecl, cursor, parent); |
| 1686 | UseCursorKind(CXCursor_CXXMethod, cursor, parent); |
| 1687 | UseCursorKind(CXCursor_Namespace, cursor, parent); |
| 1688 | UseCursorKind(CXCursor_NamespaceAlias, cursor, parent); |
| 1689 | UseCursorKind(CXCursor_Constructor, cursor, parent); |
| 1690 | UseCursorKind(CXCursor_Destructor, cursor, parent); |
| 1691 | UseCursorKind(CXCursor_ConversionFunction, cursor, parent); |
| 1692 | UseCursorKind(CXCursor_TemplateTypeParameter, cursor, parent); |
| 1693 | UseCursorKind(CXCursor_NonTypeTemplateParameter, cursor, parent); |
| 1694 | UseCursorKind(CXCursor_TemplateTemplateParameter, cursor, parent); |
| 1695 | UseCursorKind(CXCursor_FunctionTemplate, cursor, parent); |
| 1696 | UseCursorKind(CXCursor_ClassTemplate, cursor, parent); |
| 1697 | UseCursorKind(CXCursor_ClassTemplatePartialSpecialization, cursor, parent); |
| 1698 | UseCursorKind(CXCursor_ObjCInterfaceDecl, cursor, parent); |
| 1699 | UseCursorKind(CXCursor_ObjCCategoryDecl, cursor, parent); |
| 1700 | UseCursorKind(CXCursor_ObjCProtocolDecl, cursor, parent); |
| 1701 | UseCursorKind(CXCursor_ObjCPropertyDecl, cursor, parent); |
| 1702 | UseCursorKind(CXCursor_ObjCIvarDecl, cursor, parent); |
| 1703 | UseCursorKind(CXCursor_ObjCInstanceMethodDecl, cursor, parent); |
| 1704 | UseCursorKind(CXCursor_ObjCClassMethodDecl, cursor, parent); |
| 1705 | UseCursorKind(CXCursor_ObjCImplementationDecl, cursor, parent); |
| 1706 | UseCursorKind(CXCursor_ObjCCategoryImplDecl, cursor, parent); |
| 1707 | UseCursorKind(CXCursor_MacroDefinition, cursor, parent); |
no test coverage detected