@abaplint/transpiler 2.11.7 → 2.11.9

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.
@@ -133,9 +133,9 @@ class Chunk {
133
133
  return this;
134
134
  }
135
135
  getMap(generatedFilename) {
136
- const generator = new sourceMap.SourceMapGenerator();
137
- this.mappings.forEach(m => generator.addMapping(m));
138
- const json = generator.toJSON();
136
+ const sourceMapGenerator = new sourceMap.SourceMapGenerator();
137
+ this.mappings.forEach(m => sourceMapGenerator.addMapping(m));
138
+ const json = sourceMapGenerator.toJSON();
139
139
  json.file = generatedFilename;
140
140
  json.sourceRoot = "";
141
141
  return JSON.stringify(json, null, 2);
@@ -20,6 +20,7 @@ export * from "./field_offset";
20
20
  export * from "./field_symbol";
21
21
  export * from "./function_exporting";
22
22
  export * from "./source_field_symbol_chain";
23
+ export * from "./type_name_or_infer";
23
24
  export * from "./function_parameters";
24
25
  export * from "./message_number";
25
26
  export * from "./method_call_body";
@@ -36,6 +36,7 @@ __exportStar(require("./field_offset"), exports);
36
36
  __exportStar(require("./field_symbol"), exports);
37
37
  __exportStar(require("./function_exporting"), exports);
38
38
  __exportStar(require("./source_field_symbol_chain"), exports);
39
+ __exportStar(require("./type_name_or_infer"), exports);
39
40
  __exportStar(require("./function_parameters"), exports);
40
41
  __exportStar(require("./message_number"), exports);
41
42
  __exportStar(require("./method_call_body"), exports);
@@ -16,7 +16,7 @@ class SourceTranspiler {
16
16
  const children = node.getChildren();
17
17
  for (let i = 0; i < children.length; i++) {
18
18
  const c = children[i];
19
- const last = i === children.length - 1;
19
+ const isLast = i === children.length - 1;
20
20
  if (c instanceof core_1.Nodes.ExpressionNode) {
21
21
  if (c.get() instanceof core_1.Expressions.FieldChain) {
22
22
  ret.appendChunk(new _1.FieldChainTranspiler(this.addGet).transpile(c, traversal));
@@ -43,7 +43,7 @@ class SourceTranspiler {
43
43
  if (code.includes("await")) {
44
44
  ret = new chunk_1.Chunk().appendString("(").appendChunk(ret).appendString(")");
45
45
  }
46
- if (this.addGet && last === true) {
46
+ if (this.addGet && isLast === true) {
47
47
  ret.append(".get()", c, traversal);
48
48
  }
49
49
  }
@@ -59,7 +59,7 @@ class SourceTranspiler {
59
59
  else if (c.get() instanceof core_1.Expressions.ComponentChain) {
60
60
  ret = new chunk_1.Chunk().appendString("(").appendChunk(ret).appendString(").get().");
61
61
  ret.appendChunk(new _1.ComponentChainTranspiler().transpile(c, traversal));
62
- if (this.addGet && last === true) {
62
+ if (this.addGet && isLast === true) {
63
63
  ret.append(".get()", c, traversal);
64
64
  }
65
65
  }
@@ -69,6 +69,17 @@ class SourceTranspiler {
69
69
  else if (c.get() instanceof core_1.Expressions.TextElement) {
70
70
  ret = new chunk_1.Chunk().appendString(`new abap.types.String().set("${c.concatTokens()}")`);
71
71
  }
72
+ else if (c.get() instanceof core_1.Expressions.ConvBody) {
73
+ const typ = node.findFirstExpression(core_1.Expressions.TypeNameOrInfer);
74
+ if (typ === undefined) {
75
+ throw new Error("TypeNameOrInfer not found in ConvBody");
76
+ }
77
+ ret = new chunk_1.Chunk().appendString(new _1.TypeNameOrInfer().transpile(typ, traversal).getCode());
78
+ ret.appendString(".set(");
79
+ // todo: handle LET
80
+ ret.appendString(traversal.traverse(c.getFirstChild()).getCode());
81
+ ret.appendString(")");
82
+ }
72
83
  else {
73
84
  ret.appendString("SourceUnknown-" + c.get().constructor.name);
74
85
  }
@@ -0,0 +1,7 @@
1
+ import { Nodes } from "@abaplint/core";
2
+ import { IExpressionTranspiler } from "./_expression_transpiler";
3
+ import { Traversal } from "../traversal";
4
+ import { Chunk } from "../chunk";
5
+ export declare class TypeNameOrInfer implements IExpressionTranspiler {
6
+ transpile(node: Nodes.ExpressionNode, traversal: Traversal): Chunk;
7
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TypeNameOrInfer = void 0;
4
+ const chunk_1 = require("../chunk");
5
+ const transpile_types_1 = require("../transpile_types");
6
+ class TypeNameOrInfer {
7
+ transpile(node, traversal) {
8
+ let type;
9
+ const scope = traversal.findCurrentScopeByToken(node.getFirstToken());
10
+ if (node.concatTokens() === "#") {
11
+ type = traversal.lookupInferred(node, scope);
12
+ }
13
+ else {
14
+ type = traversal.lookupType(node.getFirstChild(), scope);
15
+ }
16
+ if (type === undefined) {
17
+ throw new Error("TypeNameOrInfer, type not found: " + node.concatTokens());
18
+ }
19
+ const ret = new chunk_1.Chunk();
20
+ ret.appendString(new transpile_types_1.TranspileTypes().toType(type));
21
+ return ret;
22
+ }
23
+ }
24
+ exports.TypeNameOrInfer = TypeNameOrInfer;
25
+ //# sourceMappingURL=type_name_or_infer.js.map
@@ -1 +1 @@
1
- export declare const DEFAULT_KEYWORDS: string[];
1
+ export declare const DEFAULT_KEYWORDS: Set<string>;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_KEYWORDS = void 0;
4
4
  // https://www.w3schools.com/js/js_reserved.asp
5
- exports.DEFAULT_KEYWORDS = [
5
+ exports.DEFAULT_KEYWORDS = new Set([
6
6
  "abstract", "arguments", "await",
7
7
  "break", "byte", "catch",
8
8
  // "char",
@@ -21,6 +21,6 @@ exports.DEFAULT_KEYWORDS = [
21
21
  "try", "typeof", "var", "void",
22
22
  "delete",
23
23
  "volatile", "while", "yield"
24
- ];
24
+ ]);
25
25
  // "with"
26
26
  //# sourceMappingURL=keywords.js.map
@@ -20,7 +20,8 @@ class LoopTranspiler {
20
20
  if (!(node.get() instanceof abaplint.Statements.Loop)) {
21
21
  throw new Error("LoopTranspiler, unexpected node");
22
22
  }
23
- const source = traversal.traverse(node.findDirectExpression(abaplint.Expressions.SimpleSource2)).getCode();
23
+ const loopSource = node.findDirectExpression(abaplint.Expressions.LoopSource)?.getFirstChild();
24
+ const source = traversal.traverse(loopSource).getCode();
24
25
  this.unique = unique_identifier_1.UniqueIdentifier.get();
25
26
  let target = "";
26
27
  const into = node.findDirectExpression(abaplint.Expressions.LoopTarget)?.findDirectExpression(abaplint.Expressions.Target);
@@ -41,7 +41,7 @@ class MessageTranspiler {
41
41
  }
42
42
  else {
43
43
  // exception or constant based
44
- const exception = node.findDirectExpression(abaplint.Expressions.SimpleSource3);
44
+ const exception = node.findDirectExpression(abaplint.Expressions.MessageSourceSource)?.findDirectExpression(abaplint.Expressions.SimpleSource3);
45
45
  const str = exception?.findFirstExpression(abaplint.Expressions.Constant);
46
46
  if (str) {
47
47
  options.push("text: " + traversal.traverse(str).getCode());
@@ -64,11 +64,10 @@ class MessageTranspiler {
64
64
  if (c.getFirstToken().getStr().toUpperCase() === "WITH") {
65
65
  withs = true;
66
66
  }
67
- else if (withs === true && c.get() instanceof abaplint.Expressions.Source) {
68
- w.push(traversal.traverse(c).getCode());
69
- }
70
- else if (withs === true && c.get() instanceof abaplint.Expressions.SimpleSource3) {
71
- w.push(traversal.traverse(c).getCode());
67
+ else if (withs === true
68
+ && c.get() instanceof abaplint.Expressions.MessageSourceSource
69
+ && c instanceof abaplint.Nodes.ExpressionNode) {
70
+ w.push(traversal.traverse(c.getFirstChild()).getCode());
72
71
  }
73
72
  else if (withs === true) {
74
73
  break;
@@ -82,24 +82,8 @@ class TranspileTypes {
82
82
  const list = [];
83
83
  const suffix = {};
84
84
  const asInclude = {};
85
- /*
86
- const skipFields: Set<string> = new Set();
87
-
88
- for (const c of type.getComponents()) {
89
- if (c.type instanceof abaplint.BasicTypes.StructureType) {
90
- for (const f of c.type.getComponents()) {
91
- skipFields.add(f.name.toLowerCase());
92
- }
93
- }
94
- }
95
- */
96
85
  for (const c of type.getComponents()) {
97
86
  const lower = c.name.toLowerCase();
98
- /*
99
- if (skipFields.has(lower)) {
100
- continue; // skip fields from nested structures
101
- }
102
- */
103
87
  list.push(`"` + lower + `": ` + this.toType(c.type));
104
88
  if (c.suffix) {
105
89
  suffix[lower] = c.suffix;
@@ -39,6 +39,8 @@ export declare class Traversal {
39
39
  isTypePool(token: abaplint.Token): string | undefined;
40
40
  isInterfaceAttribute(token: abaplint.Token): string | undefined;
41
41
  private findReadOrWriteReference;
42
+ private findInferredTypeReference;
43
+ private findTypeReference;
42
44
  private buildThisAttributes;
43
45
  private buildFriendsAccess;
44
46
  buildConstructorContents(scope: abaplint.ISpaghettiScopeNode | undefined, def: abaplint.IClassDefinition): string;
@@ -48,6 +50,8 @@ export declare class Traversal {
48
50
  findClassDefinition(name: string | undefined, scope: abaplint.ISpaghettiScopeNode | undefined): abaplint.IClassDefinition | undefined;
49
51
  private dataFromInterfaces;
50
52
  private aliasesFromInterfaces;
53
+ lookupType(node: abaplint.Nodes.ExpressionNode, scope: abaplint.ISpaghettiScopeNode | undefined): abaplint.AbstractType | undefined;
54
+ lookupInferred(node: abaplint.Nodes.ExpressionNode, scope: abaplint.ISpaghettiScopeNode | undefined): abaplint.AbstractType | undefined;
51
55
  determineType(node: abaplint.Nodes.ExpressionNode | abaplint.Nodes.StatementNode, scope: abaplint.ISpaghettiScopeNode | undefined): abaplint.AbstractType | undefined;
52
56
  isInsideLoop(node: abaplint.Nodes.StatementNode): boolean;
53
57
  isInsideDoOrWhile(node: abaplint.Nodes.StatementNode): boolean;
@@ -27,8 +27,7 @@ class Traversal {
27
27
  return name?.replace(/\//g, "$");
28
28
  }
29
29
  static prefixVariable(name) {
30
- // TODO: performace, make this a hash lookup?,
31
- if (keywords_1.DEFAULT_KEYWORDS.some(k => k === name)) {
30
+ if (name && keywords_1.DEFAULT_KEYWORDS.has(name)) {
32
31
  return "$" + name;
33
32
  }
34
33
  return name + "";
@@ -403,6 +402,36 @@ class Traversal {
403
402
  }
404
403
  return undefined;
405
404
  }
405
+ findInferredTypeReference(token) {
406
+ const scope = this.findCurrentScopeByToken(token);
407
+ if (scope === undefined) {
408
+ return undefined;
409
+ }
410
+ for (const r of scope.getData().references) {
411
+ if (r.referenceType === abaplint.ReferenceType.InferredType
412
+ && r.position.getStart().equals(token.getStart())) {
413
+ if (r.resolved instanceof abaplint.TypedIdentifier) {
414
+ return r.resolved.getType();
415
+ }
416
+ }
417
+ }
418
+ return undefined;
419
+ }
420
+ findTypeReference(token) {
421
+ const scope = this.findCurrentScopeByToken(token);
422
+ if (scope === undefined) {
423
+ return undefined;
424
+ }
425
+ for (const r of scope.getData().references) {
426
+ if (r.referenceType === abaplint.ReferenceType.TypeReference
427
+ && r.position.getStart().equals(token.getStart())) {
428
+ if (r.resolved instanceof abaplint.TypedIdentifier) {
429
+ return r.resolved.getType();
430
+ }
431
+ }
432
+ }
433
+ return undefined;
434
+ }
406
435
  buildThisAttributes(def, cName) {
407
436
  let ret = "";
408
437
  for (const a of def.getAttributes()?.getAll() || []) {
@@ -575,6 +604,50 @@ this.INTERNAL_ID = abap.internalIdCounter++;\n`;
575
604
  }
576
605
  return ret;
577
606
  }
607
+ lookupType(node, scope) {
608
+ if (scope === undefined) {
609
+ return undefined;
610
+ }
611
+ else if (!(node.get() instanceof abaplint.Expressions.TypeName)) {
612
+ throw new Error("lookupType, node is not a TypeName, " + node.get());
613
+ }
614
+ const name = node.concatTokens().toLowerCase();
615
+ switch (name) {
616
+ case "i":
617
+ return abaplint.BasicTypes.IntegerType.get();
618
+ case "f":
619
+ return new abaplint.BasicTypes.FloatType();
620
+ case "string":
621
+ return abaplint.BasicTypes.StringType.get();
622
+ case "xstring":
623
+ return abaplint.BasicTypes.XStringType.get();
624
+ case "d":
625
+ return new abaplint.BasicTypes.DateType();
626
+ case "t":
627
+ return new abaplint.BasicTypes.TimeType();
628
+ default:
629
+ break;
630
+ }
631
+ const found = this.findTypeReference(node.getFirstToken());
632
+ if (found !== undefined) {
633
+ return found;
634
+ }
635
+ const dtel = this.reg.getObject("DTEL", name);
636
+ if (dtel) {
637
+ return dtel.parseType(this.reg);
638
+ }
639
+ // todo: yea, well, yea
640
+ throw new Error("lookupType, type not found, " + node.concatTokens());
641
+ }
642
+ lookupInferred(node, scope) {
643
+ if (scope === undefined) {
644
+ return undefined;
645
+ }
646
+ else if (node.concatTokens() !== "#") {
647
+ throw new Error("lookupInferred, unexpected, " + node.get());
648
+ }
649
+ return this.findInferredTypeReference(node.getFirstToken());
650
+ }
578
651
  determineType(node, scope) {
579
652
  if (scope === undefined) {
580
653
  return undefined;
@@ -63,4 +63,6 @@ export interface ITranspilerOptions {
63
63
  ignoreSourceMap?: boolean;
64
64
  /** import programs */
65
65
  importProg?: boolean;
66
+ /** skips version check, not recommended */
67
+ skipVersionCheck?: boolean;
66
68
  }
@@ -121,6 +121,13 @@ class Validation {
121
121
  // this is not a constant, just a regex that happens to not match anything
122
122
  exports.config.syntax.errorNamespace = "VOID_EVERYTHING";
123
123
  }
124
+ if (this.options?.skipVersionCheck === true) {
125
+ // todo, set it to abaplint default version
126
+ exports.config.syntax.version = core_1.Version.v758;
127
+ }
128
+ else {
129
+ exports.config.syntax.version = core_1.Version.OpenABAP;
130
+ }
124
131
  const conf = new core_1.Config(JSON.stringify(exports.config));
125
132
  reg.setConfig(conf);
126
133
  const issues = reg.findIssues();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/transpiler",
3
- "version": "2.11.7",
3
+ "version": "2.11.9",
4
4
  "description": "Transpiler",
5
5
  "main": "build/src/index.js",
6
6
  "typings": "build/src/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "author": "abaplint",
30
30
  "license": "MIT",
31
31
  "dependencies": {
32
- "@abaplint/core": "^2.113.152",
32
+ "@abaplint/core": "^2.113.154",
33
33
  "source-map": "^0.7.6"
34
34
  },
35
35
  "devDependencies": {