Remove base class ToJavaScript methods in FormCalc

This CL removes the Loop base class as it adds no functionality. Other
base classes have had their ToJavaScript methods set as pure virtual and
their constructors made protected.

Change-Id: I5c77b8734d23c576dd52db7f72396ecdf2f7bd22
Reviewed-on: https://pdfium-review.googlesource.com/27270
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
index 97652bc..ae6cdb4 100644
--- a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
@@ -27,11 +27,6 @@
 CXFA_FMExpression::CXFA_FMExpression(uint32_t line, XFA_FM_EXPTYPE type)
     : m_type(type), m_line(line) {}
 
-bool CXFA_FMExpression::ToJavaScript(CFX_WideTextBuf& js, ReturnType type) {
-  CXFA_FMToJavaScriptDepth depthManager;
-  return !CXFA_IsTooBig(js) && depthManager.IsWithinMaxDepth();
-}
-
 CXFA_FMFunctionDefinition::CXFA_FMFunctionDefinition(
     uint32_t line,
     bool isGlobal,
@@ -291,18 +286,11 @@
   return !CXFA_IsTooBig(js);
 }
 
-CXFA_FMLoopExpression::~CXFA_FMLoopExpression() {}
-
-bool CXFA_FMLoopExpression::ToJavaScript(CFX_WideTextBuf& js, ReturnType type) {
-  CXFA_FMToJavaScriptDepth depthManager;
-  return !CXFA_IsTooBig(js) && depthManager.IsWithinMaxDepth();
-}
-
 CXFA_FMWhileExpression::CXFA_FMWhileExpression(
     uint32_t line,
     std::unique_ptr<CXFA_FMSimpleExpression> pCondition,
     std::unique_ptr<CXFA_FMExpression> pExpression)
-    : CXFA_FMLoopExpression(line),
+    : CXFA_FMExpression(line),
       m_pCondition(std::move(pCondition)),
       m_pExpression(std::move(pExpression)) {}
 
@@ -369,7 +357,7 @@
     int32_t iDirection,
     std::unique_ptr<CXFA_FMSimpleExpression> pStep,
     std::unique_ptr<CXFA_FMExpression> pList)
-    : CXFA_FMLoopExpression(line),
+    : CXFA_FMExpression(line),
       m_wsVariant(wsVariant),
       m_pAssignment(std::move(pAssignment)),
       m_pAccessor(std::move(pAccessor)),
@@ -434,7 +422,7 @@
     const WideStringView& wsIdentifier,
     std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pAccessors,
     std::unique_ptr<CXFA_FMExpression> pList)
-    : CXFA_FMLoopExpression(line),
+    : CXFA_FMExpression(line),
       m_wsIdentifier(wsIdentifier),
       m_pAccessors(std::move(pAccessors)),
       m_pList(std::move(pList)) {}
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.h b/xfa/fxfa/fm2js/cxfa_fmexpression.h
index 104b897..5140ed3 100644
--- a/xfa/fxfa/fm2js/cxfa_fmexpression.h
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.h
@@ -27,14 +27,16 @@
 
 class CXFA_FMExpression {
  public:
-  explicit CXFA_FMExpression(uint32_t line);
-  CXFA_FMExpression(uint32_t line, XFA_FM_EXPTYPE type);
   virtual ~CXFA_FMExpression() {}
+  virtual bool ToJavaScript(CFX_WideTextBuf& javascript, ReturnType type) = 0;
 
-  virtual bool ToJavaScript(CFX_WideTextBuf& javascript, ReturnType type);
   uint32_t GetLine() { return m_line; }
   XFA_FM_EXPTYPE GetExpType() const { return m_type; }
 
+ protected:
+  explicit CXFA_FMExpression(uint32_t line);
+  CXFA_FMExpression(uint32_t line, XFA_FM_EXPTYPE type);
+
  private:
   XFA_FM_EXPTYPE m_type;
   uint32_t m_line;
@@ -126,15 +128,7 @@
   std::unique_ptr<CXFA_FMExpression> m_pElseExpression;
 };
 
