@abaplint/core 2.111.0 → 2.112.0

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 (214) hide show
  1. package/build/abaplint.d.ts +17 -8
  2. package/build/src/abap/5_syntax/_builtin.js +2 -2
  3. package/build/src/abap/5_syntax/_current_scope.js +2 -0
  4. package/build/src/abap/5_syntax/_procedural.js +6 -2
  5. package/build/src/abap/5_syntax/_syntax_input.js +11 -0
  6. package/build/src/abap/5_syntax/assert_error.js +7 -0
  7. package/build/src/abap/5_syntax/basic_types.js +78 -79
  8. package/build/src/abap/5_syntax/expressions/attribute_chain.js +15 -8
  9. package/build/src/abap/5_syntax/expressions/attribute_name.js +24 -11
  10. package/build/src/abap/5_syntax/expressions/cast.js +24 -13
  11. package/build/src/abap/5_syntax/expressions/compare.js +4 -4
  12. package/build/src/abap/5_syntax/expressions/component_chain.js +26 -11
  13. package/build/src/abap/5_syntax/expressions/component_compare.js +7 -4
  14. package/build/src/abap/5_syntax/expressions/component_compare_simple.js +11 -6
  15. package/build/src/abap/5_syntax/expressions/component_cond.js +3 -3
  16. package/build/src/abap/5_syntax/expressions/component_name.js +10 -5
  17. package/build/src/abap/5_syntax/expressions/cond.js +3 -6
  18. package/build/src/abap/5_syntax/expressions/cond_body.js +6 -6
  19. package/build/src/abap/5_syntax/expressions/conv_body.js +9 -8
  20. package/build/src/abap/5_syntax/expressions/corresponding_body.js +3 -3
  21. package/build/src/abap/5_syntax/expressions/data_definition.js +7 -7
  22. package/build/src/abap/5_syntax/expressions/database_table.js +9 -7
  23. package/build/src/abap/5_syntax/expressions/default.js +8 -2
  24. package/build/src/abap/5_syntax/expressions/dereference.js +5 -2
  25. package/build/src/abap/5_syntax/expressions/dynamic.js +2 -2
  26. package/build/src/abap/5_syntax/expressions/field_assignment.js +12 -5
  27. package/build/src/abap/5_syntax/expressions/field_chain.js +52 -64
  28. package/build/src/abap/5_syntax/expressions/field_length.js +2 -2
  29. package/build/src/abap/5_syntax/expressions/field_offset.js +2 -2
  30. package/build/src/abap/5_syntax/expressions/filter_body.js +3 -3
  31. package/build/src/abap/5_syntax/expressions/for.js +11 -11
  32. package/build/src/abap/5_syntax/expressions/form_param.js +10 -9
  33. package/build/src/abap/5_syntax/expressions/fstarget.js +8 -5
  34. package/build/src/abap/5_syntax/expressions/inline_data.js +11 -8
  35. package/build/src/abap/5_syntax/expressions/inline_field_definition.js +12 -8
  36. package/build/src/abap/5_syntax/expressions/inline_fs.js +7 -7
  37. package/build/src/abap/5_syntax/expressions/inline_loop_definition.js +16 -11
  38. package/build/src/abap/5_syntax/expressions/let.js +3 -3
  39. package/build/src/abap/5_syntax/expressions/loop_group_by.js +5 -15
  40. package/build/src/abap/5_syntax/expressions/message_source.js +4 -4
  41. package/build/src/abap/5_syntax/expressions/method_call_body.js +4 -4
  42. package/build/src/abap/5_syntax/expressions/method_call_chain.js +34 -25
  43. package/build/src/abap/5_syntax/expressions/method_call_param.js +33 -14
  44. package/build/src/abap/5_syntax/expressions/method_def_returning.js +7 -6
  45. package/build/src/abap/5_syntax/expressions/method_param.js +11 -10
  46. package/build/src/abap/5_syntax/expressions/method_parameters.js +76 -49
  47. package/build/src/abap/5_syntax/expressions/method_source.js +47 -38
  48. package/build/src/abap/5_syntax/expressions/new_object.js +48 -28
  49. package/build/src/abap/5_syntax/expressions/raise_with.js +2 -2
  50. package/build/src/abap/5_syntax/expressions/reduce_body.js +10 -10
  51. package/build/src/abap/5_syntax/expressions/reduce_next.js +3 -3
  52. package/build/src/abap/5_syntax/expressions/select.js +48 -33
  53. package/build/src/abap/5_syntax/expressions/select_loop.js +2 -2
  54. package/build/src/abap/5_syntax/expressions/source.js +74 -64
  55. package/build/src/abap/5_syntax/expressions/source_field.js +12 -6
  56. package/build/src/abap/5_syntax/expressions/source_field_symbol.js +8 -4
  57. package/build/src/abap/5_syntax/expressions/sql_compare.js +11 -19
  58. package/build/src/abap/5_syntax/expressions/sql_for_all_entries.js +7 -4
  59. package/build/src/abap/5_syntax/expressions/sql_from.js +3 -3
  60. package/build/src/abap/5_syntax/expressions/sql_in.js +34 -0
  61. package/build/src/abap/5_syntax/expressions/sql_order_by.js +2 -2
  62. package/build/src/abap/5_syntax/expressions/sql_source.js +3 -3
  63. package/build/src/abap/5_syntax/expressions/string_template.js +16 -8
  64. package/build/src/abap/5_syntax/expressions/switch_body.js +8 -4
  65. package/build/src/abap/5_syntax/expressions/table_expression.js +2 -2
  66. package/build/src/abap/5_syntax/expressions/target.js +50 -29
  67. package/build/src/abap/5_syntax/expressions/type_table.js +7 -7
  68. package/build/src/abap/5_syntax/expressions/value_body.js +17 -12
  69. package/build/src/abap/5_syntax/global_definitions/find_global_definitions.js +19 -6
  70. package/build/src/abap/5_syntax/spaghetti_scope.js +2 -1
  71. package/build/src/abap/5_syntax/statements/add.js +3 -3
  72. package/build/src/abap/5_syntax/statements/add_corresponding.js +3 -3
  73. package/build/src/abap/5_syntax/statements/append.js +25 -14
  74. package/build/src/abap/5_syntax/statements/assert.js +2 -2
  75. package/build/src/abap/5_syntax/statements/assign.js +17 -12
  76. package/build/src/abap/5_syntax/statements/authority_check.js +2 -2
  77. package/build/src/abap/5_syntax/statements/call.js +8 -5
  78. package/build/src/abap/5_syntax/statements/call_badi.js +4 -4
  79. package/build/src/abap/5_syntax/statements/call_function.js +12 -9
  80. package/build/src/abap/5_syntax/statements/call_kernel.js +2 -2
  81. package/build/src/abap/5_syntax/statements/call_transaction.js +3 -3
  82. package/build/src/abap/5_syntax/statements/call_transformation.js +5 -5
  83. package/build/src/abap/5_syntax/statements/case.js +2 -2
  84. package/build/src/abap/5_syntax/statements/case_type.js +2 -2
  85. package/build/src/abap/5_syntax/statements/catch.js +24 -19
  86. package/build/src/abap/5_syntax/statements/check.js +2 -2
  87. package/build/src/abap/5_syntax/statements/class_data.js +9 -5
  88. package/build/src/abap/5_syntax/statements/class_deferred.js +2 -2
  89. package/build/src/abap/5_syntax/statements/class_implementation.js +16 -13
  90. package/build/src/abap/5_syntax/statements/class_local_friends.js +16 -9
  91. package/build/src/abap/5_syntax/statements/clear.js +3 -3
  92. package/build/src/abap/5_syntax/statements/close_dataset.js +2 -2
  93. package/build/src/abap/5_syntax/statements/collect.js +4 -4
  94. package/build/src/abap/5_syntax/statements/commit_entities.js +4 -4
  95. package/build/src/abap/5_syntax/statements/concatenate.js +18 -11
  96. package/build/src/abap/5_syntax/statements/condense.js +2 -2
  97. package/build/src/abap/5_syntax/statements/constant.js +6 -5
  98. package/build/src/abap/5_syntax/statements/controls.js +5 -5
  99. package/build/src/abap/5_syntax/statements/convert.js +8 -8
  100. package/build/src/abap/5_syntax/statements/create_data.js +11 -11
  101. package/build/src/abap/5_syntax/statements/create_object.js +49 -26
  102. package/build/src/abap/5_syntax/statements/data.js +8 -4
  103. package/build/src/abap/5_syntax/statements/delete_cluster.js +4 -4
  104. package/build/src/abap/5_syntax/statements/delete_database.js +5 -5
  105. package/build/src/abap/5_syntax/statements/delete_internal.js +7 -7
  106. package/build/src/abap/5_syntax/statements/delete_report.js +2 -2
  107. package/build/src/abap/5_syntax/statements/describe.js +13 -13
  108. package/build/src/abap/5_syntax/statements/divide.js +3 -3
  109. package/build/src/abap/5_syntax/statements/do.js +8 -5
  110. package/build/src/abap/5_syntax/statements/editor_call.js +3 -3
  111. package/build/src/abap/5_syntax/statements/else_if.js +2 -2
  112. package/build/src/abap/5_syntax/statements/export.js +5 -5
  113. package/build/src/abap/5_syntax/statements/fieldsymbol.js +4 -4
  114. package/build/src/abap/5_syntax/statements/find.js +13 -13
  115. package/build/src/abap/5_syntax/statements/form.js +10 -7
  116. package/build/src/abap/5_syntax/statements/format.js +2 -2
  117. package/build/src/abap/5_syntax/statements/get_badi.js +4 -4
  118. package/build/src/abap/5_syntax/statements/get_bit.js +9 -6
  119. package/build/src/abap/5_syntax/statements/get_cursor.js +2 -2
  120. package/build/src/abap/5_syntax/statements/get_locale.js +3 -3
  121. package/build/src/abap/5_syntax/statements/get_parameter.js +4 -4
  122. package/build/src/abap/5_syntax/statements/get_reference.js +8 -5
  123. package/build/src/abap/5_syntax/statements/get_run_time.js +3 -3
  124. package/build/src/abap/5_syntax/statements/get_time.js +3 -3
  125. package/build/src/abap/5_syntax/statements/if.js +2 -2
  126. package/build/src/abap/5_syntax/statements/import.js +5 -5
  127. package/build/src/abap/5_syntax/statements/import_dynpro.js +3 -3
  128. package/build/src/abap/5_syntax/statements/include_type.js +9 -5
  129. package/build/src/abap/5_syntax/statements/insert_database.js +5 -5
  130. package/build/src/abap/5_syntax/statements/insert_field_group.js +4 -4
  131. package/build/src/abap/5_syntax/statements/insert_internal.js +22 -13
  132. package/build/src/abap/5_syntax/statements/insert_report.js +2 -2
  133. package/build/src/abap/5_syntax/statements/insert_textpool.js +2 -2
  134. package/build/src/abap/5_syntax/statements/interface_deferred.js +2 -2
  135. package/build/src/abap/5_syntax/statements/log_point.js +2 -2
  136. package/build/src/abap/5_syntax/statements/loop.js +29 -16
  137. package/build/src/abap/5_syntax/statements/loop_at_screen.js +3 -3
  138. package/build/src/abap/5_syntax/statements/message.js +6 -6
  139. package/build/src/abap/5_syntax/statements/method_implementation.js +18 -13
  140. package/build/src/abap/5_syntax/statements/modify_database.js +8 -8
  141. package/build/src/abap/5_syntax/statements/modify_entities.js +4 -4
  142. package/build/src/abap/5_syntax/statements/modify_internal.js +15 -8
  143. package/build/src/abap/5_syntax/statements/modify_screen.js +2 -2
  144. package/build/src/abap/5_syntax/statements/move.js +17 -10
  145. package/build/src/abap/5_syntax/statements/move_corresponding.js +14 -7
  146. package/build/src/abap/5_syntax/statements/multiply.js +3 -3
  147. package/build/src/abap/5_syntax/statements/open_dataset.js +3 -3
  148. package/build/src/abap/5_syntax/statements/pack.js +3 -3
  149. package/build/src/abap/5_syntax/statements/parameter.js +11 -6
  150. package/build/src/abap/5_syntax/statements/perform.js +12 -8
  151. package/build/src/abap/5_syntax/statements/raise.js +23 -18
  152. package/build/src/abap/5_syntax/statements/raise_event.js +4 -4
  153. package/build/src/abap/5_syntax/statements/ranges.js +6 -5
  154. package/build/src/abap/5_syntax/statements/read_entities.js +4 -4
  155. package/build/src/abap/5_syntax/statements/read_report.js +3 -3
  156. package/build/src/abap/5_syntax/statements/read_table.js +40 -21
  157. package/build/src/abap/5_syntax/statements/read_textpool.js +3 -3
  158. package/build/src/abap/5_syntax/statements/receive.js +3 -3
  159. package/build/src/abap/5_syntax/statements/replace.js +3 -3
  160. package/build/src/abap/5_syntax/statements/scan.js +3 -3
  161. package/build/src/abap/5_syntax/statements/search.js +2 -2
  162. package/build/src/abap/5_syntax/statements/select.js +2 -2
  163. package/build/src/abap/5_syntax/statements/select_loop.js +2 -2
  164. package/build/src/abap/5_syntax/statements/selection_screen.js +4 -4
  165. package/build/src/abap/5_syntax/statements/selectoption.js +9 -6
  166. package/build/src/abap/5_syntax/statements/set_bit.js +8 -5
  167. package/build/src/abap/5_syntax/statements/set_handler.js +3 -3
  168. package/build/src/abap/5_syntax/statements/set_locale.js +3 -3
  169. package/build/src/abap/5_syntax/statements/set_parameter.js +2 -2
  170. package/build/src/abap/5_syntax/statements/set_pf_status.js +2 -2
  171. package/build/src/abap/5_syntax/statements/set_titlebar.js +2 -2
  172. package/build/src/abap/5_syntax/statements/shift.js +15 -8
  173. package/build/src/abap/5_syntax/statements/sort.js +16 -7
  174. package/build/src/abap/5_syntax/statements/split.js +12 -7
  175. package/build/src/abap/5_syntax/statements/static.js +4 -4
  176. package/build/src/abap/5_syntax/statements/submit.js +4 -4
  177. package/build/src/abap/5_syntax/statements/subtract.js +3 -3
  178. package/build/src/abap/5_syntax/statements/subtract_corresponding.js +3 -3
  179. package/build/src/abap/5_syntax/statements/syntax_check.js +3 -3
  180. package/build/src/abap/5_syntax/statements/system_call.js +2 -2
  181. package/build/src/abap/5_syntax/statements/tables.js +7 -7
  182. package/build/src/abap/5_syntax/statements/transfer.js +3 -3
  183. package/build/src/abap/5_syntax/statements/translate.js +3 -3
  184. package/build/src/abap/5_syntax/statements/truncate_dataset.js +2 -2
  185. package/build/src/abap/5_syntax/statements/type.js +12 -7
  186. package/build/src/abap/5_syntax/statements/unassign.js +7 -4
  187. package/build/src/abap/5_syntax/statements/unpack.js +3 -3
  188. package/build/src/abap/5_syntax/statements/update_database.js +11 -11
  189. package/build/src/abap/5_syntax/statements/wait.js +3 -3
  190. package/build/src/abap/5_syntax/statements/when.js +2 -2
  191. package/build/src/abap/5_syntax/statements/when_type.js +9 -6
  192. package/build/src/abap/5_syntax/statements/while.js +4 -4
  193. package/build/src/abap/5_syntax/statements/with.js +3 -3
  194. package/build/src/abap/5_syntax/statements/with_loop.js +3 -3
  195. package/build/src/abap/5_syntax/statements/write.js +14 -10
  196. package/build/src/abap/5_syntax/structures/class_data.js +3 -3
  197. package/build/src/abap/5_syntax/structures/constants.js +6 -5
  198. package/build/src/abap/5_syntax/structures/data.js +17 -13
  199. package/build/src/abap/5_syntax/structures/statics.js +16 -11
  200. package/build/src/abap/5_syntax/structures/type_enum.js +15 -13
  201. package/build/src/abap/5_syntax/structures/types.js +9 -9
  202. package/build/src/abap/5_syntax/syntax.js +32 -16
  203. package/build/src/abap/types/class_attributes.js +30 -30
  204. package/build/src/abap/types/class_definition.js +29 -29
  205. package/build/src/abap/types/event_definition.js +5 -5
  206. package/build/src/abap/types/form_definition.js +13 -13
  207. package/build/src/abap/types/interface_definition.js +19 -19
  208. package/build/src/abap/types/method_definition.js +10 -10
  209. package/build/src/abap/types/method_definitions.js +9 -10
  210. package/build/src/abap/types/method_parameters.js +29 -29
  211. package/build/src/issue.js +12 -0
  212. package/build/src/registry.js +1 -1
  213. package/build/src/rules/check_syntax.js +2 -1
  214. package/package.json +3 -3
