diff options
Diffstat (limited to 'tools/bookmaker/includeWriter.h')
-rw-r--r-- | tools/bookmaker/includeWriter.h | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/tools/bookmaker/includeWriter.h b/tools/bookmaker/includeWriter.h new file mode 100644 index 0000000000..6271ac7425 --- /dev/null +++ b/tools/bookmaker/includeWriter.h @@ -0,0 +1,243 @@ +/* + * 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<Definition>::iterator tIter, list<Definition>::iterator tIterEnd) + : fDefIter(tIter) + , fDefEnd(tIterEnd) { + } + list<Definition>::iterator fDefIter; + list<Definition>::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<IterState>& 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<Definition*>& 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<const string, Definition>& ); +private: + vector<const Definition* > 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 |