aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/bookmaker/selfCheck.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/bookmaker/selfCheck.cpp')
-rw-r--r--tools/bookmaker/selfCheck.cpp117
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;
}