File indexing completed on 2024-04-28 16:57:52

0001 /*
0002   This file is part of the clazy static checker.
0003 
0004     Copyright (C) Sérgio Martins <iamsergio@gmail.com>
0005 
0006     This library is free software; you can redistribute it and/or
0007     modify it under the terms of the GNU Library General Public
0008     License as published by the Free Software Foundation; either
0009     version 2 of the License, or (at your option) any later version.
0010 
0011     This library is distributed in the hope that it will be useful,
0012     but WITHOUT ANY WARRANTY; without even the implied warranty of
0013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014     Library General Public License for more details.
0015 
0016     You should have received a copy of the GNU Library General Public License
0017     along with this library; see the file COPYING.LIB.  If not, write to
0018     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0019     Boston, MA 02110-1301, USA.
0020 */
0021 
0022 #ifndef CLAZY_BODYRANGE_H
0023 #define CLAZY_BODYRANGE_H
0024 
0025 #include <clang/AST/Stmt.h>
0026 #include <clang/Basic/SourceLocation.h>
0027 #include <clang/Basic/SourceManager.h>
0028 
0029 struct StmtBodyRange
0030 {
0031     clang::Stmt *body = nullptr;
0032     const clang::SourceManager *const sm = nullptr;
0033     const clang::SourceLocation searchUntilLoc; // We don't search after this point
0034 
0035     explicit StmtBodyRange(clang::Stmt *body,
0036                            const clang::SourceManager *sm = nullptr,
0037                            clang::SourceLocation searchUntilLoc = {})
0038         : body(body)
0039         , sm(sm)
0040         , searchUntilLoc(searchUntilLoc)
0041     {
0042     }
0043 
0044     bool isValid() const
0045     {
0046         return body != nullptr;
0047     }
0048 
0049     bool isOutsideRange(clang::Stmt *stmt) const
0050     {
0051         return isOutsideRange(stmt ? clazy::getLocStart(stmt) : clang::SourceLocation());
0052     }
0053 
0054     bool isOutsideRange(clang::SourceLocation loc) const
0055     {
0056         if (loc.isInvalid())
0057             return true;
0058 
0059         if (!sm || searchUntilLoc.isInvalid())
0060             return false;
0061 
0062         return sm->isBeforeInSLocAddrSpace(searchUntilLoc, loc);
0063     }
0064 };
0065 
0066 #endif