@abaplint/transpiler 2.10.48 → 2.10.50
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.
- package/build/src/expressions/constant.d.ts +2 -1
- package/build/src/expressions/constant.js +29 -25
- package/build/src/handlers/handle_abap.js +8 -5
- package/build/src/statements/clear.js +1 -2
- package/build/src/statements/index.d.ts +1 -0
- package/build/src/statements/index.js +1 -0
- package/build/src/statements/program.d.ts +7 -0
- package/build/src/statements/program.js +12 -0
- package/build/src/statements/refresh.js +2 -8
- package/build/src/statements/select.js +1 -1
- package/build/src/traversal.d.ts +1 -2
- package/package.json +3 -3
|
@@ -5,7 +5,8 @@ import { IExpressionTranspiler } from "./_expression_transpiler";
|
|
|
5
5
|
export declare class ConstantTranspiler implements IExpressionTranspiler {
|
|
6
6
|
private readonly addGet;
|
|
7
7
|
constructor(addGet?: boolean);
|
|
8
|
+
private handleInteger;
|
|
8
9
|
transpile(node: Nodes.ExpressionNode, traversal: Traversal): Chunk;
|
|
9
|
-
private
|
|
10
|
+
private handleCharacter;
|
|
10
11
|
static escape(str: string): string;
|
|
11
12
|
}
|
|
@@ -7,30 +7,33 @@ class ConstantTranspiler {
|
|
|
7
7
|
constructor(addGet = false) {
|
|
8
8
|
this.addGet = addGet;
|
|
9
9
|
}
|
|
10
|
+
handleInteger(int, traversal) {
|
|
11
|
+
const concat = int.concatTokens().trim();
|
|
12
|
+
const parsed = Number.parseInt(concat, 10);
|
|
13
|
+
let code = "";
|
|
14
|
+
if (concat.length > 18) {
|
|
15
|
+
// its potentially larger than Number.MAX_SAFE_INTEGER
|
|
16
|
+
// https://stackoverflow.com/questions/1379934/large-numbers-erroneously-rounded-in-javascript
|
|
17
|
+
code = `new abap.types.Integer8().set("${concat}")`;
|
|
18
|
+
}
|
|
19
|
+
else if (parsed > 2147483647 || parsed < -2147483648) {
|
|
20
|
+
code = `new abap.types.Integer8().set("${concat}")`;
|
|
21
|
+
}
|
|
22
|
+
else if (parsed >= -10 && parsed <= 200) {
|
|
23
|
+
code = `abap.IntegerFactory.get(${concat})`;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
code = `new abap.types.Integer().set(${concat})`;
|
|
27
|
+
}
|
|
28
|
+
if (this.addGet === true) {
|
|
29
|
+
code += ".get()";
|
|
30
|
+
}
|
|
31
|
+
return new chunk_1.Chunk().append(code, int, traversal);
|
|
32
|
+
}
|
|
10
33
|
transpile(node, traversal) {
|
|
11
34
|
const int = node.findFirstExpression(core_1.Expressions.Integer);
|
|
12
35
|
if (int) {
|
|
13
|
-
|
|
14
|
-
const parsed = Number.parseInt(concat, 10);
|
|
15
|
-
let code = "";
|
|
16
|
-
if (concat.length > 18) {
|
|
17
|
-
// its potentially larger than Number.MAX_SAFE_INTEGER
|
|
18
|
-
// https://stackoverflow.com/questions/1379934/large-numbers-erroneously-rounded-in-javascript
|
|
19
|
-
code = `new abap.types.Integer8().set("${concat}")`;
|
|
20
|
-
}
|
|
21
|
-
else if (parsed > 2147483647 || parsed < -2147483648) {
|
|
22
|
-
code = `new abap.types.Integer8().set("${concat}")`;
|
|
23
|
-
}
|
|
24
|
-
else if (parsed >= -10 && parsed <= 200) {
|
|
25
|
-
code = `abap.IntegerFactory.get(${concat})`;
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
code = `new abap.types.Integer().set(${concat})`;
|
|
29
|
-
}
|
|
30
|
-
if (this.addGet === true) {
|
|
31
|
-
code += ".get()";
|
|
32
|
-
}
|
|
33
|
-
return new chunk_1.Chunk().append(code, node, traversal);
|
|
36
|
+
return this.handleInteger(int, traversal);
|
|
34
37
|
}
|
|
35
38
|
let str = node.findDirectExpression(core_1.Expressions.ConstantString);
|
|
36
39
|
if (str === undefined) {
|
|
@@ -39,7 +42,7 @@ class ConstantTranspiler {
|
|
|
39
42
|
if (str) {
|
|
40
43
|
let res = str.getFirstToken().getStr();
|
|
41
44
|
if (res.startsWith("'") && this.addGet === false) {
|
|
42
|
-
const code = this.
|
|
45
|
+
const code = this.handleCharacter(res);
|
|
43
46
|
return new chunk_1.Chunk().append(code, node, traversal);
|
|
44
47
|
}
|
|
45
48
|
else if (res.startsWith("`") && this.addGet === false) {
|
|
@@ -67,7 +70,7 @@ class ConstantTranspiler {
|
|
|
67
70
|
chunk.appendString(",");
|
|
68
71
|
}
|
|
69
72
|
if (res.startsWith("'") && this.addGet === false) {
|
|
70
|
-
const code = this.
|
|
73
|
+
const code = this.handleCharacter(res);
|
|
71
74
|
chunk.append(code, node, traversal);
|
|
72
75
|
}
|
|
73
76
|
else if (res.startsWith("`") && this.addGet === false) {
|
|
@@ -80,14 +83,15 @@ class ConstantTranspiler {
|
|
|
80
83
|
}
|
|
81
84
|
return new chunk_1.Chunk(`todo, Constant`);
|
|
82
85
|
}
|
|
83
|
-
|
|
86
|
+
handleCharacter(res) {
|
|
84
87
|
const foo = res.replace(/''/g, "'");
|
|
85
88
|
let length = foo.length - 2;
|
|
86
89
|
if (length <= 0) {
|
|
87
90
|
// note: Characters cannot have length = zero, 1 is minimum
|
|
88
91
|
length = 1;
|
|
89
92
|
}
|
|
90
|
-
const code = "
|
|
93
|
+
const code = "abap.CharacterFactory.get(" + length + ", " + ConstantTranspiler.escape(res) + ")";
|
|
94
|
+
// const code = "new abap.types.Character(" + length + ").set(" + ConstantTranspiler.escape(res) + ")";
|
|
91
95
|
return code;
|
|
92
96
|
}
|
|
93
97
|
static escape(str) {
|
|
@@ -119,22 +119,25 @@ class HandleABAP {
|
|
|
119
119
|
return contents;
|
|
120
120
|
}
|
|
121
121
|
findExports(node) {
|
|
122
|
-
if (node === undefined) {
|
|
123
|
-
return [];
|
|
124
|
-
}
|
|
125
122
|
const res = [];
|
|
126
|
-
for (const c of node
|
|
123
|
+
for (const c of node?.findAllStatements(abaplint.Statements.ClassDefinition) || []) {
|
|
127
124
|
const e = c.findFirstExpression(abaplint.Expressions.ClassName)?.getFirstToken().getStr();
|
|
128
125
|
if (e) {
|
|
129
126
|
res.push(e.toLowerCase());
|
|
130
127
|
}
|
|
131
128
|
}
|
|
132
|
-
for (const c of node
|
|
129
|
+
for (const c of node?.findAllStatements(abaplint.Statements.Interface) || []) {
|
|
133
130
|
const e = c.findFirstExpression(abaplint.Expressions.InterfaceName)?.getFirstToken().getStr();
|
|
134
131
|
if (e) {
|
|
135
132
|
res.push(e.toLowerCase());
|
|
136
133
|
}
|
|
137
134
|
}
|
|
135
|
+
for (const c of node?.findAllStatements(abaplint.Statements.Form) || []) {
|
|
136
|
+
const e = c.findFirstExpression(abaplint.Expressions.FormName)?.getFirstToken().getStr();
|
|
137
|
+
if (e) {
|
|
138
|
+
res.push(e.toLowerCase());
|
|
139
|
+
}
|
|
140
|
+
}
|
|
138
141
|
return res;
|
|
139
142
|
}
|
|
140
143
|
}
|
|
@@ -7,9 +7,8 @@ class ClearTranspiler {
|
|
|
7
7
|
transpile(node, traversal) {
|
|
8
8
|
const target = traversal.traverse(node.findDirectExpression(abaplint.Expressions.Target));
|
|
9
9
|
const ret = new chunk_1.Chunk();
|
|
10
|
-
ret.append("abap.statements.clear(", node, traversal);
|
|
11
10
|
ret.appendChunk(target);
|
|
12
|
-
ret.append(");", node.getLastToken(), traversal);
|
|
11
|
+
ret.append(".clear();", node.getLastToken(), traversal);
|
|
13
12
|
return ret;
|
|
14
13
|
}
|
|
15
14
|
}
|
|
@@ -41,6 +41,7 @@ __exportStar(require("./close_dataset"), exports);
|
|
|
41
41
|
__exportStar(require("./collect"), exports);
|
|
42
42
|
__exportStar(require("./commit"), exports);
|
|
43
43
|
__exportStar(require("./compute"), exports);
|
|
44
|
+
__exportStar(require("./program"), exports);
|
|
44
45
|
__exportStar(require("./concatenate"), exports);
|
|
45
46
|
__exportStar(require("./condense"), exports);
|
|
46
47
|
__exportStar(require("./constant"), exports);
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as abaplint from "@abaplint/core";
|
|
2
|
+
import { IStatementTranspiler } from "./_statement_transpiler";
|
|
3
|
+
import { Traversal } from "../traversal";
|
|
4
|
+
import { Chunk } from "../chunk";
|
|
5
|
+
export declare class ProgramTranspiler implements IStatementTranspiler {
|
|
6
|
+
transpile(_node: abaplint.Nodes.StatementNode, _traversal: Traversal): Chunk;
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProgramTranspiler = void 0;
|
|
4
|
+
const chunk_1 = require("../chunk");
|
|
5
|
+
class ProgramTranspiler {
|
|
6
|
+
transpile(_node, _traversal) {
|
|
7
|
+
// for now, do nothing,
|
|
8
|
+
return new chunk_1.Chunk(``);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
exports.ProgramTranspiler = ProgramTranspiler;
|
|
12
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -1,16 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RefreshTranspiler = void 0;
|
|
4
|
-
const
|
|
5
|
-
const chunk_1 = require("../chunk");
|
|
4
|
+
const clear_1 = require("./clear");
|
|
6
5
|
class RefreshTranspiler {
|
|
7
6
|
transpile(node, traversal) {
|
|
8
|
-
|
|
9
|
-
const ret = new chunk_1.Chunk();
|
|
10
|
-
ret.append("abap.statements.clear(", node, traversal);
|
|
11
|
-
ret.appendChunk(target);
|
|
12
|
-
ret.append(");", node.getLastToken(), traversal);
|
|
13
|
-
return ret;
|
|
7
|
+
return new clear_1.ClearTranspiler().transpile(node, traversal);
|
|
14
8
|
}
|
|
15
9
|
}
|
|
16
10
|
exports.RefreshTranspiler = RefreshTranspiler;
|
|
@@ -100,7 +100,7 @@ class SelectTranspiler {
|
|
|
100
100
|
throw new Error("FAE, todo, empty table");
|
|
101
101
|
} else {
|
|
102
102
|
const ${unique2} = ${faeTranspiled}.array();
|
|
103
|
-
|
|
103
|
+
${target}.clear();
|
|
104
104
|
for await (const ${unique} of ${unique2}) {
|
|
105
105
|
await abap.statements.select(${target}, {select: "${select.trim()}"${extra}}, {appending: true});
|
|
106
106
|
}
|
package/build/src/traversal.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as abaplint from "@abaplint/core";
|
|
2
|
-
import { ISpaghettiScopeNode } from "@abaplint/core";
|
|
3
2
|
import { Chunk } from "./chunk";
|
|
4
3
|
import { ITranspilerOptions } from "./types";
|
|
5
4
|
export declare class Traversal {
|
|
@@ -31,7 +30,7 @@ export declare class Traversal {
|
|
|
31
30
|
buildAttributes(def: abaplint.IClassDefinition | abaplint.IInterfaceDefinition | undefined, scope: abaplint.ISpaghettiScopeNode | undefined, prefix?: string): Set<string>;
|
|
32
31
|
isBuiltinMethod(token: abaplint.Token): boolean;
|
|
33
32
|
isSQLConversion(token: abaplint.Token): string | undefined;
|
|
34
|
-
findMethodReference(token: abaplint.Token, scope: ISpaghettiScopeNode | undefined): undefined | {
|
|
33
|
+
findMethodReference(token: abaplint.Token, scope: abaplint.ISpaghettiScopeNode | undefined): undefined | {
|
|
35
34
|
def: abaplint.Types.MethodDefinition;
|
|
36
35
|
name: string;
|
|
37
36
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abaplint/transpiler",
|
|
3
|
-
"version": "2.10.
|
|
3
|
+
"version": "2.10.50",
|
|
4
4
|
"description": "Transpiler",
|
|
5
5
|
"main": "build/src/index.js",
|
|
6
6
|
"typings": "build/src/index.d.ts",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
"author": "abaplint",
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@abaplint/core": "^2.113.
|
|
32
|
+
"@abaplint/core": "^2.113.114",
|
|
33
33
|
"source-map": "^0.7.4"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@types/chai": "^4.3.20",
|
|
37
37
|
"@types/mocha": "^10.0.10",
|
|
38
38
|
"chai": "^4.5.0",
|
|
39
|
-
"mocha": "^11.
|
|
39
|
+
"mocha": "^11.2.2",
|
|
40
40
|
"source-map-support": "^0.5.21",
|
|
41
41
|
"typescript": "^5.8.3"
|
|
42
42
|
}
|