@abaplint/transpiler 2.12.23 → 2.12.24

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.
@@ -6,6 +6,7 @@ const abaplint = require("@abaplint/core");
6
6
  const chunk_1 = require("../chunk");
7
7
  const type_name_or_infer_1 = require("./type_name_or_infer");
8
8
  const transpile_types_1 = require("../transpile_types");
9
+ const types_1 = require("../types");
9
10
  class NewObjectTranspiler {
10
11
  transpile(node, traversal) {
11
12
  const ret = new chunk_1.Chunk();
@@ -18,8 +19,26 @@ class NewObjectTranspiler {
18
19
  if (parameters) {
19
20
  para = traversal.traverse(parameters).getCode();
20
21
  }
21
- const type = new type_name_or_infer_1.TypeNameOrInfer().findType(typeNameOrInfer, traversal);
22
- if (type instanceof abaplint.BasicTypes.ObjectReferenceType) {
22
+ let type = new type_name_or_infer_1.TypeNameOrInfer().findTypeOrUndefined(typeNameOrInfer, traversal);
23
+ if (type === undefined) {
24
+ const scope = traversal.findCurrentScopeByToken(node.getFirstToken());
25
+ try {
26
+ type = traversal.lookupType(typeNameOrInfer, scope);
27
+ }
28
+ catch {
29
+ // ignore
30
+ }
31
+ }
32
+ if (type === undefined) {
33
+ if (traversal.options?.unknownTypes === types_1.UnknownTypesEnum.runtimeError) {
34
+ ret.appendString(`(function() { throw new Error("Void type: ${typeNameOrInfer.concatTokens().toUpperCase()}") })()`);
35
+ return ret;
36
+ }
37
+ else {
38
+ throw new Error("NewObjectTranspiler, type not found: " + node.concatTokens() + ", " + traversal.getCurrentObject().getName() + " line " + node.getFirstToken().getStart().getRow());
39
+ }
40
+ }
41
+ else if (type instanceof abaplint.BasicTypes.ObjectReferenceType) {
23
42
  if (node.getChildren()[3].get() instanceof abaplint.Expressions.Source) {
24
43
  // single default parameter
25
44
  const scope = traversal.findCurrentScopeByToken(typeNameOrInfer.getFirstToken());
@@ -32,7 +51,13 @@ class NewObjectTranspiler {
32
51
  ret.appendString(transpile_types_1.TranspileTypes.toType(type) + ".set(await (new " + clas + "()).constructor_(" + para + "))");
33
52
  }
34
53
  else {
35
- throw new Error("NewObjectTranspiler: only ObjectReferenceType currently handled, todo");
54
+ const source = node.findFirstExpression(abaplint.Expressions.Source);
55
+ if (source === undefined) {
56
+ throw new Error("NewObjectTranspiler: DataReference source not found");
57
+ }
58
+ const typeCode = transpile_types_1.TranspileTypes.toType(type);
59
+ const sourceCode = traversal.traverse(source).getCode();
60
+ ret.appendString("((() => {const r = new abap.types.DataReference(" + typeCode + "); r.assign(" + sourceCode + "); return r; })())");
36
61
  }
37
62
  return ret;
38
63
  }
@@ -4,5 +4,6 @@ import { Traversal } from "../traversal";
4
4
  import { Chunk } from "../chunk";
5
5
  export declare class TypeNameOrInfer implements IExpressionTranspiler {
6
6
  findType(node: Nodes.ExpressionNode, traversal: Traversal): AbstractType;
7
+ findTypeOrUndefined(node: Nodes.ExpressionNode, traversal: Traversal): AbstractType | undefined;
7
8
  transpile(node: Nodes.ExpressionNode, traversal: Traversal): Chunk;
8
9
  }
@@ -12,6 +12,11 @@ class TypeNameOrInfer {
12
12
  }
13
13
  return type;
14
14
  }
15
+ findTypeOrUndefined(node, traversal) {
16
+ const scope = traversal.findCurrentScopeByToken(node.getFirstToken());
17
+ const type = traversal.lookupInferred(node, scope);
18
+ return type;
19
+ }
15
20
  transpile(node, traversal) {
16
21
  const type = this.findType(node, traversal);
17
22
  const ret = new chunk_1.Chunk();
@@ -595,7 +595,8 @@ this.INTERNAL_ID = abap.internalIdCounter++;\n`;
595
595
  if (scope === undefined) {
596
596
  return undefined;
597
597
  }
598
- else if (!(node.get() instanceof abaplint.Expressions.TypeName)) {
598
+ else if (!(node.get() instanceof abaplint.Expressions.TypeName)
599
+ && !(node.get() instanceof abaplint.Expressions.TypeNameOrInfer)) {
599
600
  throw new Error("lookupType, node is not a TypeName, " + node.get());
600
601
  }
601
602
  const name = node.concatTokens().toLowerCase();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/transpiler",
3
- "version": "2.12.23",
3
+ "version": "2.12.24",
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.115.10",
32
+ "@abaplint/core": "^2.115.14",
33
33
  "source-map": "^0.7.6"
34
34
  },
35
35
  "devDependencies": {