@abaplint/core 2.89.7 → 2.89.10
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/abap/5_syntax/basic_types.js +18 -8
- package/build/src/abap/5_syntax/expressions/compare.js +4 -0
- package/build/src/abap/5_syntax/expressions/field_chain.js +7 -3
- package/build/src/abap/5_syntax/expressions/field_length.js +2 -6
- package/build/src/abap/5_syntax/expressions/field_offset.js +2 -6
- package/build/src/abap/5_syntax/expressions/loop_group_by.js +11 -0
- package/build/src/abap/5_syntax/expressions/source.js +3 -0
- package/build/src/abap/5_syntax/expressions/source_field_symbol.js +17 -0
- package/build/src/registry.js +1 -1
- package/build/src/rules/downport.js +28 -18
- package/package.json +4 -4
|
@@ -249,9 +249,9 @@ class BasicTypes {
|
|
|
249
249
|
}
|
|
250
250
|
}
|
|
251
251
|
const options = {
|
|
252
|
-
withHeader: text.includes("WITH HEADER LINE"),
|
|
252
|
+
withHeader: text.includes(" WITH HEADER LINE"),
|
|
253
253
|
type: type,
|
|
254
|
-
isUnique: text.includes("WITH UNIQUE"),
|
|
254
|
+
isUnique: text.includes(" WITH UNIQUE"),
|
|
255
255
|
keyFields: keyFields,
|
|
256
256
|
};
|
|
257
257
|
let found = undefined;
|
|
@@ -387,7 +387,7 @@ class BasicTypes {
|
|
|
387
387
|
sub = node.findFirstExpression(Expressions.FieldChain);
|
|
388
388
|
}
|
|
389
389
|
found = this.resolveLikeName(sub);
|
|
390
|
-
if (found &&
|
|
390
|
+
if (found && this.isOccurs(node)) {
|
|
391
391
|
found = new Types.TableType(found, { withHeader: text.includes("WITH HEADER LINE") }, qualifiedName);
|
|
392
392
|
}
|
|
393
393
|
}
|
|
@@ -416,10 +416,10 @@ class BasicTypes {
|
|
|
416
416
|
else if (text.startsWith("TYPE")) {
|
|
417
417
|
found = this.resolveTypeName(typeName, this.findLength(node), this.findDecimals(node), qualifiedName);
|
|
418
418
|
const concat = node.concatTokens().toUpperCase();
|
|
419
|
-
if (found &&
|
|
420
|
-
found = new Types.TableType(found, { withHeader: concat.includes("WITH HEADER LINE") }, qualifiedName);
|
|
419
|
+
if (found && this.isOccurs(node)) {
|
|
420
|
+
found = new Types.TableType(found, { withHeader: concat.includes(" WITH HEADER LINE") }, qualifiedName);
|
|
421
421
|
}
|
|
422
|
-
else if (found && concat.includes("WITH HEADER LINE")) {
|
|
422
|
+
else if (found && concat.includes(" WITH HEADER LINE")) {
|
|
423
423
|
if (found instanceof Types.VoidType) {
|
|
424
424
|
found = new Types.TableType(found, { withHeader: true });
|
|
425
425
|
}
|
|
@@ -440,14 +440,24 @@ class BasicTypes {
|
|
|
440
440
|
}
|
|
441
441
|
}
|
|
442
442
|
found = new Types.CharacterType(length, qualifiedName); // fallback
|
|
443
|
-
if (
|
|
444
|
-
found = new Types.TableType(found, { withHeader: concat.includes("WITH HEADER LINE") }, qualifiedName);
|
|
443
|
+
if (this.isOccurs(node)) {
|
|
444
|
+
found = new Types.TableType(found, { withHeader: concat.includes(" WITH HEADER LINE") }, qualifiedName);
|
|
445
445
|
}
|
|
446
446
|
}
|
|
447
447
|
}
|
|
448
448
|
return found;
|
|
449
449
|
}
|
|
450
450
|
/////////////////////
|
|
451
|
+
isOccurs(node) {
|
|
452
|
+
var _a;
|
|
453
|
+
if (node.findDirectTokenByText("OCCURS")) {
|
|
454
|
+
return true;
|
|
455
|
+
}
|
|
456
|
+
else if ((_a = node.findFirstExpression(Expressions.TypeTable)) === null || _a === void 0 ? void 0 : _a.findDirectTokenByText("OCCURS")) {
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
return false;
|
|
460
|
+
}
|
|
451
461
|
// todo, rewrite this method
|
|
452
462
|
resolveTypeChain(expr) {
|
|
453
463
|
var _a;
|
|
@@ -4,11 +4,15 @@ exports.Compare = void 0;
|
|
|
4
4
|
const Expressions = require("../../2_statements/expressions");
|
|
5
5
|
const source_1 = require("./source");
|
|
6
6
|
const method_call_chain_1 = require("./method_call_chain");
|
|
7
|
+
const source_field_symbol_1 = require("./source_field_symbol");
|
|
7
8
|
class Compare {
|
|
8
9
|
runSyntax(node, scope, filename) {
|
|
9
10
|
for (const t of node.findDirectExpressions(Expressions.Source)) {
|
|
10
11
|
new source_1.Source().runSyntax(t, scope, filename);
|
|
11
12
|
}
|
|
13
|
+
for (const t of node.findDirectExpressions(Expressions.SourceFieldSymbol)) {
|
|
14
|
+
new source_field_symbol_1.SourceFieldSymbol().runSyntax(t, scope, filename);
|
|
15
|
+
}
|
|
12
16
|
for (const t of node.findDirectExpressions(Expressions.MethodCallChain)) {
|
|
13
17
|
new method_call_chain_1.MethodCallChain().runSyntax(t, scope, filename);
|
|
14
18
|
}
|
|
@@ -13,6 +13,7 @@ const field_length_1 = require("./field_length");
|
|
|
13
13
|
const table_expression_1 = require("./table_expression");
|
|
14
14
|
const expressions_1 = require("../../2_statements/expressions");
|
|
15
15
|
const dereference_1 = require("./dereference");
|
|
16
|
+
const source_field_symbol_1 = require("./source_field_symbol");
|
|
16
17
|
class FieldChain {
|
|
17
18
|
runSyntax(node, scope, filename, refType) {
|
|
18
19
|
const concat = node.concatTokens();
|
|
@@ -102,8 +103,11 @@ class FieldChain {
|
|
|
102
103
|
if (node === undefined) {
|
|
103
104
|
return undefined;
|
|
104
105
|
}
|
|
105
|
-
if (node
|
|
106
|
-
|
|
106
|
+
if (node instanceof nodes_1.ExpressionNode
|
|
107
|
+
&& node.get() instanceof Expressions.SourceFieldSymbol) {
|
|
108
|
+
return new source_field_symbol_1.SourceFieldSymbol().runSyntax(node, scope, filename);
|
|
109
|
+
}
|
|
110
|
+
else if (node.get() instanceof Expressions.SourceField) {
|
|
107
111
|
const token = node.getFirstToken();
|
|
108
112
|
const name = token.getStr();
|
|
109
113
|
const found = scope.findVariable(name);
|
|
@@ -121,7 +125,7 @@ class FieldChain {
|
|
|
121
125
|
}
|
|
122
126
|
return found.getType();
|
|
123
127
|
}
|
|
124
|
-
if (node.get() instanceof Expressions.ClassName) {
|
|
128
|
+
else if (node.get() instanceof Expressions.ClassName) {
|
|
125
129
|
const classTok = node.getFirstToken();
|
|
126
130
|
const classNam = classTok.getStr();
|
|
127
131
|
if (classNam.toUpperCase() === "OBJECT") {
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.FieldLength = void 0;
|
|
4
4
|
const Expressions = require("../../2_statements/expressions");
|
|
5
5
|
const _reference_1 = require("../_reference");
|
|
6
|
+
const source_field_symbol_1 = require("./source_field_symbol");
|
|
6
7
|
class FieldLength {
|
|
7
8
|
runSyntax(node, scope, filename) {
|
|
8
9
|
const field = node.findDirectExpression(Expressions.SourceField);
|
|
@@ -16,12 +17,7 @@ class FieldLength {
|
|
|
16
17
|
}
|
|
17
18
|
const symbol = node.findDirectExpression(Expressions.SourceFieldSymbol);
|
|
18
19
|
if (symbol) {
|
|
19
|
-
|
|
20
|
-
const found = scope.findVariable(token.getStr());
|
|
21
|
-
if (found === undefined) {
|
|
22
|
-
throw new Error("\"" + symbol.getFirstToken().getStr() + "\" not found, FieldLength");
|
|
23
|
-
}
|
|
24
|
-
scope.addReference(token, found, _reference_1.ReferenceType.DataReadReference, filename);
|
|
20
|
+
new source_field_symbol_1.SourceFieldSymbol().runSyntax(symbol, scope, filename);
|
|
25
21
|
}
|
|
26
22
|
}
|
|
27
23
|
}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.FieldOffset = void 0;
|
|
4
4
|
const Expressions = require("../../2_statements/expressions");
|
|
5
5
|
const _reference_1 = require("../_reference");
|
|
6
|
+
const source_field_symbol_1 = require("./source_field_symbol");
|
|
6
7
|
class FieldOffset {
|
|
7
8
|
runSyntax(node, scope, filename) {
|
|
8
9
|
const field = node.findDirectExpression(Expressions.SourceField);
|
|
@@ -16,12 +17,7 @@ class FieldOffset {
|
|
|
16
17
|
}
|
|
17
18
|
const symbol = node.findDirectExpression(Expressions.SourceFieldSymbol);
|
|
18
19
|
if (symbol) {
|
|
19
|
-
|
|
20
|
-
const found = scope.findVariable(token.getStr());
|
|
21
|
-
if (found === undefined) {
|
|
22
|
-
throw new Error("\"" + symbol.getFirstToken().getStr() + "\" not found, FieldOffset");
|
|
23
|
-
}
|
|
24
|
-
scope.addReference(token, found, _reference_1.ReferenceType.DataReadReference, filename);
|
|
20
|
+
new source_field_symbol_1.SourceFieldSymbol().runSyntax(symbol, scope, filename);
|
|
25
21
|
}
|
|
26
22
|
}
|
|
27
23
|
}
|
|
@@ -4,7 +4,9 @@ exports.LoopGroupBy = void 0;
|
|
|
4
4
|
const Expressions = require("../../2_statements/expressions");
|
|
5
5
|
const basic_1 = require("../../types/basic");
|
|
6
6
|
const component_compare_1 = require("./component_compare");
|
|
7
|
+
const inline_data_1 = require("./inline_data");
|
|
7
8
|
const inline_fs_1 = require("./inline_fs");
|
|
9
|
+
const target_1 = require("./target");
|
|
8
10
|
class LoopGroupBy {
|
|
9
11
|
runSyntax(node, scope, filename) {
|
|
10
12
|
const components = [];
|
|
@@ -17,6 +19,15 @@ class LoopGroupBy {
|
|
|
17
19
|
return;
|
|
18
20
|
}
|
|
19
21
|
const sourceType = new basic_1.StructureType(components);
|
|
22
|
+
for (const t of node.findAllExpressions(Expressions.Target)) {
|
|
23
|
+
const inline = t.findDirectExpression(Expressions.InlineData);
|
|
24
|
+
if (inline) {
|
|
25
|
+
new inline_data_1.InlineData().runSyntax(inline, scope, filename, new basic_1.VoidType("todoGroupBy"));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
new target_1.Target().runSyntax(t, scope, filename);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
20
31
|
const inlinefs = node.findFirstExpression(Expressions.InlineFS);
|
|
21
32
|
if (inlinefs) {
|
|
22
33
|
new inline_fs_1.InlineFS().runSyntax(inlinefs, scope, filename, sourceType);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SourceFieldSymbol = void 0;
|
|
4
|
+
const _reference_1 = require("../_reference");
|
|
5
|
+
class SourceFieldSymbol {
|
|
6
|
+
runSyntax(node, scope, filename) {
|
|
7
|
+
const token = node.getFirstToken();
|
|
8
|
+
const found = scope.findVariable(token.getStr());
|
|
9
|
+
if (found === undefined) {
|
|
10
|
+
throw new Error("\"" + node.getFirstToken().getStr() + "\" not found, SourceFieldSymbol");
|
|
11
|
+
}
|
|
12
|
+
scope.addReference(token, found, _reference_1.ReferenceType.DataReadReference, filename);
|
|
13
|
+
return found.getType();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.SourceFieldSymbol = SourceFieldSymbol;
|
|
17
|
+
//# sourceMappingURL=source_field_symbol.js.map
|
package/build/src/registry.js
CHANGED
|
@@ -690,36 +690,46 @@ ${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
|
690
690
|
bar->if_t100_dyn_msg~msgv4 = 'abc'.
|
|
691
691
|
RAISE EXCEPTION bar.
|
|
692
692
|
*/
|
|
693
|
-
var _a;
|
|
694
|
-
if (node.get() instanceof Statements.Raise) {
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
693
|
+
var _a, _b, _c;
|
|
694
|
+
if (!(node.get() instanceof Statements.Raise)) {
|
|
695
|
+
return undefined;
|
|
696
|
+
}
|
|
697
|
+
let id = undefined;
|
|
698
|
+
let number = undefined;
|
|
699
|
+
let startToken = node.findDirectTokenByText("ID");
|
|
700
|
+
if (startToken) {
|
|
699
701
|
const sources = node.findDirectExpressions(Expressions.Source);
|
|
700
|
-
|
|
702
|
+
id = sources[0].concatTokens();
|
|
701
703
|
const numberExpression = node.findExpressionAfterToken("NUMBER");
|
|
702
704
|
if (numberExpression === undefined) {
|
|
703
705
|
throw "downport raiseException, could not find number";
|
|
704
706
|
}
|
|
705
|
-
|
|
707
|
+
number = numberExpression.concatTokens();
|
|
706
708
|
if (numberExpression.get() instanceof Expressions.MessageNumber) {
|
|
707
709
|
number = "'" + number + "'";
|
|
708
710
|
}
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
const
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
711
|
+
}
|
|
712
|
+
else {
|
|
713
|
+
const s = node.findDirectExpression(Expressions.MessageSource);
|
|
714
|
+
if (s === undefined) {
|
|
715
|
+
return undefined;
|
|
716
|
+
}
|
|
717
|
+
id = "'" + ((_a = s.findDirectExpression(Expressions.MessageClass)) === null || _a === void 0 ? void 0 : _a.concatTokens()) + "'";
|
|
718
|
+
number = "'" + ((_b = s.findDirectExpression(Expressions.MessageTypeAndNumber)) === null || _b === void 0 ? void 0 : _b.concatTokens().substring(1)) + "'";
|
|
719
|
+
startToken = node.getFirstToken();
|
|
720
|
+
}
|
|
721
|
+
const className = ((_c = node.findDirectExpression(Expressions.ClassName)) === null || _c === void 0 ? void 0 : _c.concatTokens()) || "ERROR";
|
|
722
|
+
const uniqueName1 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
723
|
+
const uniqueName2 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
724
|
+
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
725
|
+
const abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
726
|
+
${indentation}${uniqueName1}-msgid = ${id === null || id === void 0 ? void 0 : id.toUpperCase()}.
|
|
715
727
|
${indentation}${uniqueName1}-msgno = ${number}.
|
|
716
728
|
${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
717
729
|
${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.
|
|
718
730
|
${indentation}RAISE EXCEPTION ${uniqueName2}.`;
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
}
|
|
722
|
-
return undefined;
|
|
731
|
+
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), abap);
|
|
732
|
+
return issue_1.Issue.atToken(lowFile, startToken, "Downport RAISE MESSAGE", this.getMetadata().key, this.conf.severity, fix);
|
|
723
733
|
}
|
|
724
734
|
emptyKey(node, lowFile) {
|
|
725
735
|
for (let i of node.findAllExpressions(Expressions.TypeTable)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abaplint/core",
|
|
3
|
-
"version": "2.89.
|
|
3
|
+
"version": "2.89.10",
|
|
4
4
|
"description": "abaplint - Core API",
|
|
5
5
|
"main": "build/src/index.js",
|
|
6
6
|
"typings": "build/abaplint.d.ts",
|
|
@@ -45,12 +45,12 @@
|
|
|
45
45
|
},
|
|
46
46
|
"homepage": "https://abaplint.org",
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@microsoft/api-extractor": "^7.
|
|
48
|
+
"@microsoft/api-extractor": "^7.23.0",
|
|
49
49
|
"@types/chai": "^4.3.1",
|
|
50
50
|
"@types/mocha": "^9.1.1",
|
|
51
|
-
"@types/node": "^17.0.
|
|
51
|
+
"@types/node": "^17.0.27",
|
|
52
52
|
"chai": "^4.3.6",
|
|
53
|
-
"eslint": "^8.
|
|
53
|
+
"eslint": "^8.14.0",
|
|
54
54
|
"mocha": "^9.2.2",
|
|
55
55
|
"c8": "^7.11.2",
|
|
56
56
|
"source-map-support": "^0.5.21",
|