@darabonba/python-generator 1.2.19 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/ChangeLog.md +0 -158
  2. package/lib/builtin.js +818 -0
  3. package/lib/generator.js +2708 -0
  4. package/lib/helper.js +422 -0
  5. package/package.json +6 -5
  6. package/tests/expected/alias/setup.py +79 -0
  7. package/tests/expected/alias/tea_python_tests/__init__.py +1 -0
  8. package/tests/expected/alias/tea_python_tests/client.py +35 -0
  9. package/tests/expected/annotation/tea_python_tests/__init__.py +1 -0
  10. package/tests/expected/annotation/tea_python_tests/client.py +93 -0
  11. package/tests/expected/annotation/tea_python_tests/models.py +37 -0
  12. package/tests/expected/api/tea_python_tests/__init__.py +1 -0
  13. package/tests/expected/api/tea_python_tests/client.py +106 -0
  14. package/tests/expected/builtin/tea_python_tests/client.py +685 -0
  15. package/tests/expected/comment/tea_python_tests/__init__.py +1 -0
  16. package/tests/expected/comment/tea_python_tests/client.py +288 -0
  17. package/tests/expected/comment/tea_python_tests/models.py +195 -0
  18. package/tests/expected/complex/tea_python_tests/__init__.py +1 -0
  19. package/tests/expected/complex/tea_python_tests/client.py +1169 -0
  20. package/tests/expected/complex/tea_python_tests/exceptions.py +39 -0
  21. package/tests/expected/complex/tea_python_tests/models.py +570 -0
  22. package/tests/expected/const/tea_python_tests/__init__.py +1 -0
  23. package/tests/expected/const/tea_python_tests/client.py +14 -0
  24. package/{src/langs/python/files/setup.py.tmpl → tests/expected/empty/setup.py} +11 -11
  25. package/tests/expected/empty/tea_python_tests/__init__.py +1 -0
  26. package/tests/expected/empty/tea_python_tests/client.py +10 -0
  27. package/tests/expected/exec/tea_python_tests/__init__.py +1 -0
  28. package/tests/expected/exec/tea_python_tests/exec_client.py +21 -0
  29. package/tests/expected/function/tea_python_tests/__init__.py +1 -0
  30. package/tests/expected/function/tea_python_tests/client.py +64 -0
  31. package/tests/expected/import/setup.py +78 -0
  32. package/tests/expected/import/tea_python_tests/__init__.py +1 -0
  33. package/tests/expected/import/tea_python_tests/client.py +29 -0
  34. package/tests/expected/map/tea_python_tests/__init__.py +1 -0
  35. package/tests/expected/map/tea_python_tests/client.py +39 -0
  36. package/tests/expected/model/tea_python_tests/__init__.py +1 -0
  37. package/tests/expected/model/tea_python_tests/client.py +10 -0
  38. package/tests/expected/model/tea_python_tests/exceptions.py +28 -0
  39. package/tests/expected/model/tea_python_tests/models.py +780 -0
  40. package/tests/expected/multi/tea_python_tests/api.py +95 -0
  41. package/tests/expected/multi/tea_python_tests/client.py +40 -0
  42. package/tests/expected/multi/tea_python_tests/lib/util.py +19 -0
  43. package/tests/expected/multi/tea_python_tests/model/user.py +26 -0
  44. package/tests/expected/multi/tea_python_tests/model/user_exceptions.py +83 -0
  45. package/tests/expected/multi/tea_python_tests/model/user_models.py +145 -0
  46. package/tests/expected/statements/tea_python_tests/__init__.py +1 -0
  47. package/tests/expected/statements/tea_python_tests/client.py +86 -0
  48. package/tests/expected/super/tea_python_tests/__init__.py +1 -0
  49. package/tests/expected/super/tea_python_tests/client.py +16 -0
  50. package/tests/expected/typedef/setup.py +77 -0
  51. package/tests/expected/typedef/tea_python_tests/__init__.py +1 -0
  52. package/tests/expected/typedef/tea_python_tests/client.py +74 -0
  53. package/tests/expected/typedef/tea_python_tests/models.py +42 -0
  54. package/tests/fixtures/alias/Darafile +11 -0
  55. package/tests/fixtures/alias/libraries/Alias/Darafile +11 -0
  56. package/tests/fixtures/alias/libraries/Alias-Symbol/Darafile +11 -0
  57. package/tests/fixtures/builtin/Darafile +6 -0
  58. package/tests/fixtures/builtin/main.dara +333 -0
  59. package/tests/fixtures/complex/libraries/import.dara +18 -11
  60. package/tests/fixtures/complex/main.dara +452 -103
  61. package/tests/fixtures/import/libraries/Darafile +1 -1
  62. package/tests/fixtures/import/pack/Darafile +3 -0
  63. package/tests/fixtures/map/libraries/Darafile +3 -0
  64. package/tests/fixtures/map/libraries/import.dara +4 -0
  65. package/tests/fixtures/map/main.dara +17 -2
  66. package/tests/fixtures/model/.libraries.json +3 -0
  67. package/tests/fixtures/model/Darafile +5 -2
  68. package/tests/fixtures/model/libraries/Darafile +20 -0
  69. package/tests/fixtures/model/libraries/import.dara +27 -0
  70. package/tests/fixtures/model/main.dara +60 -42
  71. package/tests/fixtures/multi/.libraries.json +3 -0
  72. package/tests/fixtures/multi/Darafile +12 -0
  73. package/tests/fixtures/multi/api.dara +20 -0
  74. package/tests/fixtures/multi/lib/util.dara +5 -0
  75. package/tests/fixtures/multi/libraries/darabonba_Util_0.2.11/Teafile +68 -0
  76. package/tests/fixtures/multi/libraries/darabonba_Util_0.2.11/main.tea +244 -0
  77. package/tests/fixtures/multi/libraries/darabonba_Util_0.2.11/util.tea +2 -0
  78. package/tests/fixtures/multi/main.dara +32 -0
  79. package/tests/fixtures/multi/model/user.dara +35 -0
  80. package/tests/{python3.tests.js → main.tests.js} +107 -65
  81. package/tests/output/alias/setup.py +79 -0
  82. package/tests/output/alias/tea_python_tests/client.py +35 -0
  83. package/{src/langs/python2/files/setup.py.tmpl → tests/output/annotation/setup.py} +19 -24
  84. package/tests/output/annotation/tea_python_tests/client.py +93 -0
  85. package/tests/output/annotation/tea_python_tests/models.py +37 -0
  86. package/tests/output/api/setup.py +77 -0
  87. package/tests/output/api/tea_python_tests/client.py +106 -0
  88. package/tests/output/builtin/setup.py +77 -0
  89. package/tests/output/builtin/tea_python_tests/client.py +685 -0
  90. package/tests/output/comment/setup.py +77 -0
  91. package/tests/output/comment/tea_python_tests/client.py +288 -0
  92. package/tests/output/comment/tea_python_tests/models.py +195 -0
  93. package/tests/output/complex/setup.py +77 -0
  94. package/tests/output/complex/tea_python_tests/client.py +1169 -0
  95. package/tests/output/complex/tea_python_tests/exceptions.py +39 -0
  96. package/tests/output/complex/tea_python_tests/models.py +570 -0
  97. package/tests/output/const/setup.py +77 -0
  98. package/tests/output/const/tea_python_tests/client.py +14 -0
  99. package/tests/output/empty/setup.py +77 -0
  100. package/tests/output/empty/tea_python_tests/client.py +10 -0
  101. package/tests/output/exec/setup.py +77 -0
  102. package/tests/output/exec/tea_python_tests/exec_client.py +21 -0
  103. package/tests/output/function/setup.py +77 -0
  104. package/tests/output/function/tea_python_tests/client.py +64 -0
  105. package/tests/output/import/setup.py +78 -0
  106. package/tests/output/import/tea_python_tests/client.py +29 -0
  107. package/tests/output/map/setup.py +77 -0
  108. package/tests/output/map/tea_python_tests/client.py +39 -0
  109. package/tests/output/model/setup.py +77 -0
  110. package/tests/output/model/tea_python_tests/client.py +10 -0
  111. package/tests/output/model/tea_python_tests/exceptions.py +28 -0
  112. package/tests/output/model/tea_python_tests/models.py +780 -0
  113. package/tests/output/multi/setup.py +77 -0
  114. package/tests/output/multi/tea_python_tests/api.py +95 -0
  115. package/tests/output/multi/tea_python_tests/client.py +40 -0
  116. package/tests/output/multi/tea_python_tests/lib/util.py +19 -0
  117. package/tests/output/multi/tea_python_tests/model/user.py +26 -0
  118. package/tests/output/multi/tea_python_tests/model/user_exceptions.py +83 -0
  119. package/tests/output/multi/tea_python_tests/model/user_models.py +145 -0
  120. package/tests/output/statements/setup.py +77 -0
  121. package/tests/output/statements/tea_python_tests/client.py +86 -0
  122. package/tests/output/super/setup.py +77 -0
  123. package/tests/output/super/tea_python_tests/client.py +16 -0
  124. package/tests/output/typedef/setup.py +78 -0
  125. package/tests/output/typedef/tea_python_tests/client.py +74 -0
  126. package/tests/output/typedef/tea_python_tests/models.py +42 -0
  127. package/src/generator.js +0 -231
  128. package/src/langs/common/combinator.js +0 -193
  129. package/src/langs/common/config.js +0 -60
  130. package/src/langs/common/enum.js +0 -179
  131. package/src/langs/common/items.js +0 -551
  132. package/src/langs/common/package_info.js +0 -53
  133. package/src/langs/python/combinator.js +0 -1898
  134. package/src/langs/python/config.js +0 -169
  135. package/src/langs/python/files/.gitignore.tmpl +0 -5
  136. package/src/langs/python/files/__init__.py.tmpl +0 -1
  137. package/src/langs/python/package_info.js +0 -78
  138. package/src/langs/python2/combinator.js +0 -1770
  139. package/src/langs/python2/config.js +0 -162
  140. package/src/langs/python2/files/.gitignore.tmpl +0 -5
  141. package/src/langs/python2/files/__init__.py.tmpl +0 -1
  142. package/src/langs/python2/package_info.js +0 -78
  143. package/src/lib/debug.js +0 -55
  144. package/src/lib/emitter.js +0 -95
  145. package/src/lib/helper.js +0 -207
  146. package/src/resolver/base.js +0 -282
  147. package/src/resolver/client.js +0 -1013
  148. package/src/resolver/model.js +0 -159
  149. package/tests/common.tests.js +0 -244
  150. package/tests/lib.tests.js +0 -269
  151. package/tests/python2.tests.js +0 -283
  152. package/tests/resolver.tests.js +0 -434