@@ -3,16 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FieldAssignment = void 0;
4
4
  const Expressions = require("../../2_statements/expressions");
5
5
  const basic_1 = require("../../types/basic");
6
+ const _syntax_input_1 = require("../_syntax_input");
6
7
  const source_1 = require("./source");
7
8
  class FieldAssignment {
8
- runSyntax(node, scope, filename, targetType) {
9
+ runSyntax(node, input, targetType) {
9
10
  const fieldSub = node.findDirectExpression(Expressions.FieldSub);
10
11
  if (fieldSub === undefined) {
11
- throw new Error("FieldAssignment, FieldSub node not found");
12
+ const message = "FieldAssignment, FieldSub node not found";
13
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
14
+ return;
12
15
  }
13
16
  const s = node.findDirectExpression(Expressions.Source);
14
17
  if (s === undefined) {
15
- throw new Error("FieldAssignment, Source node not found");
18
+ const message = "FieldAssignment, Source node not found";
19
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
20
+ return;
16
21
  }
17
22
  let type = undefined;
18
23
  if (targetType instanceof basic_1.StructureType) {
@@ -22,7 +27,9 @@ class FieldAssignment {
22
27
  if (text !== "-" && context instanceof basic_1.StructureType) {
23
28
  context = context.getComponentByName(text);
24
29
  if (context === undefined && targetType.containsVoid() === false) {
25
- throw new Error(`field ${text} does not exist in structure`);
30
+ const message = `field ${text} does not exist in structure`;
31
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
32
+ return;
26
33
  }
27
34
  }
28
35
  }
@@ -31,7 +38,7 @@ class FieldAssignment {
31
38
  else if (targetType instanceof basic_1.VoidType) {
32
39
  type = targetType;
33
40
  }
34
- new source_1.Source().runSyntax(s, scope, filename, type);
41
+ new source_1.Source().runSyntax(s, input, type);
35
42
  }
36
43
  }
37
44
  exports.FieldAssignment = FieldAssignment;
@@ -15,42 +15,43 @@ const expressions_1 = require("../../2_statements/expressions");
15
15
  const dereference_1 = require("./dereference");
16
16
  const source_field_symbol_1 = require("./source_field_symbol");
17
17
  const source_field_1 = require("./source_field");
18
+ const _syntax_input_1 = require("../_syntax_input");
18
19
  class FieldChain {
19
- runSyntax(node, scope, filename, refType) {
20
- var _a, _b, _c, _d, _e;
21
- const children = node.getChildren();
22
- let context = undefined;
23
- try {
24
- context = this.findTop(children[0], scope, filename, refType);
25
- }
26
- catch (error) {
20
+ runSyntax(node, input, refType) {
21
+ var _a, _b, _c;
22
+ if (((_a = node.getFirstChild()) === null || _a === void 0 ? void 0 : _a.get()) instanceof Expressions.SourceField
23
+ && node.findDirectExpression(Expressions.ComponentName)) {
24
+ // workaround for names with dashes, eg. "sy-repid"
27
25
  const concat = node.concatTokens();
28
- if (concat.includes("-") && ((_a = node.getFirstChild()) === null || _a === void 0 ? void 0 : _a.get()) instanceof Expressions.SourceField) {
29
- // workaround for names with dashes, eg. "sy-repid"
30
- const offset = ((_b = node.findDirectExpression(Expressions.FieldOffset)) === null || _b === void 0 ? void 0 : _b.concatTokens()) || "";
31
- const length = ((_c = node.findDirectExpression(Expressions.FieldLength)) === null || _c === void 0 ? void 0 : _c.concatTokens()) || "";
32
- const found = scope.findVariable(concat.replace(offset, "").replace(length, ""));
33
- if (found) {
34
- if (refType) {
35
- scope.addReference(node.getFirstToken(), found, refType, filename);
36
- }
37
- // this is not completely correct, but will work, dashes in names is a mess anyhow
38
- return found.getType();
26
+ const offset = ((_b = node.findDirectExpression(Expressions.FieldOffset)) === null || _b === void 0 ? void 0 : _b.concatTokens()) || "";
27
+ const length = ((_c = node.findDirectExpression(Expressions.FieldLength)) === null || _c === void 0 ? void 0 : _c.concatTokens()) || "";
28
+ const found = input.scope.findVariable(concat.replace(offset, "").replace(length, ""));
29
+ if (found) {
30
+ if (refType) {
31
+ input.scope.addReference(node.getFirstToken(), found, refType, input.filename);
39
32
  }
33
+ // this is not completely correct, but will work, dashes in names is a mess anyhow
34
+ return found.getType();
40
35
  }
41
- throw error;
42
36
  }
37
+ let context = undefined;
38
+ const children = node.getChildren();
39
+ context = this.findTop(children[0], input, refType);
43
40
  for (let i = 1; i < children.length; i++) {
44
41
  const current = children[i];
45
42
  if (current === undefined) {
46
43
  break;
47
44
  }
48
45
  if (current.get() instanceof tokens_1.DashW) {
49
- throw new Error("Ending with dash");
46
+ const message = "Ending with dash";
47
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, current.getFirstToken(), message));
48
+ return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
50
49
  }
51
50
  else if (current.get() instanceof tokens_1.Dash) {
52
51
  if (context instanceof basic_1.UnknownType) {
53
- throw new Error("Not a structure, type unknown, FieldChain");
52
+ const message = "Not a structure, type unknown, FieldChain";
53
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, current.getFirstToken(), message));
54
+ return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
54
55
  }
55
56
  else if (!(context instanceof basic_1.StructureType)
56
57
  && !(context instanceof basic_1.TableType && context.isWithHeader())
@@ -60,7 +61,7 @@ class FieldChain {
60
61
  for (let j = 0; j < i; j++) {
61
62
  contextName += children[j].concatTokens();
62
63
  }
63
- if (scope.isAllowHeaderUse(contextName)) {
64
+ if (input.scope.isAllowHeaderUse(contextName)) {
64
65
  // FOR ALL ENTRIES workaround
65
66
  context = context.getRowType();
66
67
  if (!(context instanceof basic_1.StructureType) && !(context instanceof basic_1.VoidType)) {
@@ -68,11 +69,15 @@ class FieldChain {
68
69
  }
69
70
  }
70
71
  else {
71
- throw new Error("Table without header, cannot access fields, " + contextName);
72
+ const message = "Table without header, cannot access fields, " + contextName;
73
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, current.getFirstToken(), message));
74
+ return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
72
75
  }
73
76
  }
74
77
  else {
75
- throw new Error("Not a structure, FieldChain");
78
+ const message = "Not a structure, FieldChain";
79
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, current.getFirstToken(), message));
80
+ return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
76
81
  }
77
82
  }
78
83
  }
@@ -80,56 +85,37 @@ class FieldChain {
80
85
  if (!(context instanceof basic_1.ObjectReferenceType)
81
86
  && !(context instanceof basic_1.DataReference)
82
87
  && !(context instanceof basic_1.VoidType)) {
83
- throw new Error("Not an object reference, field chain");
88
+ const message = "Not an object reference, field chain";
89
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, current.getFirstToken(), message));
90
+ return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
84
91
  }
85
92
  }
86
93
  else if (current.get() instanceof expressions_1.Dereference) {
87
- context = new dereference_1.Dereference().runSyntax(context);
94
+ context = new dereference_1.Dereference().runSyntax(current, context, input);
88
95
  }
89
96
  else if (current.get() instanceof Expressions.ComponentName) {
90
97
  if (context instanceof basic_1.TableType && context.isWithHeader()) {
91
98
  context = context.getRowType();
92
99
  }
93
- try {
94
- context = new component_name_1.ComponentName().runSyntax(context, current);
95
- }
96
- catch (error) {
97
- const concat = node.concatTokens();
98
- if (concat.includes("-")) {
99
- // workaround for names with dashes, eg. "sy-repid"
100
- const offset = ((_d = node.findDirectExpression(Expressions.FieldOffset)) === null || _d === void 0 ? void 0 : _d.concatTokens()) || "";
101
- const length = ((_e = node.findDirectExpression(Expressions.FieldLength)) === null || _e === void 0 ? void 0 : _e.concatTokens()) || "";
102
- const found = scope.findVariable(concat.replace(offset, "").replace(length, ""));
103
- if (found) {
104
- if (refType) {
105
- scope.addReference(node.getFirstToken(), found, refType, filename);
106
- }
107
- context = found.getType();
108
- }
109
- else {
110
- throw error;
111
- }
112
- }
113
- else {
114
- throw error;
115
- }
116
- }
100
+ context = new component_name_1.ComponentName().runSyntax(context, current, input);
117
101
  }
118
102
  else if (current instanceof nodes_1.ExpressionNode
119
103
  && current.get() instanceof Expressions.TableExpression) {
120
104
  if (!(context instanceof basic_1.TableType) && !(context instanceof basic_1.VoidType)) {
121
- throw new Error("Table expression, expected table");
105
+ const message = "Table expression, expected table";
106
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, current.getFirstToken(), message));
107
+ return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
122
108
  }
123
- new table_expression_1.TableExpression().runSyntax(current, scope, filename);
109
+ new table_expression_1.TableExpression().runSyntax(current, input);
124
110
  if (!(context instanceof basic_1.VoidType)) {
125
111
  context = context.getRowType();
126
112
  }
127
113
  }
