Home | History | Annotate | Download | only in fm2js
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #ifndef XFA_FXFA_FM2JS_CXFA_FMSIMPLEEXPRESSION_H_
      8 #define XFA_FXFA_FM2JS_CXFA_FMSIMPLEEXPRESSION_H_
      9 
     10 #include <memory>
     11 #include <vector>
     12 
     13 #include "xfa/fxfa/fm2js/cxfa_fmlexer.h"
     14 
     15 #define RUNTIMEFUNCTIONRETURNVALUE L"pfm_ret"
     16 #define EXCLAMATION_IN_IDENTIFIER L"pfm__excl__"
     17 
     18 enum XFA_FM_SimpleExpressionType {
     19   ASSIGN,
     20   LOGICALOR,
     21   LOGICALAND,
     22   EQUALITY,
     23   NOTEQUALITY,
     24   LESS,
     25   LESSEQUAL,
     26   GREATER,
     27   GREATEREQUAL,
     28   PLUS,
     29   MINUS,
     30   MULTIPLE,
     31   DIVIDE,
     32   POSITIVE,
     33   NEGATIVE,
     34   NOT,
     35   CALL,
     36   DOT,
     37   DOTDOT,
     38   CONCATFMOBJECT,
     39   ISFMOBJECT,
     40   ISFMARRAY,
     41   GETFMVALUE,
     42   GETFMJSOBJ,
     43   VARFILTER
     44 };
     45 
     46 class CFX_WideTextBuf;
     47 
     48 WideStringView XFA_FM_EXPTypeToString(
     49     XFA_FM_SimpleExpressionType simpleExpType);
     50 
     51 enum XFA_FM_AccessorIndex {
     52   ACCESSOR_NO_INDEX,
     53   ACCESSOR_NO_RELATIVEINDEX,
     54   ACCESSOR_POSITIVE_INDEX,
     55   ACCESSOR_NEGATIVE_INDEX
     56 };
     57 
     58 class CXFA_FMSimpleExpression {
     59  public:
     60   CXFA_FMSimpleExpression(uint32_t line, XFA_FM_TOKEN op);
     61   virtual ~CXFA_FMSimpleExpression() {}
     62   virtual bool ToJavaScript(CFX_WideTextBuf& javascript);
     63   virtual bool ToImpliedReturnJS(CFX_WideTextBuf& javascript);
     64 
     65   XFA_FM_TOKEN GetOperatorToken() const;
     66 
     67  protected:
     68   uint32_t m_line;
     69   const XFA_FM_TOKEN m_op;
     70 };
     71 
     72 class CXFA_FMNullExpression : public CXFA_FMSimpleExpression {
     73  public:
     74   explicit CXFA_FMNullExpression(uint32_t line);
     75   ~CXFA_FMNullExpression() override {}
     76   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
     77 };
     78 
     79 class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression {
     80  public:
     81   CXFA_FMNumberExpression(uint32_t line, WideStringView wsNumber);
     82   ~CXFA_FMNumberExpression() override;
     83   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
     84 
     85  private:
     86   WideStringView m_wsNumber;
     87 };
     88 
     89 class CXFA_FMStringExpression : public CXFA_FMSimpleExpression {
     90  public:
     91   CXFA_FMStringExpression(uint32_t line, WideStringView wsString);
     92   ~CXFA_FMStringExpression() override;
     93   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
     94 
     95  private:
     96   WideStringView m_wsString;
     97 };
     98 
     99 class CXFA_FMIdentifierExpression : public CXFA_FMSimpleExpression {
    100  public:
    101   CXFA_FMIdentifierExpression(uint32_t line, WideStringView wsIdentifier);
    102   ~CXFA_FMIdentifierExpression() override;
    103   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    104 
    105  private:
    106   WideStringView m_wsIdentifier;
    107 };
    108 
    109 class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression {
    110  public:
    111   CXFA_FMUnaryExpression(uint32_t line,
    112                          XFA_FM_TOKEN op,
    113                          std::unique_ptr<CXFA_FMSimpleExpression> pExp);
    114   ~CXFA_FMUnaryExpression() override;
    115 
    116   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    117 
    118  protected:
    119   std::unique_ptr<CXFA_FMSimpleExpression> m_pExp;
    120 };
    121 
    122 class CXFA_FMBinExpression : public CXFA_FMSimpleExpression {
    123  public:
    124   CXFA_FMBinExpression(uint32_t line,
    125                        XFA_FM_TOKEN op,
    126                        std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
    127                        std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
    128   ~CXFA_FMBinExpression() override;
    129 
    130   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    131 
    132  protected:
    133   std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
    134   std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
    135 };
    136 
    137 class CXFA_FMAssignExpression : public CXFA_FMBinExpression {
    138  public:
    139   CXFA_FMAssignExpression(uint32_t line,
    140                           XFA_FM_TOKEN op,
    141                           std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
    142                           std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
    143   ~CXFA_FMAssignExpression() override {}
    144   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    145   bool ToImpliedReturnJS(CFX_WideTextBuf& javascript) override;
    146 };
    147 
    148 class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression {
    149  public:
    150   CXFA_FMLogicalOrExpression(uint32_t line,
    151                              XFA_FM_TOKEN op,
    152                              std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
    153                              std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
    154   ~CXFA_FMLogicalOrExpression() override {}
    155   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    156 };
    157 
    158 class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression {
    159  public:
    160   CXFA_FMLogicalAndExpression(uint32_t line,
    161                               XFA_FM_TOKEN op,
    162                               std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
    163                               std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
    164   ~CXFA_FMLogicalAndExpression() override {}
    165   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    166 };
    167 
    168 class CXFA_FMEqualityExpression : public CXFA_FMBinExpression {
    169  public:
    170   CXFA_FMEqualityExpression(uint32_t line,
    171                             XFA_FM_TOKEN op,
    172                             std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
    173                             std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
    174   ~CXFA_FMEqualityExpression() override {}
    175   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    176 };
    177 
    178 class CXFA_FMRelationalExpression : public CXFA_FMBinExpression {
    179  public:
    180   CXFA_FMRelationalExpression(uint32_t line,
    181                               XFA_FM_TOKEN op,
    182                               std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
    183                               std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
    184   ~CXFA_FMRelationalExpression() override {}
    185   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    186 };
    187 
    188 class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression {
    189  public:
    190   CXFA_FMAdditiveExpression(uint32_t line,
    191                             XFA_FM_TOKEN op,
    192                             std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
    193                             std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
    194   ~CXFA_FMAdditiveExpression() override {}
    195   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    196 };
    197 
    198 class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression {
    199  public:
    200   CXFA_FMMultiplicativeExpression(
    201       uint32_t line,
    202       XFA_FM_TOKEN op,
    203       std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
    204       std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
    205   ~CXFA_FMMultiplicativeExpression() override {}
    206   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    207 };
    208 
    209 class CXFA_FMPosExpression : public CXFA_FMUnaryExpression {
    210  public:
    211   CXFA_FMPosExpression(uint32_t line,
    212                        std::unique_ptr<CXFA_FMSimpleExpression> pExp);
    213   ~CXFA_FMPosExpression() override {}
    214   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    215 };
    216 
    217 class CXFA_FMNegExpression : public CXFA_FMUnaryExpression {
    218  public:
    219   CXFA_FMNegExpression(uint32_t line,
    220                        std::unique_ptr<CXFA_FMSimpleExpression> pExp);
    221   ~CXFA_FMNegExpression() override {}
    222   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    223 };
    224 
    225 class CXFA_FMNotExpression : public CXFA_FMUnaryExpression {
    226  public:
    227   CXFA_FMNotExpression(uint32_t line,
    228                        std::unique_ptr<CXFA_FMSimpleExpression> pExp);
    229   ~CXFA_FMNotExpression() override {}
    230   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    231 };
    232 
    233 class CXFA_FMCallExpression : public CXFA_FMUnaryExpression {
    234  public:
    235   CXFA_FMCallExpression(
    236       uint32_t line,
    237       std::unique_ptr<CXFA_FMSimpleExpression> pExp,
    238       std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& pArguments,
    239       bool bIsSomMethod);
    240   ~CXFA_FMCallExpression() override;
    241 
    242   bool IsBuiltInFunc(CFX_WideTextBuf* funcName);
    243   uint32_t IsMethodWithObjParam(const WideString& methodName);
    244   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    245 
    246  private:
    247   bool m_bIsSomMethod;
    248   std::vector<std::unique_ptr<CXFA_FMSimpleExpression>> m_Arguments;
    249 };
    250 
    251 class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression {
    252  public:
    253   CXFA_FMDotAccessorExpression(
    254       uint32_t line,
    255       std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
    256       XFA_FM_TOKEN op,
    257       WideStringView wsIdentifier,
    258       std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp);
    259   ~CXFA_FMDotAccessorExpression() override;
    260   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    261 
    262  private:
    263   WideStringView m_wsIdentifier;
    264 };
    265 
    266 class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression {
    267  public:
    268   CXFA_FMIndexExpression(uint32_t line,
    269                          XFA_FM_AccessorIndex accessorIndex,
    270                          std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp,
    271                          bool bIsStarIndex);
    272   ~CXFA_FMIndexExpression() override {}
    273   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    274 
    275  private:
    276   XFA_FM_AccessorIndex m_accessorIndex;
    277   bool m_bIsStarIndex;
    278 };
    279 
    280 class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression {
    281  public:
    282   CXFA_FMDotDotAccessorExpression(
    283       uint32_t line,
    284       std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
    285       XFA_FM_TOKEN op,
    286       WideStringView wsIdentifier,
    287       std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp);
    288   ~CXFA_FMDotDotAccessorExpression() override;
    289 
    290   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    291 
    292  private:
    293   WideStringView m_wsIdentifier;
    294 };
    295 
    296 class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression {
    297  public:
    298   CXFA_FMMethodCallExpression(
    299       uint32_t line,
    300       std::unique_ptr<CXFA_FMSimpleExpression> pAccessorExp1,
    301       std::unique_ptr<CXFA_FMSimpleExpression> pCallExp);
    302   ~CXFA_FMMethodCallExpression() override {}
    303   bool ToJavaScript(CFX_WideTextBuf& javascript) override;
    304 };
    305 
    306 bool CXFA_IsTooBig(const CFX_WideTextBuf& javascript);
    307 
    308 #endif  // XFA_FXFA_FM2JS_CXFA_FMSIMPLEEXPRESSION_H_
    309