blob: f0f2f390d50327e8f09ec3306025136d5f152f41 [file] [log] [blame]
Dan Sinclair1770c022016-03-14 14:14:16 -04001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
8#define XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_
9
10#include <memory>
11
dsinclaira52ab742016-09-29 13:59:29 -070012#include "core/fxcrt/fx_basic.h"
Dan Sinclair1770c022016-03-14 14:14:16 -040013#include "xfa/fxfa/fm2js/xfa_lexer.h"
14
15#define RUNTIMEFUNCTIONRETURNVALUE \
16 (FX_WSTRC(L"foxit_xfa_formcalc_runtime_func_return_value"))
17#define EXCLAMATION_IN_IDENTIFIER \
18 (FX_WSTRC(L"foxit_xfa_formcalc__exclamation__"))
19
20enum XFA_FM_SimpleExpressionType {
21 ASSIGN,
22 LOGICALOR,
23 LOGICALAND,
24 EQUALITY,
25 NOTEQUALITY,
26 LESS,
27 LESSEQUAL,
28 GREATER,
29 GREATEREQUAL,
30 PLUS,
31 MINUS,
32 MULTIPLE,
33 DIVIDE,
34 POSITIVE,
35 NEGATIVE,
36 NOT,
37 CALL,
38 DOT,
39 DOTDOT,
40 CONCATFMOBJECT,
41 ISFMOBJECT,
42 ISFMARRAY,
43 GETFMVALUE,
44 GETFMJSOBJ,
45 VARFILTER
46};
47
48CFX_WideStringC XFA_FM_EXPTypeToString(
49 XFA_FM_SimpleExpressionType simpleExpType);
50
51enum XFA_FM_AccessorIndex {
52 ACCESSOR_NO_INDEX,
53 ACCESSOR_NO_RELATIVEINDEX,
54 ACCESSOR_POSITIVE_INDEX,
55 ACCESSOR_NEGATIVE_INDEX
56};
57
58class CXFA_FMSimpleExpression {
59 public:
tsepezdeee3d22016-03-25 14:38:58 -070060 CXFA_FMSimpleExpression(uint32_t line, XFA_FM_TOKEN op);
Dan Sinclair1770c022016-03-14 14:14:16 -040061 virtual ~CXFA_FMSimpleExpression() {}
62 virtual void ToJavaScript(CFX_WideTextBuf& javascript);
63 virtual void ToImpliedReturnJS(CFX_WideTextBuf& javascript);
64
65 XFA_FM_TOKEN GetOperatorToken() const;
66
67 protected:
tsepezdeee3d22016-03-25 14:38:58 -070068 uint32_t m_line;
Dan Sinclair1770c022016-03-14 14:14:16 -040069 XFA_FM_TOKEN m_op;
70};
71
72class CXFA_FMNullExpression : public CXFA_FMSimpleExpression {
73 public:
tsepezdeee3d22016-03-25 14:38:58 -070074 explicit CXFA_FMNullExpression(uint32_t line);
Dan Sinclair1770c022016-03-14 14:14:16 -040075 ~CXFA_FMNullExpression() override {}
76 void ToJavaScript(CFX_WideTextBuf& javascript) override;
77};
78
79class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression {
80 public:
tsepezdeee3d22016-03-25 14:38:58 -070081 CXFA_FMNumberExpression(uint32_t line, CFX_WideStringC wsNumber);
weili47bcd4c2016-06-16 08:00:06 -070082 ~CXFA_FMNumberExpression() override;
Dan Sinclair1770c022016-03-14 14:14:16 -040083 void ToJavaScript(CFX_WideTextBuf& javascript) override;
84
85 private:
86 CFX_WideStringC m_wsNumber;
87};
88
89class CXFA_FMStringExpression : public CXFA_FMSimpleExpression {
90 public:
tsepezdeee3d22016-03-25 14:38:58 -070091 CXFA_FMStringExpression(uint32_t line, CFX_WideStringC wsString);
weili47bcd4c2016-06-16 08:00:06 -070092 ~CXFA_FMStringExpression() override;
Dan Sinclair1770c022016-03-14 14:14:16 -040093 void ToJavaScript(CFX_WideTextBuf& javascript) override;
94
95 private:
96 CFX_WideStringC m_wsString;
97};
98
dsinclairca271272016-08-03 10:48:00 -070099class CXFA_FMIdentifierExpression : public CXFA_FMSimpleExpression {
Dan Sinclair1770c022016-03-14 14:14:16 -0400100 public:
dsinclairca271272016-08-03 10:48:00 -0700101 CXFA_FMIdentifierExpression(uint32_t line, CFX_WideStringC wsIdentifier);
102 ~CXFA_FMIdentifierExpression() override;
Dan Sinclair1770c022016-03-14 14:14:16 -0400103 void ToJavaScript(CFX_WideTextBuf& javascript) override;
104
105 private:
106 CFX_WideStringC m_wsIdentifier;
107};
108
109class CXFA_FMUnaryExpression : public CXFA_FMSimpleExpression {
110 public:
tsepezdeee3d22016-03-25 14:38:58 -0700111 CXFA_FMUnaryExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400112 XFA_FM_TOKEN op,
113 CXFA_FMSimpleExpression* pExp);
weili47bcd4c2016-06-16 08:00:06 -0700114 ~CXFA_FMUnaryExpression() override;
115
Dan Sinclair1770c022016-03-14 14:14:16 -0400116 void ToJavaScript(CFX_WideTextBuf& javascript) override;
117
118 protected:
119 std::unique_ptr<CXFA_FMSimpleExpression> m_pExp;
120};
121
122class CXFA_FMBinExpression : public CXFA_FMSimpleExpression {
123 public:
tsepezdeee3d22016-03-25 14:38:58 -0700124 CXFA_FMBinExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400125 XFA_FM_TOKEN op,
126 CXFA_FMSimpleExpression* pExp1,
127 CXFA_FMSimpleExpression* pExp2);
weili47bcd4c2016-06-16 08:00:06 -0700128 ~CXFA_FMBinExpression() override;
129
Dan Sinclair1770c022016-03-14 14:14:16 -0400130 void ToJavaScript(CFX_WideTextBuf& javascript) override;
131
132 protected:
133 std::unique_ptr<CXFA_FMSimpleExpression> m_pExp1;
134 std::unique_ptr<CXFA_FMSimpleExpression> m_pExp2;
135};
136
137class CXFA_FMAssignExpression : public CXFA_FMBinExpression {
138 public:
tsepezdeee3d22016-03-25 14:38:58 -0700139 CXFA_FMAssignExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400140 XFA_FM_TOKEN op,
141 CXFA_FMSimpleExpression* pExp1,
142 CXFA_FMSimpleExpression* pExp2);
143 ~CXFA_FMAssignExpression() override {}
144 void ToJavaScript(CFX_WideTextBuf& javascript) override;
145 void ToImpliedReturnJS(CFX_WideTextBuf& javascript) override;
146};
147
148class CXFA_FMLogicalOrExpression : public CXFA_FMBinExpression {
149 public:
tsepezdeee3d22016-03-25 14:38:58 -0700150 CXFA_FMLogicalOrExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400151 XFA_FM_TOKEN op,
152 CXFA_FMSimpleExpression* pExp1,
153 CXFA_FMSimpleExpression* pExp2);
154 ~CXFA_FMLogicalOrExpression() override {}
155 void ToJavaScript(CFX_WideTextBuf& javascript) override;
156};
157
158class CXFA_FMLogicalAndExpression : public CXFA_FMBinExpression {
159 public:
tsepezdeee3d22016-03-25 14:38:58 -0700160 CXFA_FMLogicalAndExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400161 XFA_FM_TOKEN op,
162 CXFA_FMSimpleExpression* pExp1,
163 CXFA_FMSimpleExpression* pExp2);
164 ~CXFA_FMLogicalAndExpression() override {}
165 void ToJavaScript(CFX_WideTextBuf& javascript) override;
166};
167
168class CXFA_FMEqualityExpression : public CXFA_FMBinExpression {
169 public:
tsepezdeee3d22016-03-25 14:38:58 -0700170 CXFA_FMEqualityExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400171 XFA_FM_TOKEN op,
172 CXFA_FMSimpleExpression* pExp1,
173 CXFA_FMSimpleExpression* pExp2);
174 ~CXFA_FMEqualityExpression() override {}
175 void ToJavaScript(CFX_WideTextBuf& javascript) override;
176};
177
178class CXFA_FMRelationalExpression : public CXFA_FMBinExpression {
179 public:
tsepezdeee3d22016-03-25 14:38:58 -0700180 CXFA_FMRelationalExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400181 XFA_FM_TOKEN op,
182 CXFA_FMSimpleExpression* pExp1,
183 CXFA_FMSimpleExpression* pExp2);
184 ~CXFA_FMRelationalExpression() override {}
185 void ToJavaScript(CFX_WideTextBuf& javascript) override;
186};
187
188class CXFA_FMAdditiveExpression : public CXFA_FMBinExpression {
189 public:
tsepezdeee3d22016-03-25 14:38:58 -0700190 CXFA_FMAdditiveExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400191 XFA_FM_TOKEN op,
192 CXFA_FMSimpleExpression* pExp1,
193 CXFA_FMSimpleExpression* pExp2);
194 ~CXFA_FMAdditiveExpression() override {}
195 void ToJavaScript(CFX_WideTextBuf& javascript) override;
196};
197
198class CXFA_FMMultiplicativeExpression : public CXFA_FMBinExpression {
199 public:
tsepezdeee3d22016-03-25 14:38:58 -0700200 CXFA_FMMultiplicativeExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400201 XFA_FM_TOKEN op,
202 CXFA_FMSimpleExpression* pExp1,
203 CXFA_FMSimpleExpression* pExp2);
204 ~CXFA_FMMultiplicativeExpression() override {}
205 void ToJavaScript(CFX_WideTextBuf& javascript) override;
206};
207
208class CXFA_FMPosExpression : public CXFA_FMUnaryExpression {
209 public:
tsepezdeee3d22016-03-25 14:38:58 -0700210 CXFA_FMPosExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
Dan Sinclair1770c022016-03-14 14:14:16 -0400211 ~CXFA_FMPosExpression() override {}
212 void ToJavaScript(CFX_WideTextBuf& javascript) override;
213};
214
215class CXFA_FMNegExpression : public CXFA_FMUnaryExpression {
216 public:
tsepezdeee3d22016-03-25 14:38:58 -0700217 CXFA_FMNegExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
Dan Sinclair1770c022016-03-14 14:14:16 -0400218 ~CXFA_FMNegExpression() override {}
219 void ToJavaScript(CFX_WideTextBuf& javascript) override;
220};
221
222class CXFA_FMNotExpression : public CXFA_FMUnaryExpression {
223 public:
tsepezdeee3d22016-03-25 14:38:58 -0700224 CXFA_FMNotExpression(uint32_t line, CXFA_FMSimpleExpression* pExp);
Dan Sinclair1770c022016-03-14 14:14:16 -0400225 ~CXFA_FMNotExpression() override {}
226 void ToJavaScript(CFX_WideTextBuf& javascript) override;
227};
228
229class CXFA_FMCallExpression : public CXFA_FMUnaryExpression {
230 public:
tsepezdeee3d22016-03-25 14:38:58 -0700231 CXFA_FMCallExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400232 CXFA_FMSimpleExpression* pExp,
tsepeza3109842016-04-28 16:56:08 -0700233 CFX_ArrayTemplate<CXFA_FMSimpleExpression*>* pArguments,
Dan Sinclair1770c022016-03-14 14:14:16 -0400234 FX_BOOL bIsSomMethod);
235 ~CXFA_FMCallExpression() override;
tsepeza3109842016-04-28 16:56:08 -0700236
Dan Sinclair1770c022016-03-14 14:14:16 -0400237 bool IsBuildInFunc(CFX_WideTextBuf* funcName);
tsepezdeee3d22016-03-25 14:38:58 -0700238 uint32_t IsMethodWithObjParam(const CFX_WideStringC& methodName);
Dan Sinclair1770c022016-03-14 14:14:16 -0400239 void ToJavaScript(CFX_WideTextBuf& javascript) override;
240
241 private:
242 FX_BOOL m_bIsSomMethod;
tsepeza3109842016-04-28 16:56:08 -0700243 CFX_ArrayTemplate<CXFA_FMSimpleExpression*>* m_pArguments;
Dan Sinclair1770c022016-03-14 14:14:16 -0400244};
245
246class CXFA_FMDotAccessorExpression : public CXFA_FMBinExpression {
247 public:
tsepezdeee3d22016-03-25 14:38:58 -0700248 CXFA_FMDotAccessorExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400249 CXFA_FMSimpleExpression* pAccessor,
250 XFA_FM_TOKEN op,
251 CFX_WideStringC wsIdentifier,
252 CXFA_FMSimpleExpression* pIndexExp);
weili47bcd4c2016-06-16 08:00:06 -0700253 ~CXFA_FMDotAccessorExpression() override;
Dan Sinclair1770c022016-03-14 14:14:16 -0400254 void ToJavaScript(CFX_WideTextBuf& javascript) override;
255
256 private:
257 CFX_WideStringC m_wsIdentifier;
258};
259
260class CXFA_FMIndexExpression : public CXFA_FMUnaryExpression {
261 public:
tsepezdeee3d22016-03-25 14:38:58 -0700262 CXFA_FMIndexExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400263 XFA_FM_AccessorIndex accessorIndex,
264 CXFA_FMSimpleExpression* pIndexExp,
265 FX_BOOL bIsStarIndex);
266 ~CXFA_FMIndexExpression() override {}
267 void ToJavaScript(CFX_WideTextBuf& javascript) override;
268
269 private:
270 XFA_FM_AccessorIndex m_accessorIndex;
271 FX_BOOL m_bIsStarIndex;
272};
273
274class CXFA_FMDotDotAccessorExpression : public CXFA_FMBinExpression {
275 public:
tsepezdeee3d22016-03-25 14:38:58 -0700276 CXFA_FMDotDotAccessorExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400277 CXFA_FMSimpleExpression* pAccessor,
278 XFA_FM_TOKEN op,
279 CFX_WideStringC wsIdentifier,
280 CXFA_FMSimpleExpression* pIndexExp);
weili47bcd4c2016-06-16 08:00:06 -0700281 ~CXFA_FMDotDotAccessorExpression() override;
282
Dan Sinclair1770c022016-03-14 14:14:16 -0400283 void ToJavaScript(CFX_WideTextBuf& javascript) override;
284
285 private:
286 CFX_WideStringC m_wsIdentifier;
287};
288
289class CXFA_FMMethodCallExpression : public CXFA_FMBinExpression {
290 public:
tsepezdeee3d22016-03-25 14:38:58 -0700291 CXFA_FMMethodCallExpression(uint32_t line,
Dan Sinclair1770c022016-03-14 14:14:16 -0400292 CXFA_FMSimpleExpression* pAccessorExp1,
293 CXFA_FMSimpleExpression* pCallExp);
294 ~CXFA_FMMethodCallExpression() override {}
295 void ToJavaScript(CFX_WideTextBuf& javascript) override;
296};
297
298#endif // XFA_FXFA_FM2JS_XFA_SIMPLEEXPRESSION_H_