// 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_FXFA_FM2JS_CXFA_FMSIMPLEEXPRESSION_H_ #define XFA_FXFA_FM2JS_CXFA_FMSIMPLEEXPRESSION_H_ #include #include #include "xfa/fxfa/fm2js/cxfa_fmlexer.h" enum XFA_FM_AccessorIndex { ACCESSOR_NO_INDEX, ACCESSOR_NO_RELATIVEINDEX, ACCESSOR_POSITIVE_INDEX, ACCESSOR_NEGATIVE_INDEX }; enum class ReturnType { kImplied, kInfered }; class CFX_WideTextBuf; class CXFA_FMSimpleExpression { public: virtual ~CXFA_FMSimpleExpression() {} virtual bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) = 0; XFA_FM_TOKEN GetOperatorToken() const; protected: explicit CXFA_FMSimpleExpression(XFA_FM_TOKEN op); const XFA_FM_TOKEN m_op; }; class CXFA_FMNullExpression final : public CXFA_FMSimpleExpression { public: CXFA_FMNullExpression(); ~CXFA_FMNullExpression() override {} bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; }; class CXFA_FMNumberExpression final : public CXFA_FMSimpleExpression { public: explicit CXFA_FMNumberExpression(WideStringView wsNumber); ~CXFA_FMNumberExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: WideStringView m_wsNumber; }; class CXFA_FMStringExpression final : public CXFA_FMSimpleExpression { public: explicit CXFA_FMStringExpression(WideStringView wsString); ~CXFA_FMStringExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: WideStringView m_wsString; }; class CXFA_FMIdentifierExpression final : public CXFA_FMSimpleExpression { public: explicit CXFA_FMIdentifierExpression(WideStringView wsIdentifier); ~CXFA_FMIdentifierExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: WideStringView m_wsIdentifier; }; class CXFA_FMAssignExpression final : public CXFA_FMSimpleExpression { public: CXFA_FMAssignExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMAssignExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: std::unique_ptr m_pExp1; std::unique_ptr m_pExp2; }; class CXFA_FMBinExpression : public CXFA_FMSimpleExpression { public: ~CXFA_FMBinExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; protected: CXFA_FMBinExpression(const WideString& opName, XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); private: WideString m_OpName; std::unique_ptr m_pExp1; std::unique_ptr m_pExp2; }; class CXFA_FMLogicalOrExpression final : public CXFA_FMBinExpression { public: CXFA_FMLogicalOrExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMLogicalOrExpression() override {} }; class CXFA_FMLogicalAndExpression final : public CXFA_FMBinExpression { public: CXFA_FMLogicalAndExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMLogicalAndExpression() override {} }; class CXFA_FMEqualExpression final : public CXFA_FMBinExpression { public: CXFA_FMEqualExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMEqualExpression() override {} }; class CXFA_FMNotEqualExpression final : public CXFA_FMBinExpression { public: CXFA_FMNotEqualExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMNotEqualExpression() override {} }; class CXFA_FMGtExpression final : public CXFA_FMBinExpression { public: CXFA_FMGtExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMGtExpression() override {} }; class CXFA_FMGeExpression final : public CXFA_FMBinExpression { public: CXFA_FMGeExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMGeExpression() override {} }; class CXFA_FMLtExpression final : public CXFA_FMBinExpression { public: CXFA_FMLtExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMLtExpression() override {} }; class CXFA_FMLeExpression final : public CXFA_FMBinExpression { public: CXFA_FMLeExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMLeExpression() override {} }; class CXFA_FMPlusExpression final : public CXFA_FMBinExpression { public: CXFA_FMPlusExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMPlusExpression() override {} }; class CXFA_FMMinusExpression final : public CXFA_FMBinExpression { public: CXFA_FMMinusExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMMinusExpression() override {} }; class CXFA_FMMulExpression final : public CXFA_FMBinExpression { public: CXFA_FMMulExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMMulExpression() override {} }; class CXFA_FMDivExpression final : public CXFA_FMBinExpression { public: CXFA_FMDivExpression(XFA_FM_TOKEN op, std::unique_ptr pExp1, std::unique_ptr pExp2); ~CXFA_FMDivExpression() override {} }; class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression { public: ~CXFA_FMUnaryExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; protected: CXFA_FMUnaryExpression(const WideString& opName, XFA_FM_TOKEN op, std::unique_ptr pExp); private: WideString m_OpName; std::unique_ptr m_pExp; }; class CXFA_FMPosExpression final : public CXFA_FMUnaryExpression { public: explicit CXFA_FMPosExpression(std::unique_ptr pExp); ~CXFA_FMPosExpression() override {} }; class CXFA_FMNegExpression final : public CXFA_FMUnaryExpression { public: explicit CXFA_FMNegExpression(std::unique_ptr pExp); ~CXFA_FMNegExpression() override {} }; class CXFA_FMNotExpression final : public CXFA_FMUnaryExpression { public: explicit CXFA_FMNotExpression(std::unique_ptr pExp); ~CXFA_FMNotExpression() override {} }; class CXFA_FMCallExpression final : public CXFA_FMSimpleExpression { public: CXFA_FMCallExpression( std::unique_ptr pExp, std::vector>&& pArguments, bool bIsSomMethod); ~CXFA_FMCallExpression() override; bool IsBuiltInFunc(CFX_WideTextBuf* funcName); uint32_t IsMethodWithObjParam(const WideString& methodName); bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: std::unique_ptr m_pExp; bool m_bIsSomMethod; std::vector> m_Arguments; }; class CXFA_FMDotAccessorExpression final : public CXFA_FMSimpleExpression { public: CXFA_FMDotAccessorExpression( std::unique_ptr pAccessor, XFA_FM_TOKEN op, WideStringView wsIdentifier, std::unique_ptr pIndexExp); ~CXFA_FMDotAccessorExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: WideStringView m_wsIdentifier; std::unique_ptr m_pExp1; std::unique_ptr m_pExp2; }; class CXFA_FMIndexExpression final : public CXFA_FMSimpleExpression { public: CXFA_FMIndexExpression(XFA_FM_AccessorIndex accessorIndex, std::unique_ptr pIndexExp, bool bIsStarIndex); ~CXFA_FMIndexExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: std::unique_ptr m_pExp; XFA_FM_AccessorIndex m_accessorIndex; bool m_bIsStarIndex; }; class CXFA_FMDotDotAccessorExpression final : public CXFA_FMSimpleExpression { public: CXFA_FMDotDotAccessorExpression( std::unique_ptr pAccessor, XFA_FM_TOKEN op, WideStringView wsIdentifier, std::unique_ptr pIndexExp); ~CXFA_FMDotDotAccessorExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: WideStringView m_wsIdentifier; std::unique_ptr m_pExp1; std::unique_ptr m_pExp2; }; class CXFA_FMMethodCallExpression final : public CXFA_FMSimpleExpression { public: CXFA_FMMethodCallExpression( std::unique_ptr pAccessorExp1, std::unique_ptr pCallExp); ~CXFA_FMMethodCallExpression() override; bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override; private: std::unique_ptr m_pExp1; std::unique_ptr m_pExp2; }; bool CXFA_IsTooBig(const CFX_WideTextBuf* js); #endif // XFA_FXFA_FM2JS_CXFA_FMSIMPLEEXPRESSION_H_