Nest CXFA_FMToken in CXFA_FMLexer
Get closer to the one class per file rule.
-- Make it a struct while we're at it.
Change-Id: I95ce7b5f46ab2bfe7408d2e9ca3caabfa3ab2d72
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/79951
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
index 159910f..b6eb7ea 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer.cpp
@@ -115,16 +115,16 @@
} // namespace
-CXFA_FMToken::CXFA_FMToken(XFA_FM_TOKEN token) : m_type(token) {}
+CXFA_FMLexer::Token::Token(XFA_FM_TOKEN token) : m_type(token) {}
-CXFA_FMToken::CXFA_FMToken() : CXFA_FMToken(TOKreserver) {}
+CXFA_FMLexer::Token::Token() : Token(TOKreserver) {}
-CXFA_FMToken::CXFA_FMToken(const CXFA_FMToken&) = default;
+CXFA_FMLexer::Token::Token(const Token& that) = default;
-CXFA_FMToken::~CXFA_FMToken() = default;
+CXFA_FMLexer::Token::~Token() = default;
#ifndef NDEBUG
-WideString CXFA_FMToken::ToDebugString() const {
+WideString CXFA_FMLexer::Token::ToDebugString() const {
WideString str = WideString::FromASCII("type = ");
str += WideString::FromASCII(tokenStrings[m_type]);
str += WideString::FromASCII(", string = ");
@@ -138,14 +138,14 @@
CXFA_FMLexer::~CXFA_FMLexer() = default;
-CXFA_FMToken CXFA_FMLexer::NextToken() {
+CXFA_FMLexer::Token CXFA_FMLexer::NextToken() {
if (m_bLexerError)
- return CXFA_FMToken();
+ return Token();
while (!IsComplete() && m_spInput[m_nCursor]) {
if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
switch (m_spInput[m_nCursor]) {
@@ -174,90 +174,90 @@
case '=':
++m_nCursor;
if (m_nCursor >= m_spInput.size())
- return CXFA_FMToken(TOKassign);
+ return Token(TOKassign);
if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
if (m_spInput[m_nCursor] == '=') {
++m_nCursor;
- return CXFA_FMToken(TOKeq);
+ return Token(TOKeq);
}
- return CXFA_FMToken(TOKassign);
+ return Token(TOKassign);
case '<':
++m_nCursor;
if (m_nCursor >= m_spInput.size())
- return CXFA_FMToken(TOKlt);
+ return Token(TOKlt);
if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
if (m_spInput[m_nCursor] == '=') {
++m_nCursor;
- return CXFA_FMToken(TOKle);
+ return Token(TOKle);
}
if (m_spInput[m_nCursor] == '>') {
++m_nCursor;
- return CXFA_FMToken(TOKne);
+ return Token(TOKne);
}
- return CXFA_FMToken(TOKlt);
+ return Token(TOKlt);
case '>':
++m_nCursor;
if (m_nCursor >= m_spInput.size())
- return CXFA_FMToken(TOKgt);
+ return Token(TOKgt);
if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
if (m_spInput[m_nCursor] == '=') {
++m_nCursor;
- return CXFA_FMToken(TOKge);
+ return Token(TOKge);
}
- return CXFA_FMToken(TOKgt);
+ return Token(TOKgt);
case ',':
++m_nCursor;
- return CXFA_FMToken(TOKcomma);
+ return Token(TOKcomma);
case '(':
++m_nCursor;
- return CXFA_FMToken(TOKlparen);
+ return Token(TOKlparen);
case ')':
++m_nCursor;
- return CXFA_FMToken(TOKrparen);
+ return Token(TOKrparen);
case '[':
++m_nCursor;
- return CXFA_FMToken(TOKlbracket);
+ return Token(TOKlbracket);
case ']':
++m_nCursor;
- return CXFA_FMToken(TOKrbracket);
+ return Token(TOKrbracket);
case '&':
++m_nCursor;
- return CXFA_FMToken(TOKand);
+ return Token(TOKand);
case '|':
++m_nCursor;
- return CXFA_FMToken(TOKor);
+ return Token(TOKor);
case '+':
++m_nCursor;
- return CXFA_FMToken(TOKplus);
+ return Token(TOKplus);
case '-':
++m_nCursor;
- return CXFA_FMToken(TOKminus);
+ return Token(TOKminus);
case '*':
++m_nCursor;
- return CXFA_FMToken(TOKmul);
+ return Token(TOKmul);
case '/': {
++m_nCursor;
if (m_nCursor >= m_spInput.size())
- return CXFA_FMToken(TOKdiv);
+ return Token(TOKdiv);
if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
if (m_spInput[m_nCursor] != '/')
- return CXFA_FMToken(TOKdiv);
+ return Token(TOKdiv);
AdvanceForComment();
break;
@@ -265,30 +265,30 @@
case '.':
++m_nCursor;
if (m_nCursor >= m_spInput.size())
- return CXFA_FMToken(TOKdot);
+ return Token(TOKdot);
if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
if (m_spInput[m_nCursor] == '.') {
++m_nCursor;
- return CXFA_FMToken(TOKdotdot);
+ return Token(TOKdotdot);
}
if (m_spInput[m_nCursor] == '*') {
++m_nCursor;
- return CXFA_FMToken(TOKdotstar);
+ return Token(TOKdotstar);
}
if (m_spInput[m_nCursor] == '#') {
++m_nCursor;
- return CXFA_FMToken(TOKdotscream);
+ return Token(TOKdotscream);
}
if (FXSYS_IsDecimalDigit(m_spInput[m_nCursor])) {
--m_nCursor;
return AdvanceForNumber();
}
- return CXFA_FMToken(TOKdot);
+ return Token(TOKdot);
default:
if (IsWhitespaceCharacter(m_spInput[m_nCursor])) {
++m_nCursor;
@@ -296,15 +296,15 @@
}
if (!IsInitialIdentifierCharacter(m_spInput[m_nCursor])) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
return AdvanceForIdentifier();
}
}
- return CXFA_FMToken(TOKeof);
+ return Token(TOKeof);
}
-CXFA_FMToken CXFA_FMLexer::AdvanceForNumber() {
+CXFA_FMLexer::Token CXFA_FMLexer::AdvanceForNumber() {
// This will set end to the character after the end of the number.
int32_t used_length = 0;
if (m_nCursor < m_spInput.size()) {
@@ -315,17 +315,17 @@
if (used_length == 0 ||
(end < m_spInput.size() && FXSYS_iswalpha(m_spInput[end]))) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
- CXFA_FMToken token(TOKnumber);
+ Token token(TOKnumber);
token.m_string =
WideStringView(m_spInput.subspan(m_nCursor, end - m_nCursor));
m_nCursor = end;
return token;
}
-CXFA_FMToken CXFA_FMLexer::AdvanceForString() {
- CXFA_FMToken token(TOKstring);
+CXFA_FMLexer::Token CXFA_FMLexer::AdvanceForString() {
+ Token token(TOKstring);
size_t start = m_nCursor;
++m_nCursor;
while (!IsComplete() && m_spInput[m_nCursor]) {
@@ -357,16 +357,16 @@
// Didn't find the end of the string.
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
-CXFA_FMToken CXFA_FMLexer::AdvanceForIdentifier() {
+CXFA_FMLexer::Token CXFA_FMLexer::AdvanceForIdentifier() {
size_t start = m_nCursor;
++m_nCursor;
while (!IsComplete() && m_spInput[m_nCursor]) {
if (!IsFormCalcCharacter(m_spInput[m_nCursor])) {
RaiseError();
- return CXFA_FMToken();
+ return Token();
}
if (!IsIdentifierCharacter(m_spInput[m_nCursor]))
break;
@@ -376,7 +376,7 @@
WideStringView str =
WideStringView(m_spInput.subspan(start, m_nCursor - start));
- CXFA_FMToken token(TokenizeIdentifier(str));
+ Token token(TokenizeIdentifier(str));
token.m_string = str;
return token;
}
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer.h b/xfa/fxfa/fm2js/cxfa_fmlexer.h
index fe55a12..d820186 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer.h
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer.h
@@ -81,35 +81,34 @@
TOKreserver
};
-class CXFA_FMToken {
- public:
- CXFA_FMToken();
- explicit CXFA_FMToken(XFA_FM_TOKEN token);
- CXFA_FMToken(const CXFA_FMToken&);
- ~CXFA_FMToken();
-
-#ifndef NDEBUG
- WideString ToDebugString() const;
-#endif // NDEBUG
-
- WideStringView m_string;
- XFA_FM_TOKEN m_type;
-};
-
class CXFA_FMLexer {
CPPGC_STACK_ALLOCATED(); // Raw pointers allowed.
public:
+ struct Token {
+ Token();
+ explicit Token(XFA_FM_TOKEN token);
+ Token(const Token& that);
+ ~Token();
+
+#ifndef NDEBUG
+ WideString ToDebugString() const;
+#endif // NDEBUG
+
+ WideStringView m_string;
+ XFA_FM_TOKEN m_type;
+ };
+
explicit CXFA_FMLexer(WideStringView wsFormcalc);
~CXFA_FMLexer();
- CXFA_FMToken NextToken();
+ Token NextToken();
bool IsComplete() const { return m_nCursor >= m_spInput.size(); }
private:
- CXFA_FMToken AdvanceForNumber();
- CXFA_FMToken AdvanceForString();
- CXFA_FMToken AdvanceForIdentifier();
+ Token AdvanceForNumber();
+ Token AdvanceForString();
+ Token AdvanceForIdentifier();
void AdvanceForComment();
void RaiseError() { m_bLexerError = true; }
diff --git a/xfa/fxfa/fm2js/cxfa_fmlexer_unittest.cpp b/xfa/fxfa/fm2js/cxfa_fmlexer_unittest.cpp
index 3f5eacc..6ecc3b9 100644
--- a/xfa/fxfa/fm2js/cxfa_fmlexer_unittest.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmlexer_unittest.cpp
@@ -13,14 +13,14 @@
TEST(CXFA_FMLexerTest, NullString) {
WideStringView null_string;
CXFA_FMLexer lexer(null_string);
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKeof, token.m_type);
EXPECT_TRUE(lexer.IsComplete());
}
TEST(CXFA_FMLexerTest, EmptyString) {
CXFA_FMLexer lexer(L"");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKeof, token.m_type);
EXPECT_TRUE(lexer.IsComplete());
}
@@ -28,7 +28,7 @@
TEST(CXFA_FMLexerTest, Numbers) {
{
CXFA_FMLexer lexer(L"-12");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
// TODO(dsinclair): Should this return -12 instead of two tokens?
EXPECT_EQ(TOKminus, token.m_type);
token = lexer.NextToken();
@@ -38,31 +38,31 @@
}
{
CXFA_FMLexer lexer(L"1.5362");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
EXPECT_EQ(L"1.5362", token.m_string);
}
{
CXFA_FMLexer lexer(L"0.875");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
EXPECT_EQ(L"0.875", token.m_string);
}
{
CXFA_FMLexer lexer(L"5.56e-2");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
EXPECT_EQ(L"5.56e-2", token.m_string);
}
{
CXFA_FMLexer lexer(L"1.234E10");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
EXPECT_EQ(L"1.234E10", token.m_string);
}
{
CXFA_FMLexer lexer(L"123456789.012345678");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
// TODO(dsinclair): This should round as per IEEE 64-bit values.
// EXPECT_EQ(L"123456789.01234567", token.m_string);
@@ -70,7 +70,7 @@
}
{
CXFA_FMLexer lexer(L"99999999999999999");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
// TODO(dsinclair): This is spec'd as rounding when > 16 significant digits
// prior to the exponent.
@@ -84,7 +84,7 @@
TEST(CXFA_FMLexerTest, Strings) {
{
CXFA_FMLexer lexer(L"\"The cat jumped over the fence.\"");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKstring, token.m_type);
EXPECT_EQ(L"\"The cat jumped over the fence.\"", token.m_string);
@@ -93,14 +93,14 @@
}
{
CXFA_FMLexer lexer(L"\"\"");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKstring, token.m_type);
EXPECT_EQ(L"\"\"", token.m_string);
}
{
CXFA_FMLexer lexer(
L"\"The message reads: \"\"Warning: Insufficient Memory\"\"\"");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKstring, token.m_type);
EXPECT_EQ(L"\"The message reads: \"\"Warning: Insufficient Memory\"\"\"",
token.m_string);
@@ -108,7 +108,7 @@
{
CXFA_FMLexer lexer(
L"\"\\u0047\\u006f\\u0066\\u0069\\u0073\\u0068\\u0021\\u000d\\u000a\"");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKstring, token.m_type);
EXPECT_EQ(
L"\"\\u0047\\u006f\\u0066\\u0069\\u0073\\u0068\\u0021\\u000d\\u000a\"",
@@ -184,7 +184,7 @@
for (size_t i = 0; i < pdfium::size(op); ++i) {
CXFA_FMLexer lexer(op[i].op);
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(op[i].token, token.m_type);
EXPECT_TRUE(lexer.IsComplete());
}
@@ -193,17 +193,17 @@
TEST(CXFA_FMLexerTest, Comments) {
{
CXFA_FMLexer lexer(L"// Empty.");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKeof, token.m_type);
}
{
CXFA_FMLexer lexer(L"//");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKeof, token.m_type);
}
{
CXFA_FMLexer lexer(L"123 // Empty.\n\"str\"");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
EXPECT_EQ(L"123", token.m_string);
@@ -216,17 +216,17 @@
}
{
CXFA_FMLexer lexer(L";");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKeof, token.m_type);
}
{
CXFA_FMLexer lexer(L"; Empty.");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKeof, token.m_type);
}
{
CXFA_FMLexer lexer(L"123 ;Empty.\n\"str\"");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
EXPECT_EQ(L"123", token.m_string);
@@ -245,7 +245,7 @@
L"a", L"an_identifier", L"_ident", L"$ident", L"!ident", L"GetAddr"};
for (const auto* ident : identifiers) {
CXFA_FMLexer lexer(ident);
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKidentifier, token.m_type);
EXPECT_EQ(ident, token.m_string);
EXPECT_TRUE(lexer.IsComplete());
@@ -255,17 +255,17 @@
TEST(CXFA_FMLexerTest, InvalidIdentifiers) {
{
CXFA_FMLexer lexer(L"#a");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKreserver, token.m_type);
}
{
CXFA_FMLexer lexer(L"1a");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKreserver, token.m_type);
}
{
CXFA_FMLexer lexer(L"an@identifier");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_NE(TOKreserver, token.m_type);
token = lexer.NextToken();
EXPECT_EQ(TOKreserver, token.m_type);
@@ -274,7 +274,7 @@
}
{
CXFA_FMLexer lexer(L"_ident@");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_NE(TOKreserver, token.m_type);
token = lexer.NextToken();
EXPECT_EQ(TOKreserver, token.m_type);
@@ -285,12 +285,12 @@
TEST(CXFA_FMLexerTest, Whitespace) {
{
CXFA_FMLexer lexer(L" \t\xc\x9\xb");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKeof, token.m_type);
}
{
CXFA_FMLexer lexer(L"123 \t\xc\x9\xb 456");
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKnumber, token.m_type);
EXPECT_EQ(L"123", token.m_string);
@@ -306,7 +306,7 @@
TEST(CXFA_FMLexerTest, NullData) {
CXFA_FMLexer lexer(WideStringView(L"\x2d\x32\x00\x2d\x32", 5));
- CXFA_FMToken token = lexer.NextToken();
+ CXFA_FMLexer::Token token = lexer.NextToken();
EXPECT_EQ(TOKminus, token.m_type);
token = lexer.NextToken();
diff --git a/xfa/fxfa/fm2js/cxfa_fmparser.h b/xfa/fxfa/fm2js/cxfa_fmparser.h
index 0e61abb..eb3da64 100644
--- a/xfa/fxfa/fm2js/cxfa_fmparser.h
+++ b/xfa/fxfa/fm2js/cxfa_fmparser.h
@@ -66,7 +66,7 @@
UnownedPtr<cppgc::Heap> const m_heap;
UnownedPtr<CXFA_FMLexer> m_lexer;
- CXFA_FMToken m_token;
+ CXFA_FMLexer::Token m_token;
bool m_error = false;
unsigned long m_parse_depth = 0;
unsigned long m_max_parse_depth;