diff options
Diffstat (limited to 'tools/bookmaker/selfCheck.cpp')
-rw-r--r-- | tools/bookmaker/selfCheck.cpp | 117 |
1 files changed, 74 insertions, 43 deletions
diff --git a/tools/bookmaker/selfCheck.cpp b/tools/bookmaker/selfCheck.cpp index 3392945a9f..5f1eb38ece 100644 --- a/tools/bookmaker/selfCheck.cpp +++ b/tools/bookmaker/selfCheck.cpp @@ -11,6 +11,27 @@ #include <windows.h> #endif + + /* SkDebugf works in both visual studio and git shell, but + in git shell output is not piped to grep. + printf does not generate output in visual studio, but + does in git shell and can be piped. + */ +#ifdef SK_BUILD_FOR_WIN +#define PRINTF(...) \ +do { \ + if (IsDebuggerPresent()) { \ + SkDebugf(__VA_ARGS__); \ + } else { \ + printf(__VA_ARGS__); \ + } \ +} while (false) +#else +#define PRINTF(...) \ + printf(__VA_ARGS__) +#endif + + // Check that mutiple like-named methods are under one Subtopic // Check that SeeAlso reference each other @@ -47,52 +68,62 @@ public: protected: - bool checkRelatedFunctions() { - const Definition* cs = this->classOrStruct(); - vector<string> methodNames; - if (cs) { - string prefix = cs->fName + "::"; - for (auto& csChild : cs->fChildren) { - if (MarkType::kMethod != csChild->fMarkType) { - // only check methods for now - continue; - } - if (Definition::MethodType::kConstructor == csChild->fMethodType) { - continue; - } - if (Definition::MethodType::kDestructor == csChild->fMethodType) { - continue; - } - if (Definition::MethodType::kOperator == csChild->fMethodType) { - continue; - } - if (csChild->fClone) { - // FIXME: check to see if all cloned methods are in table - // since format of clones is in flux, defer this check for now - continue; - } - bool containsMarkTypeIn = csChild->fDeprecated; // no markup for deprecated - for (auto child : csChild->fChildren) { - if (MarkType::kIn == child->fMarkType) { - containsMarkTypeIn = true; - break; + void checkMethod(string topic, const Definition* csChild, vector<string>* reported) { + if (MarkType::kSubtopic == csChild->fMarkType) { + for (auto child : csChild->fChildren) { + checkMethod(topic, child, reported); + } + return; + } else if (MarkType::kMethod != csChild->fMarkType) { + // only check methods for now + return; + } + bool containsMarkTypeIn = csChild->fDeprecated // no markup for deprecated + || Definition::MethodType::kConstructor == csChild->fMethodType + || Definition::MethodType::kDestructor == csChild->fMethodType + || Definition::MethodType::kOperator == csChild->fMethodType + || csChild->fClone; + for (auto child : csChild->fChildren) { + if (MarkType::kIn == child->fMarkType) { + containsMarkTypeIn = true; + string subtopic(child->fContentStart, + child->fContentEnd - child->fContentStart); + string fullname = topic + '_' + subtopic; + auto topEnd = fBmhParser.fTopicMap.end(); + auto topFind = fBmhParser.fTopicMap.find(fullname); + auto reportEnd = reported->end(); + auto reportFind = std::find(reported->begin(), reported->end(), subtopic); + if (topEnd == topFind) { + if (reportEnd == reportFind) { + reported->push_back(subtopic); } } - if (!containsMarkTypeIn) { -#ifdef SK_BUILD_FOR_WIN - /* SkDebugf works in both visual studio and git shell, but - in git shell output is not piped to grep. - printf does not generate output in visual studio, but - does in git shell and can be piped. - */ - if (IsDebuggerPresent()) { - SkDebugf("No #In: %s\n", csChild->fName.c_str()); - } else -#endif - printf("No #In: %s\n", csChild->fName.c_str()); - } - } + } + } + if (!containsMarkTypeIn) { + PRINTF("No #In: %s\n", csChild->fName.c_str()); + } + } + + bool checkRelatedFunctions() { + const Definition* cs = this->classOrStruct(); + if (!cs) { + return true; + } + const Definition* topic = cs->fParent; + SkASSERT(topic); + SkASSERT(MarkType::kTopic == topic->fMarkType); + string topicName = topic->fName; + vector<string> methodNames; + vector<string> reported; + string prefix = cs->fName + "::"; + for (auto& csChild : cs->fChildren) { + checkMethod(topicName, csChild, &reported); } + for (auto missing : reported) { + string fullname = topicName + '_' + missing; + PRINTF("No #Subtopic: %s\n", fullname.c_str()); + } return true; } |