#ifndef PARSER_UTILS_H #define PARSER_UTILS_H #include #include #include #include // preprocess/ macro define struct Define { QString name; QString args; QString value; QString filename; bool hardCoded;// if true, don't free memory (points to hard defines) QStringList argList; // args list to format values QString formatValue; // format template to format values }; using PDefine = std::shared_ptr; using DefineMap = QHash; using PDefineMap = std::shared_ptr; enum class SkipType { skItself, // skip itself skToSemicolon, // skip to ; skToColon, // skip to : skToRightParenthesis, // skip to ) skToLeftBrace,// Skip to { skToRightBrace, // skip to } skNone // It's a keyword but don't process here }; enum class StatementKind { skUnknown, skPreprocessor, skEnumType, skEnum, skTypedef, skClass, skFunction, skOperator, skConstructor, skDestructor, skVariable, skParameter, skNamespace, skNamespaceAlias, skBlock, skUserCodeIn, // user code template skKeyword, // keywords skGlobalVariable, skLocalVariable, skAlias }; using StatementKindSet = QSet; enum class StatementScope { ssGlobal, ssLocal, ssClassLocal }; enum class StatementClassScope { scsNone, scsPrivate, scsProtected, scsPublic }; enum class MemberOperatorType { otArrow, otDot, otDColon, otOther }; struct RemovedStatement{ QString type; // type "int" QString command; // identifier/name of statement "foo" int definitionLine; // definition QString definitionFileName; // definition QString fullName; // fullname(including class and namespace) QString noNameArgs; // Args without name }; using PRemovedStatement = std::shared_ptr; struct Statement; using PStatement = std::shared_ptr; using StatementList = QList; using PStatementList = std::shared_ptr; using StatementMap = QMultiMap; struct Statement { std::weak_ptr parentScope; // parent class/struct/namespace scope, don't use auto pointer to prevent circular reference QString hintText; // text to force display when using PrettyPrintStatement QString type; // type "int" QString command; // identifier/name of statement "foo" QString args; // args "(int a,float b)" QStringList argList; QString value; // Used for macro defines/typedef, "100" in "#defin COUNT 100" StatementKind kind; // kind of statement class/variable/function/etc QList> inheritanceList; // list of statements this one inherits from, can be nil StatementScope scope; // global/local/classlocal StatementClassScope classScope; // protected/private/public bool hasDefinition; // definiton line/filename is valid int line; // declaration int endLine; int definitionLine; // definition int definitionEndLine; QString fileName; // declaration QString definitionFileName; // definition bool inProject; // statement in project bool inSystemHeader; // statement in system header (#include <>) StatementMap children; // functions can be overloaded,so we use list to save children with the same name QSet friends; // friend class / functions bool isStatic; // static function / variable bool isInherited; // inherted member; QString fullName; // fullname(including class and namespace), ClassA::foo QStringList usingList; // using namespaces int usageCount; //Usage Count, used by TCodeCompletion int freqTop; // Usage Count Rank, used by TCodeCompletion QString noNameArgs;// Args without name }; struct UsingNamespace { QStringList namespaces; // List['std','foo'] for using namespace std::foo; QString filename; int line; int endLine; bool fromHeader; }; using PUsingNamespace = std::shared_ptr; struct IncompleteClass { PStatement statement; int count; }; using PIncompleteClass = std::shared_ptr; struct FileIncludes { QString baseFile; QMap includeFiles; // true means the file is directly included, false means included indirectly QSet usings; // namespaces it usings StatementMap statements; // but we don't save temporary statements StatementMap declaredStatements; // statements declared in this file QMap scopes; // int is start line of the statement scope QSet dependingFiles; // The files I depeneds on QSet dependedFiles; // the files depends on me }; using PFileIncludes = std::shared_ptr; extern QStringList CppDirectives; extern QStringList JavadocTags; extern QMap CppKeywords; extern QSet CppTypeKeywords; extern QSet STLPointers; extern QSet STLContainers; extern QSet STLElementMethods; void initParser(); QString getHeaderFileName(const QString& relativeTo, const QString& line, const QStringList& includePaths, const QStringList& projectIncludePaths); QString getLocalHeaderFileName(const QString& relativeTo, const QString& fileName); QString getSystemHeaderFileName(const QString& fileName, const QStringList& includePaths); bool isSystemHeaderFile(const QString& fileName, const QStringList& includePaths); bool isKeyword(const QString& word); #endif // PARSER_UTILS_H