1 /* 2 * Copyright 2018 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef includeWriter_DEFINED 9 #define includeWriter_DEFINED 10 11 #include "includeParser.h" 12 13 class IncludeWriter : public IncludeParser { 14 public: 15 enum class Word { 16 kStart, 17 kCap, 18 kFirst, 19 kUnderline, 20 kMixed, 21 }; 22 23 enum class Phrase { 24 kNo, 25 kYes, 26 }; 27 28 enum class PunctuationState { 29 kStart, 30 kDelimiter, 31 kParen, // treated as a delimiter unless following a space, and followed by word 32 kPeriod, 33 kSpace, 34 }; 35 36 enum class RefType { 37 kUndefined, 38 kNormal, 39 kExternal, 40 }; 41 42 enum class SkipFirstLine { 43 kNo, 44 kYes, 45 }; 46 47 enum class Wrote { 48 kNone, 49 kLF, 50 kChars, 51 }; 52 53 enum class MemberPass { 54 kCount, 55 kOut, 56 }; 57 58 enum class ItemState { 59 kNone, 60 kName, 61 kValue, 62 kComment, 63 }; 64 65 struct IterState { 66 IterState (list<Definition>::iterator tIter, list<Definition>::iterator tIterEnd) 67 : fDefIter(tIter) 68 , fDefEnd(tIterEnd) { 69 } 70 list<Definition>::iterator fDefIter; 71 list<Definition>::iterator fDefEnd; 72 }; 73 74 struct ParentPair { 75 const Definition* fParent; 76 const ParentPair* fPrev; 77 }; 78 79 struct Preprocessor { 80 Preprocessor() { 81 reset(); 82 } 83 84 void reset() { 85 fDefinition = nullptr; 86 fStart = nullptr; 87 fEnd = nullptr; 88 fWord = false; 89 } 90 91 const Definition* fDefinition; 92 const char* fStart; 93 const char* fEnd; 94 bool fWord; 95 }; 96 97 struct Item { 98 void reset() { 99 fName = ""; 100 fValue = ""; 101 } 102 103 string fName; 104 string fValue; 105 }; 106 107 struct LastItem { 108 const char* fStart; 109 const char* fEnd; 110 }; 111 112 struct ItemLength { 113 int fCurName; 114 int fCurValue; 115 int fLongestName; 116 int fLongestValue; 117 }; 118 119 IncludeWriter() : IncludeParser() { 120 this->reset(); 121 } 122 123 ~IncludeWriter() override {} 124 125 bool contentFree(int size, const char* data) const { 126 while (size > 0 && data[0] <= ' ') { 127 --size; 128 ++data; 129 } 130 while (size > 0 && data[size - 1] <= ' ') { 131 --size; 132 } 133 return 0 == size; 134 } 135 136 bool checkChildCommentLength(const Definition* parent, MarkType childType) const; 137 void checkEnumLengths(const Definition& child, string enumName, ItemLength* length) const; 138 void constOut(const Definition* memberStart, const Definition* bmhConst); 139 void constSizeMembers(const RootDefinition* root); 140 bool defineOut(const Definition& ); 141 bool descriptionOut(const Definition* def, SkipFirstLine , Phrase ); 142 void enumHeaderOut(RootDefinition* root, const Definition& child); 143 string enumMemberComment(const Definition* currentEnumItem, const Definition& child) const; 144 const Definition* enumMemberForComment(const Definition* currentEnumItem) const; 145 ItemState enumMemberName(const Definition& child, 146 const Definition* token, Item* , LastItem* , const Definition** enumItem); 147 void enumMemberOut(const Definition* currentEnumItem, const Definition& child, 148 const Item& , Preprocessor& ); 149 void enumMembersOut(Definition& child); 150 bool enumPreprocessor(Definition* token, MemberPass pass, 151 vector<IterState>& iterStack, IterState** iterState, Preprocessor* ); 152 void enumSizeItems(const Definition& child); 153 bool findEnumSubtopic(string undername, const Definition** ) const; 154 void firstBlock(int size, const char* data); 155 bool firstBlockTrim(int size, const char* data); 156 Definition* findMemberCommentBlock(const vector<Definition*>& bmhChildren, string name) const; 157 Definition* findMethod(string name, RootDefinition* ) const; 158 159 void indentDeferred(IndentKind kind) { 160 if (fIndentNext) { 161 this->indentIn(kind); 162 fIndentNext = false; 163 } 164 } 165 166 int lookupMethod(const PunctuationState punctuation, const Word word, 167 const int start, const int run, int lastWrite, 168 const char* data, bool hasIndirection); 169 int lookupReference(const PunctuationState punctuation, const Word word, 170 const int start, const int run, int lastWrite, const char last, 171 const char* data); 172 const Definition* matchMemberName(string matchName, const Definition& child) const; 173 void methodOut(Definition* method, const Definition& child); 174 bool populate(Definition* def, ParentPair* parentPair, RootDefinition* root); 175 bool populate(BmhParser& bmhParser); 176 177 void reset() override { 178 INHERITED::resetCommon(); 179 fBmhParser = nullptr; 180 fDeferComment = nullptr; 181 fBmhMethod = nullptr; 182 fEnumDef = nullptr; 183 fMethodDef = nullptr; 184 fBmhConst = nullptr; 185 fConstDef = nullptr; 186 fLastDescription = nullptr; 187 fStartSetter = nullptr; 188 fBmhStructDef = nullptr; 189 fContinuation = nullptr; 190 fInStruct = false; 191 fWroteMethod = false; 192 fIndentNext = false; 193 fPendingMethod = false; 194 fFirstWrite = false; 195 fStructEnded = false; 196 fWritingIncludes = true; 197 } 198 199 string resolveAlias(const Definition* ); 200 string resolveMethod(const char* start, const char* end, bool first); 201 string resolveRef(const char* start, const char* end, bool first, RefType* refType); 202 Wrote rewriteBlock(int size, const char* data, Phrase phrase); 203 void setStart(const char* start, const Definition * ); 204 void setStartBack(const char* start, const Definition * ); 205 Definition* structMemberOut(const Definition* memberStart, const Definition& child); 206 void structOut(const Definition* root, const Definition& child, 207 const char* commentStart, const char* commentEnd); 208 void structSizeMembers(const Definition& child); 209 bool writeHeader(std::pair<const string, Definition>& ); 210 private: 211 vector<const Definition* > fICSStack; 212 BmhParser* fBmhParser; 213 Definition* fDeferComment; 214 const Definition* fBmhMethod; 215 const Definition* fEnumDef; 216 const Definition* fMethodDef; 217 const Definition* fBmhConst; 218 const Definition* fConstDef; 219 const Definition* fLastDescription; 220 const Definition* fStartSetter; 221 Definition* fBmhStructDef; 222 const char* fContinuation; // used to construct paren-qualified method name 223 int fAnonymousEnumCount; 224 int fEnumItemValueTab; 225 int fEnumItemCommentTab; 226 int fStructMemberTab; 227 int fStructValueTab; 228 int fStructCommentTab; 229 int fStructMemberLength; 230 int fConstValueTab; 231 int fConstCommentTab; 232 int fConstLength; 233 bool fInStruct; // set if struct is inside class 234 bool fWroteMethod; 235 bool fIndentNext; 236 bool fPendingMethod; 237 bool fFirstWrite; // set to write file information just after includes 238 bool fStructEnded; // allow resetting indent after struct is complete 239 240 typedef IncludeParser INHERITED; 241 }; 242 243 #endif 244