work save
This commit is contained in:
parent
e80a92c30a
commit
f228717eb7
|
@ -138,16 +138,6 @@ void CppPreprocessor::addDefineByLine(const QString &line, bool hardCoded)
|
|||
addDefineByParts(name, args, value, hardCoded);
|
||||
}
|
||||
|
||||
PDefine CppPreprocessor::getDefine(const QString &name)
|
||||
{
|
||||
return mDefines.value(name,PDefine());
|
||||
}
|
||||
|
||||
PDefine CppPreprocessor::getHardDefine(const QString &name)
|
||||
{
|
||||
return mHardDefines.value(name,PDefine());
|
||||
}
|
||||
|
||||
void CppPreprocessor::reset()
|
||||
{
|
||||
mResult.clear();
|
||||
|
@ -160,14 +150,6 @@ void CppPreprocessor::reset()
|
|||
resetDefines(); // do not throw away hardcoded
|
||||
}
|
||||
|
||||
void CppPreprocessor::resetDefines()
|
||||
{
|
||||
mDefines = mHardDefines;
|
||||
// mDefines.clear();
|
||||
|
||||
// mDefines.insert(mHardDefines);
|
||||
}
|
||||
|
||||
void CppPreprocessor::setScanOptions(bool parseSystem, bool parseLocal)
|
||||
{
|
||||
mParseSystem = parseSystem;
|
||||
|
@ -302,22 +284,9 @@ QString CppPreprocessor::getNextPreprocessor()
|
|||
return result;
|
||||
}
|
||||
|
||||
void CppPreprocessor::simplify(QString &output)
|
||||
{
|
||||
// Remove #
|
||||
output = output.mid(1).trimmed();
|
||||
}
|
||||
|
||||
void CppPreprocessor::handleBranch(const QString &line)
|
||||
{
|
||||
if (line.startsWith("ifdef")) {
|
||||
// // if a branch that is not at our level is false, current branch is false too;
|
||||
// for (int i=0;i<=mBranchResults.count()-2;i++) {
|
||||
// if (!mBranchResults[i]) {
|
||||
// setCurrentBranch(false);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
if (!getCurrentBranch()) {
|
||||
setCurrentBranch(false);
|
||||
} else {
|
||||
|
@ -327,13 +296,6 @@ void CppPreprocessor::handleBranch(const QString &line)
|
|||
|
||||
}
|
||||
} else if (line.startsWith("ifndef")) {
|
||||
// // if a branch that is not at our level is false, current branch is false too;
|
||||
// for (int i=0;i<=mBranchResults.count()-2;i++) {
|
||||
// if (!mBranchResults[i]) {
|
||||
// setCurrentBranch(false);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
if (!getCurrentBranch()) {
|
||||
setCurrentBranch(false);
|
||||
} else {
|
||||
|
@ -342,13 +304,6 @@ void CppPreprocessor::handleBranch(const QString &line)
|
|||
setCurrentBranch( getDefine(name)==nullptr );
|
||||
}
|
||||
} else if (line.startsWith("if")) {
|
||||
// // if a branch that is not at our level is false, current branch is false too;
|
||||
// for (int i=0;i<=mBranchResults.count()-2;i++) {
|
||||
// if (!mBranchResults[i]) {
|
||||
// setCurrentBranch(false);
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
if (!getCurrentBranch()) {// we are already inside an if that is NOT being taken
|
||||
setCurrentBranch(false);// so don't take this one either
|
||||
} else {
|
||||
|
@ -378,14 +333,6 @@ void CppPreprocessor::handleBranch(const QString &line)
|
|||
}
|
||||
}
|
||||
|
||||
void CppPreprocessor::handleDefine(const QString &line)
|
||||
{
|
||||
if (getCurrentBranch()) {
|
||||
addDefineByLine(line, false);
|
||||
mResult[mPreProcIndex] = '#' + line; // add define to result file so the parser can handle it
|
||||
}
|
||||
}
|
||||
|
||||
void CppPreprocessor::handleInclude(const QString &line, bool fromNext)
|
||||
{
|
||||
if (!getCurrentBranch()) // we're skipping due to a branch failure
|
||||
|
@ -620,11 +567,6 @@ void CppPreprocessor::removeGCCAttribute(const QString &line, QString &newLine,
|
|||
}
|
||||
}
|
||||
|
||||
PParsedFile CppPreprocessor::getInclude(int index)
|
||||
{
|
||||
return mIncludes[index];
|
||||
}
|
||||
|
||||
void CppPreprocessor::openInclude(const QString &fileName, QStringList bufferedText)
|
||||
{
|
||||
if (mIncludes.size()>0) {
|
||||
|
@ -764,35 +706,6 @@ void CppPreprocessor::closeInclude()
|
|||
.arg(parsedFile->index+1));
|
||||
}
|
||||
|
||||
bool CppPreprocessor::getCurrentBranch()
|
||||
{
|
||||
if (!mBranchResults.isEmpty())
|
||||
return mBranchResults.last();
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
void CppPreprocessor::setCurrentBranch(bool value)
|
||||
{
|
||||
mBranchResults.append(value);
|
||||
}
|
||||
|
||||
void CppPreprocessor::removeCurrentBranch()
|
||||
{
|
||||
if (mBranchResults.size()>0)
|
||||
mBranchResults.pop_back();
|
||||
}
|
||||
|
||||
QStringList CppPreprocessor::result() const
|
||||
{
|
||||
return mResult;
|
||||
}
|
||||
|
||||
PFileIncludes CppPreprocessor::getFileIncludesEntry(const QString &fileName)
|
||||
{
|
||||
return mIncludesList.value(fileName,PFileIncludes());
|
||||
}
|
||||
|
||||
void CppPreprocessor::addDefinesInFile(const QString &fileName)
|
||||
{
|
||||
if (mProcessed.contains(fileName))
|
||||
|
@ -1104,103 +1017,6 @@ void CppPreprocessor::skipToPreprocessor()
|
|||
}
|
||||
}
|
||||
|
||||
bool CppPreprocessor::isWordChar(const QChar &ch)
|
||||
{
|
||||
if (ch=='_'
|
||||
// || (ch>='a' && ch<='z') || (ch>='A' && ch<='Z')
|
||||
|| ch.isLetter()
|
||||
|| (ch>='0' && ch<='9')) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CppPreprocessor::isIdentChar(const QChar &ch)
|
||||
{
|
||||
if (ch=='_' || ch == '*' || ch == '&' || ch == '~' ||
|
||||
ch.isLetter()
|
||||
//(ch>='a' && ch<='z') || (ch>='A' && ch<='Z')
|
||||
|| (ch>='0' && ch<='9')) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CppPreprocessor::isLineChar(const QChar &ch)
|
||||
{
|
||||
return ch=='\r' || ch == '\n';
|
||||
}
|
||||
|
||||
bool CppPreprocessor::isSpaceChar(const QChar &ch)
|
||||
{
|
||||
return ch == ' ' || ch == '\t';
|
||||
}
|
||||
|
||||
bool CppPreprocessor::isOperatorChar(const QChar &ch)
|
||||
{
|
||||
|
||||
switch(ch.unicode()) {
|
||||
case '+':
|
||||
case '-':
|
||||
case '*':
|
||||
case '/':
|
||||
case '!':
|
||||
case '=':
|
||||
case '<':
|
||||
case '>':
|
||||
case '&':
|
||||
case '|':
|
||||
case '^':
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool CppPreprocessor::isMacroIdentChar(const QChar &ch)
|
||||
{
|
||||
//return (ch>='A' && ch<='Z') || (ch>='a' && ch<='z')
|
||||
return ch.isLetter()
|
||||
|| ch == '_';
|
||||
}
|
||||
|
||||
bool CppPreprocessor::isDigit(const QChar &ch)
|
||||
{
|
||||
return (ch>='0' && ch<='9');
|
||||
}
|
||||
|
||||
bool CppPreprocessor::isNumberChar(const QChar &ch)
|
||||
{
|
||||
if (ch>='0' && ch<='9')
|
||||
return true;
|
||||
if (ch>='a' && ch<='f')
|
||||
return true;
|
||||
if (ch>='A' && ch<='F')
|
||||
return true;
|
||||
switch(ch.unicode()) {
|
||||
case 'x':
|
||||
case 'X':
|
||||
case 'u':
|
||||
case 'U':
|
||||
case 'l':
|
||||
case 'L':
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
QString CppPreprocessor::lineBreak()
|
||||
{
|
||||
return "\n";
|
||||
}
|
||||
|
||||
bool CppPreprocessor::evaluateIf(const QString &line)
|
||||
{
|
||||
QString newLine = expandDefines(line); // replace FOO by numerical value of FOO
|
||||
return evaluateExpression(newLine);
|
||||
}
|
||||
|
||||
QString CppPreprocessor::expandDefines(QString line)
|
||||
{
|
||||
int searchPos = 0;
|
||||
|
@ -1784,39 +1600,3 @@ int CppPreprocessor::evaluateExpression(QString line)
|
|||
return -1;
|
||||
return result;
|
||||
}
|
||||
|
||||
const QList<QString> &CppPreprocessor::projectIncludePathList() const
|
||||
{
|
||||
return mProjectIncludePathList;
|
||||
}
|
||||
|
||||
const QList<QString> &CppPreprocessor::includePathList() const
|
||||
{
|
||||
return mIncludePathList;
|
||||
}
|
||||
|
||||
const DefineMap &CppPreprocessor::hardDefines() const
|
||||
{
|
||||
return mHardDefines;
|
||||
}
|
||||
|
||||
const QSet<QString> &CppPreprocessor::projectIncludePaths()
|
||||
{
|
||||
return mProjectIncludePaths;
|
||||
}
|
||||
|
||||
const QSet<QString> &CppPreprocessor::includePaths()
|
||||
{
|
||||
return mIncludePaths;
|
||||
}
|
||||
|
||||
QSet<QString> &CppPreprocessor::scannedFiles()
|
||||
{
|
||||
return mScannedFiles;
|
||||
}
|
||||
|
||||
QHash<QString, PFileIncludes> &CppPreprocessor::includesList()
|
||||
{
|
||||
return mIncludesList;
|
||||
}
|
||||
|
||||
|
|
|
@ -75,29 +75,54 @@ public:
|
|||
void addProjectIncludePath(const QString& fileName);
|
||||
void clearIncludePaths();
|
||||
void clearProjectIncludePaths();
|
||||
QStringList result() const;
|
||||
|
||||
QHash<QString, PFileIncludes> &includesList();
|
||||
const QStringList &result() const {
|
||||
return mResult;
|
||||
}
|
||||
|
||||
QSet<QString> &scannedFiles();
|
||||
QHash<QString, PFileIncludes> &includesList() {
|
||||
return mIncludesList;
|
||||
}
|
||||
|
||||
const QSet<QString> &includePaths();
|
||||
QSet<QString> &scannedFiles() {
|
||||
return mScannedFiles;
|
||||
}
|
||||
|
||||
const QSet<QString> &projectIncludePaths();
|
||||
const QSet<QString> &includePaths() {
|
||||
return mIncludePaths;
|
||||
}
|
||||
|
||||
const DefineMap &hardDefines() const;
|
||||
const QSet<QString> &projectIncludePaths() {
|
||||
return mProjectIncludePaths;
|
||||
}
|
||||
|
||||
const QList<QString> &includePathList() const;
|
||||
const DefineMap &hardDefines() const {
|
||||
return mHardDefines;
|
||||
}
|
||||
|
||||
const QList<QString> &projectIncludePathList() const;
|
||||
const QList<QString> &includePathList() const {
|
||||
return mIncludePathList;
|
||||
}
|
||||
|
||||
const QList<QString> &projectIncludePathList() const {
|
||||
return mProjectIncludePathList;
|
||||
}
|
||||
private:
|
||||
void preprocessBuffer();
|
||||
void skipToEndOfPreprocessor();
|
||||
void skipToPreprocessor();
|
||||
QString getNextPreprocessor();
|
||||
void simplify(QString& output);
|
||||
void simplify(QString& output) {
|
||||
// Remove #
|
||||
output = output.mid(1).trimmed();
|
||||
}
|
||||
void handleBranch(const QString& line);
|
||||
void handleDefine(const QString& line);
|
||||
void handleDefine(const QString& line) {
|
||||
if (getCurrentBranch()) {
|
||||
addDefineByLine(line, false);
|
||||
mResult[mPreProcIndex] = '#' + line; // add define to result file so the parser can handle it
|
||||
}
|
||||
}
|
||||
void handleInclude(const QString& line, bool fromNext=false);
|
||||
void handlePreprocessor(const QString& value);
|
||||
void handleUndefine(const QString& line);
|
||||
|
@ -105,24 +130,44 @@ private:
|
|||
void expandMacro(const QString& line, QString& newLine, QString& word, int& i, int depth);
|
||||
QString removeGCCAttributes(const QString& line);
|
||||
void removeGCCAttribute(const QString&line, QString& newLine, int &i, const QString& word);
|
||||
PDefine getDefine(const QString& name);
|
||||
PDefine getDefine(const QString& name) {
|
||||
return mDefines.value(name,PDefine());
|
||||
}
|
||||
// current file stuff
|
||||
PParsedFile getInclude(int index);
|
||||
PParsedFile getInclude(int index) {
|
||||
return mIncludes[index];
|
||||
}
|
||||
void openInclude(const QString& fileName, QStringList bufferedText=QStringList());
|
||||
void closeInclude();
|
||||
|
||||
// branch stuff
|
||||
bool getCurrentBranch();
|
||||
void setCurrentBranch(bool value);
|
||||
void removeCurrentBranch();
|
||||
bool getCurrentBranch() const{
|
||||
if (!mBranchResults.isEmpty())
|
||||
return mBranchResults.last();
|
||||
else
|
||||
return true;
|
||||
}
|
||||
void setCurrentBranch(bool value) {
|
||||
mBranchResults.append(value);
|
||||
}
|
||||
void removeCurrentBranch() {
|
||||
if (mBranchResults.size()>0)
|
||||
mBranchResults.pop_back();
|
||||
}
|
||||
// include stuff
|
||||
PFileIncludes getFileIncludesEntry(const QString& FileName);
|
||||
PFileIncludes getFileIncludesEntry(const QString& fileName) {
|
||||
return mIncludesList.value(fileName,PFileIncludes());
|
||||
}
|
||||
void addDefinesInFile(const QString& fileName);
|
||||
void resetDefines();
|
||||
void resetDefines() {
|
||||
mDefines = mHardDefines;
|
||||
}
|
||||
void addDefineByParts(const QString& name, const QString& args,
|
||||
const QString& value, bool hardCoded);
|
||||
void addDefineByLine(const QString& line, bool hardCoded);
|
||||
PDefine getHardDefine(const QString& name);
|
||||
PDefine getHardDefine(const QString& name) {
|
||||
return mHardDefines.value(name,PDefine());
|
||||
}
|
||||
void invalidDefinesInFile(const QString& fileName);
|
||||
|
||||
void parseArgs(PDefine define);
|
||||
|
@ -132,42 +177,99 @@ private:
|
|||
/*
|
||||
* '_','a'..'z','A'..'Z','0'..'9'
|
||||
*/
|
||||
bool isWordChar(const QChar& ch);
|
||||
bool isWordChar(const QChar& ch) const{
|
||||
return (ch=='_' || (ch>='0' && ch<='9')
|
||||
|| ch.isLetter()
|
||||
);
|
||||
}
|
||||
/*
|
||||
* 'A'..'Z', '0'..'9', 'a'..'z', '_', '*', '&', '~'
|
||||
*/
|
||||
bool isIdentChar(const QChar& ch);
|
||||
bool isIdentChar(const QChar& ch) const {
|
||||
return (ch=='_' || ch == '*' || ch == '&' || ch == '~' ||
|
||||
ch.isLetter()
|
||||
|| (ch>='0' && ch<='9'));
|
||||
}
|
||||
/*
|
||||
* '\r','\n'
|
||||
*/
|
||||
bool isLineChar(const QChar& ch);
|
||||
bool isLineChar(const QChar& ch) const {
|
||||
return ch=='\r' || ch == '\n';
|
||||
}
|
||||
/*
|
||||
* '\t' ' '
|
||||
*/
|
||||
bool isSpaceChar(const QChar& ch);
|
||||
bool isSpaceChar(const QChar& ch) const {
|
||||
return ch == ' ' || ch == '\t';
|
||||
}
|
||||
/*
|
||||
* '+', '-', '*', '/', '!', '=', '<', '>', '&', '|', '^'
|
||||
*/
|
||||
bool isOperatorChar(const QChar& ch);
|
||||
bool isOperatorChar(const QChar& ch) const {
|
||||
switch(ch.unicode()) {
|
||||
case '+':
|
||||
case '-':
|
||||
case '*':
|
||||
case '/':
|
||||
case '!':
|
||||
case '=':
|
||||
case '<':
|
||||
case '>':
|
||||
case '&':
|
||||
case '|':
|
||||
case '^':
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* 'A'..'Z', 'a'..'z', '_'
|
||||
*/
|
||||
bool isMacroIdentChar(const QChar& ch);
|
||||
bool isMacroIdentChar(const QChar& ch) const {
|
||||
return ch.isLetter()
|
||||
|| ch == '_';
|
||||
}
|
||||
|
||||
/*
|
||||
* '0'..'9'
|
||||
*/
|
||||
bool isDigit(const QChar& ch);
|
||||
bool isDigit(const QChar& ch) const {
|
||||
return (ch>='0' && ch<='9');
|
||||
}
|
||||
|
||||
/*
|
||||
* '0'..'9','x',X','a'..'f','A'..'F','u','U','l','L'
|
||||
*/
|
||||
bool isNumberChar(const QChar& ch);
|
||||
bool isNumberChar(const QChar& ch) const {
|
||||
if (ch>='0' && ch<='9')
|
||||
return true;
|
||||
if (ch>='a' && ch<='f')
|
||||
return true;
|
||||
if (ch>='A' && ch<='F')
|
||||
return true;
|
||||
switch(ch.unicode()) {
|
||||
case 'x':
|
||||
case 'X':
|
||||
case 'u':
|
||||
case 'U':
|
||||
case 'l':
|
||||
case 'L':
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
QString lineBreak();
|
||||
QString lineBreak() const{
|
||||
return "\n";
|
||||
}
|
||||
|
||||
bool evaluateIf(const QString& line);
|
||||
bool evaluateIf(const QString& line) {
|
||||
QString newLine = expandDefines(line); // replace FOO by numerical value of FOO
|
||||
return evaluateExpression(newLine);
|
||||
}
|
||||
QString expandDefines(QString line);
|
||||
bool skipBraces(const QString&line, int& index, int step = 1);
|
||||
QString expandFunction(PDefine define,QString args);
|
||||
|
|
Loading…
Reference in New Issue