// 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_EXPRESSION_H
#define _XFA_FM_EXPRESSION_H
enum XFA_FM_EXPTYPE {
  XFA_FM_EXPTYPE_UNKNOWN,
  XFA_FM_EXPTYPE_FUNC,
  XFA_FM_EXPTYPE_VAR,
  XFA_FM_EXPTYPE_EXP,
  XFA_FM_EXPTYPE_BLOCK,
  XFA_FM_EXPTYPE_IF,
  XFA_FM_EXPTYPE_BREAK,
  XFA_FM_EXPTYPE_CONTINUE,
};
class CXFA_FMExpression {
 public:
  CXFA_FMExpression(FX_DWORD line);
  CXFA_FMExpression(FX_DWORD line, XFA_FM_EXPTYPE type);
  virtual ~CXFA_FMExpression(){};
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);
  FX_DWORD GetLine() { return m_line; }
  XFA_FM_EXPTYPE GetExpType() const { return m_type; }

 protected:
  XFA_FM_EXPTYPE m_type;
  FX_DWORD m_line;
};
class CXFA_FMFunctionDefinition : public CXFA_FMExpression {
 public:
  CXFA_FMFunctionDefinition(FX_DWORD line,
                            FX_BOOL isGlobal,
                            const CFX_WideStringC& wsName,
                            CFX_WideStringCArray* pArguments,
                            CFX_PtrArray* pExpressions);
  virtual ~CXFA_FMFunctionDefinition();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CFX_WideStringC m_wsName;
  CFX_WideStringCArray* m_pArguments;
  CFX_PtrArray* m_pExpressions;
  FX_BOOL m_isGlobal;
};
class CXFA_FMVarExpression : public CXFA_FMExpression {
 public:
  CXFA_FMVarExpression(FX_DWORD line,
                       const CFX_WideStringC& wsName,
                       CXFA_FMExpression* pInit);
  virtual ~CXFA_FMVarExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CFX_WideStringC m_wsName;
  CXFA_FMExpression* m_pInit;
};
class CXFA_FMExpExpression : public CXFA_FMExpression {
 public:
  CXFA_FMExpExpression(FX_DWORD line, CXFA_FMSimpleExpression* pExpression);
  virtual ~CXFA_FMExpExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CXFA_FMSimpleExpression* m_pExpression;
};
class CXFA_FMBlockExpression : public CXFA_FMExpression {
 public:
  CXFA_FMBlockExpression(FX_DWORD line, CFX_PtrArray* pExpressionList);
  virtual ~CXFA_FMBlockExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CFX_PtrArray* m_pExpressionList;
};
class CXFA_FMDoExpression : public CXFA_FMExpression {
 public:
  CXFA_FMDoExpression(FX_DWORD line, CXFA_FMExpression* pList);
  virtual ~CXFA_FMDoExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CXFA_FMExpression* m_pList;
};
class CXFA_FMIfExpression : public CXFA_FMExpression {
 public:
  CXFA_FMIfExpression(FX_DWORD line,
                      CXFA_FMSimpleExpression* pExpression,
                      CXFA_FMExpression* pIfExpression,
                      CXFA_FMExpression* pElseExpression);
  virtual ~CXFA_FMIfExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CXFA_FMSimpleExpression* m_pExpression;
  CXFA_FMExpression* m_pIfExpression;
  CXFA_FMExpression* m_pElseExpression;
};
class CXFA_FMLoopExpression : public CXFA_FMExpression {
 public:
  CXFA_FMLoopExpression(FX_DWORD line) : CXFA_FMExpression(line) {}
  virtual ~CXFA_FMLoopExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);
};
class CXFA_FMWhileExpression : public CXFA_FMLoopExpression {
 public:
  CXFA_FMWhileExpression(FX_DWORD line,
                         CXFA_FMSimpleExpression* pCodition,
                         CXFA_FMExpression* pExpression);
  virtual ~CXFA_FMWhileExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CXFA_FMSimpleExpression* m_pCondition;
  CXFA_FMExpression* m_pExpression;
};
class CXFA_FMBreakExpression : public CXFA_FMExpression {
 public:
  CXFA_FMBreakExpression(FX_DWORD line);
  virtual ~CXFA_FMBreakExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);
};
class CXFA_FMContinueExpression : public CXFA_FMExpression {
 public:
  CXFA_FMContinueExpression(FX_DWORD line);
  virtual ~CXFA_FMContinueExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);
};
class CXFA_FMForExpression : public CXFA_FMLoopExpression {
 public:
  CXFA_FMForExpression(FX_DWORD line,
                       const CFX_WideStringC& wsVariant,
                       CXFA_FMSimpleExpression* pAssignment,
                       CXFA_FMSimpleExpression* pAccessor,
                       int32_t iDirection,
                       CXFA_FMSimpleExpression* pStep,
                       CXFA_FMExpression* pList);
  virtual ~CXFA_FMForExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CFX_WideStringC m_wsVariant;
  CXFA_FMSimpleExpression* m_pAssignment;
  CXFA_FMSimpleExpression* m_pAccessor;
  int32_t m_iDirection;
  CXFA_FMSimpleExpression* m_pStep;
  CXFA_FMExpression* m_pList;
};
class CXFA_FMForeachExpression : public CXFA_FMLoopExpression {
 public:
  CXFA_FMForeachExpression(FX_DWORD line,
                           const CFX_WideStringC& wsIdentifier,
                           CFX_PtrArray* pAccessors,
                           CXFA_FMExpression* pList);
  virtual ~CXFA_FMForeachExpression();
  virtual void ToJavaScript(CFX_WideTextBuf& javascript);
  virtual void ToImpliedReturnJS(CFX_WideTextBuf&);

 private:
  CFX_WideStringC m_wsIdentifier;
  CFX_PtrArray* m_pAccessors;
  CXFA_FMExpression* m_pList;
};
#endif
