aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/bookmaker/includeWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/bookmaker/includeWriter.cpp')
-rw-r--r--tools/bookmaker/includeWriter.cpp150
1 files changed, 78 insertions, 72 deletions
diff --git a/tools/bookmaker/includeWriter.cpp b/tools/bookmaker/includeWriter.cpp
index 067c014070..5b2f8076bc 100644
--- a/tools/bookmaker/includeWriter.cpp
+++ b/tools/bookmaker/includeWriter.cpp
@@ -375,43 +375,11 @@ void IncludeWriter::enumMembersOut(const RootDefinition* root, Definition& child
vector<IterState> iterStack;
iterStack.emplace_back(child.fTokens.begin(), child.fTokens.end());
IterState* iterState = &iterStack[0];
- bool preprocessorWord = false;
- const char* preprocessStart = nullptr;
- const char* preprocessEnd = nullptr;
+ Preprocessor preprocessor;
for (int onePast = 0; onePast < 2; onePast += iterState->fDefIter == iterState->fDefEnd) {
Definition* token = onePast ? nullptr : &*iterState->fDefIter++;
- if (token && Definition::Type::kBracket == token->fType) {
- if (Bracket::kSlashSlash == token->fBracket) {
- fStart = token->fContentEnd;
- continue; // ignore old inline comments
- }
- if (Bracket::kSlashStar == token->fBracket) {
- fStart = token->fContentEnd + 1;
- continue; // ignore old inline comments
- }
- if (Bracket::kPound == token->fBracket) { // preprocessor wraps member
- preprocessStart = token->fContentStart;
- if (KeyWord::kIf == token->fKeyWord || KeyWord::kIfdef == token->fKeyWord) {
- iterStack.emplace_back(token->fTokens.begin(), token->fTokens.end());
- iterState = &iterStack.back();
- preprocessorWord = true;
- } else if (KeyWord::kEndif == token->fKeyWord) {
- iterStack.pop_back();
- iterState = &iterStack.back();
- preprocessEnd = token->fContentEnd;
- } else {
- SkASSERT(0); // incomplete
- }
- continue;
- }
- SkASSERT(0); // incomplete
- }
- if (token && Definition::Type::kWord != token->fType) {
- SkASSERT(0); // incomplete
- }
- if (preprocessorWord) {
- preprocessorWord = false;
- preprocessEnd = token->fContentEnd;
+ if (this->enumPreprocessor(token, MemberPass::kOut, iterStack, &iterState,
+ &preprocessor)) {
continue;
}
if (token && State::kItemName == state) {
@@ -462,16 +430,17 @@ void IncludeWriter::enumMembersOut(const RootDefinition* root, Definition& child
fIndent -= 4;
}
this->lfcr();
- if (preprocessStart) {
- SkASSERT(preprocessEnd);
+ if (preprocessor.fStart) {
+ SkASSERT(preprocessor.fEnd);
int saveIndent = fIndent;
fIndent = SkTMax(0, fIndent - 8);
this->lf(2);
- this->writeBlock((int) (preprocessEnd - preprocessStart), preprocessStart);
+ this->writeBlock(
+ (int) (preprocessor.fEnd - preprocessor.fStart), preprocessor.fStart);
this->lfcr();
fIndent = saveIndent;
- preprocessStart = nullptr;
- preprocessEnd = nullptr;
+ preprocessor.fStart = nullptr;
+ preprocessor.fEnd = nullptr;
}
if (token && State::kItemValue == state) {
fStart = token->fContentStart;
@@ -538,8 +507,11 @@ void IncludeWriter::enumMembersOut(const RootDefinition* root, Definition& child
this->writeString(currentEnumItem->fToBeDeprecated
? "To be deprecated soon." : "Deprecated.");
}
+ TextParserSave save(this);
+ this->setForErrorReporting(currentEnumItem, commentStart);
wroteLineFeed = Wrote::kLF ==
this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
+ save.restore();
fIndent -= 4;
if (wroteLineFeed || fColumn > 100 - 3 /* space * / */ ) {
this->lfcr();
@@ -559,6 +531,55 @@ void IncludeWriter::enumMembersOut(const RootDefinition* root, Definition& child
}
}
+bool IncludeWriter::enumPreprocessor(Definition* token, MemberPass pass,
+ vector<IterState>& iterStack, IterState** iterState, Preprocessor* preprocessor) {
+ if (token && Definition::Type::kBracket == token->fType) {
+ if (Bracket::kSlashSlash == token->fBracket) {
+ if (MemberPass::kOut == pass) {
+ fStart = token->fContentEnd;
+ }
+ return true; // ignore old inline comments
+ }
+ if (Bracket::kSlashStar == token->fBracket) {
+ if (MemberPass::kOut == pass) {
+ fStart = token->fContentEnd + 1;
+ }
+ return true; // ignore old inline comments
+ }
+ if (Bracket::kPound == token->fBracket) { // preprocessor wraps member
+ preprocessor->fStart = token->fContentStart;
+ if (KeyWord::kIf == token->fKeyWord || KeyWord::kIfdef == token->fKeyWord) {
+ iterStack.emplace_back(token->fTokens.begin(), token->fTokens.end());
+ *iterState = &iterStack.back();
+ preprocessor->fWord = true;
+ } else if (KeyWord::kEndif == token->fKeyWord || KeyWord::kElif == token->fKeyWord
+ || KeyWord::kElse == token->fKeyWord) {
+ iterStack.pop_back();
+ *iterState = &iterStack.back();
+ preprocessor->fEnd = token->fContentEnd;
+ if (KeyWord::kElif == token->fKeyWord) {
+ iterStack.emplace_back(token->fTokens.begin(), token->fTokens.end());
+ *iterState = &iterStack.back();
+ preprocessor->fWord = true;
+ }
+ } else {
+ SkASSERT(0); // incomplete
+ }
+ return true;
+ }
+ return true;
+ }
+ if (token && Definition::Type::kWord != token->fType) {
+ SkASSERT(0); // incomplete
+ }
+ if (preprocessor->fWord) {
+ preprocessor->fWord = false;
+ preprocessor->fEnd = token->fContentEnd;
+ return true;
+ }
+ return false;
+}
+
void IncludeWriter::enumSizeItems(const Definition& child) {
enum class State {
kNoItem,
@@ -580,36 +601,11 @@ void IncludeWriter::enumSizeItems(const Definition& child) {
vector<IterState> iterStack;
iterStack.emplace_back(brace->fTokens.begin(), brace->fTokens.end());
IterState* iterState = &iterStack[0];
- bool preprocessorWord = false;
+ Preprocessor preprocessor;
while (iterState->fDefIter != iterState->fDefEnd) {
auto& token = *iterState->fDefIter++;
- if (Definition::Type::kBracket == token.fType) {
- if (Bracket::kSlashSlash == token.fBracket) {
- continue; // ignore old inline comments
- }
- if (Bracket::kSlashStar == token.fBracket) {
- continue; // ignore old inline comments
- }
- if (Bracket::kPound == token.fBracket) { // preprocessor wraps member
- if (KeyWord::kIf == token.fKeyWord || KeyWord::kIfdef == token.fKeyWord) {
- iterStack.emplace_back(token.fTokens.begin(), token.fTokens.end());
- iterState = &iterStack.back();
- preprocessorWord = true;
- } else if (KeyWord::kEndif == token.fKeyWord) {
- iterStack.pop_back();
- iterState = &iterStack.back();
- } else {
- SkASSERT(0); // incomplete
- }
- continue;
- }
- SkASSERT(0); // incomplete
- }
- if (Definition::Type::kWord != token.fType) {
- SkASSERT(0); // incomplete
- }
- if (preprocessorWord) {
- preprocessorWord = false;
+ if (this->enumPreprocessor(&token, MemberPass::kCount, iterStack, &iterState,
+ &preprocessor)) {
continue;
}
if (State::kItemName == state) {
@@ -763,6 +759,17 @@ void IncludeWriter::structOut(const Definition* root, const Definition& child,
this->writeCommentTrailer();
}
+bool IncludeWriter::findEnumSubtopic(string undername, const Definition** rootDefPtr) const {
+ const Definition* subtopic = fEnumDef->fParent;
+ string subcheck = subtopic->fFiddle + '_' + undername;
+ auto iter = fBmhParser->fTopicMap.find(subcheck);
+ if (iter == fBmhParser->fTopicMap.end()) {
+ return false;
+ }
+ *rootDefPtr = iter->second;
+ return true;
+}
+
Definition* IncludeWriter::findMemberCommentBlock(const vector<Definition*>& bmhChildren,
const string& name) const {
for (auto memberDef : bmhChildren) {
@@ -1038,9 +1045,6 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
const Definition* requireDense = nullptr;
const Definition* startDef = nullptr;
for (auto& child : def->fTokens) {
- if (51 == child.fLineCount) {
- SkDebugf("");
- }
if (KeyWord::kOperator == child.fKeyWord && method &&
Definition::MethodType::kOperator == method->fMethodType) {
eatOperator = true;
@@ -1728,8 +1732,10 @@ string IncludeWriter::resolveRef(const char* start, const char* end, bool first,
auto aliasIter = fBmhParser->fAliasMap.find(undername);
if (fBmhParser->fAliasMap.end() != aliasIter) {
rootDef = aliasIter->second;
+ } else if (fInEnum && fEnumDef && this->findEnumSubtopic(undername, &rootDef)) {
+ ;
} else if (!first) {
- SkDebugf("unfound: %s\n", undername.c_str());
+ this->fChar = start;
this->reportError("reference unfound");
return "";
}