-class CXFA_FMLoopExpression : public CXFA_FMExpression {
- public:
-  explicit CXFA_FMLoopExpression(uint32_t line) : CXFA_FMExpression(line) {}
-  ~CXFA_FMLoopExpression() override;
-
-  bool ToJavaScript(CFX_WideTextBuf& javascript, ReturnType type) override;
-};
-
-class CXFA_FMWhileExpression : public CXFA_FMLoopExpression {
+class CXFA_FMWhileExpression : public CXFA_FMExpression {
  public:
   CXFA_FMWhileExpression(uint32_t line,
                          std::unique_ptr<CXFA_FMSimpleExpression> pCodition,
@@ -164,7 +158,7 @@
   bool ToJavaScript(CFX_WideTextBuf& javascript, ReturnType type) override;
 };
 
-class CXFA_FMForExpression : public CXFA_FMLoopExpression {
+class CXFA_FMForExpression : public CXFA_FMExpression {
  public:
   CXFA_FMForExpression(uint32_t line,
                        const WideStringView& wsVariant,
@@ -186,7 +180,7 @@
   std::unique_ptr<CXFA_FMExpression> m_pList;
 };
 
-class CXFA_FMForeachExpression : public CXFA_FMLoopExpression {
+class CXFA_FMForeachExpression : public CXFA_FMExpression {
  public:
   // Takes ownership of |pAccessors|.
   CXFA_FMForeachExpression(
diff --git a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
index 8354072..ec61511 100644
--- a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.cpp
@@ -74,11 +74,6 @@
 CXFA_FMSimpleExpression::CXFA_FMSimpleExpression(uint32_t line, XFA_FM_TOKEN op)
     : m_line(line), m_op(op) {}
 
-bool CXFA_FMSimpleExpression::ToJavaScript(CFX_WideTextBuf& js,
-                                           ReturnType type) {
-  CXFA_FMToJavaScriptDepth depthManager;
-  return !CXFA_IsTooBig(js) && depthManager.IsWithinMaxDepth();
-}
 XFA_FM_TOKEN CXFA_FMSimpleExpression::GetOperatorToken() const {
   return m_op;
 }
@@ -195,13 +190,7 @@
     std::unique_ptr<CXFA_FMSimpleExpression> pExp)
     : CXFA_FMSimpleExpression(line, op), m_pExp(std::move(pExp)) {}
 
-CXFA_FMUnaryExpression::~CXFA_FMUnaryExpression() {}
-
-bool CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& js,
-                                          ReturnType type) {
-  CXFA_FMToJavaScriptDepth depthManager;
-  return !CXFA_IsTooBig(js) && depthManager.IsWithinMaxDepth();
-}
+CXFA_FMUnaryExpression::~CXFA_FMUnaryExpression() = default;
 
 CXFA_FMBinExpression::CXFA_FMBinExpression(
     uint32_t line,
@@ -212,12 +201,7 @@
       m_pExp1(std::move(pExp1)),
       m_pExp2(std::move(pExp2)) {}
 
-CXFA_FMBinExpression::~CXFA_FMBinExpression() {}
-
-bool CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& js, ReturnType type) {
-  CXFA_FMToJavaScriptDepth depthManager;
-  return !CXFA_IsTooBig(js) && depthManager.IsWithinMaxDepth();
-}
+CXFA_FMBinExpression::~CXFA_FMBinExpression() = default;
 
 CXFA_FMAssignExpression::CXFA_FMAssignExpression(
     uint32_t line,
diff --git a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h
index 57f4d2e..bc41c74 100644
--- a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h
+++ b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression.h
@@ -25,14 +25,14 @@
 
 class CXFA_FMSimpleExpression {
  public:
-  CXFA_FMSimpleExpression(uint32_t line, XFA_FM_TOKEN op);
   virtual ~CXFA_FMSimpleExpression() {}
-
-  virtual bool ToJavaScript(CFX_WideTextBuf& javascript, ReturnType type);
+  virtual bool ToJavaScript(CFX_WideTextBuf& javascript, ReturnType type) = 0;
 
   XFA_FM_TOKEN GetOperatorToken() const;
 
  protected:
+  CXFA_FMSimpleExpression(uint32_t line, XFA_FM_TOKEN op);
+
   uint32_t m_line;
   const XFA_FM_TOKEN m_op;
 };
@@ -80,28 +80,26 @@
 
 class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression {
  public:
+  ~CXFA_FMUnaryExpression() override;
+
+ protected:
   CXFA_FMUnaryExpression(uint32_t line,
                          XFA_FM_TOKEN op,
                          std::unique_ptr<CXFA_FMSimpleExpression> pExp);
-  ~CXFA_FMUnaryExpression() override;
 
-  bool ToJavaScript(CFX_WideTextBuf& javascript, ReturnType type) override;
-
- protected:
   std::unique_ptr<CXFA_FMSimpleExpression> m_pExp;
 };
 
 class CXFA_FMBinExpression : public CXFA_FMSimpleExpression {
  public:
+  ~CXFA_FMBinExpression() override;
+
+ protected:
   CXFA_FMBinExpression(uint32_t line,
                        XFA_FM_TOKEN op,
                        std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
                        std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
-  ~CXFA_FMBinExpression() override;
 
-  bool ToJavaScript(CFX_WideTextBuf& javascript, ReturnType type) override;
-
- protected:
   std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
   std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
 };
diff --git a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression_unittest.cpp b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression_unittest.cpp
index e97df41..168de84 100644
--- a/xfa/fxfa/fm2js/cxfa_fmsimpleexpression_unittest.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmsimpleexpression_unittest.cpp
@@ -21,7 +21,7 @@
 
   std::vector<std::unique_ptr<CXFA_FMSimpleExpression>> args;
   for (size_t i = 0; i < 50; i++)
-    args.push_back(pdfium::MakeUnique<CXFA_FMSimpleExpression>(0, TOKnan));
+    args.push_back(pdfium::MakeUnique<CXFA_FMNullExpression>(0));
 
   CXFA_FMToJavaScriptDepth::Reset();
   CXFA_FMCallExpression callExp(0, std::move(exp), std::move(args), true);
@@ -37,9 +37,9 @@
     result += L"pfm_rt.get_";
     // Object positions for sign() method.
     if (i == 0 || i == 5 || i == 6)
-      result += L"jsobj()";
+      result += L"jsobj(null)";
     else
-      result += L"val()";
+      result += L"val(null)";
   }
   result += L")";