128
114
  else if (current.get() instanceof Expressions.AttributeName) {
129
- context = new attribute_name_1.AttributeName().runSyntax(context, current, scope, filename, refType);
115
+ context = new attribute_name_1.AttributeName().runSyntax(context, current, input, refType);
130
116
  }
131
117
  else if (current.get() instanceof Expressions.FieldOffset && current instanceof nodes_1.ExpressionNode) {
132
- const offset = new field_offset_1.FieldOffset().runSyntax(current, scope, filename);
118
+ const offset = new field_offset_1.FieldOffset().runSyntax(current, input);
133
119
  if (offset) {
134
120
  if (context instanceof basic_1.CharacterType) {
135
121
  context = new basic_1.CharacterType(context.getLength() - offset);
@@ -140,7 +126,7 @@ class FieldChain {
140
126
  }
141
127
  }
142
128
  else if (current.get() instanceof Expressions.FieldLength && current instanceof nodes_1.ExpressionNode) {
143
- const length = new field_length_1.FieldLength().runSyntax(current, scope, filename);
129
+ const length = new field_length_1.FieldLength().runSyntax(current, input);
144
130
  if (length) {
145
131
  if (context instanceof basic_1.CharacterType) {
146
132
  context = new basic_1.CharacterType(length);
@@ -154,17 +140,17 @@ class FieldChain {
154
140
  return context;
155
141
  }
156
142
  ////////////////
157
- findTop(node, scope, filename, type) {
143
+ findTop(node, input, type) {
158
144
  if (node === undefined) {
159
145
  return undefined;
160
146
  }
161
147
  if (node instanceof nodes_1.ExpressionNode
162
148
  && node.get() instanceof Expressions.SourceFieldSymbol) {
163
- return new source_field_symbol_1.SourceFieldSymbol().runSyntax(node, scope, filename);
149
+ return new source_field_symbol_1.SourceFieldSymbol().runSyntax(node, input);
164
150
  }
165
151
  else if (node instanceof nodes_1.ExpressionNode
166
152
  && node.get() instanceof Expressions.SourceField) {
167
- return new source_field_1.SourceField().runSyntax(node, scope, filename, type);
153
+ return new source_field_1.SourceField().runSyntax(node, input, type);
168
154
  }
169
155
  else if (node.get() instanceof Expressions.ClassName) {
170
156
  const classTok = node.getFirstToken();
@@ -172,17 +158,19 @@ class FieldChain {
172
158
  if (classNam.toUpperCase() === "OBJECT") {
173
159
  return new basic_1.GenericObjectReferenceType();
174
160
  }
175
- const found = scope.existsObject(classNam);
161
+ const found = input.scope.existsObject(classNam);
176
162
  if (found === null || found === void 0 ? void 0 : found.id) {
177
- scope.addReference(classTok, found.id, _reference_1.ReferenceType.ObjectOrientedReference, filename);
163
+ input.scope.addReference(classTok, found.id, _reference_1.ReferenceType.ObjectOrientedReference, input.filename);
178
164
  return new basic_1.ObjectReferenceType(found.id);
179
165
  }
180
- else if (scope.getDDIC().inErrorNamespace(classNam) === false) {
181
- scope.addReference(classTok, undefined, _reference_1.ReferenceType.ObjectOrientedVoidReference, filename, { ooName: classNam.toUpperCase() });
166
+ else if (input.scope.getDDIC().inErrorNamespace(classNam) === false) {
167
+ input.scope.addReference(classTok, undefined, _reference_1.ReferenceType.ObjectOrientedVoidReference, input.filename, { ooName: classNam.toUpperCase() });
182
168
  return new basic_1.VoidType(classNam);
183
169
  }
184
170
  else {
185
- throw new Error("Unknown class " + classNam);
171
+ const message = "Unknown class " + classNam;
172
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
173
+ return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
186
174
  }
187
175
  }
188
176
  return undefined;
@@ -5,10 +5,10 @@ const Expressions = require("../../2_statements/expressions");
5
5
  const _reference_1 = require("../_reference");
6
6
  const field_chain_1 = require("./field_chain");
7
7
  class FieldLength {
8
- runSyntax(node, scope, filename) {
8
+ runSyntax(node, input) {
9
9
  const field = node.findDirectExpression(Expressions.SimpleFieldChain2);
10
10
  if (field) {
11
- new field_chain_1.FieldChain().runSyntax(field, scope, filename, _reference_1.ReferenceType.DataReadReference);
11
+ new field_chain_1.FieldChain().runSyntax(field, input, _reference_1.ReferenceType.DataReadReference);
12
12
  return undefined;
13
13
  }
14
14
  else {
@@ -5,10 +5,10 @@ const Expressions = require("../../2_statements/expressions");
5
5
  const _reference_1 = require("../_reference");
6
6
  const field_chain_1 = require("./field_chain");
7
7
  class FieldOffset {
8
- runSyntax(node, scope, filename) {
8
+ runSyntax(node, input) {
9
9
  const field = node.findDirectExpression(Expressions.SimpleFieldChain2);
10
10
  if (field) {
11
- new field_chain_1.FieldChain().runSyntax(field, scope, filename, _reference_1.ReferenceType.DataReadReference);
11
+ new field_chain_1.FieldChain().runSyntax(field, input, _reference_1.ReferenceType.DataReadReference);
12
12
  return undefined;
13
13
  }
14
14
  else {
@@ -4,17 +4,17 @@ exports.FilterBody = void 0;
4
4
  const Expressions = require("../../2_statements/expressions");
5
5
  const source_1 = require("./source");
6
6
  class FilterBody {
7
- runSyntax(node, scope, filename, targetType) {
7
+ runSyntax(node, input, targetType) {
8
8
  if (node === undefined) {
9
9
  return targetType;
10
10
  }
11
11
  let type = undefined;
12
12
  for (const s of node.findDirectExpressions(Expressions.Source)) {
13
13
  if (type === undefined) {
14
- type = new source_1.Source().runSyntax(s, scope, filename);
14
+ type = new source_1.Source().runSyntax(s, input);
15
15
  }
16
16
  else {
17
- new source_1.Source().runSyntax(s, scope, filename);
17
+ new source_1.Source().runSyntax(s, input);
18
18
  }
19
19
  }
20
20
  return type ? type : targetType;
@@ -13,7 +13,7 @@ const _typed_identifier_1 = require("../../types/_typed_identifier");
13
13
  const _reference_1 = require("../_reference");
14
14
  const let_1 = require("./let");
15
15
  class For {
16
- runSyntax(node, scope, filename) {
16
+ runSyntax(node, input) {
17
17
  var _a;
18
18
  let scoped = false;
19
19
  const inlineLoop = node.findDirectExpressions(Expressions.InlineLoopDefinition);
@@ -26,32 +26,32 @@ class For {
26
26
  || groupsToken !== undefined;
27
27
  if (addScope) {
28
28
  // this scope is popped in parent expressions
29
- scope.push(_scope_type_1.ScopeType.For, "FOR", node.getFirstToken().getStart(), filename);
29
+ input.scope.push(_scope_type_1.ScopeType.For, "FOR", node.getFirstToken().getStart(), input.filename);
30
30
  scoped = true;
31
31
  }
32
32
  for (const s of inlineLoop) {
33
- new inline_loop_definition_1.InlineLoopDefinition().runSyntax(s, scope, filename);
33
+ new inline_loop_definition_1.InlineLoopDefinition().runSyntax(s, input);
34
34
  }
35
35
  for (const f of inlineField) {
36
- new inline_field_definition_1.InlineFieldDefinition().runSyntax(f, scope, filename);
36
+ new inline_field_definition_1.InlineFieldDefinition().runSyntax(f, input);
37
37
  }
38
38
  if (groupsToken !== undefined) {
39
39
  const type = new basic_1.VoidType("todoGroupBy");
40
- const identifier = new _typed_identifier_1.TypedIdentifier(groupsToken, filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
41
- scope.addIdentifier(identifier);
42
- scope.addReference(groupsToken, identifier, _reference_1.ReferenceType.DataWriteReference, filename);
40
+ const identifier = new _typed_identifier_1.TypedIdentifier(groupsToken, input.filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
41
+ input.scope.addIdentifier(identifier);
42
+ input.scope.addReference(groupsToken, identifier, _reference_1.ReferenceType.DataWriteReference, input.filename);
43
43
  }
44
44
  for (const s of node.findDirectExpressions(Expressions.Source)) {
45
- new source_1.Source().runSyntax(s, scope, filename);
45
+ new source_1.Source().runSyntax(s, input);
46
46
  }
47
47
  for (const s of node.findDirectExpressions(Expressions.ComponentCond)) {
48
- new component_cond_1.ComponentCond().runSyntax(s, scope, filename);
48
+ new component_cond_1.ComponentCond().runSyntax(s, input);
49
49
  }
50
50
  for (const s of node.findDirectExpressions(Expressions.Cond)) {
51
- new cond_1.Cond().runSyntax(s, scope, filename);
51
+ new cond_1.Cond().runSyntax(s, input);
52
52
  }
53
53
  if (lett) {
54
- new let_1.Let().runSyntax(lett, scope, filename, true);
54
+ new let_1.Let().runSyntax(lett, input, true);
55
55
  }
56
56
  return scoped;
57
57
  }
@@ -5,8 +5,9 @@ const _typed_identifier_1 = require("../../types/_typed_identifier");
5
5
  const basic_1 = require("../../types/basic");
6
6
  const expressions_1 = require("../../2_statements/expressions");
7
7
  const basic_types_1 = require("../basic_types");
8
+ const assert_error_1 = require("../assert_error");
8
9
  class FormParam {
9
- runSyntax(node, scope, filename) {
10
+ runSyntax(node, input) {
10
11
  var _a, _b, _c;
11
12
  const nameToken = (_a = node.findFirstExpression(expressions_1.FormParamName)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
12
13
  if (node.findDirectTokenByText("STRUCTURE") && nameToken) {
@@ -14,28 +15,28 @@ class FormParam {
14
15
  const typeName = (_b = node.findDirectExpression(expressions_1.SimpleFieldChain)) === null || _b === void 0 ? void 0 : _b.getFirstToken().getStr();
15
16
  let type = undefined;
16
17
  if (typeName) {
17
- type = (_c = scope.findType(typeName)) === null || _c === void 0 ? void 0 : _c.getType();
18
+ type = (_c = input.scope.findType(typeName)) === null || _c === void 0 ? void 0 : _c.getType();
18
19
  if (type === undefined) {
19
- type = scope.getDDIC().lookupTableOrView(typeName).type;
20
+ type = input.scope.getDDIC().lookupTableOrView(typeName).type;
20
21
  }
21
22
  }
22
23
  else {
23
24
  type = new basic_1.UnknownType("todo, FORM STRUCTURES typing");
24
25
  }
25
- return new _typed_identifier_1.TypedIdentifier(nameToken, filename, type, ["form_parameter" /* IdentifierMeta.FormParameter */]);
26
+ return new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, type, ["form_parameter" /* IdentifierMeta.FormParameter */]);
26
27
  }
27
28
  if (node.getChildren().length === 1 && nameToken) {
28
29
  // untyped FORM parameter
29
- return new _typed_identifier_1.TypedIdentifier(nameToken, filename, new basic_1.AnyType(), ["form_parameter" /* IdentifierMeta.FormParameter */]);
30
+ return new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, new basic_1.AnyType(), ["form_parameter" /* IdentifierMeta.FormParameter */]);
30
31
  }
31
- const bfound = new basic_types_1.BasicTypes(filename, scope).parseType(node);
32
+ const bfound = new basic_types_1.BasicTypes(input).parseType(node);
32
33
  if (nameToken && bfound) {
33
- return new _typed_identifier_1.TypedIdentifier(nameToken, filename, bfound, ["form_parameter" /* IdentifierMeta.FormParameter */]);
34
+ return new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, bfound, ["form_parameter" /* IdentifierMeta.FormParameter */]);
34
35
  }
35
36
  if (nameToken) {
36
- return new _typed_identifier_1.TypedIdentifier(nameToken, filename, new basic_1.UnknownType("FormParam, todo"), ["form_parameter" /* IdentifierMeta.FormParameter */]);
37
+ return new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, new basic_1.UnknownType("FormParam, todo"), ["form_parameter" /* IdentifierMeta.FormParameter */]);
37
38
  }
38
- throw new Error("FormParam, unexpected node");
39
+ throw new assert_error_1.AssertError("FormParam, unexpected node");
39
40
  }
40
41
  }
41
42
  exports.FormParam = FormParam;
@@ -4,20 +4,23 @@ exports.FSTarget = void 0;
4
4
  const Expressions = require("../../2_statements/expressions");
5
5
  const inline_fs_1 = require("./inline_fs");
6
6
  const _reference_1 = require("../_reference");
7
+ const _syntax_input_1 = require("../_syntax_input");
7
8
  class FSTarget {
8
- runSyntax(node, scope, filename, type) {
9
+ runSyntax(node, input, type) {
9
10
  const inlinefs = node === null || node === void 0 ? void 0 : node.findDirectExpression(Expressions.InlineFS);
10
11
  if (inlinefs) {
11
- new inline_fs_1.InlineFS().runSyntax(inlinefs, scope, filename, type);
12
+ new inline_fs_1.InlineFS().runSyntax(inlinefs, input, type);
12
13
  }
13
14
  const target = node === null || node === void 0 ? void 0 : node.findDirectExpression(Expressions.TargetFieldSymbol);
14
15
  if (target) {
15
16
  const token = target.getFirstToken();
16
- const found = scope.findVariable(token.getStr());
17
+ const found = input.scope.findVariable(token.getStr());
17
18
  if (found === undefined) {
18
- throw new Error(`"${token.getStr()}" not found, FSTarget`);
19
+ const message = `"${token.getStr()}" not found, FSTarget`;
20
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
21
+ return;
19
22
  }
20
- scope.addReference(token, found, _reference_1.ReferenceType.DataWriteReference, filename);
23
+ input.scope.addReference(token, found, _reference_1.ReferenceType.DataWriteReference, input.filename);
21
24
  }
22
25
  }
23
26
  }
@@ -5,8 +5,9 @@ const Expressions = require("../../2_statements/expressions");
5
5
  const _typed_identifier_1 = require("../../types/_typed_identifier");
6
6
  const basic_1 = require("../../types/basic");
7
7
  const _reference_1 = require("../_reference");
8
+ const _syntax_input_1 = require("../_syntax_input");
8
9
  class InlineData {
9
- runSyntax(node, scope, filename, type) {
10
+ runSyntax(node, input, type) {
10
11
  var _a;
11
12
  const token = (_a = node.findFirstExpression(Expressions.TargetField)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
12
13
  if (token && type) {
@@ -14,17 +15,19 @@ class InlineData {
14
15
  type = basic_1.StringType.get();
15
16
  }
16
17
  else if (type instanceof basic_1.CGenericType) {
17
- throw new Error("InlineData, generic type C cannot be used for inferred type");
18
+ const message = "InlineData, generic type C cannot be used for inferred type";
19
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
20
+ return;
18
21
  }
19
- const identifier = new _typed_identifier_1.TypedIdentifier(token, filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
20
- scope.addIdentifier(identifier);
21
- scope.addReference(token, identifier, _reference_1.ReferenceType.DataWriteReference, filename);
22
+ const identifier = new _typed_identifier_1.TypedIdentifier(token, input.filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
23
+ input.scope.addIdentifier(identifier);
24
+ input.scope.addReference(token, identifier, _reference_1.ReferenceType.DataWriteReference, input.filename);
22
25
  }
23
26
  else if (token) {
24
27
  const message = "InlineData, could not determine type for \"" + token.getStr() + "\"";
25
- const identifier = new _typed_identifier_1.TypedIdentifier(token, filename, new basic_1.UnknownType(message), ["inline" /* IdentifierMeta.InlineDefinition */]);
26
- scope.addIdentifier(identifier);
27
- scope.addReference(token, identifier, _reference_1.ReferenceType.DataWriteReference, filename);
28
+ const identifier = new _typed_identifier_1.TypedIdentifier(token, input.filename, new basic_1.UnknownType(message), ["inline" /* IdentifierMeta.InlineDefinition */]);
29
+ input.scope.addIdentifier(identifier);
30
+ input.scope.addReference(token, identifier, _reference_1.ReferenceType.DataWriteReference, input.filename);
28
31
  }
29
32
  }
30
33
  }
@@ -7,8 +7,10 @@ const Expressions = require("../../2_statements/expressions");
7
7
  const basic_types_1 = require("../basic_types");
8
8
  const unknown_type_1 = require("../../types/basic/unknown_type");
9
9
  const _reference_1 = require("../_reference");
10
+ const _syntax_input_1 = require("../_syntax_input");
11
+ const basic_1 = require("../../types/basic");
10
12
  class InlineFieldDefinition {
11
- runSyntax(node, scope, filename, targetType) {
13
+ runSyntax(node, input, targetType) {
12
14
  var _a;
13
15
  let type = undefined;
14
16
  const field = (_a = node.findDirectExpression(Expressions.Field)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
@@ -17,11 +19,11 @@ class InlineFieldDefinition {
17
19
  }
18
20
  const source = node.findDirectExpression(Expressions.Source);
19
21
  if (source) {
20
- type = new source_1.Source().runSyntax(source, scope, filename);
22
+ type = new source_1.Source().runSyntax(source, input);
21
23
  }
22
24
  const typeName = node.findDirectExpression(Expressions.TypeName);
23
25
  if (typeName) {
24
- type = new basic_types_1.BasicTypes(filename, scope).parseType(typeName);
26
+ type = new basic_types_1.BasicTypes(input).parseType(typeName);
25
27
  }
26
28
  if (targetType !== undefined) {
27
29
  type = targetType;
@@ -30,12 +32,14 @@ class InlineFieldDefinition {
30
32
  type = new unknown_type_1.UnknownType("InlineFieldDefinition, fallback");
31
33
  }
32
34
  const name = field.getStr();
33
- if (scope.findVariable(name) !== undefined) {
34
- throw new Error(`Variable ${name} already defined`);
35
+ if (input.scope.findVariable(name) !== undefined) {
36
+ const message = `Variable ${name} already defined`;
37
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
38
+ return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
35
39
  }
36
- const identifier = new _typed_identifier_1.TypedIdentifier(field, filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
37
- scope.addReference(field, identifier, _reference_1.ReferenceType.DataWriteReference, filename);
38
- scope.addIdentifier(identifier);
40
+ const identifier = new _typed_identifier_1.TypedIdentifier(field, input.filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
41
+ input.scope.addReference(field, identifier, _reference_1.ReferenceType.DataWriteReference, input.filename);
42
+ input.scope.addIdentifier(identifier);
39
43
  return type;
40
44
  }
41
45
  }
@@ -6,19 +6,19 @@ const _typed_identifier_1 = require("../../types/_typed_identifier");
6
6
  const basic_1 = require("../../types/basic");
7
7
  const _reference_1 = require("../_reference");
8
8
  class InlineFS {
9
- runSyntax(node, scope, filename, type) {
9
+ runSyntax(node, input, type) {
10
10
  var _a;
11
11
  const token = (_a = node.findFirstExpression(Expressions.TargetFieldSymbol)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
12
12
  if (token && type) {
13
- const identifier = new _typed_identifier_1.TypedIdentifier(token, filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
14
- scope.addIdentifier(identifier);
15
- scope.addReference(token, identifier, _reference_1.ReferenceType.DataWriteReference, filename);
13
+ const identifier = new _typed_identifier_1.TypedIdentifier(token, input.filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
14
+ input.scope.addIdentifier(identifier);
15
+ input.scope.addReference(token, identifier, _reference_1.ReferenceType.DataWriteReference, input.filename);
16
16
  }
17
17
  else if (token) {
18
18
  const message = "InlineFS, could not determine type for \"" + token.getStr() + "\"";
19
- const identifier = new _typed_identifier_1.TypedIdentifier(token, filename, new basic_1.UnknownType(message), ["inline" /* IdentifierMeta.InlineDefinition */]);
20
- scope.addIdentifier(identifier);
21
- scope.addReference(token, identifier, _reference_1.ReferenceType.DataWriteReference, filename);
19
+ const identifier = new _typed_identifier_1.TypedIdentifier(token, input.filename, new basic_1.UnknownType(message), ["inline" /* IdentifierMeta.InlineDefinition */]);
20
+ input.scope.addIdentifier(identifier);
21
+ input.scope.addReference(token, identifier, _reference_1.ReferenceType.DataWriteReference, input.filename);
22
22
  }
23
23
  }
24
24
  }
@@ -6,8 +6,9 @@ const source_1 = require("./source");
6
6
  const basic_1 = require("../../types/basic");
7
7
  const _typed_identifier_1 = require("../../types/_typed_identifier");
8
8
  const _reference_1 = require("../_reference");
9
+ const _syntax_input_1 = require("../_syntax_input");
9
10
  class InlineLoopDefinition {
10
- runSyntax(node, scope, filename) {
11
+ runSyntax(node, input) {
11
12
  if (node === undefined) {
12
13
  return;
13
14
  }
@@ -17,7 +18,7 @@ class InlineLoopDefinition {
17
18
  }
18
19
  const source = node.findDirectExpression(Expressions.Source);
19
20
  if (source && target) {
20
- const sourceType = new source_1.Source().runSyntax(source, scope, filename);
21
+ const sourceType = new source_1.Source().runSyntax(source, input);
21
22
  let rowType = undefined;
22
23
  if (sourceType instanceof basic_1.TableType) {
23
24
  rowType = sourceType.getRowType();
@@ -26,7 +27,9 @@ class InlineLoopDefinition {
26
27
  rowType = sourceType;
27
28
  }
28
29
  else if (sourceType instanceof basic_1.UnknownType) {
29
- throw new Error("Unknown type, " + sourceType.getError());
30
+ const message = "Unknown type, " + sourceType.getError();
31
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
32
+ return;
30
33
  }
31
34
  if (rowType === undefined
32
35
  && node.concatTokens().toUpperCase().includes(" IN GROUP ")
@@ -34,18 +37,20 @@ class InlineLoopDefinition {
34
37
  rowType = sourceType;
35
38
  }
36
39
  else if (rowType === undefined) {
37
- throw new Error("InlineLoopDefinition, not a table type");
40
+ const message = "InlineLoopDefinition, not a table type";
41
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
42
+ return;
38
43
  }
39
- const identifier = new _typed_identifier_1.TypedIdentifier(target.getFirstToken(), filename, rowType, ["inline" /* IdentifierMeta.InlineDefinition */]);
40
- scope.addReference(target.getFirstToken(), identifier, _reference_1.ReferenceType.DataWriteReference, filename);
41
- scope.addReference(target.getFirstToken(), identifier, _reference_1.ReferenceType.DataReadReference, filename);
42
- scope.addIdentifier(identifier);
44
+ const identifier = new _typed_identifier_1.TypedIdentifier(target.getFirstToken(), input.filename, rowType, ["inline" /* IdentifierMeta.InlineDefinition */]);
45
+ input.scope.addReference(target.getFirstToken(), identifier, _reference_1.ReferenceType.DataWriteReference, input.filename);
46
+ input.scope.addReference(target.getFirstToken(), identifier, _reference_1.ReferenceType.DataReadReference, input.filename);
47
+ input.scope.addIdentifier(identifier);
43
48
  }
44
49
  const index = node.findExpressionAfterToken("INTO");
45
50
  if (index && index.get() instanceof Expressions.TargetField) {
46
- const identifier = new _typed_identifier_1.TypedIdentifier(index.getFirstToken(), filename, basic_1.IntegerType.get(), ["inline" /* IdentifierMeta.InlineDefinition */]);
47
- scope.addReference(index.getFirstToken(), identifier, _reference_1.ReferenceType.DataWriteReference, filename);
48
- scope.addIdentifier(identifier);
51
+ const identifier = new _typed_identifier_1.TypedIdentifier(index.getFirstToken(), input.filename, basic_1.IntegerType.get(), ["inline" /* IdentifierMeta.InlineDefinition */]);
52
+ input.scope.addReference(index.getFirstToken(), identifier, _reference_1.ReferenceType.DataWriteReference, input.filename);
53
+ input.scope.addIdentifier(identifier);
49
54
  }
50
55
  }
51
56
  }