aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar Cary Clark <caryclark@skia.org>2017-09-14 11:25:39 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-09-14 16:05:21 +0000
commitd0530ba8f406ef287ce89a995ce7be4b32ab6e85 (patch)
tree4a4f575d252e68364d041a4a67ee38739e7b5e1b /tools
parentd29f0e7ccb84993562f34f2d8e3933a19a3ed676 (diff)
wip pixmap docs
wip pixmap docs Docs-Preview: https://skia.org/?cl=42522 Bug: skia: 6898 Change-Id: I85947bc36ea057ed008b87d7bef2efa82d7c89ad Reviewed-on: https://skia-review.googlesource.com/42522 Reviewed-by: Cary Clark <caryclark@skia.org> Commit-Queue: Cary Clark <caryclark@skia.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/bookmaker/bookmaker.cpp59
-rw-r--r--tools/bookmaker/bookmaker.h95
-rw-r--r--tools/bookmaker/fiddleParser.cpp18
-rw-r--r--tools/bookmaker/includeParser.cpp45
-rw-r--r--tools/bookmaker/includeWriter.cpp95
-rw-r--r--tools/bookmaker/mdOut.cpp50
-rw-r--r--tools/bookmaker/spellCheck.cpp67
7 files changed, 274 insertions, 155 deletions
diff --git a/tools/bookmaker/bookmaker.cpp b/tools/bookmaker/bookmaker.cpp
index ac8f04da9f..1df8d42e9c 100644
--- a/tools/bookmaker/bookmaker.cpp
+++ b/tools/bookmaker/bookmaker.cpp
@@ -938,6 +938,7 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
definition->fFiddle = normalized_name(name);
}
definition->fMarkType = markType;
+ definition->fAnonymous = fAnonymous;
this->setAsParent(definition);
}
} break;
@@ -1078,9 +1079,6 @@ bool BmhParser::addDefinition(const char* defStart, bool hasEnd, MarkType markTy
fMarkup.emplace_front(markType, defStart, fLineCount, fParent);
definition = &fMarkup.front();
definition->fContentStart = fChar;
- if (MarkType::kFormula == markType && MarkType::kRow == definition->fParent->fMarkType) {
- SkDebugf("");
- }
definition->fName = typeNameBuilder[0];
definition->fFiddle = fParent->fFiddle;
char suffix = '\0';
@@ -1383,6 +1381,7 @@ bool BmhParser::dumpExamples(const char* fiddleJsonFileName) const {
}
fprintf(fiddleOut, "\n}\n");
fclose(fiddleOut);
+ SkDebugf("wrote %s\n", fiddleJsonFileName);
return true;
}
@@ -1525,10 +1524,6 @@ bool BmhParser::findDefinitions() {
}
}
} else if (TableState::kNone == fTableState) {
- bool parentIsList = MarkType::kList == fParent->fMarkType;
- if (parentIsList && fLineCount > 1230) {
- SkDebugf("");
- }
// fixme? no nested tables for now
fColStart = fChar - 1;
fMarkup.emplace_front(MarkType::kRow, fColStart, fLineCount, fParent);
@@ -1627,6 +1622,7 @@ bool HackParser::hackFiles() {
} while (!this->eof());
fprintf(out, "%.*s", (int) (fEnd - start), start);
fclose(out);
+ SkDebugf("wrote %s\n", filename.c_str());
return true;
}
@@ -2143,15 +2139,16 @@ string BmhParser::word(const string& prefix, const string& delimiter) {
// pass one: parse text, collect definitions
// pass two: lookup references
-DEFINE_string2(bmh, b, "", "A path to a *.bmh file or a directory.");
+DEFINE_string2(bmh, b, "", "Path to a *.bmh file or a directory.");
DEFINE_string2(examples, e, "", "File of fiddlecli input, usually fiddle.json (For now, disables -r -f -s)");
DEFINE_string2(fiddle, f, "", "File of fiddlecli output, usually fiddleout.json.");
-DEFINE_string2(include, i, "", "A path to a *.h file or a directory.");
+DEFINE_string2(include, i, "", "Path to a *.h file or a directory.");
DEFINE_bool2(hack, k, false, "Do a find/replace hack to update all *.bmh files. (Requires -b)");
+DEFINE_bool2(stdout, o, false, "Write file out to standard out.");
DEFINE_bool2(populate, p, false, "Populate include from bmh. (Requires -b -i)");
DEFINE_string2(ref, r, "", "Resolve refs and write bmh_*.md files to path. (Requires -b)");
-DEFINE_string2(spellcheck, s, "", "Spell-check [once, all, mispellings]. (Requires -b)");
-DEFINE_bool2(tokens, t, false, "Output include tokens. (Requires -i)");
+DEFINE_string2(spellcheck, s, "", "Spell-check [once, all, mispelling]. (Requires -b)");
+DEFINE_string2(tokens, t, "", "Directory to write bmh from include. (Requires -i)");
DEFINE_bool2(crosscheck, x, false, "Check bmh against includes. (Requires -b -i)");
static int count_children(const Definition& def, MarkType markType) {
@@ -2220,7 +2217,6 @@ int main(int argc, char** const argv) {
SkDebugf("hack failed\n");
return -1;
}
- SkDebugf("hack success\n");
return 0;
}
if ((FLAGS_include.isEmpty() || FLAGS_bmh.isEmpty()) && FLAGS_populate) {
@@ -2238,7 +2234,7 @@ int main(int argc, char** const argv) {
SkCommandLineFlags::PrintUsage();
return 1;
}
- if (FLAGS_include.isEmpty() && FLAGS_tokens) {
+ if (FLAGS_include.isEmpty() && !FLAGS_tokens.isEmpty()) {
SkDebugf("-t requires -i\n");
SkCommandLineFlags::PrintUsage();
return 1;
@@ -2255,14 +2251,16 @@ int main(int argc, char** const argv) {
}
bool done = false;
if (!FLAGS_include.isEmpty()) {
- if (FLAGS_tokens || FLAGS_crosscheck) {
+ if (!FLAGS_tokens.isEmpty() || FLAGS_crosscheck) {
IncludeParser includeParser;
includeParser.validate();
if (!includeParser.parseFile(FLAGS_include[0], ".h")) {
return -1;
}
- if (FLAGS_tokens) {
- includeParser.dumpTokens();
+ if (!FLAGS_tokens.isEmpty()) {
+ if (includeParser.dumpTokens(FLAGS_tokens[0])) {
+ bmhParser.fWroteOut = true;
+ }
done = true;
} else if (FLAGS_crosscheck) {
if (!includeParser.crossCheck(bmhParser)) {
@@ -2276,9 +2274,11 @@ int main(int argc, char** const argv) {
if (!includeWriter.parseFile(FLAGS_include[0], ".h")) {
return -1;
}
+ includeWriter.fDebugOut = FLAGS_stdout;
if (!includeWriter.populate(bmhParser)) {
return -1;
}
+ bmhParser.fWroteOut = true;
done = true;
}
}
@@ -2290,7 +2290,9 @@ int main(int argc, char** const argv) {
}
if (!done && !FLAGS_ref.isEmpty() && FLAGS_examples.isEmpty()) {
MdOut mdOut(bmhParser);
- mdOut.buildReferences(FLAGS_bmh[0], FLAGS_ref[0]);
+ if (mdOut.buildReferences(FLAGS_bmh[0], FLAGS_ref[0])) {
+ bmhParser.fWroteOut = true;
+ }
}
if (!done && !FLAGS_spellcheck.isEmpty() && FLAGS_examples.isEmpty()) {
bmhParser.spellCheck(FLAGS_bmh[0], FLAGS_spellcheck);
@@ -2307,18 +2309,21 @@ int main(int argc, char** const argv) {
if (!bmhParser.dumpExamples(FLAGS_examples[0])) {
return -1;
}
+ return 0;
}
- for (const auto& topic : bmhParser.fTopicMap) {
- if (topic.second->fParent) {
- continue;
+ if (!bmhParser.fWroteOut) {
+ for (const auto& topic : bmhParser.fTopicMap) {
+ if (topic.second->fParent) {
+ continue;
+ }
+ examples += count_children(*topic.second, MarkType::kExample);
+ methods += count_children(*topic.second, MarkType::kMethod);
+ topics += count_children(*topic.second, MarkType::kSubtopic);
+ topics += count_children(*topic.second, MarkType::kTopic);
}
- examples += count_children(*topic.second, MarkType::kExample);
- methods += count_children(*topic.second, MarkType::kMethod);
- topics += count_children(*topic.second, MarkType::kSubtopic);
- topics += count_children(*topic.second, MarkType::kTopic);
+ SkDebugf("topics=%d classes=%d methods=%d examples=%d\n",
+ bmhParser.fTopicMap.size(), bmhParser.fClassMap.size(),
+ methods, examples);
}
- SkDebugf("topics=%d classes=%d methods=%d examples=%d\n",
- bmhParser.fTopicMap.size(), bmhParser.fClassMap.size(),
- methods, examples);
return 0;
}
diff --git a/tools/bookmaker/bookmaker.h b/tools/bookmaker/bookmaker.h
index 503db20f24..1d95f13453 100644
--- a/tools/bookmaker/bookmaker.h
+++ b/tools/bookmaker/bookmaker.h
@@ -8,8 +8,6 @@
#ifndef bookmaker_DEFINED
#define bookmaker_DEFINED
-#define STDOUT_TO_IDE_OUT 0
-
#include "SkCommandLineFlags.h"
#include "SkData.h"
@@ -71,7 +69,10 @@ enum class KeyWord {
kStruct,
kTemplate,
kTypedef,
+ kUint16_t,
kUint32_t,
+ kUint64_t,
+ kUint8_t,
kUnion,
kUnsigned,
kVoid,
@@ -161,6 +162,24 @@ enum class Punctuation { // catch-all for misc symbols tracked in C
kColon, // for foo() : bar(1), baz(2) {}
};
+enum class KeyProperty {
+ kNone,
+ kClassSection,
+ kFunction,
+ kModifier,
+ kNumber,
+ kObject,
+ kPreprocessor,
+};
+
+struct IncludeKey {
+ const char* fName;
+ KeyWord fKeyWord;
+ KeyProperty fProperty;
+};
+
+extern const IncludeKey kKeyWords[];
+
static inline bool has_nonwhitespace(const string& s) {
bool nonwhite = false;
for (const char& c : s) {
@@ -449,7 +468,9 @@ public:
bool skipName(const char* word) {
size_t len = strlen(word);
if (len <= (size_t) (fEnd - fChar) && !strncmp(word, fChar, len)) {
- fChar += len;
+ for (size_t i = 0; i < len; ++i) {
+ this->next();
+ }
}
return this->eof() || ' ' >= fChar[0];
}
@@ -890,6 +911,7 @@ public:
bool fPrivate = false;
bool fShort = false;
bool fMemberStart = false;
+ bool fAnonymous = false;
mutable bool fVisited = false;
};
@@ -959,6 +981,7 @@ public:
ParserCommon() : TextParser()
, fParent(nullptr)
+ , fDebugOut(false)
{
}
@@ -972,9 +995,9 @@ public:
void indentToColumn(int column) {
SkASSERT(column >= fColumn);
-#if STDOUT_TO_IDE_OUT
- SkDebugf("%*s", column - fColumn, "");
-#endif
+ if (fDebugOut) {
+ SkDebugf("%*s", column - fColumn, "");
+ }
fprintf(fOut, "%*s", column - fColumn, "");
fColumn = column;
fSpaces += column - fColumn;
@@ -1068,10 +1091,13 @@ public:
fPendingSpace = false;
}
writePending();
-#if STDOUT_TO_IDE_OUT
- string check(data, size);
- SkDebugf("%s", check.c_str());
-#endif
+ if (fDebugOut) {
+ if (!strncmp("SK_SUPPORT", data, 10)) {
+ SkDebugf("");
+ }
+ string check(data, size);
+ SkDebugf("%s", check.c_str());
+ }
fprintf(fOut, "%.*s", size, data);
int added = 0;
while (size > 0 && '\n' != data[--size]) {
@@ -1109,9 +1135,6 @@ public:
}
void writeString(const char* str) {
- if (!strcmp("utf-8", str)) {
- SkDebugf("");
- }
SkASSERT(strlen(str) > 0);
SkASSERT(' ' < str[0]);
SkASSERT(' ' < str[strlen(str) - 1]);
@@ -1119,9 +1142,12 @@ public:
fPendingSpace = false;
}
writePending();
-#if STDOUT_TO_IDE_OUT
- SkDebugf("%s", str);
-#endif
+ if (fDebugOut) {
+ if (!strncmp("SK_SUPPORT", str, 10)) {
+ SkDebugf("");
+ }
+ SkDebugf("%s", str);
+ }
SkASSERT(!strchr(str, '\n'));
fprintf(fOut, "%s", str);
fColumn += strlen(str);
@@ -1134,9 +1160,9 @@ public:
fPendingLF = SkTMin(fPendingLF, fMaxLF);
bool wroteLF = false;
while (fLinefeeds < fPendingLF) {
-#if STDOUT_TO_IDE_OUT
- SkDebugf("\n");
-#endif
+ if (fDebugOut) {
+ SkDebugf("\n");
+ }
fprintf(fOut, "\n");
++fLinefeeds;
wroteLF = true;
@@ -1145,17 +1171,17 @@ public:
if (wroteLF) {
SkASSERT(0 == fColumn);
SkASSERT(fIndent >= fSpaces);
- #if STDOUT_TO_IDE_OUT
- SkDebugf("%*s", fIndent - fSpaces, "");
- #endif
+ if (fDebugOut) {
+ SkDebugf("%*s", fIndent - fSpaces, "");
+ }
fprintf(fOut, "%*s", fIndent - fSpaces, "");
fColumn = fIndent;
fSpaces = fIndent;
}
if (fPendingSpace) {
- #if STDOUT_TO_IDE_OUT
- SkDebugf(" ");
- #endif
+ if (fDebugOut) {
+ SkDebugf(" ");
+ }
fprintf(fOut, " ");
++fColumn;
fPendingSpace = false;
@@ -1173,6 +1199,7 @@ public:
int fColumn; // current column; number of chars past last linefeed
int fIndent; // desired indention
bool fPendingSpace; // a space should preceed the next string or block
+ bool fDebugOut; // set true to write to std out
private:
typedef TextParser INHERITED;
};
@@ -1231,7 +1258,7 @@ public:
, { "Alias", nullptr, MarkType::kAlias, R_N, E_N, 0 }
, { "Bug", nullptr, MarkType::kBug, R_N, E_N, 0 }
, { "Class", &fClassMap, MarkType::kClass, R_Y, E_O, M_CSST | M(Root) }
-, { "Code", nullptr, MarkType::kCode, R_Y, E_N, M_CSST | M_E }
+, { "Code", nullptr, MarkType::kCode, R_O, E_N, M_CSST | M_E }
, { "", nullptr, MarkType::kColumn, R_Y, E_N, M(Row) }
, { "", nullptr, MarkType::kComment, R_N, E_N, 0 }
, { "Const", &fConstMap, MarkType::kConst, R_Y, E_N, M_E | M_ST }
@@ -1396,7 +1423,7 @@ public:
bool fInComment;
bool fInString;
bool fCheckMethods;
-
+ bool fWroteOut = false;
private:
typedef ParserCommon INHERITED;
};
@@ -1489,7 +1516,7 @@ public:
IClassDefinition* defineClass(const Definition& includeDef, const string& className);
void dumpClassTokens(IClassDefinition& classDef);
void dumpComment(Definition* token);
- void dumpTokens();
+ bool dumpTokens(const string& directory);
bool findComments(const Definition& includeDef, Definition* markupDef);
Definition* findIncludeObject(const Definition& includeDef, MarkType markType,
@@ -1651,6 +1678,11 @@ public:
kMixed,
};
+ enum class Phrase {
+ kNo,
+ kYes,
+ };
+
enum class PunctuationState {
kStart,
kDelimiter,
@@ -1721,11 +1753,12 @@ public:
fAttrDeprecated = nullptr;
fAnonymousEnumCount = 1;
fInStruct = false;
+ fWroteMethod = false;
}
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);
+ Wrote rewriteBlock(int size, const char* data, Phrase phrase);
Definition* structMemberOut(const Definition* memberStart, const Definition& child);
void structOut(const Definition* root, const Definition& child,
const char* commentStart, const char* commentEnd);
@@ -1748,6 +1781,7 @@ private:
int fStructValueTab;
int fStructCommentTab;
bool fInStruct;
+ bool fWroteMethod;
typedef IncludeParser INHERITED;
};
@@ -1822,6 +1856,7 @@ private:
bool buildRefFromFile(const char* fileName, const char* outDir);
bool checkParamReturnBody(const Definition* def) const;
void childrenOut(const Definition* def, const char* contentStart);
+ const Definition* findParamType();
const Definition* isDefined(const TextParser& parser, const string& ref, bool report) const;
string linkName(const Definition* ) const;
string linkRef(const string& leadingSpaces, const Definition*, const string& ref) const;
@@ -1837,6 +1872,7 @@ private:
fEnumClass = nullptr;
fMethod = nullptr;
fRoot = nullptr;
+ fLastParam = nullptr;
fTableState = TableState::kNone;
fHasFiddle = false;
fInDescription = false;
@@ -1857,6 +1893,7 @@ private:
const Definition* fEnumClass;
Definition* fMethod;
RootDefinition* fRoot;
+ const Definition* fLastParam;
TableState fTableState;
bool fHasFiddle;
bool fInDescription; // FIXME: for now, ignore unfound camelCase in description since it may
diff --git a/tools/bookmaker/fiddleParser.cpp b/tools/bookmaker/fiddleParser.cpp
index d5cfcf425c..3361543301 100644
--- a/tools/bookmaker/fiddleParser.cpp
+++ b/tools/bookmaker/fiddleParser.cpp
@@ -55,7 +55,6 @@ bool FiddleParser::parseFiddles() {
if (']' != this->peek()) {
// report compiler errors
int brackets = 1;
- const char* errorStart = fChar;
do {
if ('[' == this->peek()) {
++brackets;
@@ -63,8 +62,7 @@ bool FiddleParser::parseFiddles() {
--brackets;
}
} while (!this->eof() && this->next() && brackets > 0);
- SkDebugf("fiddle compile error in %s: %.*s\n", name.c_str(), (int) (fChar - errorStart),
- errorStart);
+ this->reportError("fiddle compile error");
}
if (!this->skipExact("],\n")) {
return false;
@@ -73,12 +71,10 @@ bool FiddleParser::parseFiddles() {
return false;
}
if ('"' != this->peek()) {
- const char* errorStart = fChar;
if (!this->skipToEndBracket('"')) {
return false;
}
- SkDebugf("fiddle runtime error in %s: %.*s\n", name.c_str(), (int) (fChar - errorStart),
- errorStart);
+ this->reportError("fiddle runtime error");
}
if (!this->skipExact("\",\n")) {
return false;
@@ -92,7 +88,7 @@ bool FiddleParser::parseFiddles() {
}
Definition* example = this->findExample(name);
if (!example) {
- SkDebugf("missing example %s\n", name.c_str());
+ this->reportError("missing example");
}
string hash(hashStart, fChar - hashStart);
if (example) {
@@ -141,21 +137,21 @@ bool FiddleParser::parseFiddles() {
SkASSERT(fiddleLen > 0);
if (bmhLen != fiddleLen) {
if (!foundVolatile) {
- SkDebugf("mismatched stdout len in %s\n", name.c_str());
+ bmh.reportError("mismatched stdout len\n");
}
} else if (strncmp(bmh.fChar, fiddle.fChar, fiddleLen)) {
if (!foundVolatile) {
- SkDebugf("mismatched stdout text in %s\n", name.c_str());
+ bmh.reportError("mismatched stdout text\n");
}
}
bmh.skipToLineStart();
fiddle.skipToLineStart();
} while (!bmh.eof() && !fiddle.eof());
if (!foundStdOut) {
- SkDebugf("bmh %s missing stdout\n", name.c_str());
+ bmh.reportError("bmh %s missing stdout\n");
} else if (!bmh.eof() || !fiddle.eof()) {
if (!foundVolatile) {
- SkDebugf("%s mismatched stdout eof\n", name.c_str());
+ bmh.reportError("%s mismatched stdout eof\n");
}
}
}
diff --git a/tools/bookmaker/includeParser.cpp b/tools/bookmaker/includeParser.cpp
index cc7627ac7c..1000a037e7 100644
--- a/tools/bookmaker/includeParser.cpp
+++ b/tools/bookmaker/includeParser.cpp
@@ -7,22 +7,6 @@
#include "bookmaker.h"
-enum class KeyProperty {
- kNone,
- kClassSection,
- kFunction,
- kModifier,
- kNumber,
- kObject,
- kPreprocessor,
-};
-
-struct IncludeKey {
- const char* fName;
- KeyWord fKeyWord;
- KeyProperty fProperty;
-};
-
const IncludeKey kKeyWords[] = {
{ "", KeyWord::kNone, KeyProperty::kNone },
{ "SK_API", KeyWord::kSK_API, KeyProperty::kModifier },
@@ -55,7 +39,10 @@ const IncludeKey kKeyWords[] = {
{ "struct", KeyWord::kStruct, KeyProperty::kObject },
{ "template", KeyWord::kTemplate, KeyProperty::kObject },
{ "typedef", KeyWord::kTypedef, KeyProperty::kObject },
+ { "uint16_t", KeyWord::kUint16_t, KeyProperty::kNumber },
{ "uint32_t", KeyWord::kUint32_t, KeyProperty::kNumber },
+ { "uint64_t", KeyWord::kUint64_t, KeyProperty::kNumber },
+ { "uint8_t", KeyWord::kUint8_t, KeyProperty::kNumber },
{ "union", KeyWord::kUnion, KeyProperty::kObject },
{ "unsigned", KeyWord::kUnsigned, KeyProperty::kNumber },
{ "void", KeyWord::kVoid, KeyProperty::kNumber },
@@ -417,6 +404,8 @@ bool IncludeParser::crossCheck(BmhParser& bmhParser) {
if (!root->dumpUnVisited()) {
SkDebugf("some struct elements not found; struct finding in includeParser is missing\n");
}
+ SkDebugf("cross-checked %s\n", className.c_str());
+ bmhParser.fWroteOut = true;
return true;
}
@@ -683,13 +672,17 @@ void IncludeParser::dumpComment(Definition* token) {
}
// dump equivalent markup
-void IncludeParser::dumpTokens() {
+bool IncludeParser::dumpTokens(const string& dir) {
string skClassName = this->className();
- string fileName = skClassName + ".bmh";
+ string fileName = dir;
+ if (dir.length() && '/' != dir[dir.length() - 1]) {
+ fileName += '/';
+ }
+ fileName += skClassName + "_Reference.bmh";
fOut = fopen(fileName.c_str(), "wb");
if (!fOut) {
SkDebugf("could not open output file %s\n", fileName.c_str());
- return;
+ return false;
}
string prefixName = skClassName.substr(0, 2);
string topicName = skClassName.length() > 2 && isupper(skClassName[2]) &&
@@ -811,6 +804,8 @@ void IncludeParser::dumpTokens() {
fprintf(fOut, "#Topic %s ##" "\n",
topicName.c_str());
fclose(fOut);
+ SkDebugf("wrote %s\n", fileName.c_str());
+ return true;
}
bool IncludeParser::findComments(const Definition& includeDef, Definition* markupDef) {
@@ -960,7 +955,8 @@ bool IncludeParser::parseComment(const string& filename, const char* start, cons
if (!parser.skipWord(kKeyWords[(int) markupDef->fKeyWord].fName)) {
return reportError<bool>("missing object type");
}
- if (!parser.skipWord(markupDef->fName.c_str())) {
+ if (!parser.skipWord(markupDef->fName.c_str()) &&
+ KeyWord::kEnum != markupDef->fKeyWord) {
return reportError<bool>("missing object name");
}
@@ -1232,6 +1228,9 @@ bool IncludeParser::parseMethod(Definition* child, Definition* markupDef) {
break;
}
}
+ while (end > start && ' ' >= end[-1]) {
+ --end;
+ }
markupDef->fTokens.emplace_back(MarkType::kMethod, start, end, tokenIter->fLineCount,
markupDef);
Definition* markupChild = &markupDef->fTokens.back();
@@ -1404,14 +1403,14 @@ bool IncludeParser::parseChar() {
char test = *fChar;
if ('\\' == fPrev) {
if ('\n' == test) {
- ++fLineCount;
+// ++fLineCount;
fLine = fChar + 1;
}
goto done;
}
switch (test) {
case '\n':
- ++fLineCount;
+// ++fLineCount;
fLine = fChar + 1;
if (fInChar) {
return reportError<bool>("malformed char");
@@ -1777,7 +1776,7 @@ bool IncludeParser::parseChar() {
}
done:
fPrev = test;
- ++fChar;
+ this->next();
return true;
}
diff --git a/tools/bookmaker/includeWriter.cpp b/tools/bookmaker/includeWriter.cpp
index 78b0364b06..90f0d6c171 100644
--- a/tools/bookmaker/includeWriter.cpp
+++ b/tools/bookmaker/includeWriter.cpp
@@ -79,12 +79,12 @@ void IncludeWriter::enumHeaderOut(const RootDefinition* root,
this->lfcr();
wroteHeader = true;
}
- this->rewriteBlock((int) (commentEnd - commentStart), commentStart);
+ this->rewriteBlock((int) (commentEnd - commentStart), commentStart, Phrase::kNo);
if (MarkType::kAnchor == test->fMarkType) {
commentStart = test->fContentStart;
commentEnd = test->fChildren[0]->fStart;
this->writeSpace();
- this->rewriteBlock((int) (commentEnd - commentStart), commentStart);
+ this->rewriteBlock((int) (commentEnd - commentStart), commentStart, Phrase::kNo);
this->writeSpace();
}
commentStart = test->fTerminator;
@@ -207,7 +207,7 @@ void IncludeWriter::enumMembersOut(const RootDefinition* root, Definition& child
this->indentToColumn(fEnumItemCommentTab);
this->writeString("//!<");
this->writeSpace();
- this->rewriteBlock(commentLen, commentStart);
+ this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
}
if (onePast) {
fIndent -= 4;
@@ -274,7 +274,8 @@ void IncludeWriter::enumMembersOut(const RootDefinition* root, Definition& child
if (!currentEnumItem->fShort) {
this->writeCommentHeader();
fIndent += 4;
- bool wroteLineFeed = Wrote::kLF == this->rewriteBlock(commentLen, commentStart);
+ bool wroteLineFeed = Wrote::kLF ==
+ this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
fIndent -= 4;
if (wroteLineFeed || fColumn > 100 - 3 /* space * / */ ) {
this->lfcr();
@@ -405,6 +406,9 @@ void IncludeWriter::enumSizeItems(const Definition& child) {
// walk children and output complete method doxygen description
void IncludeWriter::methodOut(const Definition* method, const Definition& child) {
+ if ("SkPath::getGenerationID" == method->fName) {
+ SkDebugf("");
+ }
fBmhMethod = method;
fMethodDef = &child;
fContinuation = nullptr;
@@ -427,14 +431,14 @@ void IncludeWriter::methodOut(const Definition* method, const Definition& child)
commentLen = (int) (methodProp->fStart - commentStart);
if (commentLen > 0) {
SkASSERT(commentLen < 1000);
- if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart)) {
+ if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) {
this->lfcr();
}
}
commentStart = methodProp->fContentStart;
commentLen = (int) (methodProp->fContentEnd - commentStart);
if (commentLen > 0) {
- if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart)) {
+ if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) {
this->lfcr();
}
}
@@ -447,7 +451,7 @@ void IncludeWriter::methodOut(const Definition* method, const Definition& child)
commentStart = methodProp->fContentStart;
commentLen = (int) (methodProp->fContentEnd - commentStart);
if (commentLen > 0) {
- if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart)) {
+ if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) {
this->lfcr();
}
}
@@ -458,7 +462,7 @@ void IncludeWriter::methodOut(const Definition* method, const Definition& child)
commentLen = (int) (methodProp->fStart - commentStart);
if (commentLen > 0) {
SkASSERT(commentLen < 1000);
- if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart)) {
+ if (Wrote::kNone != this->rewriteBlock(commentLen, commentStart, Phrase::kNo)) {
this->lfcr();
}
}
@@ -474,7 +478,7 @@ void IncludeWriter::methodOut(const Definition* method, const Definition& child)
}
}
SkASSERT(commentLen > 0 && commentLen < 1500);
- this->rewriteBlock(commentLen, commentStart);
+ this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
// compute indention column
size_t column = 0;
bool hasParmReturn = false;
@@ -513,7 +517,7 @@ void IncludeWriter::methodOut(const Definition* method, const Definition& child)
// FIXME : detect this earlier; assert if #Return is empty
SkASSERT(partLen > 0 && partLen < 200);
fIndent = column;
- this->rewriteBlock(partLen, partStart);
+ this->rewriteBlock(partLen, partStart, Phrase::kYes);
fIndent = saveIndent;
this->lfcr();
}
@@ -525,6 +529,7 @@ void IncludeWriter::methodOut(const Definition* method, const Definition& child)
this->writeCommentTrailer();
fBmhMethod = nullptr;
fMethodDef = nullptr;
+ fWroteMethod = true;
}
void IncludeWriter::structOut(const Definition* root, const Definition& child,
@@ -537,15 +542,18 @@ void IncludeWriter::structOut(const Definition* root, const Definition& child,
this->writeString(child.fName.c_str());
fIndent += 4;
this->lfcr();
- this->rewriteBlock((int) (commentEnd - commentStart), commentStart);
+ this->rewriteBlock((int) (commentEnd - commentStart), commentStart, Phrase::kNo);
fIndent -= 4;
this->lfcr();
this->writeCommentTrailer();
}
Definition* IncludeWriter::structMemberOut(const Definition* memberStart, const Definition& child) {
- const char* blockStart = fDeferComment ? fLastComment->fContentEnd : fStart;
- this->writeBlockTrim((int) (memberStart->fStart - blockStart), blockStart);
+ const char* blockStart = !fWroteMethod && fDeferComment ? fLastComment->fContentEnd : fStart;
+ const char* blockEnd = fWroteMethod && fDeferComment ? fDeferComment->fStart - 1 :
+ memberStart->fStart;
+ this->writeBlockTrim((int) (blockEnd - blockStart), blockStart);
+ fWroteMethod = false;
const char* commentStart = nullptr;
ptrdiff_t commentLen = 0;
string name(child.fContentStart, (int) (child.fContentEnd - child.fContentStart));
@@ -567,7 +575,7 @@ Definition* IncludeWriter::structMemberOut(const Definition* memberStart, const
fIndent += 4;
for (auto child : commentBlock->fChildren) {
commentLen = child->fStart - commentStart;
- wroteLineFeed |= Wrote::kLF == this->rewriteBlock(commentLen, commentStart);
+ wroteLineFeed |= Wrote::kLF == this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
if (MarkType::kFormula == child->fMarkType) {
this->writeSpace();
this->writeBlock((int) (child->fContentEnd - child->fContentStart),
@@ -576,7 +584,7 @@ Definition* IncludeWriter::structMemberOut(const Definition* memberStart, const
commentStart = child->fTerminator;
}
commentLen = commentBlock->fContentEnd - commentStart;
- wroteLineFeed |= Wrote::kLF == this->rewriteBlock(commentLen, commentStart);
+ wroteLineFeed |= Wrote::kLF == this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
fIndent -= 4;
if (wroteLineFeed || fColumn > 100 - 3 /* space * / */ ) {
this->lfcr();
@@ -610,7 +618,7 @@ Definition* IncludeWriter::structMemberOut(const Definition* memberStart, const
this->indentToColumn(fStructCommentTab);
this->writeString("//!<");
this->writeSpace();
- this->rewriteBlock(commentLen, commentStart);
+ this->rewriteBlock(commentLen, commentStart, Phrase::kNo);
this->lfcr();
}
return valueEnd;
@@ -652,7 +660,10 @@ void IncludeWriter::structSizeMembers(Definition& child) {
case KeyWord::kConstExpr:
case KeyWord::kStatic:
case KeyWord::kInt:
+ case KeyWord::kUint8_t:
+ case KeyWord::kUint16_t:
case KeyWord::kUint32_t:
+ case KeyWord::kUint64_t:
case KeyWord::kSize_t:
case KeyWord::kFloat:
case KeyWord::kBool:
@@ -768,10 +779,14 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
}
if (fContinuation) {
if (Definition::Type::kKeyWord == child.fType) {
- if (KeyWord::kFriend == child.fKeyWord || KeyWord::kBool == child.fKeyWord ||
+ if (KeyWord::kFriend == child.fKeyWord ||
KeyWord::kSK_API == child.fKeyWord) {
continue;
}
+ const IncludeKey& includeKey = kKeyWords[(int) child.fKeyWord];
+ if (KeyProperty::kNumber == includeKey.fProperty) {
+ continue;
+ }
}
if (Definition::Type::kBracket == child.fType && Bracket::kParen == child.fBracket) {
if (!clonedMethod) {
@@ -832,6 +847,11 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
this->methodOut(method, child);
continue;
}
+ if (Definition::Type::kPunctuation == child.fType &&
+ Punctuation::kAsterisk == child.fPunctuation &&
+ clonedMethod) {
+ continue;
+ }
if (inConstructor) {
continue;
}
@@ -983,7 +1003,10 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
case KeyWord::kConstExpr:
case KeyWord::kStatic:
case KeyWord::kInt:
+ case KeyWord::kUint8_t:
+ case KeyWord::kUint16_t:
case KeyWord::kUint32_t:
+ case KeyWord::kUint64_t:
case KeyWord::kUnsigned:
case KeyWord::kSize_t:
case KeyWord::kFloat:
@@ -1024,6 +1047,8 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
fIndent -= 4;
fContinuation = nullptr;
fDeferComment = nullptr;
+ } else if (KeyWord::kUint8_t == child.fKeyWord) {
+ continue;
} else {
if (fInEnum && KeyWord::kClass == child.fChildren[0]->fKeyWord) {
if (!this->populate(child.fChildren[0], &pair, root)) {
@@ -1039,6 +1064,7 @@ bool IncludeWriter::populate(Definition* def, ParentPair* prevPair, RootDefiniti
if (KeyWord::kEnum == child.fParent->fKeyWord ||
(KeyWord::kClass == child.fParent->fKeyWord && child.fParent->fParent &&
KeyWord::kEnum == child.fParent->fParent->fKeyWord)) {
+ SkASSERT(Bracket::kBrace == child.fBracket);
this->enumMembersOut(root, child);
this->writeString("};");
this->lf(2);
@@ -1098,6 +1124,9 @@ bool IncludeWriter::populate(BmhParser& bmhParser) {
bool allPassed = true;
for (auto& includeMapper : fIncludeMap) {
size_t lastSlash = includeMapper.first.rfind('/');
+ if (string::npos == lastSlash) {
+ lastSlash = includeMapper.first.rfind('\\');
+ }
if (string::npos == lastSlash || lastSlash >= includeMapper.first.length() - 1) {
return this->reportError<bool>("malformed include name");
}
@@ -1126,6 +1155,7 @@ bool IncludeWriter::populate(BmhParser& bmhParser) {
this->lfcr();
this->writePending();
fclose(fOut);
+ SkDebugf("wrote %s\n", fileName.c_str());
}
return allPassed;
}
@@ -1226,17 +1256,21 @@ string IncludeWriter::resolveRef(const char* start, const char* end, bool first,
(int) (child->fContentEnd - child->fContentStart));
break;
}
- if (MarkType::kClass == child->fMarkType ||
- MarkType::kStruct == child->fMarkType ||
- MarkType::kEnum == child->fMarkType ||
- MarkType::kEnumClass == child->fMarkType) {
- substitute = child->fName;
- if (MarkType::kEnum == child->fMarkType && fInEnum) {
- size_t parentClassEnd = substitute.find("::");
- SkASSERT(string::npos != parentClassEnd);
- substitute = substitute.substr(parentClassEnd + 2);
+ }
+ if (!substitute.length()) {
+ for (auto child : rootDef->fChildren) {
+ if (MarkType::kClass == child->fMarkType ||
+ MarkType::kStruct == child->fMarkType ||
+ (MarkType::kEnum == child->fMarkType && !child->fAnonymous) ||
+ MarkType::kEnumClass == child->fMarkType) {
+ substitute = child->fName;
+ if (MarkType::kEnum == child->fMarkType && fInEnum) {
+ size_t parentClassEnd = substitute.find("::");
+ SkASSERT(string::npos != parentClassEnd);
+ substitute = substitute.substr(parentClassEnd + 2);
+ }
+ break;
}
- break;
}
}
if (!substitute.length()) {
@@ -1244,7 +1278,7 @@ string IncludeWriter::resolveRef(const char* start, const char* end, bool first,
if (parent) {
if (MarkType::kClass == parent->fMarkType ||
MarkType::kStruct == parent->fMarkType ||
- MarkType::kEnum == parent->fMarkType ||
+ (MarkType::kEnum == parent->fMarkType && !parent->fAnonymous) ||
MarkType::kEnumClass == parent->fMarkType) {
if (parent->fParent != fRootTopic) {
substitute = parent->fName;
@@ -1324,7 +1358,7 @@ int IncludeWriter::lookupReference(const PunctuationState punctuation, const Wor
}
/* returns true if rewriteBlock wrote linefeeds */
-IncludeWriter::Wrote IncludeWriter::rewriteBlock(int size, const char* data) {
+IncludeWriter::Wrote IncludeWriter::rewriteBlock(int size, const char* data, Phrase phrase) {
bool wroteLineFeeds = false;
while (size > 0 && data[0] <= ' ') {
--size;
@@ -1338,7 +1372,8 @@ IncludeWriter::Wrote IncludeWriter::rewriteBlock(int size, const char* data) {
}
int run = 0;
Word word = Word::kStart;
- PunctuationState punctuation = PunctuationState::kStart;
+ PunctuationState punctuation = Phrase::kNo == phrase ?
+ PunctuationState::kStart : PunctuationState::kSpace;
int start = 0;
int lastWrite = 0;
int lineFeeds = 0;
diff --git a/tools/bookmaker/mdOut.cpp b/tools/bookmaker/mdOut.cpp
index 0a53fc4147..b0cec6659b 100644
--- a/tools/bookmaker/mdOut.cpp
+++ b/tools/bookmaker/mdOut.cpp
@@ -22,7 +22,9 @@ string MdOut::addReferences(const char* refStart, const char* refEnd,
bool lineStart = true;
string ref;
string leadingSpaces;
+ int distFromParam = 99;
do {
+ ++distFromParam;
const char* base = t.fChar;
t.skipWhiteSpace();
const char* wordStart = t.fChar;
@@ -138,6 +140,8 @@ string MdOut::addReferences(const char* refStart, const char* refEnd,
const Definition* def;
if (fMethod && (def = fMethod->hasParam(ref))) {
result += linkRef(leadingSpaces, def, ref);
+ fLastParam = def;
+ distFromParam = 0;
continue;
} else if (!fInDescription && ref[0] != '0'
&& string::npos != ref.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ")) {
@@ -145,6 +149,23 @@ string MdOut::addReferences(const char* refStart, const char* refEnd,
if (('f' != ref[0] && string::npos == ref.find("()"))
// || '.' != t.backup(ref.c_str())
&& ('k' != ref[0] && string::npos == ref.find("_Private"))) {
+ if ('.' == wordStart[0] && distFromParam == 1) {
+ const Definition* paramType = this->findParamType();
+ if (paramType) {
+ string fullName = paramType->fName + "::" + ref;
+ bool found = false;
+ for (auto child : paramType->fChildren) {
+ if (fullName == child->fName) {
+ result += linkRef(leadingSpaces, paramType, ref);
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ continue;
+ }
+ }
+ }
if (BmhParser::Resolvable::kOut != resolvable) {
t.reportError("missed camelCase");
return result;
@@ -242,6 +263,7 @@ bool MdOut::buildRefFromFile(const char* name, const char* outDir) {
filename = match + ".md";
match += ".bmh";
fOut = nullptr;
+ string fullName;
for (const auto& topic : fBmhParser.fTopicMap) {
Definition* topicDef = topic.second;
if (topicDef->fParent) {
@@ -255,7 +277,7 @@ bool MdOut::buildRefFromFile(const char* name, const char* outDir) {
continue;
}
if (!fOut) {
- string fullName(outDir);
+ fullName = outDir;
if ('/' != fullName.back()) {
fullName += '/';
}
@@ -279,6 +301,7 @@ bool MdOut::buildRefFromFile(const char* name, const char* outDir) {
if (fOut) {
this->writePending();
fclose(fOut);
+ SkDebugf("wrote %s\n", fullName.c_str());
fOut = nullptr;
}
return true;
@@ -330,6 +353,31 @@ void MdOut::childrenOut(const Definition* def, const char* start) {
}
}
+const Definition* MdOut::findParamType() {
+ SkASSERT(fMethod);
+ TextParser parser(fMethod->fFileName, fMethod->fStart, fMethod->fContentStart,
+ fMethod->fLineCount);
+ string lastFull;
+ do {
+ parser.skipToAlpha();
+ if (parser.eof()) {
+ return nullptr;
+ }
+ const char* word = parser.fChar;
+ parser.skipFullName();
+ SkASSERT(!parser.eof());
+ string name = string(word, parser.fChar - word);
+ if (fLastParam->fName == name) {
+ const Definition* paramType = this->isDefined(parser, lastFull, false);
+ return paramType;
+ }
+ if (isupper(name[0])) {
+ lastFull = name;
+ }
+ } while (true);
+ return nullptr;
+}
+
const Definition* MdOut::isDefined(const TextParser& parser, const string& ref, bool report) const {
auto rootIter = fBmhParser.fClassMap.find(ref);
if (rootIter != fBmhParser.fClassMap.end()) {
diff --git a/tools/bookmaker/spellCheck.cpp b/tools/bookmaker/spellCheck.cpp
index 06a5d2be70..7a45fb04ed 100644
--- a/tools/bookmaker/spellCheck.cpp
+++ b/tools/bookmaker/spellCheck.cpp
@@ -485,9 +485,11 @@ void SpellCheck::report(SkCommandLineFlags::StringArray report) {
}
}
SkDebugf("\n");
+ return;
}
if (report.contains("all")) {
int column = 0;
+ char lastInitial = 'a';
for (auto iter : elems) {
if (string::npos != iter.second.fFile.find("undocumented.bmh")) {
continue;
@@ -509,50 +511,47 @@ void SpellCheck::report(SkCommandLineFlags::StringArray report) {
if (!allLower) {
continue;
}
- if (column + check.length() > 100) {
+ if (column + check.length() > 100 || check[0] != lastInitial) {
SkDebugf("\n");
column = 0;
}
+ if (check[0] != lastInitial) {
+ SkDebugf("\n");
+ lastInitial = check[0];
+ }
SkDebugf("%s ", check.c_str());
column += check.length();
}
SkDebugf("\n\n");
+ return;
}
- if (report.contains("mispellings")) {
- const char* mispelled[] = {
- "decrementing",
- "differentially",
- "incrementing",
- "superset",
- };
- const char** mispellPtr = mispelled;
- const char** mispellEnd = &mispelled[SK_ARRAY_COUNT(mispelled)];
- for (auto iter : elems) {
- if (string::npos != iter.second.fFile.find("undocumented.bmh")) {
- continue;
- }
- if (string::npos != iter.second.fFile.find("markup.bmh")) {
- continue;
- }
- if (string::npos != iter.second.fFile.find("usingBookmaker.bmh")) {
- continue;
- }
- string check = iter.first.c_str();
- while (check.compare(*mispellPtr) > 0) {
- SkDebugf("%s not found\n", *mispellPtr);
- if (mispellEnd == ++mispellPtr) {
- break;
- }
- }
- if (mispellEnd == mispellPtr) {
+ int index = 0;
+ const char* mispelled = report[0];
+ for (auto iter : elems) {
+ if (string::npos != iter.second.fFile.find("undocumented.bmh")) {
+ continue;
+ }
+ if (string::npos != iter.second.fFile.find("markup.bmh")) {
+ continue;
+ }
+ if (string::npos != iter.second.fFile.find("usingBookmaker.bmh")) {
+ continue;
+ }
+ string check = iter.first.c_str();
+ while (check.compare(mispelled) > 0) {
+ SkDebugf("%s not found\n", mispelled);
+ if (report.count() == ++index) {
break;
}
- if (check.compare(*mispellPtr) == 0) {
- SkDebugf("%s(%d): %s\n", iter.second.fFile.c_str(), iter.second.fLine,
- iter.first.c_str());
- if (mispellEnd == ++mispellPtr) {
- break;
- }
+ }
+ if (report.count() == index) {
+ break;
+ }
+ if (check.compare(mispelled) == 0) {
+ SkDebugf("%s(%d): %s\n", iter.second.fFile.c_str(), iter.second.fLine,
+ iter.first.c_str());
+ if (report.count() == ++index) {
+ break;
}
}
}