• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 {
IterStateIterState66         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 {
PreprocessorPreprocessor80         Preprocessor() {
81             reset();
82         }
83 
resetPreprocessor84         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 {
resetItem98         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 
IncludeWriter()119     IncludeWriter() : IncludeParser() {
120         this->reset();
121     }
122 
~IncludeWriter()123     ~IncludeWriter() override {}
124 
contentFree(int size,const char * data)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 
indentDeferred(IndentKind kind)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 
reset()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