326 lines
10 KiB
C++
326 lines
10 KiB
C++
// 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 <memory>
|
|
#include <vector>
|
|
|
|
#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() = default;
|
|
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<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMAssignExpression() override;
|
|
|
|
bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
|
|
|
|
private:
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> 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<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
|
|
private:
|
|
WideString m_OpName;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
|
|
};
|
|
|
|
class CXFA_FMLogicalOrExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMLogicalOrExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMLogicalOrExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMLogicalAndExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMLogicalAndExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMLogicalAndExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMEqualExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMEqualExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMEqualExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMNotEqualExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMNotEqualExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMNotEqualExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMGtExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMGtExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMGtExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMGeExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMGeExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMGeExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMLtExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMLtExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMLtExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMLeExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMLeExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMLeExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMPlusExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMPlusExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMPlusExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMMinusExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMMinusExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMMinusExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMMulExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMMulExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp2);
|
|
~CXFA_FMMulExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMDivExpression final : public CXFA_FMBinExpression {
|
|
public:
|
|
CXFA_FMDivExpression(XFA_FM_TOKEN op,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> 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<CXFA_FMSimpleExpression> pExp);
|
|
|
|
private:
|
|
WideString m_OpName;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp;
|
|
};
|
|
|
|
class CXFA_FMPosExpression final : public CXFA_FMUnaryExpression {
|
|
public:
|
|
explicit CXFA_FMPosExpression(std::unique_ptr<CXFA_FMSimpleExpression> pExp);
|
|
~CXFA_FMPosExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMNegExpression final : public CXFA_FMUnaryExpression {
|
|
public:
|
|
explicit CXFA_FMNegExpression(std::unique_ptr<CXFA_FMSimpleExpression> pExp);
|
|
~CXFA_FMNegExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMNotExpression final : public CXFA_FMUnaryExpression {
|
|
public:
|
|
explicit CXFA_FMNotExpression(std::unique_ptr<CXFA_FMSimpleExpression> pExp);
|
|
~CXFA_FMNotExpression() override {}
|
|
};
|
|
|
|
class CXFA_FMCallExpression final : public CXFA_FMSimpleExpression {
|
|
public:
|
|
CXFA_FMCallExpression(
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pExp,
|
|
std::vector<std::unique_ptr<CXFA_FMSimpleExpression>>&& 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<CXFA_FMSimpleExpression> m_pExp;
|
|
bool m_bIsSomMethod;
|
|
std::vector<std::unique_ptr<CXFA_FMSimpleExpression>> m_Arguments;
|
|
};
|
|
|
|
class CXFA_FMDotAccessorExpression final : public CXFA_FMSimpleExpression {
|
|
public:
|
|
CXFA_FMDotAccessorExpression(
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
|
|
XFA_FM_TOKEN op,
|
|
WideStringView wsIdentifier,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp);
|
|
~CXFA_FMDotAccessorExpression() override;
|
|
|
|
bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
|
|
|
|
private:
|
|
WideStringView m_wsIdentifier;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
|
|
};
|
|
|
|
class CXFA_FMIndexExpression final : public CXFA_FMSimpleExpression {
|
|
public:
|
|
CXFA_FMIndexExpression(XFA_FM_AccessorIndex accessorIndex,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp,
|
|
bool bIsStarIndex);
|
|
~CXFA_FMIndexExpression() override;
|
|
|
|
bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
|
|
|
|
private:
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp;
|
|
XFA_FM_AccessorIndex m_accessorIndex;
|
|
bool m_bIsStarIndex;
|
|
};
|
|
|
|
class CXFA_FMDotDotAccessorExpression final : public CXFA_FMSimpleExpression {
|
|
public:
|
|
CXFA_FMDotDotAccessorExpression(
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pAccessor,
|
|
XFA_FM_TOKEN op,
|
|
WideStringView wsIdentifier,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pIndexExp);
|
|
~CXFA_FMDotDotAccessorExpression() override;
|
|
|
|
bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
|
|
|
|
private:
|
|
WideStringView m_wsIdentifier;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
|
|
};
|
|
|
|
class CXFA_FMMethodCallExpression final : public CXFA_FMSimpleExpression {
|
|
public:
|
|
CXFA_FMMethodCallExpression(
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pAccessorExp1,
|
|
std::unique_ptr<CXFA_FMSimpleExpression> pCallExp);
|
|
~CXFA_FMMethodCallExpression() override;
|
|
|
|
bool ToJavaScript(CFX_WideTextBuf* js, ReturnType type) override;
|
|
|
|
private:
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
|
|
std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
|
|
};
|
|
|
|
bool CXFA_IsTooBig(const CFX_WideTextBuf* js);
|
|
|
|
#endif // XFA_FXFA_FM2JS_CXFA_FMSIMPLEEXPRESSION_H_
|