/** * @file parsing_frame.h * * Holds data needed for indenting and brace parsing * * @author Daniel Chumak * @license GPL v2+ */ #ifndef PARSING_FRAME_H_INCLUDED #define PARSING_FRAME_H_INCLUDED #include "uncrustify_types.h" #include //! Class describing a parenthesis stack entry and its information class ParenStackEntry { public: ParenStackEntry(); // --------- Access methods /** * @brief returns the token that opened the entry */ E_Token GetOpenToken() const; /** * @brief Sets the token that opened the entry * @param token the token to set */ void SetOpenToken(const E_Token token); /** * @brief returns the chunk that opened the entry */ Chunk *GetOpenChunk() const; /** * @brief Sets the chunk that opened the entry * @param chunk the chunk to set */ void SetOpenChunk(Chunk *chunk); /** * @brief returns the level that opened the entry */ size_t GetOpenLevel() const; /** * @brief Sets the level that opened the entry * @param level the level to set */ void SetOpenLevel(size_t level); /** * @brief returns the line that opened the entry */ size_t GetOpenLine() const; /** * @brief Sets the line that opened the entry * @param line the line to set */ void SetOpenLine(size_t line); /** * @brief returns the column that opened the entry */ size_t GetOpenCol() const; /** * @brief Sets the column that opened the entry * @param column the column to set */ void SetOpenCol(size_t column); /** * @brief returns the indent for braces */ size_t GetBraceIndent() const; /** * @brief Sets the indent for braces * @param indent the indent for braces */ void SetBraceIndent(size_t indent); /** * @brief returns the indent level */ size_t GetIndent() const; /** * @brief Sets the indent level * @param level the indent level */ void SetIndent(size_t level); /** * @brief returns the temporary indent level */ size_t GetIndentTmp() const; /** * @brief Sets the temporary indent level * @param level the temporary indent level */ void SetIndentTmp(size_t level); /** * @brief returns the tab indent level */ size_t GetIndentTab() const; /** * @brief Sets the tab indent level * @param level the tab indent level */ void SetIndentTab(size_t level); /** * @brief returns the consecutive namespace levels */ size_t GetNsCount() const; /** * @brief Sets the consecutive namespace levels * @param count the consecutive namespace levels */ void SetNsCount(size_t count); /** * @brief returns whether indent_continue was applied */ bool GetIndentContinue() const; /** * @brief Sets whether indent_continue was applied * @param cont new value */ void SetIndentContinue(bool cont); /** * @brief returns whether this was created in a preprocessor */ bool GetInPreproc() const; /** * @brief Sets whether this was created in a preprocessor * @param preproc new value */ void SetInPreproc(bool preproc); /** * @brief returns whether a non-vardef line was hit */ bool GetNonVardef() const; /** * @brief Sets whether a non-vardef line was hit * @param vardef new value */ void SetNonVardef(bool vardef); /** * @brief returns the parent token (if, for, function, etc) */ E_Token GetParent() const; /** * @brief Sets the parent token (if, for, function, etc) * @param parent the token to set */ void SetParent(const E_Token parent); /** * @brief returns the stage used to check progression of complex statements */ E_BraceStage GetStage() const; /** * @brief Sets the stage used to check progression of complex statements * @param stage the new value */ void SetStage(const E_BraceStage stage); /** * @brief Returns the associated indentation data as a const reference */ const IndentationData &GetIndentData() const; /** * @brief Returns the associated indentation data as a modifiable reference */ IndentationData &IndentData(); /** * @brief returns the pop chunk */ Chunk *GetPopChunk() const; /** * @brief Sets the pop chunk * @param chunk the new chunk */ void SetPopChunk(Chunk *chunk); protected: E_Token m_openToken; // the type that opened the entry Chunk *m_openChunk; // chunk that opened the level size_t m_openLevel; // level of opening type size_t m_openLine; // line that open symbol is on, only for logging purposes size_t m_openCol; // column that open symbol is on, only for logging purposes size_t m_braceIndent; // indent for braces - may not relate to indent size_t m_indent; // indent level (depends on use) size_t m_indentTmp; // temporary indent level (depends on use) size_t m_indentTab; // the 'tab' indent (always <= real column) size_t m_nsCount; // Number of consecutive namespace levels bool m_indentContinue; // indent_continue was applied bool m_inPreproc; // whether this was created in a preprocessor bool m_nonVardef; // Hit a non-vardef line E_Token m_parent; // if, for, function, etc E_BraceStage m_stage; // used to check progression of complex statements. IndentationData m_indentationData; // Indentation data Chunk *m_popChunk; // Pop chunk }; //! Class describing a parsing frame and its information class ParsingFrame { public: ParsingFrame(); virtual ~ParsingFrame() = default; /** * @brief Returns whether the frame paren stack is empty or not */ bool empty() const; /** * @brief Returns the size of the frame paren stack */ size_t size() const; /** * @brief Returns the last popped entry from the frame paren stack */ const ParenStackEntry &lastPopped() const; /** * @brief Returns the frame reference number */ size_t GetRefNumber() const; /** * @brief Set the frame reference number * @param the new reference number */ void SetRefNumber(const size_t refNo); /** * @brief Returns the frame parenthesis level */ size_t GetParenLevel() const; /** * @brief Set the frame parenthesis level * @param the new parenthesis level */ void SetParenLevel(const size_t parenLevel); /** * @brief Returns the frame brace level */ size_t GetBraceLevel() const; /** * @brief Set the frame brace level * @param the new brace level */ void SetBraceLevel(const size_t braceLevel); /** * @brief Returns the frame preprocessor level */ size_t GetPpLevel() const; /** * @brief Set the frame preprocessor level * @param the new preprocessor level */ void SetPpLevel(const size_t ppLevel); /** * @brief Returns the count of special parenthesis */ size_t GetSParenCount() const; /** * @brief Set the count of special parenthesis * @param the new special parenthesis count value */ void SetSParenCount(const size_t sParenCount); /** * @brief Returns the count of parenthesis */ size_t GetParenCount() const; /** * @brief Set the count of parenthesis * @param the new parenthesis count value */ void SetParenCount(const size_t parenCount); /** * @brief Returns the count of statements */ size_t GetStmtCount() const; /** * @brief Set the count of statements * @param the new statement count value */ void SetStmtCount(const size_t stmtCount); /** * @brief Returns the count of statements */ size_t GetExprCount() const; /** * @brief Set the count of statements * @param the new statement count value */ void SetExprCount(const size_t exprCount); /** * @brief Returns the ifdef type */ E_Token GetIfdefType() const; /** * @brief Set the ifdef type * @param the new type */ void SetIfdefType(const E_Token inIfdef); ParenStackEntry &at(size_t idx); const ParenStackEntry &at(size_t idx) const; ParenStackEntry &prev(size_t idx = 1); const ParenStackEntry &prev(size_t idx = 1) const; ParenStackEntry &top(); const ParenStackEntry &top() const; void push(Chunk *pc, const char *func, int line, E_BraceStage stage = E_BraceStage::NONE); void pop(const char *func, int line, Chunk *pc); using iterator = std::vector::iterator; iterator begin(); iterator end(); using const_iterator = std::vector::const_iterator; const_iterator begin() const; const_iterator end() const; using reverse_iterator = std::vector::reverse_iterator; reverse_iterator rbegin(); reverse_iterator rend(); using const_reverse_iterator = std::vector::const_reverse_iterator; const_reverse_iterator rbegin() const; const_reverse_iterator rend() const; protected: // Members std::vector m_parenStack; //! The parenthesis stack ParenStackEntry m_lastPopped; //! last popped frame or nullptr size_t m_refNumber; //! frame reference number size_t m_parenLevel; //! level of parens/square/angle/brace size_t m_braceLevel; //! level of brace/vbrace size_t m_ppLevel; //! level of preproc #if stuff size_t m_sParenCount; //! count of special parenthesis size_t m_parenCount; //! count of parenthesis size_t m_stmtCount; //! count of statements size_t m_exprCount; //! count of expressions E_Token m_ifdefType; //! the ifdef type }; // ------------------------------ // ParenStackEntry inline methods // ------------------------------ inline E_Token ParenStackEntry::GetOpenToken() const { return(m_openToken); } inline void ParenStackEntry::SetOpenToken(const E_Token token) { m_openToken = token; } inline Chunk *ParenStackEntry::GetOpenChunk() const { return(m_openChunk); } inline void ParenStackEntry::SetOpenChunk(Chunk *chunk) { m_openChunk = chunk; } inline size_t ParenStackEntry::GetOpenLevel() const { return(m_openLevel); } inline void ParenStackEntry::SetOpenLevel(size_t level) { m_openLevel = level; } inline size_t ParenStackEntry::GetOpenLine() const { return(m_openLine); } inline void ParenStackEntry::SetOpenLine(size_t line) { m_openLine = line; } inline size_t ParenStackEntry::GetOpenCol() const { return(m_openCol); } inline void ParenStackEntry::SetOpenCol(size_t column) { m_openCol = column; } inline size_t ParenStackEntry::GetBraceIndent() const { return(m_braceIndent); } inline void ParenStackEntry::SetBraceIndent(size_t indent) { m_braceIndent = indent; } inline size_t ParenStackEntry::GetIndent() const { return(m_indent); } inline void ParenStackEntry::SetIndent(size_t level) { m_indent = level; } inline size_t ParenStackEntry::GetIndentTmp() const { return(m_indentTmp); } inline void ParenStackEntry::SetIndentTmp(size_t level) { m_indentTmp = level; } inline size_t ParenStackEntry::GetIndentTab() const { return(m_indentTab); } inline void ParenStackEntry::SetIndentTab(size_t level) { m_indentTab = level; } inline size_t ParenStackEntry::GetNsCount() const { return(m_nsCount); } inline void ParenStackEntry::SetNsCount(size_t count) { m_nsCount = count; } inline bool ParenStackEntry::GetIndentContinue() const { return(m_indentContinue); } inline void ParenStackEntry::SetIndentContinue(bool cont) { m_indentContinue = cont; } inline bool ParenStackEntry::GetInPreproc() const { return(m_inPreproc); } inline void ParenStackEntry::SetInPreproc(bool preproc) { m_inPreproc = preproc; } inline bool ParenStackEntry::GetNonVardef() const { return(m_nonVardef); } inline void ParenStackEntry::SetNonVardef(bool vardef) { m_nonVardef = vardef; } inline E_Token ParenStackEntry::GetParent() const { return(m_parent); } inline void ParenStackEntry::SetParent(const E_Token parent) { m_parent = parent; } inline E_BraceStage ParenStackEntry::GetStage() const { return(m_stage); } inline void ParenStackEntry::SetStage(const E_BraceStage stage) { m_stage = stage; } inline const IndentationData &ParenStackEntry::GetIndentData() const { return(m_indentationData); } inline IndentationData &ParenStackEntry::IndentData() { return(m_indentationData); } inline Chunk *ParenStackEntry::GetPopChunk() const { return(m_popChunk); } inline void ParenStackEntry::SetPopChunk(Chunk *chunk) { m_popChunk = chunk; } // ------------------------------ // ParsingFrame inline methods // ------------------------------ inline bool ParsingFrame::empty() const { return(m_parenStack.empty()); } inline size_t ParsingFrame::size() const { return(m_parenStack.size()); } inline const ParenStackEntry &ParsingFrame::lastPopped() const { return(m_lastPopped); } inline size_t ParsingFrame::GetRefNumber() const { return(m_refNumber); } inline void ParsingFrame::SetRefNumber(const size_t refNo) { m_refNumber = refNo; } inline size_t ParsingFrame::GetParenLevel() const { return(m_parenLevel); } inline void ParsingFrame::SetParenLevel(const size_t parenLevel) { m_parenLevel = parenLevel; } inline size_t ParsingFrame::GetBraceLevel() const { return(m_braceLevel); } inline void ParsingFrame::SetBraceLevel(const size_t braceLevel) { m_braceLevel = braceLevel; } inline size_t ParsingFrame::GetPpLevel() const { return(m_ppLevel); } inline void ParsingFrame::SetPpLevel(const size_t ppLevel) { m_ppLevel = ppLevel; } inline size_t ParsingFrame::GetSParenCount() const { return(m_sParenCount); } inline void ParsingFrame::SetSParenCount(const size_t sParenCount) { m_sParenCount = sParenCount; } inline size_t ParsingFrame::GetParenCount() const { return(m_parenCount); } inline void ParsingFrame::SetParenCount(const size_t parenCount) { m_parenCount = parenCount; } inline size_t ParsingFrame::GetStmtCount() const { return(m_stmtCount); } inline void ParsingFrame::SetStmtCount(const size_t stmtCount) { m_stmtCount = stmtCount; } inline size_t ParsingFrame::GetExprCount() const { return(m_exprCount); } inline void ParsingFrame::SetExprCount(const size_t exprCount) { m_exprCount = exprCount; } inline E_Token ParsingFrame::GetIfdefType() const { return(m_ifdefType); } inline void ParsingFrame::SetIfdefType(const E_Token inIfdef) { m_ifdefType = inIfdef; } inline ParenStackEntry &ParsingFrame::at(size_t idx) { return(m_parenStack.at(idx)); } inline const ParenStackEntry &ParsingFrame::at(size_t idx) const { return(m_parenStack.at(idx)); } inline ParsingFrame::iterator ParsingFrame::begin() { return(std::begin(m_parenStack)); } inline ParsingFrame::const_iterator ParsingFrame::begin() const { return(std::begin(m_parenStack)); } inline ParsingFrame::reverse_iterator ParsingFrame::rbegin() { return(m_parenStack.rbegin()); } inline ParsingFrame::const_reverse_iterator ParsingFrame::rbegin() const { return(m_parenStack.rbegin()); } inline ParsingFrame::iterator ParsingFrame::end() { return(std::end(m_parenStack)); } inline ParsingFrame::const_iterator ParsingFrame::end() const { return(std::end(m_parenStack)); } inline ParsingFrame::reverse_iterator ParsingFrame::rend() { return(m_parenStack.rend()); } inline ParsingFrame::const_reverse_iterator ParsingFrame::rend() const { return(m_parenStack.rend()); } #endif /* PARSING_FRAME_H_INCLUDED */