// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef _XFA_FM_SIMPLEEXPRESSION_H
#define _XFA_FM_SIMPLEEXPRESSION_H
enum XFA_FM_SimpleExpressionType {
  ASSIGN,
  LOGICALOR,
  LOGICALAND,
  EQUALITY,
  NOTEQUALITY,
  LESS,
  LESSEQUAL,
  GREATER,
  GREATEREQUAL,
  PLUS,
  MINUS,
  MULTIPLE,
  DIVIDE,
  POSITIVE,
  NEGATIVE,
  NOT,
  CALL,
  DOT,
  DOTDOT,
  CONCATFMOBJECT,
  ISFMOBJECT,
  ISFMARRAY,
  GETFMVALUE,
  GETFMJSOBJ,
  VARFILTER
};
CFX_WideStringC XFA_FM_EXPTypeToString(
    XFA_FM_SimpleExpressionType simpleExpType);
struct XFA_FMBuildInFunc {
  uint32_t m_uHash;
  const FX_WCHAR* m_buildinfunc;
};
struct XFA_FMSOMMethod {
  uint32_t m_uHash;
  const FX_WCHAR* m_wsSomMethodName;
  FX_DWORD m_dParameters;
};
enum XFA_FM_AccessorIndex {
  ACCESSOR_NO_INDEX,
  ACCESSOR_NO_RELATIVEINDEX,
  ACCESSOR_POSITIVE_INDEX,
  ACCESSOR_NEGATIVE_INDEX
};
class CXFA_FMSimpleExpression {
 public:
  CXFA_FMSimpleExpression(FX_DWORD line, XFA_FM_TOKEN op);
  virtual ~CXFA_FMSimpleExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript);

  XFA_FM_TOKEN GetOperatorToken() const;

 protected:
  FX_DWORD m_line;
  XFA_FM_TOKEN m_op;
};
class CXFA_FMNullExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMNullExpression(FX_DWORD line);
  virtual ~CXFA_FMNullExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMNumberExpression(FX_DWORD line, CFX_WideStringC wsNumber);
  virtual ~CXFA_FMNumberExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
  CFX_WideStringC m_wsNumber;
};
class CXFA_FMStringExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMStringExpression(FX_DWORD line, CFX_WideStringC wsString);
  virtual ~CXFA_FMStringExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
  CFX_WideStringC m_wsString;
};
class CXFA_FMIdentifierExpressionn : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMIdentifierExpressionn(FX_DWORD line, CFX_WideStringC wsIdentifier);
  virtual ~CXFA_FMIdentifierExpressionn(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
  CFX_WideStringC m_wsIdentifier;
};
class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMUnaryExpression(FX_DWORD line,
                         XFA_FM_TOKEN op,
                         CXFA_FMSimpleExpression* pExp);
  virtual ~CXFA_FMUnaryExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
  CXFA_FMSimpleExpression* m_pExp;
};
class CXFA_FMBinExpression : public CXFA_FMSimpleExpression {
 public:
  CXFA_FMBinExpression(FX_DWORD line,
                       XFA_FM_TOKEN op,
                       CXFA_FMSimpleExpression* pExp1,
                       CXFA_FMSimpleExpression* pExp2);
  virtual ~CXFA_FMBinExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
  CXFA_FMSimpleExpression* m_pExp1;
  CXFA_FMSimpleExpression* m_pExp2;
};
class CXFA_FMAssignExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMAssignExpression(FX_DWORD line,
                          XFA_FM_TOKEN op,
                          CXFA_FMSimpleExpression* pExp1,
                          CXFA_FMSimpleExpression* pExp2);
  virtual ~CXFA_FMAssignExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript);
};
class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMLogicalOrExpression(FX_DWORD line,
                             XFA_FM_TOKEN op,
                             CXFA_FMSimpleExpression* pExp1,
                             CXFA_FMSimpleExpression* pExp2);
  virtual ~CXFA_FMLogicalOrExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMLogicalAndExpression(FX_DWORD line,
                              XFA_FM_TOKEN op,
                              CXFA_FMSimpleExpression* pExp1,
                              CXFA_FMSimpleExpression* pExp2);
  virtual ~CXFA_FMLogicalAndExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMEqualityExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMEqualityExpression(FX_DWORD line,
                            XFA_FM_TOKEN op,
                            CXFA_FMSimpleExpression* pExp1,
                            CXFA_FMSimpleExpression* pExp2);
  virtual ~CXFA_FMEqualityExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMRelationalExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMRelationalExpression(FX_DWORD line,
                              XFA_FM_TOKEN op,
                              CXFA_FMSimpleExpression* pExp1,
                              CXFA_FMSimpleExpression* pExp2);
  virtual ~CXFA_FMRelationalExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMAdditiveExpression(FX_DWORD line,
                            XFA_FM_TOKEN op,
                            CXFA_FMSimpleExpression* pExp1,
                            CXFA_FMSimpleExpression* pExp2);
  virtual ~CXFA_FMAdditiveExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMMultiplicativeExpression(FX_DWORD line,
                                  XFA_FM_TOKEN op,
                                  CXFA_FMSimpleExpression* pExp1,
                                  CXFA_FMSimpleExpression* pExp2);
  virtual ~CXFA_FMMultiplicativeExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMPosExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMPosExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
  virtual ~CXFA_FMPosExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMNegExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMNegExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
  virtual ~CXFA_FMNegExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMNotExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMNotExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExp);
  virtual ~CXFA_FMNotExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
};
class CXFA_FMCallExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMCallExpression(FX_DWORD line,
                        CXFA_FMSimpleExpression* pExp,
                        CFX_PtrArray* pArguments,
                        FX_BOOL bIsSomMethod);
  virtual ~CXFA_FMCallExpression();
  virtual FX_BOOL IsBuildInFunc(CFX_WideTextBuf& funcName);
  virtual FX_DWORD IsSomMethodWithObjPara(const CFX_WideStringC& methodName);
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 private:
  FX_BOOL m_bIsSomMethod;
  CFX_PtrArray* m_pArguments;
};
class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMDotAccessorExpression(FX_DWORD line,
                               CXFA_FMSimpleExpression* pAccessor,
                               XFA_FM_TOKEN op,
                               CFX_WideStringC wsIdentifier,
                               CXFA_FMSimpleExpression* pIndexExp);
  virtual ~CXFA_FMDotAccessorExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
  CFX_WideStringC m_wsIdentifier;
};
class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression {
 public:
  CXFA_FMIndexExpression(FX_DWORD line,
                         XFA_FM_AccessorIndex accessorIndex,
                         CXFA_FMSimpleExpression* pIndexExp,
                         FX_BOOL bIsStarIndex);
  virtual ~CXFA_FMIndexExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
  XFA_FM_AccessorIndex m_accessorIndex;
  FX_BOOL m_bIsStarIndex;
};
class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMDotDotAccessorExpression(FX_DWORD line,
                                  CXFA_FMSimpleExpression* pAccessor,
                                  XFA_FM_TOKEN op,
                                  CFX_WideStringC wsIdentifier,
                                  CXFA_FMSimpleExpression* pIndexExp);
  virtual ~CXFA_FMDotDotAccessorExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
  CFX_WideStringC m_wsIdentifier;
};
class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression {
 public:
  CXFA_FMMethodCallExpression(FX_DWORD line,
                              CXFA_FMSimpleExpression* pAccessorExp1,
                              CXFA_FMSimpleExpression* pCallExp);
  virtual ~CXFA_FMMethodCallExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);

 protected:
};
#endif
