From f228717eb7668e13733946e97631e678e92df4f4 Mon Sep 17 00:00:00 2001 From: Roy Qu Date: Wed, 23 Mar 2022 13:56:41 +0800 Subject: [PATCH] work save --- RedPandaIDE/parser/cpppreprocessor.cpp | 220 ------------------------- RedPandaIDE/parser/cpppreprocessor.h | 158 ++++++++++++++---- 2 files changed, 130 insertions(+), 248 deletions(-) diff --git a/RedPandaIDE/parser/cpppreprocessor.cpp b/RedPandaIDE/parser/cpppreprocessor.cpp index 936b8b77..44246517 100644 --- a/RedPandaIDE/parser/cpppreprocessor.cpp +++ b/RedPandaIDE/parser/cpppreprocessor.cpp @@ -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 &CppPreprocessor::projectIncludePathList() const -{ - return mProjectIncludePathList; -} - -const QList &CppPreprocessor::includePathList() const -{ - return mIncludePathList; -} - -const DefineMap &CppPreprocessor::hardDefines() const -{ - return mHardDefines; -} - -const QSet &CppPreprocessor::projectIncludePaths() -{ - return mProjectIncludePaths; -} - -const QSet &CppPreprocessor::includePaths() -{ - return mIncludePaths; -} - -QSet &CppPreprocessor::scannedFiles() -{ - return mScannedFiles; -} - -QHash &CppPreprocessor::includesList() -{ - return mIncludesList; -} - diff --git a/RedPandaIDE/parser/cpppreprocessor.h b/RedPandaIDE/parser/cpppreprocessor.h index 5ae5f9ce..8bf1af16 100644 --- a/RedPandaIDE/parser/cpppreprocessor.h +++ b/RedPandaIDE/parser/cpppreprocessor.h @@ -75,29 +75,54 @@ public: void addProjectIncludePath(const QString& fileName); void clearIncludePaths(); void clearProjectIncludePaths(); - QStringList result() const; - QHash &includesList(); + const QStringList &result() const { + return mResult; + } - QSet &scannedFiles(); + QHash &includesList() { + return mIncludesList; + } - const QSet &includePaths(); + QSet &scannedFiles() { + return mScannedFiles; + } - const QSet &projectIncludePaths(); + const QSet &includePaths() { + return mIncludePaths; + } - const DefineMap &hardDefines() const; + const QSet &projectIncludePaths() { + return mProjectIncludePaths; + } - const QList &includePathList() const; + const DefineMap &hardDefines() const { + return mHardDefines; + } - const QList &projectIncludePathList() const; + const QList &includePathList() const { + return mIncludePathList; + } + + const QList &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);