package/lib/builtin.js ADDED
@@ -0,0 +1,818 @@
1
+
2
+
3
+ 'use strict';
4
+ const DSL = require('@darabonba/parser');
5
+ const { _getImport, _name, CORE, _snakeCase, _isDefault } = require('./helper');
6
+
7
+ const types = [
8
+ 'integer', 'int8', 'int16', 'int32',
9
+ 'int64', 'long', 'ulong', 'string',
10
+ 'uint8', 'uint16', 'uint32', 'uint64',
11
+ 'number', 'float', 'double', 'boolean',
12
+ 'bytes', 'readable', 'writable', 'object', 'any'
13
+ ];
14
+
15
+ const integers = [
16
+ 'integer', 'int8', 'int16', 'int32',
17
+ 'int64', 'long', 'ulong',
18
+ 'uint8', 'uint16', 'uint32', 'uint64',
19
+ ];
20
+
21
+ const floats = ['float', 'double'];
22
+
23
+ class Builtin {
24
+ constructor(generator, module = '', methods = []) {
25
+ this.generator = generator;
26
+ this.module = module;
27
+
28
+ methods.forEach(method => {
29
+ this[method] = function (ast, level, async) {
30
+ this.generator.imports.push(_getImport(this.module));
31
+ if(async) {
32
+ this.generator.emit('await ');
33
+ }
34
+ this.generator.emit(`${this.module}.${_snakeCase(method)}`);
35
+ if(async) {
36
+ this.generator.emit('_async');
37
+ }
38
+ this.generator.visitArgs(ast.args, level);
39
+ };
40
+ });
41
+ }
42
+
43
+ getInstanceName(ast) {
44
+ if (!ast.left) {
45
+ return;
46
+ }
47
+ if (ast.left.id.tag === DSL.Tag.Tag.VID) {
48
+ this.generator.emit(`this.${_snakeCase(ast.left.id)}`);
49
+ } else {
50
+ this.generator.emit(`${_snakeCase(_name(ast.left.id)).replace('$','')}`);
51
+ }
52
+ }
53
+
54
+ getClientName() {
55
+ this.generator.imports.push(_getImport(this.module));
56
+ return this.module;
57
+ }
58
+ }
59
+
60
+ class Env extends Builtin {
61
+ constructor(generator) {
62
+ const methods = [];
63
+ super(generator, `${CORE}Env`, methods);
64
+ }
65
+
66
+ get(ast) {
67
+ this.generator.imports.push(_getImport(this.module));
68
+ this.generator.emit('os.environ.get(');
69
+ this.generator.emit(`'${ast.args[0].value.string}'`);
70
+ this.generator.emit(')');
71
+ }
72
+
73
+ set(ast) {
74
+ this.generator.imports.push(_getImport(this.module));
75
+ this.generator.emit('os.environ[');
76
+ this.generator.emit(`'${ast.args[0].value.string}'] = ${ast.args[1].left.id.lexeme} + '${ast.args[1].right.value.string}'`);
77
+ }
78
+ }
79
+
80
+ class Logger extends Builtin {
81
+ constructor(generator) {
82
+ const methods = ['critical', 'setLevel', 'format'];
83
+ super(generator, `${CORE}Logger`, methods);
84
+ }
85
+ log(ast) {
86
+ this.generator.imports.push(_getImport(this.module));
87
+ this.generator.emit('logging.log(logging.NOTSET, ');
88
+ this.generator.visitExpr(ast.args[0]);
89
+ this.generator.emit(')');
90
+ }
91
+
92
+ info(ast) {
93
+ this.generator.imports.push(_getImport(this.module));
94
+ this.generator.emit('logging.log(logging.INFO, ');
95
+ this.generator.visitExpr(ast.args[0]);
96
+ this.generator.emit(')');
97
+ }
98
+
99
+ warning(ast) {
100
+ this.generator.imports.push(_getImport(this.module));
101
+ this.generator.emit('logging.log(logging.WARNING, ');
102
+ this.generator.visitExpr(ast.args[0]);
103
+ this.generator.emit(')');
104
+ }
105
+
106
+ debug(ast) {
107
+ this.generator.imports.push(_getImport(this.module));
108
+ this.generator.emit('logging.log(logging.DEBUG, ');
109
+ this.generator.visitExpr(ast.args[0]);
110
+ this.generator.emit(')');
111
+ }
112
+
113
+ error(ast) {
114
+ this.generator.imports.push(_getImport(this.module));
115
+ this.generator.emit('logging.log(logging.ERROR, ');
116
+ this.generator.visitExpr(ast.args[0]);
117
+ this.generator.emit(')');
118
+ }
119
+ }
120
+
121
+ class XML extends Builtin {
122
+ constructor(generator) {
123
+ const methods = [ 'toXML'];
124
+ super(generator, `${CORE}XML`, methods);
125
+ }
126
+
127
+ parseXml(ast){
128
+ const clientName = this.getClientName();
129
+ this.generator.emit(`${clientName}.parse_xml(`);
130
+ this.generator.visitExpr(ast.args[0]);
131
+ if (ast.args[1].type === 'null') {
132
+ this.generator.emit(', ');
133
+ this.generator.emit('None');
134
+ } else {
135
+ this.generator.emit(', ');
136
+ this.generator.visitExpr(ast.args[1]);
137
+ }
138
+ this.generator.emit(')');
139
+ }
140
+ }
141
+
142
+ class URL extends Builtin {
143
+ constructor(generator) {
144
+ const methods = ['parse', 'urlEncode', 'percentEncode', 'pathEncode'];
145
+ super(generator, `${CORE}URL`, methods);
146
+ }
147
+ }
148
+
149
+ class Stream extends Builtin {
150
+ constructor(generator) {
151
+ const methods = ['readAsBytes', 'readAsJSON', 'readAsString', 'readAsSSE'];
152
+ super(generator, `${CORE}Stream`, methods);
153
+ }
154
+
155
+ write(ast, level, async) {
156
+ if(async) {
157
+ this.emit('awiat ');
158
+ }
159
+ this.generator.emit(`${_snakeCase(ast.left.id.lexeme)}.write${async ? '_async' : ''}(`);
160
+ this.generator.visitExpr(ast.args[0], level);
161
+ this.generator.emit(')\n');
162
+ }
163
+
164
+ pipe(ast) {
165
+ this.generator.emit(`${_snakeCase(ast.left.id.lexeme)}.seek(0)\n`);
166
+ // this.generator.visitExpr(ast.args[0]);
167
+ // this.generator.emit(')\n');
168
+ }
169
+ }
170
+
171
+ class Number extends Builtin {
172
+ constructor(generator) {
173
+ const methods = [];
174
+ super(generator, `${CORE}Math`, methods);
175
+ }
176
+
177
+ floor(ast, level) {
178
+ this.generator.imports.push({
179
+ className: 'math',
180
+ });
181
+ this.generator.emit('math.floor(');
182
+ this.generator.visitExpr(ast.args[0], level);
183
+ this.generator.emit(')');
184
+ }
185
+
186
+ round(ast, level) {
187
+ this.generator.emit('round(');
188
+ this.generator.visitExpr(ast.args[0], level);
189
+ this.generator.emit(')');
190
+ }
191
+
192
+ min(ast, level) {
193
+ this.generator.emit('min(');
194
+ this.generator.visitExpr(ast.args[0], level);
195
+ this.generator.emit(', ');
196
+ this.generator.visitExpr(ast.args[1], level);
197
+ this.generator.emit(')');
198
+ }
199
+
200
+ max(ast, level) {
201
+ this.generator.emit('max(');
202
+ this.generator.visitExpr(ast.args[0], level);
203
+ this.generator.emit(', ');
204
+ this.generator.visitExpr(ast.args[1], level);
205
+ this.generator.emit(')');
206
+ }
207
+
208
+ parseInt(ast) {
209
+ this.generator.emit('int(');
210
+ this.getInstanceName(ast);
211
+ this.generator.emit(')');
212
+ }
213
+
214
+ parseLong(ast) {
215
+ this.generator.emit('int(');
216
+ this.getInstanceName(ast);
217
+ this.generator.emit(')');
218
+ }
219
+
220
+ parseFloat(ast) {
221
+ this.generator.emit('float(');
222
+ this.getInstanceName(ast);
223
+ this.generator.emit(')');
224
+ }
225
+
226
+ parseDouble(ast) {
227
+ this.generator.emit('float(');
228
+ this.getInstanceName(ast);
229
+ this.generator.emit(')');
230
+ }
231
+
232
+ itol(ast) {
233
+ this.getInstanceName(ast);
234
+ }
235
+
236
+ ltoi(ast) {
237
+ this.getInstanceName(ast);
238
+ }
239
+
240
+ random() {
241
+ this.generator.imports.push({
242
+ className: 'random',
243
+ });
244
+ this.generator.emit('random.random()');
245
+ }
246
+ }
247
+
248
+ class JSON extends Builtin {
249
+ constructor(generator) {
250
+ const methods = [];
251
+ super(generator, `${CORE}JSON`, methods);
252
+ }
253
+
254
+ stringify(ast, level) {
255
+ this.generator.imports.push({
256
+ aliasName: `${CORE}Core`,
257
+ className: `${CORE}Core`,
258
+ packageName: 'darabonba.core',
259
+ });
260
+ this.generator.emit(`${CORE}Core.to_json_string(`);
261
+ this.generator.visitExpr(ast.args[0], level);
262
+ this.generator.emit(')');
263
+ }
264
+
265
+ parseJSON(ast, level) {
266
+ this.generator.imports.push({
267
+ className: 'json',
268
+ });
269
+ this.generator.emit('json.loads(');
270
+ this.generator.visitExpr(ast.args[0], level);
271
+ this.generator.emit(')');
272
+ }
273
+ }
274
+
275
+ class Form extends Builtin {
276
+ constructor(generator) {
277
+ const methods = ['toFormString', 'getBoundary', 'toFileForm'];
278
+ super(generator, `${CORE}Form`, methods);
279
+ }
280
+ }
281
+
282
+ class File extends Builtin {
283
+ constructor(generator) {
284
+ const methods = ['createReadStream', 'createWriteStream', 'exists'];
285
+ super(generator, `${CORE}File`, methods);
286
+ }
287
+ }
288
+
289
+ class Bytes extends Builtin {
290
+ constructor(generator) {
291
+ const methods = [];
292
+ super(generator, `${CORE}Bytes`, methods);
293
+ }
294
+
295
+ from_(ast) {
296
+ const clientName = this.getClientName();
297
+ this.generator.emit(`${clientName}.from_`);
298
+ this.generator.visitArgs(ast.args);
299
+ }
300
+
301
+ toString(ast) {
302
+ this.getInstanceName(ast);
303
+ this.generator.emit('.decode(\'utf-8\')');
304
+ }
305
+
306
+ length(ast) {
307
+ this.generator.emit('len(');
308
+ this.getInstanceName(ast);
309
+ this.generator.emit(')');
310
+ }
311
+
312
+ toHex(ast){
313
+ this.getInstanceName(ast);
314
+ this.generator.emit('.hex()');
315
+ }
316
+
317
+ toBase64(ast){
318
+ this.generator.imports.push({
319
+ className: 'base64',
320
+ });
321
+ this.generator.emit('base64.b64encode(');
322
+ this.getInstanceName(ast);
323
+ this.generator.emit(').decode(\'utf-8\')');
324
+ }
325
+
326
+ toJSON(ast){
327
+ this.toString(ast);
328
+ }
329
+
330
+ }
331
+
332
+
333
+ class Converter {
334
+ constructor(generator) {
335
+ this.generator = generator;
336
+ integers.forEach(type => {
337
+ this[type] = function (ast) {
338
+ const expr = ast.args[0];
339
+ generator.emit('int(');
340
+ generator.visitExpr(expr);
341
+ generator.emit(')');
342
+ };
343
+ });
344
+
345
+ floats.forEach(type => {
346
+ this[type] = function (ast) {
347
+ const expr = ast.args[0];
348
+ generator.emit('float(');
349
+ generator.visitExpr(expr);
350
+ generator.emit(')');
351
+ };
352
+ });
353
+ }
354
+
355
+ string(ast) {
356
+ const expr = ast.args[0];
357
+ if(_isDefault(expr)) {
358
+ this.generator.visitExpr(expr);
359
+ return;
360
+ }
361
+ this.generator.emit('str(');
362
+ this.generator.visitExpr(expr);
363
+ this.generator.emit(')');
364
+ }
365
+
366
+ number(ast) {
367
+ const expr = ast.args[0];
368
+ this.generator.imports.push({
369
+ aliasName: `${CORE}Core`,
370
+ className: `${CORE}Core`,
371
+ packageName: 'darabonba.core',
372
+ });
373
+ this.generator.emit(`${CORE}Core.to_number(`);
374
+ this.generator.visitExpr(expr);
375
+ this.generator.emit(')');
376
+ }
377
+
378
+ boolean(ast) {
379
+ const expr = ast.args[0];
380
+ this.generator.emit('bool(');
381
+ this.generator.visitExpr(expr);
382
+ this.generator.emit(')');
383
+ }
384
+
385
+ bytes(ast) {
386
+ const expr = ast.args[0];
387
+ this.generator.emit('bytes(');
388
+ this.generator.visitExpr(expr);
389
+ this.generator.emit(')');
390
+ }
391
+
392
+ any(ast) {
393
+ const expr = ast.args[0];
394
+ this.generator.visitExpr(expr);
395
+ }
396
+
397
+ object(ast) {
398
+ const expr = ast.args[0];
399
+ this.generator.visitExpr(expr);
400
+ }
401
+
402
+ readable(ast) {
403
+ const expr = ast.args[0];
404
+ this.generator.usedTypes.push('StringIO');
405
+ this.generator.imports.push({
406
+ className: 'json',
407
+ });
408
+ this.generator.emit('StringIO(json.dumps(');
409
+ this.generator.visitExpr(expr);
410
+ this.generator.emit('))');
411
+ }
412
+
413
+ writable(ast) {
414
+ const expr = ast.args[0];
415
+ this.generator.usedTypes.push('BytesIO');
416
+ this.generator.imports.push({
417
+ className: 'json',
418
+ });
419
+ this.generator.emit('BytesIO(json.dumps(');
420
+ this.generator.visitExpr(expr);
421
+ this.generator.emit(').encode(\'utf-8\'))');
422
+ }
423
+ }
424
+
425
+ class Func {
426
+ constructor(generator) {
427
+ this.generator = generator;
428
+ ['isNull'].forEach(method => {
429
+ this[method] = function (ast) {
430
+ const clientName = this.getClientName();
431
+ generator.emit(`${clientName}.${_snakeCase(method)}`);
432
+ generator.visitArgs(ast.args);
433
+ };
434
+ });
435
+ }
436
+
437
+ sleep(ast, level, async) {
438
+ const clientName = this.getClientName();
439
+ if(async) {
440
+ this.generator.emit('awiat ');
441
+ }
442
+ this.generator.emit(`${clientName}.sleep`);
443
+ if(async) {
444
+ this.generator.emit('_async');
445
+ }
446
+ this.generator.visitArgs(ast.args, level);
447
+ }
448
+
449
+ equal(ast) {
450
+ this.generator.visitExpr(ast.args[0]);
451
+ this.generator.emit(' == ');
452
+ this.generator.visitExpr(ast.args[1]);
453
+ }
454
+
455
+ default(ast) {
456
+ this.generator.visitExpr(ast.args[0]);
457
+ this.generator.emit(' or ');
458
+ this.generator.visitExpr(ast.args[1]);
459
+ }
460
+
461
+ getClientName() {
462
+ this.generator.imports.push({
463
+ aliasName: `${CORE}Core`,
464
+ className: `${CORE}Core`,
465
+ packageName: 'darabonba.core',
466
+ });
467
+ return `${CORE}Core`;
468
+ }
469
+ }
470
+
471
+ class String extends Builtin {
472
+
473
+ replace(ast, level) {
474
+ this.getInstanceName(ast);
475
+ const args = ast.args;
476
+ const regex = ast.args[0].value.string;
477
+ const [, extractedString, flag] = regex.match(/\/(.*?)\/(.*)/) || [];
478
+ this.generator.emit('.replace');
479
+ this.generator.emit(`('${extractedString}', `);
480
+ this.generator.visitExpr(args[1], level);
481
+ if (flag.includes('i')) {
482
+ this.generator.emit(', flags=re.IGNORECASE)');
483
+ return;
484
+ }
485
+ if (!flag.includes('g')) {
486
+ this.generator.emit(', 1)');
487
+ return;
488
+ }
489
+ this.generator.emit(')');
490
+ }
491
+
492
+ contains(ast, level) {
493
+ this.generator.visitExpr(ast.args[0], level);
494
+ this.generator.emit(' in ');
495
+ this.getInstanceName(ast);
496
+ }
497
+
498
+ length(ast) {
499
+ this.generator.emit('len(');
500
+ this.getInstanceName(ast);
501
+ this.generator.emit(')');
502
+ }
503
+
504
+ hasPrefix(ast, level) {
505
+ this.getInstanceName(ast);
506
+ const args = ast.args;
507
+ this.generator.emit('.startswith');
508
+ this.generator.visitArgs(args, level);
509
+ }
510
+
511
+ hasSuffix(ast, level) {
512
+ this.getInstanceName(ast);
513
+ const args = ast.args;
514
+ this.generator.emit('.endswith');
515
+ this.generator.visitArgs(args, level);
516
+ }
517
+
518
+ index(ast, level) {
519
+ this.getInstanceName(ast);
520
+ const args = ast.args;
521
+ this.generator.emit('.find');
522
+ this.generator.visitArgs(args, level);
523
+ }
524
+
525
+ subString(ast, level) {
526
+ this.getInstanceName(ast);
527
+ const args = ast.args;
528
+ this.generator.emit('[');
529
+ this.generator.visitExpr(args[0], level);
530
+ this.generator.emit(':');
531
+ this.generator.visitExpr(args[1], level);
532
+ this.generator.emit(']');
533
+ }
534
+
535
+ toLower(ast) {
536
+ this.getInstanceName(ast);
537
+ this.generator.emit('.lower()');
538
+ }
539
+
540
+ toUpper(ast) {
541
+ this.getInstanceName(ast);
542
+ this.generator.emit('.upper()');
543
+ }
544
+
545
+ equals(ast) {
546
+ this.getInstanceName(ast);
547
+ const expr = ast.args[0];
548
+ this.generator.emit(' == ');
549
+ this.generator.visitExpr(expr);
550
+
551
+ }
552
+
553
+ empty(ast) {
554
+ this.generator.emit('not ');
555
+ this.getInstanceName(ast);
556
+ }
557
+
558
+ toBytes(ast) {
559
+ const expr = ast.args[0];
560
+ this.getInstanceName(ast);
561
+ this.generator.emit('.encode(');
562
+ if (expr.value.string === 'utf8'){
563
+ this.generator.emit('\'utf-8\'');
564
+ }else{
565
+ this.generator.visitExpr(expr);
566
+ }
567
+ this.generator.emit(')');
568
+ }
569
+
570
+ parseInt(ast) {
571
+ this.generator.emit('int(');
572
+ this.getInstanceName(ast);
573
+ this.generator.emit(')');
574
+ }
575
+
576
+ parseLong(ast) {
577
+ this.generator.emit('int(');
578
+ this.getInstanceName(ast);
579
+ this.generator.emit(')');
580
+ }
581
+
582
+ parseFloat(ast) {
583
+ this.generator.emit('float(');
584
+ this.getInstanceName(ast);
585
+ this.generator.emit(')');
586
+ }
587
+
588
+ parseDouble(ast) {
589
+ this.generator.emit('float(');
590
+ this.getInstanceName(ast);
591
+ this.generator.emit(')');
592
+ }
593
+
594
+ trim(ast) {
595
+ this.getInstanceName(ast);
596
+ this.generator.emit('.strip()');
597
+ }
598
+ }
599
+
600
+ class Array extends Builtin {
601
+ constructor(generator) {
602
+ const methods = ['toJSON'];
603
+ super(generator, `${CORE}Array`, methods);
604
+ }
605
+
606
+ join(ast, level) {
607
+ // this.generator.emit(`'`);
608
+ this.generator.visitExpr(ast.args[0], level);
609
+ this.generator.emit('.join(');
610
+ this.getInstanceName(ast);
611
+ this.generator.emit(')');
612
+ }
613
+
614
+ contains(ast, level) {
615
+ // this.generator.emit(`if `);
616
+ this.generator.visitExpr(ast.args[0], level);
617
+ this.generator.emit(' in ');
618
+ this.getInstanceName(ast);
619
+ }
620
+
621
+ length(ast) {
622
+ this.generator.emit('len(');
623
+ this.getInstanceName(ast);
624
+ this.generator.emit(')');
625
+ }
626
+
627
+ index(ast, level) {
628
+ this.getInstanceName(ast);
629
+ this.generator.emit('.index(');
630
+ this.generator.visitExpr(ast.args[0], level);
631
+ this.generator.emit(')');
632
+ }
633
+
634
+ get(ast, level) {
635
+ this.getInstanceName(ast);
636
+ this.generator.emit('[');
637
+ this.generator.visitExpr(ast.args[0], level);
638
+ this.generator.emit(']');
639
+ }
640
+
641
+ sort(ast) {
642
+ if (ast.args[0].value.string === 'acs'){
643
+ this.generator.emit('sorted(');
644
+ this.getInstanceName(ast);
645
+ this.generator.emit(')');
646
+ }else{
647
+ this.generator.emit('sorted(');
648
+ this.getInstanceName(ast);
649
+ this.generator.emit(', reverse=True');
650
+ this.generator.emit(')');
651
+ }
652
+ }
653
+
654
+ shift(ast) {
655
+ this.getInstanceName(ast);
656
+ this.generator.emit('.pop(0)');
657
+ }
658
+
659
+ pop(ast) {
660
+ this.getInstanceName(ast);
661
+ this.generator.emit('.pop()');
662
+ }
663
+
664
+ unshift(ast, level) {
665
+ this.getInstanceName(ast);
666
+ this.generator.emit('.insert(0, ');
667
+ this.generator.visitExpr(ast.args[0], level);
668
+ this.generator.emit(')');
669
+
670
+ }
671
+
672
+ push(ast, level) {
673
+ this.getInstanceName(ast);
674
+ this.generator.emit('.insert(');
675
+ this.generator.visitExpr(ast.args[0], level);
676
+ this.generator.emit(')');
677
+ }
678
+
679
+ concat(ast, level) {
680
+ this.getInstanceName(ast);
681
+ this.generator.emit(' + ');
682
+ this.generator.visitExpr(ast.args[0], level);
683
+ }
684
+
685
+ append(ast, level) {
686
+ this.getInstanceName(ast);
687
+ this.generator.emit('.insert(');
688
+ if (ast.args[1]) {
689
+ this.generator.visitExpr(ast.args[1], level);
690
+ this.generator.emit(', ');
691
+ }
692
+ this.generator.visitExpr(ast.args[0], level);
693
+ this.generator.emit(')');
694
+ }
695
+
696
+ remove(ast, level) {
697
+ this.getInstanceName(ast);
698
+ this.generator.emit('.remove(');
699
+ this.generator.visitExpr(ast.args[0], level);
700
+ this.generator.emit(')');
701
+ }
702
+ }
703
+
704
+ class Map extends Builtin {
705
+
706
+ constructor(generator) {
707
+ const methods = [];
708
+ super(generator, `${CORE}Map`, methods);
709
+ }
710
+
711
+ toJSON(ast) {
712
+ this.generator.imports.push({
713
+ className: 'json',
714
+ });
715
+ this.generator.emit('json.dumps(');
716
+ this.getInstanceName(ast);
717
+ this.generator.emit(')');
718
+ }
719
+
720
+ length(ast) {
721
+ this.generator.emit('len(');
722
+ this.getInstanceName(ast);
723
+ this.generator.emit(')');
724
+ }
725
+
726
+ keySet(ast) {
727
+ this.getInstanceName(ast);
728
+ this.generator.emit('.keys()');
729
+ }
730
+
731
+ entries(ast) {
732
+ this.getInstanceName(ast);
733
+ this.generator.emit('.items()');
734
+ }
735
+
736
+ merge(ast) {
737
+ this.getInstanceName(ast);
738
+ this.generator.emit('.update(');
739
+ this.generator.visitExpr(ast.args[0]);
740
+ this.generator.emit(')');
741
+ }
742
+ }
743
+
744
+ class Entry extends Builtin {
745
+
746
+ key() {
747
+ this.generator.emit('k');
748
+ }
749
+
750
+ value() {
751
+ this.generator.emit('v');
752
+ }
753
+ }
754
+
755
+ class Date extends Builtin {
756
+
757
+ constructor(generator) {
758
+ const methods = [
759
+ // 'format', 'unix', 'diff', 'UTC', 'add', 'sub', 'hour',
760
+ // 'minute', 'second', 'dayOfYear', 'dayOfMonth', 'dayOfWeek',
761
+ // 'weekOfYear', 'weekOfMonth', 'month', 'year'
762
+ ];
763
+ super(generator, `${CORE}Date`, methods);
764
+ }
765
+
766
+ format(ast) {
767
+ this.generator.emit(`${ast.left.id.lexeme}.strftime(`);
768
+ this.generator.emit('\'%Y-%m-%d %H:%M:%S\'');
769
+ this.generator.emit(')');
770
+ }
771
+
772
+ unix(ast) {
773
+ this.getInstanceName(ast);
774
+ this.generator.emit('.timestamp(');
775
+ this.generator.emit(')');
776
+ }
777
+ dayOfWeek(ast) {
778
+ this.getInstanceName(ast);
779
+ this.generator.emit('.weekday()');
780
+ }
781
+
782
+ UTC(ast) {
783
+ this.getInstanceName(ast);
784
+ this.generator.emit('.UTC()');
785
+ }
786
+ }
787
+
788
+ module.exports = (generator) => {
789
+ const builtin = {};
790
+ builtin['$Env'] = new Env(generator);
791
+ builtin['$Logger'] = new Logger(generator);
792
+ builtin['$XML'] = new XML(generator);
793
+ builtin['$URL'] = new URL(generator);
794
+ builtin['$Stream'] = new Stream(generator);
795
+ builtin['$Number'] = new Number(generator);
796
+ builtin['$JSON'] = new JSON(generator);
797
+ builtin['$Form'] = new Form(generator);
798
+ builtin['$File'] = new File(generator);
799
+ builtin['$Bytes'] = new Bytes(generator);
800
+ const converter = new Converter(generator);
801
+ types.map(type => {
802
+ builtin[`$${type}`] = converter;
803
+ });
804
+
805
+ const func = new Func(generator);
806
+ builtin['$isNull'] = func;
807
+ builtin['$sleep'] = func;
808
+ builtin['$default'] = func;
809
+ builtin['$equal'] = func;
810
+
811
+ builtin['$String'] = new String(generator);
812
+ builtin['$Array'] = new Array(generator);
813
+ builtin['$Date'] = new Date(generator);
814
+ builtin['$Map'] = new Map(generator);
815
+ builtin['$Entry'] = new Entry(generator);
816
+
817
+ return builtin;
818
+ };