1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
|
/*
* Cppcheck - A tool for static C/C++ code analysis
* Copyright (C) 2007-2016 Cppcheck team.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//---------------------------------------------------------------------------
#ifndef tokenlistH
#define tokenlistH
//---------------------------------------------------------------------------
#include <string>
#include <vector>
#include "config.h"
class Token;
class Settings;
/// @addtogroup Core
/// @{
class CPPCHECKLIB TokenList {
public:
explicit TokenList(const Settings* settings);
~TokenList();
void setSettings(const Settings *settings) {
_settings = settings;
}
const Settings *getSettings() const {
return _settings;
}
/** @return the source file path. e.g. "file.cpp" */
const std::string& getSourceFilePath() const;
/** Is the code C. Used for bailouts */
bool isC() const {
return _isC;
}
/** Is the code CPP. Used for bailouts */
bool isCPP() const {
return _isCPP;
}
/**
* Delete all tokens in given token list
* @param tok token list to delete
*/
static void deleteTokens(Token *tok);
void addtoken(std::string str, const unsigned int lineno, const unsigned int fileno, bool split = false);
void addtoken(const Token *tok, const unsigned int lineno, const unsigned int fileno);
static void insertTokens(Token *dest, const Token *src, unsigned int n);
/**
* Create tokens from code.
* The code must be preprocessed first:
* - multiline strings are not handled.
* - UTF in the code are not handled.
* - comments are not handled.
* @param code input stream for code
* @param file0 source file name
*/
bool createTokens(std::istream &code, const std::string& file0 = emptyString);
/** Deallocate list */
void deallocateTokens();
/** append file name if seen the first time; return its index in any case */
unsigned int appendFileIfNew(const std::string &file);
/** get first token of list */
const Token *front() const {
return _front;
}
Token *front() {
return _front;
}
/** get last token of list */
const Token *back() const {
return _back;
}
Token *back() {
return _back;
}
/**
* Get filenames (the sourcefile + the files it include).
* The first filename is the filename for the sourcefile
* @return vector with filenames
*/
const std::vector<std::string>& getFiles() const {
return _files;
}
/**
* get filename for given token
* @param tok The given token
* @return filename for the given token
*/
const std::string& file(const Token *tok) const;
/**
* Get file:line for a given token
* @param tok given token
* @return location for given token
*/
std::string fileLine(const Token *tok) const;
/**
* Calculates a 64-bit checksum of the token list used to compare
* multiple token lists with each other as quickly as possible.
*/
unsigned long long calculateChecksum() const;
/**
* Create abstract syntax tree.
*/
void createAst();
/**
* Check abstract syntax tree.
* Throws InternalError on failure
*/
void validateAst();
/**
* Verify that the given token is an element of the tokenlist.
* That method is implemented for debugging purposes.
* @param[in] tok token to be checked
* \return true if token was found in tokenlist, false else. In case of nullptr true is returned.
*/
bool validateToken(const Token* tok) const;
private:
/** Disable copy constructor, no implementation */
TokenList(const TokenList &);
/** Disable assignment operator, no implementation */
TokenList &operator=(const TokenList &);
/** Token list */
Token *_front, *_back;
/** filenames for the tokenized source code (source + included) */
std::vector<std::string> _files;
/** settings */
const Settings* _settings;
/** File is known to be C/C++ code */
bool _isC, _isCPP;
};
/// @}
//---------------------------------------------------------------------------
#endif // tokenlistH
|