/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef includeWriter_DEFINED #define includeWriter_DEFINED #include "includeParser.h" class IncludeWriter : public IncludeParser { public: enum class Word { kStart, kCap, kFirst, kUnderline, kMixed, }; enum class Phrase { kNo, kYes, }; enum class PunctuationState { kStart, kDelimiter, kParen, // treated as a delimiter unless following a space, and followed by word kPeriod, kSpace, }; enum class RefType { kUndefined, kNormal, kExternal, }; enum class SkipFirstLine { kNo, kYes, }; enum class Wrote { kNone, kLF, kChars, }; enum class MemberPass { kCount, kOut, }; enum class ItemState { kNone, kName, kValue, kComment, }; struct IterState { IterState (list::iterator tIter, list::iterator tIterEnd) : fDefIter(tIter) , fDefEnd(tIterEnd) { } list::iterator fDefIter; list::iterator fDefEnd; }; struct ParentPair { const Definition* fParent; const ParentPair* fPrev; }; struct Preprocessor { Preprocessor() { reset(); } void reset() { fDefinition = nullptr; fStart = nullptr; fEnd = nullptr; fWord = false; } const Definition* fDefinition; const char* fStart; const char* fEnd; bool fWord; }; struct Item { void reset() { fName = ""; fValue = ""; } string fName; string fValue; }; struct LastItem { const char* fStart; const char* fEnd; }; struct ItemLength { int fCurName; int fCurValue; int fLongestName; int fLongestValue; }; IncludeWriter() : IncludeParser() { this->reset(); } ~IncludeWriter() override {} bool contentFree(int size, const char* data) const { while (size > 0 && data[0] <= ' ') { --size; ++data; } while (size > 0 && data[size - 1] <= ' ') { --size; } return 0 == size; } bool checkChildCommentLength(const Definition* parent, MarkType childType) const; void checkEnumLengths(const Definition& child, string enumName, ItemLength* length) const; void constOut(const Definition* memberStart, const Definition* bmhConst); void constSizeMembers(const RootDefinition* root); bool defineOut(const Definition& ); bool descriptionOut(const Definition* def, SkipFirstLine , Phrase ); void enumHeaderOut(RootDefinition* root, const Definition& child); string enumMemberComment(const Definition* currentEnumItem, const Definition& child) const; const Definition* enumMemberForComment(const Definition* currentEnumItem) const; ItemState enumMemberName(const Definition& child, const Definition* token, Item* , LastItem* , const Definition** enumItem); void enumMemberOut(const Definition* currentEnumItem, const Definition& child, const Item& , Preprocessor& ); void enumMembersOut(Definition& child); bool enumPreprocessor(Definition* token, MemberPass pass, vector& iterStack, IterState** iterState, Preprocessor* ); void enumSizeItems(const Definition& child); bool findEnumSubtopic(string undername, const Definition** ) const; void firstBlock(int size, const char* data); bool firstBlockTrim(int size, const char* data); Definition* findMemberCommentBlock(const vector& bmhChildren, string name) const; Definition* findMethod(string name, RootDefinition* ) const; void indentDeferred(IndentKind kind) { if (fIndentNext) { this->indentIn(kind); fIndentNext = false; } } int lookupMethod(const PunctuationState punctuation, const Word word, const int start, const int run, int lastWrite, const char* data, bool hasIndirection); int lookupReference(const PunctuationState punctuation, const Word word, const int start, const int run, int lastWrite, const char last, const char* data); const Definition* matchMemberName(string matchName, const Definition& child) const; void methodOut(Definition* method, const Definition& child); bool populate(Definition* def, ParentPair* parentPair, RootDefinition* root); bool populate(BmhParser& bmhParser); void reset() override { INHERITED::resetCommon(); fBmhParser = nullptr; fDeferComment = nullptr; fBmhMethod = nullptr; fEnumDef = nullptr; fMethodDef = nullptr; fBmhConst = nullptr; fConstDef = nullptr; fLastDescription = nullptr; fStartSetter = nullptr; fBmhStructDef = nullptr; fContinuation = nullptr; fInStruct = false; fWroteMethod = false; fIndentNext = false; fPendingMethod = false; fFirstWrite = false; fStructEnded = false; fWritingIncludes = true; } string resolveAlias(const Definition* ); string resolveMethod(const char* start, const char* end, bool first); string resolveRef(const char* start, const char* end, bool first, RefType* refType); Wrote rewriteBlock(int size, const char* data, Phrase phrase); void setStart(const char* start, const Definition * ); void setStartBack(const char* start, const Definition * ); Definition* structMemberOut(const Definition* memberStart, const Definition& child); void structOut(const Definition* root, const Definition& child, const char* commentStart, const char* commentEnd); void structSizeMembers(const Definition& child); bool writeHeader(std::pair& ); private: vector fICSStack; BmhParser* fBmhParser; Definition* fDeferComment; const Definition* fBmhMethod; const Definition* fEnumDef; const Definition* fMethodDef; const Definition* fBmhConst; const Definition* fConstDef; const Definition* fLastDescription; const Definition* fStartSetter; Definition* fBmhStructDef; const char* fContinuation; // used to construct paren-qualified method name int fAnonymousEnumCount; int fEnumItemValueTab; int fEnumItemCommentTab; int fStructMemberTab; int fStructValueTab; int fStructCommentTab; int fStructMemberLength; int fConstValueTab; int fConstCommentTab; int fConstLength; bool fInStruct; // set if struct is inside class bool fWroteMethod; bool fIndentNext; bool fPendingMethod; bool fFirstWrite; // set to write file information just after includes bool fStructEnded; // allow resetting indent after struct is complete typedef IncludeParser INHERITED; }; #endif