diff options
Diffstat (limited to 'xfa/fxfa/formcalc/cxfa_fmexpression.h')
-rw-r--r-- | xfa/fxfa/formcalc/cxfa_fmexpression.h | 608 |
1 files changed, 608 insertions, 0 deletions
diff --git a/xfa/fxfa/formcalc/cxfa_fmexpression.h b/xfa/fxfa/formcalc/cxfa_fmexpression.h new file mode 100644 index 000000000..e00921f70 --- /dev/null +++ b/xfa/fxfa/formcalc/cxfa_fmexpression.h @@ -0,0 +1,608 @@ +// Copyright 2014 The PDFium Authors +// 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_FORMCALC_CXFA_FMEXPRESSION_H_ +#define XFA_FXFA_FORMCALC_CXFA_FMEXPRESSION_H_ + +#include <vector> + +#include "core/fxcrt/widestring.h" +#include "core/fxcrt/widetext_buffer.h" +#include "fxjs/gc/heap.h" +#include "third_party/abseil-cpp/absl/types/optional.h" +#include "v8/include/cppgc/garbage-collected.h" +#include "v8/include/cppgc/member.h" +#include "xfa/fxfa/formcalc/cxfa_fmlexer.h" + +class CXFA_FMExpression : public cppgc::GarbageCollected<CXFA_FMExpression> { + public: + enum class ReturnType { kImplied, kInferred }; + + virtual ~CXFA_FMExpression(); + virtual void Trace(cppgc::Visitor* visitor) const; + + virtual bool ToJavaScript(WideTextBuffer* js, ReturnType type) const = 0; + + protected: + CXFA_FMExpression(); +}; + +class CXFA_FMSimpleExpression : public CXFA_FMExpression { + public: + ~CXFA_FMSimpleExpression() override; + + XFA_FM_TOKEN GetOperatorToken() const { return m_op; } + + protected: + explicit CXFA_FMSimpleExpression(XFA_FM_TOKEN op); + + private: + const XFA_FM_TOKEN m_op; +}; + +class CXFA_FMChainableExpression : public CXFA_FMSimpleExpression { + public: + ~CXFA_FMChainableExpression() override; + void Trace(cppgc::Visitor* visitor) const override; + + protected: + CXFA_FMChainableExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); + + CXFA_FMSimpleExpression* GetFirstExpression() const { return m_pExp1; } + CXFA_FMSimpleExpression* GetSecondExpression() const { return m_pExp2; } + + private: + cppgc::Member<CXFA_FMSimpleExpression> m_pExp1; + cppgc::Member<CXFA_FMSimpleExpression> m_pExp2; +}; + +class CXFA_FMNullExpression final : public CXFA_FMSimpleExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMNullExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMNullExpression(); +}; + +class CXFA_FMNumberExpression final : public CXFA_FMSimpleExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMNumberExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + explicit CXFA_FMNumberExpression(WideString wsNumber); + + WideString m_wsNumber; +}; + +class CXFA_FMStringExpression final : public CXFA_FMSimpleExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMStringExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + explicit CXFA_FMStringExpression(WideString wsString); + + WideString m_wsString; +}; + +class CXFA_FMIdentifierExpression final : public CXFA_FMSimpleExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMIdentifierExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + explicit CXFA_FMIdentifierExpression(WideString wsIdentifier); + + WideString m_wsIdentifier; +}; + +class CXFA_FMAssignExpression final : public CXFA_FMChainableExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMAssignExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMAssignExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMBinExpression : public CXFA_FMChainableExpression { + public: + ~CXFA_FMBinExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + protected: + CXFA_FMBinExpression(const WideString& opName, + XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); + + private: + WideString m_OpName; +}; + +class CXFA_FMLogicalOrExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMLogicalOrExpression() override; + + private: + CXFA_FMLogicalOrExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMLogicalAndExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMLogicalAndExpression() override; + + private: + CXFA_FMLogicalAndExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMEqualExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMEqualExpression() override; + + private: + CXFA_FMEqualExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMNotEqualExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMNotEqualExpression() override; + + private: + CXFA_FMNotEqualExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMGtExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMGtExpression() override; + + private: + CXFA_FMGtExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMGeExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMGeExpression() override; + + private: + CXFA_FMGeExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMLtExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMLtExpression() override; + + private: + CXFA_FMLtExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMLeExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMLeExpression() override; + + private: + CXFA_FMLeExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMPlusExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMPlusExpression() override; + + private: + CXFA_FMPlusExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMMinusExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMMinusExpression() override; + + private: + CXFA_FMMinusExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMMulExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMMulExpression() override; + + private: + CXFA_FMMulExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMDivExpression final : public CXFA_FMBinExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMDivExpression() override; + + private: + CXFA_FMDivExpression(XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp1, + CXFA_FMSimpleExpression* pExp2); +}; + +class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression { + public: + ~CXFA_FMUnaryExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + protected: + CXFA_FMUnaryExpression(const WideString& opName, + XFA_FM_TOKEN op, + CXFA_FMSimpleExpression* pExp); + + private: + WideString m_OpName; + cppgc::Member<CXFA_FMSimpleExpression> m_pExp; +}; + +class CXFA_FMPosExpression final : public CXFA_FMUnaryExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMPosExpression() override; + + private: + explicit CXFA_FMPosExpression(CXFA_FMSimpleExpression* pExp); +}; + +class CXFA_FMNegExpression final : public CXFA_FMUnaryExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMNegExpression() override; + + private: + explicit CXFA_FMNegExpression(CXFA_FMSimpleExpression* pExp); +}; + +class CXFA_FMNotExpression final : public CXFA_FMUnaryExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMNotExpression() override; + + private: + explicit CXFA_FMNotExpression(CXFA_FMSimpleExpression* pExp); +}; + +class CXFA_FMCallExpression final : public CXFA_FMSimpleExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMCallExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + bool IsBuiltInFunc(WideTextBuffer* funcName) const; + uint32_t IsMethodWithObjParam(const WideString& methodName) const; + + private: + CXFA_FMCallExpression( + CXFA_FMSimpleExpression* pExp, + std::vector<cppgc::Member<CXFA_FMSimpleExpression>>&& pArguments, + bool bIsSomMethod); + + cppgc::Member<CXFA_FMSimpleExpression> m_pExp; + std::vector<cppgc::Member<CXFA_FMSimpleExpression>> m_Arguments; + bool m_bIsSomMethod; +}; + +class CXFA_FMDotAccessorExpression final : public CXFA_FMChainableExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMDotAccessorExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMDotAccessorExpression(CXFA_FMSimpleExpression* pAccessor, + XFA_FM_TOKEN op, + WideString wsIdentifier, + CXFA_FMSimpleExpression* pIndexExp); + + WideString m_wsIdentifier; +}; + +class CXFA_FMIndexExpression final : public CXFA_FMSimpleExpression { + public: + enum class AccessorIndex : uint8_t { + kNoIndex, + kNoRelativeIndex, + kPositiveIndex, + kNegativeIndex + }; + + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMIndexExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMIndexExpression(AccessorIndex accessorIndex, + CXFA_FMSimpleExpression* pIndexExp, + bool bIsStarIndex); + + cppgc::Member<CXFA_FMSimpleExpression> m_pExp; + AccessorIndex m_accessorIndex; + bool m_bIsStarIndex; +}; + +class CXFA_FMDotDotAccessorExpression final + : public CXFA_FMChainableExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMDotDotAccessorExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMDotDotAccessorExpression(CXFA_FMSimpleExpression* pAccessor, + XFA_FM_TOKEN op, + WideString wsIdentifier, + CXFA_FMSimpleExpression* pIndexExp); + + WideString m_wsIdentifier; +}; + +class CXFA_FMMethodCallExpression final : public CXFA_FMChainableExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMMethodCallExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMMethodCallExpression(CXFA_FMSimpleExpression* pAccessorExp1, + CXFA_FMSimpleExpression* pCallExp); +}; + +class CXFA_FMFunctionDefinition final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMFunctionDefinition() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMFunctionDefinition( + WideString wsName, + std::vector<WideString>&& arguments, + std::vector<cppgc::Member<CXFA_FMExpression>>&& expressions); + + const WideString m_wsName; + std::vector<WideString> const m_pArguments; + std::vector<cppgc::Member<CXFA_FMExpression>> const m_pExpressions; +}; + +class CXFA_FMVarExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMVarExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMVarExpression(WideString wsName, CXFA_FMSimpleExpression* pInit); + + WideString const m_wsName; + cppgc::Member<CXFA_FMSimpleExpression> const m_pInit; +}; + +class CXFA_FMExpExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMExpExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + explicit CXFA_FMExpExpression(CXFA_FMSimpleExpression* pExpression); + + cppgc::Member<CXFA_FMSimpleExpression> const m_pExpression; +}; + +class CXFA_FMBlockExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMBlockExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMBlockExpression( + std::vector<cppgc::Member<CXFA_FMExpression>>&& pExpressionList); + + std::vector<cppgc::Member<CXFA_FMExpression>> const m_ExpressionList; +}; + +class CXFA_FMDoExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMDoExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + explicit CXFA_FMDoExpression(CXFA_FMExpression* pList); + + cppgc::Member<CXFA_FMExpression> const m_pList; +}; + +class CXFA_FMIfExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMIfExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMIfExpression( + CXFA_FMSimpleExpression* pExpression, + CXFA_FMExpression* pIfExpression, + std::vector<cppgc::Member<CXFA_FMIfExpression>>&& pElseIfExpressions, + CXFA_FMExpression* pElseExpression); + + cppgc::Member<CXFA_FMSimpleExpression> const m_pExpression; + cppgc::Member<CXFA_FMExpression> const m_pIfExpression; + std::vector<cppgc::Member<CXFA_FMIfExpression>> const m_pElseIfExpressions; + cppgc::Member<CXFA_FMExpression> const m_pElseExpression; +}; + +class CXFA_FMWhileExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMWhileExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMWhileExpression(CXFA_FMSimpleExpression* pCodition, + CXFA_FMExpression* pExpression); + + cppgc::Member<CXFA_FMSimpleExpression> const m_pCondition; + cppgc::Member<CXFA_FMExpression> const m_pExpression; +}; + +class CXFA_FMBreakExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMBreakExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMBreakExpression(); +}; + +class CXFA_FMContinueExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMContinueExpression() override; + + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMContinueExpression(); +}; + +class CXFA_FMForExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMForExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + CXFA_FMForExpression(WideString wsVariant, + CXFA_FMSimpleExpression* pAssignment, + CXFA_FMSimpleExpression* pAccessor, + int32_t iDirection, + CXFA_FMSimpleExpression* pStep, + CXFA_FMExpression* pList); + + const WideString m_wsVariant; + const bool m_bDirection; + cppgc::Member<CXFA_FMSimpleExpression> const m_pAssignment; + cppgc::Member<CXFA_FMSimpleExpression> const m_pAccessor; + cppgc::Member<CXFA_FMSimpleExpression> const m_pStep; + cppgc::Member<CXFA_FMExpression> const m_pList; +}; + +class CXFA_FMForeachExpression final : public CXFA_FMExpression { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMForeachExpression() override; + + void Trace(cppgc::Visitor* visitor) const override; + bool ToJavaScript(WideTextBuffer* js, ReturnType type) const override; + + private: + // Takes ownership of |pAccessors|. + CXFA_FMForeachExpression( + WideString wsIdentifier, + std::vector<cppgc::Member<CXFA_FMSimpleExpression>>&& pAccessors, + CXFA_FMExpression* pList); + + const WideString m_wsIdentifier; + std::vector<cppgc::Member<CXFA_FMSimpleExpression>> const m_pAccessors; + cppgc::Member<CXFA_FMExpression> const m_pList; +}; + +class CXFA_FMAST : public cppgc::GarbageCollected<CXFA_FMAST> { + public: + CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED; + ~CXFA_FMAST(); + + void Trace(cppgc::Visitor* visitor) const; + absl::optional<WideTextBuffer> ToJavaScript() const; + + private: + explicit CXFA_FMAST( + std::vector<cppgc::Member<CXFA_FMExpression>> expressions); + + std::vector<cppgc::Member<CXFA_FMExpression>> const expressions_; +}; + +bool CXFA_IsTooBig(const WideTextBuffer& js); + +#endif // XFA_FXFA_FORMCALC_CXFA_FMEXPRESSION_H_ |