You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
243 lines
7.1 KiB
243 lines
7.1 KiB
/* |
|
* 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
|
|
|