@abaplint/core 2.111.1 → 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.
- package/build/abaplint.d.ts +17 -8
- package/build/src/abap/5_syntax/_builtin.js +2 -2
- package/build/src/abap/5_syntax/_current_scope.js +2 -0
- package/build/src/abap/5_syntax/_procedural.js +6 -2
- package/build/src/abap/5_syntax/_syntax_input.js +11 -0
- package/build/src/abap/5_syntax/assert_error.js +7 -0
- package/build/src/abap/5_syntax/basic_types.js +78 -79
- package/build/src/abap/5_syntax/expressions/attribute_chain.js +15 -8
- package/build/src/abap/5_syntax/expressions/attribute_name.js +24 -11
- package/build/src/abap/5_syntax/expressions/cast.js +24 -13
- package/build/src/abap/5_syntax/expressions/compare.js +4 -4
- package/build/src/abap/5_syntax/expressions/component_chain.js +26 -11
- package/build/src/abap/5_syntax/expressions/component_compare.js +7 -4
- package/build/src/abap/5_syntax/expressions/component_compare_simple.js +11 -6
- package/build/src/abap/5_syntax/expressions/component_cond.js +3 -3
- package/build/src/abap/5_syntax/expressions/component_name.js +10 -5
- package/build/src/abap/5_syntax/expressions/cond.js +3 -6
- package/build/src/abap/5_syntax/expressions/cond_body.js +6 -6
- package/build/src/abap/5_syntax/expressions/conv_body.js +9 -8
- package/build/src/abap/5_syntax/expressions/corresponding_body.js +3 -3
- package/build/src/abap/5_syntax/expressions/data_definition.js +7 -7
- package/build/src/abap/5_syntax/expressions/database_table.js +9 -7
- package/build/src/abap/5_syntax/expressions/default.js +2 -2
- package/build/src/abap/5_syntax/expressions/dereference.js +5 -2
- package/build/src/abap/5_syntax/expressions/dynamic.js +2 -2
- package/build/src/abap/5_syntax/expressions/field_assignment.js +12 -5
- package/build/src/abap/5_syntax/expressions/field_chain.js +40 -25
- package/build/src/abap/5_syntax/expressions/field_length.js +2 -2
- package/build/src/abap/5_syntax/expressions/field_offset.js +2 -2
- package/build/src/abap/5_syntax/expressions/filter_body.js +3 -3
- package/build/src/abap/5_syntax/expressions/for.js +11 -11
- package/build/src/abap/5_syntax/expressions/form_param.js +10 -9
- package/build/src/abap/5_syntax/expressions/fstarget.js +8 -5
- package/build/src/abap/5_syntax/expressions/inline_data.js +11 -8
- package/build/src/abap/5_syntax/expressions/inline_field_definition.js +12 -8
- package/build/src/abap/5_syntax/expressions/inline_fs.js +7 -7
- package/build/src/abap/5_syntax/expressions/inline_loop_definition.js +16 -11
- package/build/src/abap/5_syntax/expressions/let.js +3 -3
- package/build/src/abap/5_syntax/expressions/loop_group_by.js +5 -15
- package/build/src/abap/5_syntax/expressions/message_source.js +4 -4
- package/build/src/abap/5_syntax/expressions/method_call_body.js +4 -4
- package/build/src/abap/5_syntax/expressions/method_call_chain.js +34 -25
- package/build/src/abap/5_syntax/expressions/method_call_param.js +33 -14
- package/build/src/abap/5_syntax/expressions/method_def_returning.js +7 -6
- package/build/src/abap/5_syntax/expressions/method_param.js +11 -10
- package/build/src/abap/5_syntax/expressions/method_parameters.js +76 -49
- package/build/src/abap/5_syntax/expressions/method_source.js +47 -38
- package/build/src/abap/5_syntax/expressions/new_object.js +48 -28
- package/build/src/abap/5_syntax/expressions/raise_with.js +2 -2
- package/build/src/abap/5_syntax/expressions/reduce_body.js +10 -10
- package/build/src/abap/5_syntax/expressions/reduce_next.js +3 -3
- package/build/src/abap/5_syntax/expressions/select.js +48 -33
- package/build/src/abap/5_syntax/expressions/select_loop.js +2 -2
- package/build/src/abap/5_syntax/expressions/source.js +74 -64
- package/build/src/abap/5_syntax/expressions/source_field.js +12 -6
- package/build/src/abap/5_syntax/expressions/source_field_symbol.js +8 -4
- package/build/src/abap/5_syntax/expressions/sql_compare.js +11 -19
- package/build/src/abap/5_syntax/expressions/sql_for_all_entries.js +7 -4
- package/build/src/abap/5_syntax/expressions/sql_from.js +3 -3
- package/build/src/abap/5_syntax/expressions/sql_in.js +34 -0
- package/build/src/abap/5_syntax/expressions/sql_order_by.js +2 -2
- package/build/src/abap/5_syntax/expressions/sql_source.js +3 -3
- package/build/src/abap/5_syntax/expressions/string_template.js +16 -8
- package/build/src/abap/5_syntax/expressions/switch_body.js +8 -4
- package/build/src/abap/5_syntax/expressions/table_expression.js +2 -2
- package/build/src/abap/5_syntax/expressions/target.js +50 -29
- package/build/src/abap/5_syntax/expressions/type_table.js +7 -7
- package/build/src/abap/5_syntax/expressions/value_body.js +17 -12
- package/build/src/abap/5_syntax/global_definitions/find_global_definitions.js +19 -6
- package/build/src/abap/5_syntax/spaghetti_scope.js +2 -1
- package/build/src/abap/5_syntax/statements/add.js +3 -3
- package/build/src/abap/5_syntax/statements/add_corresponding.js +3 -3
- package/build/src/abap/5_syntax/statements/append.js +25 -14
- package/build/src/abap/5_syntax/statements/assert.js +2 -2
- package/build/src/abap/5_syntax/statements/assign.js +17 -12
- package/build/src/abap/5_syntax/statements/authority_check.js +2 -2
- package/build/src/abap/5_syntax/statements/call.js +8 -5
- package/build/src/abap/5_syntax/statements/call_badi.js +4 -4
- package/build/src/abap/5_syntax/statements/call_function.js +12 -9
- package/build/src/abap/5_syntax/statements/call_kernel.js +2 -2
- package/build/src/abap/5_syntax/statements/call_transaction.js +3 -3
- package/build/src/abap/5_syntax/statements/call_transformation.js +5 -5
- package/build/src/abap/5_syntax/statements/case.js +2 -2
- package/build/src/abap/5_syntax/statements/case_type.js +2 -2
- package/build/src/abap/5_syntax/statements/catch.js +24 -19
- package/build/src/abap/5_syntax/statements/check.js +2 -2
- package/build/src/abap/5_syntax/statements/class_data.js +9 -5
- package/build/src/abap/5_syntax/statements/class_deferred.js +2 -2
- package/build/src/abap/5_syntax/statements/class_implementation.js +16 -13
- package/build/src/abap/5_syntax/statements/class_local_friends.js +16 -9
- package/build/src/abap/5_syntax/statements/clear.js +3 -3
- package/build/src/abap/5_syntax/statements/close_dataset.js +2 -2
- package/build/src/abap/5_syntax/statements/collect.js +4 -4
- package/build/src/abap/5_syntax/statements/commit_entities.js +4 -4
- package/build/src/abap/5_syntax/statements/concatenate.js +18 -11
- package/build/src/abap/5_syntax/statements/condense.js +2 -2
- package/build/src/abap/5_syntax/statements/constant.js +6 -5
- package/build/src/abap/5_syntax/statements/controls.js +5 -5
- package/build/src/abap/5_syntax/statements/convert.js +8 -8
- package/build/src/abap/5_syntax/statements/create_data.js +11 -11
- package/build/src/abap/5_syntax/statements/create_object.js +49 -26
- package/build/src/abap/5_syntax/statements/data.js +8 -4
- package/build/src/abap/5_syntax/statements/delete_cluster.js +4 -4
- package/build/src/abap/5_syntax/statements/delete_database.js +5 -5
- package/build/src/abap/5_syntax/statements/delete_internal.js +7 -7
- package/build/src/abap/5_syntax/statements/delete_report.js +2 -2
- package/build/src/abap/5_syntax/statements/describe.js +13 -13
- package/build/src/abap/5_syntax/statements/divide.js +3 -3
- package/build/src/abap/5_syntax/statements/do.js +8 -5
- package/build/src/abap/5_syntax/statements/editor_call.js +3 -3
- package/build/src/abap/5_syntax/statements/else_if.js +2 -2
- package/build/src/abap/5_syntax/statements/export.js +5 -5
- package/build/src/abap/5_syntax/statements/fieldsymbol.js +4 -4
- package/build/src/abap/5_syntax/statements/find.js +13 -13
- package/build/src/abap/5_syntax/statements/form.js +10 -7
- package/build/src/abap/5_syntax/statements/format.js +2 -2
- package/build/src/abap/5_syntax/statements/get_badi.js +4 -4
- package/build/src/abap/5_syntax/statements/get_bit.js +9 -6
- package/build/src/abap/5_syntax/statements/get_cursor.js +2 -2
- package/build/src/abap/5_syntax/statements/get_locale.js +3 -3
- package/build/src/abap/5_syntax/statements/get_parameter.js +4 -4
- package/build/src/abap/5_syntax/statements/get_reference.js +8 -5
- package/build/src/abap/5_syntax/statements/get_run_time.js +3 -3
- package/build/src/abap/5_syntax/statements/get_time.js +3 -3
- package/build/src/abap/5_syntax/statements/if.js +2 -2
- package/build/src/abap/5_syntax/statements/import.js +5 -5
- package/build/src/abap/5_syntax/statements/import_dynpro.js +3 -3
- package/build/src/abap/5_syntax/statements/include_type.js +9 -5
- package/build/src/abap/5_syntax/statements/insert_database.js +5 -5
- package/build/src/abap/5_syntax/statements/insert_field_group.js +4 -4
- package/build/src/abap/5_syntax/statements/insert_internal.js +22 -13
- package/build/src/abap/5_syntax/statements/insert_report.js +2 -2
- package/build/src/abap/5_syntax/statements/insert_textpool.js +2 -2
- package/build/src/abap/5_syntax/statements/interface_deferred.js +2 -2
- package/build/src/abap/5_syntax/statements/log_point.js +2 -2
- package/build/src/abap/5_syntax/statements/loop.js +29 -16
- package/build/src/abap/5_syntax/statements/loop_at_screen.js +3 -3
- package/build/src/abap/5_syntax/statements/message.js +6 -6
- package/build/src/abap/5_syntax/statements/method_implementation.js +18 -13
- package/build/src/abap/5_syntax/statements/modify_database.js +8 -8
- package/build/src/abap/5_syntax/statements/modify_entities.js +4 -4
- package/build/src/abap/5_syntax/statements/modify_internal.js +15 -8
- package/build/src/abap/5_syntax/statements/modify_screen.js +2 -2
- package/build/src/abap/5_syntax/statements/move.js +17 -10
- package/build/src/abap/5_syntax/statements/move_corresponding.js +14 -7
- package/build/src/abap/5_syntax/statements/multiply.js +3 -3
- package/build/src/abap/5_syntax/statements/open_dataset.js +3 -3
- package/build/src/abap/5_syntax/statements/pack.js +3 -3
- package/build/src/abap/5_syntax/statements/parameter.js +11 -6
- package/build/src/abap/5_syntax/statements/perform.js +12 -8
- package/build/src/abap/5_syntax/statements/raise.js +23 -18
- package/build/src/abap/5_syntax/statements/raise_event.js +4 -4
- package/build/src/abap/5_syntax/statements/ranges.js +6 -5
- package/build/src/abap/5_syntax/statements/read_entities.js +4 -4
- package/build/src/abap/5_syntax/statements/read_report.js +3 -3
- package/build/src/abap/5_syntax/statements/read_table.js +40 -21
- package/build/src/abap/5_syntax/statements/read_textpool.js +3 -3
- package/build/src/abap/5_syntax/statements/receive.js +3 -3
- package/build/src/abap/5_syntax/statements/replace.js +3 -3
- package/build/src/abap/5_syntax/statements/scan.js +3 -3
- package/build/src/abap/5_syntax/statements/search.js +2 -2
- package/build/src/abap/5_syntax/statements/select.js +2 -2
- package/build/src/abap/5_syntax/statements/select_loop.js +2 -2
- package/build/src/abap/5_syntax/statements/selection_screen.js +4 -4
- package/build/src/abap/5_syntax/statements/selectoption.js +9 -6
- package/build/src/abap/5_syntax/statements/set_bit.js +8 -5
- package/build/src/abap/5_syntax/statements/set_handler.js +3 -3
- package/build/src/abap/5_syntax/statements/set_locale.js +3 -3
- package/build/src/abap/5_syntax/statements/set_parameter.js +2 -2
- package/build/src/abap/5_syntax/statements/set_pf_status.js +2 -2
- package/build/src/abap/5_syntax/statements/set_titlebar.js +2 -2
- package/build/src/abap/5_syntax/statements/shift.js +15 -8
- package/build/src/abap/5_syntax/statements/sort.js +16 -7
- package/build/src/abap/5_syntax/statements/split.js +12 -7
- package/build/src/abap/5_syntax/statements/static.js +4 -4
- package/build/src/abap/5_syntax/statements/submit.js +4 -4
- package/build/src/abap/5_syntax/statements/subtract.js +3 -3
- package/build/src/abap/5_syntax/statements/subtract_corresponding.js +3 -3
- package/build/src/abap/5_syntax/statements/syntax_check.js +3 -3
- package/build/src/abap/5_syntax/statements/system_call.js +2 -2
- package/build/src/abap/5_syntax/statements/tables.js +7 -7
- package/build/src/abap/5_syntax/statements/transfer.js +3 -3
- package/build/src/abap/5_syntax/statements/translate.js +3 -3
- package/build/src/abap/5_syntax/statements/truncate_dataset.js +2 -2
- package/build/src/abap/5_syntax/statements/type.js +12 -7
- package/build/src/abap/5_syntax/statements/unassign.js +7 -4
- package/build/src/abap/5_syntax/statements/unpack.js +3 -3
- package/build/src/abap/5_syntax/statements/update_database.js +11 -11
- package/build/src/abap/5_syntax/statements/wait.js +3 -3
- package/build/src/abap/5_syntax/statements/when.js +2 -2
- package/build/src/abap/5_syntax/statements/when_type.js +9 -6
- package/build/src/abap/5_syntax/statements/while.js +4 -4
- package/build/src/abap/5_syntax/statements/with.js +3 -3
- package/build/src/abap/5_syntax/statements/with_loop.js +3 -3
- package/build/src/abap/5_syntax/statements/write.js +14 -10
- package/build/src/abap/5_syntax/structures/class_data.js +3 -3
- package/build/src/abap/5_syntax/structures/constants.js +6 -5
- package/build/src/abap/5_syntax/structures/data.js +17 -13
- package/build/src/abap/5_syntax/structures/statics.js +16 -11
- package/build/src/abap/5_syntax/structures/type_enum.js +15 -13
- package/build/src/abap/5_syntax/structures/types.js +9 -9
- package/build/src/abap/5_syntax/syntax.js +32 -16
- package/build/src/abap/types/class_attributes.js +30 -30
- package/build/src/abap/types/class_definition.js +29 -29
- package/build/src/abap/types/event_definition.js +5 -5
- package/build/src/abap/types/form_definition.js +13 -13
- package/build/src/abap/types/interface_definition.js +19 -19
- package/build/src/abap/types/method_definition.js +10 -10
- package/build/src/abap/types/method_definitions.js +9 -10
- package/build/src/abap/types/method_parameters.js +29 -29
- package/build/src/issue.js +12 -0
- package/build/src/registry.js +1 -1
- package/build/src/rules/check_syntax.js +2 -1
- package/package.json +3 -3
|
@@ -8,14 +8,16 @@ const inline_data_1 = require("./inline_data");
|
|
|
8
8
|
const target_1 = require("./target");
|
|
9
9
|
const source_1 = require("./source");
|
|
10
10
|
const _type_utils_1 = require("../_type_utils");
|
|
11
|
+
const _syntax_input_1 = require("../_syntax_input");
|
|
12
|
+
const assert_error_1 = require("../assert_error");
|
|
11
13
|
class MethodParameters {
|
|
12
14
|
constructor() {
|
|
13
15
|
this.requiredParameters = undefined;
|
|
14
16
|
}
|
|
15
|
-
runSyntax(node,
|
|
17
|
+
runSyntax(node, input, method) {
|
|
16
18
|
var _a;
|
|
17
19
|
if (!(node.get() instanceof Expressions.MethodParameters)) {
|
|
18
|
-
throw new
|
|
20
|
+
throw new assert_error_1.AssertError("MethodParameters, unexpected input");
|
|
19
21
|
}
|
|
20
22
|
const children = node.getChildren().slice();
|
|
21
23
|
if (method instanceof basic_1.VoidType) {
|
|
@@ -28,50 +30,56 @@ class MethodParameters {
|
|
|
28
30
|
const name = (_a = children.shift()) === null || _a === void 0 ? void 0 : _a.getFirstToken().getStr().toUpperCase();
|
|
29
31
|
switch (name) {
|
|
30
32
|
case "EXPORTING":
|
|
31
|
-
this.checkExporting(children.shift(),
|
|
33
|
+
this.checkExporting(children.shift(), input, method, false);
|
|
32
34
|
break;
|
|
33
35
|
case "IMPORTING":
|
|
34
|
-
this.checkImporting(children.shift(),
|
|
36
|
+
this.checkImporting(children.shift(), input, method);
|
|
35
37
|
break;
|
|
36
38
|
case "CHANGING":
|
|
37
|
-
this.checkChanging(children.shift(),
|
|
39
|
+
this.checkChanging(children.shift(), input, method);
|
|
38
40
|
break;
|
|
39
41
|
case "RECEIVING":
|
|
40
|
-
this.checkReceiving(children.shift(),
|
|
42
|
+
this.checkReceiving(children.shift(), input, method);
|
|
41
43
|
break;
|
|
42
44
|
case "EXCEPTIONS":
|
|
43
45
|
children.shift(); // todo, old style exceptions
|
|
44
46
|
break;
|
|
45
47
|
default:
|
|
46
|
-
throw new
|
|
48
|
+
throw new assert_error_1.AssertError("MethodParameters, unexpected token, " + name);
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
|
-
this.reportErrors();
|
|
51
|
+
this.reportErrors(node, input);
|
|
50
52
|
}
|
|
51
53
|
///////////////////////
|
|
52
|
-
checkReceiving(node,
|
|
54
|
+
checkReceiving(node, input, method) {
|
|
53
55
|
var _a;
|
|
54
56
|
const type = method instanceof basic_1.VoidType ? method : (_a = method.getParameters().getReturning()) === null || _a === void 0 ? void 0 : _a.getType();
|
|
55
57
|
if (type === undefined) {
|
|
56
|
-
|
|
58
|
+
const message = "Method does not have a returning parameter";
|
|
59
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
60
|
+
return;
|
|
57
61
|
}
|
|
58
62
|
else if (!(node instanceof nodes_1.ExpressionNode)) {
|
|
59
|
-
|
|
63
|
+
const message = "checkReceiving, not an expression node";
|
|
64
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
65
|
+
return;
|
|
60
66
|
}
|
|
61
67
|
const target = node.findDirectExpression(Expressions.Target);
|
|
62
68
|
const inline = target === null || target === void 0 ? void 0 : target.findDirectExpression(Expressions.InlineData);
|
|
63
69
|
if (inline) {
|
|
64
|
-
new inline_data_1.InlineData().runSyntax(inline,
|
|
70
|
+
new inline_data_1.InlineData().runSyntax(inline, input, type);
|
|
65
71
|
}
|
|
66
72
|
else if (target) {
|
|
67
|
-
const targetType = new target_1.Target().runSyntax(target,
|
|
68
|
-
if (targetType && new _type_utils_1.TypeUtils(scope).isAssignable(type, targetType) === false) {
|
|
69
|
-
|
|
73
|
+
const targetType = new target_1.Target().runSyntax(target, input);
|
|
74
|
+
if (targetType && new _type_utils_1.TypeUtils(input.scope).isAssignable(type, targetType) === false) {
|
|
75
|
+
const message = "Method returning value not type compatible";
|
|
76
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
77
|
+
return;
|
|
70
78
|
}
|
|
71
79
|
}
|
|
72
80
|
}
|
|
73
|
-
checkImporting(node,
|
|
74
|
-
for (const item of this.parameterListT(node,
|
|
81
|
+
checkImporting(node, input, method) {
|
|
82
|
+
for (const item of this.parameterListT(node, input)) {
|
|
75
83
|
let parameterType = undefined;
|
|
76
84
|
if (method instanceof basic_1.VoidType) {
|
|
77
85
|
parameterType = method;
|
|
@@ -79,27 +87,35 @@ class MethodParameters {
|
|
|
79
87
|
else {
|
|
80
88
|
const parameter = method.getParameters().getExporting().find(p => p.getName().toUpperCase() === item.name);
|
|
81
89
|
if (parameter === undefined) {
|
|
82
|
-
|
|
90
|
+
const message = "Method exporting parameter \"" + item.name + "\" does not exist";
|
|
91
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
92
|
+
return;
|
|
83
93
|
}
|
|
84
94
|
parameterType = parameter.getType();
|
|
85
95
|
}
|
|
86
96
|
const inline = item.target.findDirectExpression(Expressions.InlineData);
|
|
87
97
|
if (inline) {
|
|
88
|
-
new inline_data_1.InlineData().runSyntax(inline,
|
|
98
|
+
new inline_data_1.InlineData().runSyntax(inline, input, parameterType);
|
|
89
99
|
}
|
|
90
100
|
else if (item.targetType === undefined) {
|
|
91
|
-
|
|
101
|
+
const message = "Could not determine target type";
|
|
102
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
103
|
+
return;
|
|
92
104
|
}
|
|
93
|
-
else if (item.targetType && new _type_utils_1.TypeUtils(scope).isAssignable(parameterType, item.targetType) === false) {
|
|
94
|
-
|
|
105
|
+
else if (item.targetType && new _type_utils_1.TypeUtils(input.scope).isAssignable(parameterType, item.targetType) === false) {
|
|
106
|
+
const message = "Method parameter type not compatible, " + item.name;
|
|
107
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
108
|
+
return;
|
|
95
109
|
}
|
|
96
110
|
}
|
|
97
111
|
}
|
|
98
|
-
checkChanging(node,
|
|
112
|
+
checkChanging(node, input, method) {
|
|
99
113
|
var _a;
|
|
100
|
-
for (const item of this.parameterListT(node,
|
|
114
|
+
for (const item of this.parameterListT(node, input)) {
|
|
101
115
|
if (item.target.findFirstExpression(Expressions.InlineData) !== undefined) {
|
|
102
|
-
|
|
116
|
+
const message = "CHANGING cannot be inlined";
|
|
117
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
118
|
+
return;
|
|
103
119
|
}
|
|
104
120
|
let parameterType = undefined;
|
|
105
121
|
if (method instanceof basic_1.VoidType) {
|
|
@@ -108,18 +124,22 @@ class MethodParameters {
|
|
|
108
124
|
else {
|
|
109
125
|
const parameter = method.getParameters().getChanging().find(p => p.getName().toUpperCase() === item.name);
|
|
110
126
|
if (parameter === undefined) {
|
|
111
|
-
|
|
127
|
+
const message = "Method changing parameter \"" + item.name + "\" does not exist";
|
|
128
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
129
|
+
return;
|
|
112
130
|
}
|
|
113
131
|
parameterType = parameter.getType();
|
|
114
132
|
}
|
|
115
|
-
if (item.targetType && new _type_utils_1.TypeUtils(scope).isAssignable(parameterType, item.targetType) === false) {
|
|
116
|
-
|
|
133
|
+
if (item.targetType && new _type_utils_1.TypeUtils(input.scope).isAssignable(parameterType, item.targetType) === false) {
|
|
134
|
+
const message = "Method parameter type not compatible, " + item.name;
|
|
135
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
136
|
+
return;
|
|
117
137
|
}
|
|
118
138
|
(_a = this.requiredParameters) === null || _a === void 0 ? void 0 : _a.delete(item.name);
|
|
119
139
|
}
|
|
120
140
|
}
|
|
121
|
-
checkExporting(node,
|
|
122
|
-
const items = this.parameterListS(node,
|
|
141
|
+
checkExporting(node, input, method, errors = true) {
|
|
142
|
+
const items = this.parameterListS(node, input, method);
|
|
123
143
|
if (method instanceof basic_1.VoidType) {
|
|
124
144
|
return;
|
|
125
145
|
}
|
|
@@ -133,43 +153,48 @@ class MethodParameters {
|
|
|
133
153
|
|| item.source.findFirstExpression(Expressions.StringTemplate) !== undefined
|
|
134
154
|
|| item.source.findFirstExpression(Expressions.ArithOperator) !== undefined;
|
|
135
155
|
if (parameter === undefined) {
|
|
136
|
-
|
|
156
|
+
const message = "Method importing parameter \"" + item.name + "\" does not exist";
|
|
157
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
158
|
+
return;
|
|
137
159
|
}
|
|
138
|
-
else if (new _type_utils_1.TypeUtils(scope).isAssignableStrict(item.sourceType, parameter.getType(), calculated) === false) {
|
|
139
|
-
|
|
160
|
+
else if (new _type_utils_1.TypeUtils(input.scope).isAssignableStrict(item.sourceType, parameter.getType(), calculated) === false) {
|
|
161
|
+
const message = "Method parameter type not compatible, " + item.name;
|
|
162
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
163
|
+
return;
|
|
140
164
|
}
|
|
141
165
|
this.requiredParameters.delete(item.name);
|
|
142
166
|
}
|
|
143
167
|
if (errors === true) {
|
|
144
|
-
this.reportErrors();
|
|
168
|
+
this.reportErrors(node, input);
|
|
145
169
|
}
|
|
146
170
|
}
|
|
147
|
-
reportErrors() {
|
|
171
|
+
reportErrors(node, input) {
|
|
148
172
|
var _a;
|
|
149
173
|
for (const r of ((_a = this.requiredParameters) === null || _a === void 0 ? void 0 : _a.values()) || []) {
|
|
150
|
-
|
|
174
|
+
const message = `method parameter "${r}" must be supplied`;
|
|
175
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
151
176
|
}
|
|
152
177
|
}
|
|
153
|
-
parameterListS(node,
|
|
178
|
+
parameterListS(node, input, method) {
|
|
154
179
|
var _a;
|
|
155
180
|
if (node === undefined) {
|
|
156
181
|
return [];
|
|
157
182
|
}
|
|
158
183
|
else if (!(node.get() instanceof Expressions.ParameterListS)) {
|
|
159
|
-
throw new
|
|
184
|
+
throw new assert_error_1.AssertError("parameterListS, unexpected node");
|
|
160
185
|
}
|
|
161
186
|
const ret = [];
|
|
162
187
|
for (const c of node.getChildren()) {
|
|
163
188
|
if (!(c.get() instanceof Expressions.ParameterS) || !(c instanceof nodes_1.ExpressionNode)) {
|
|
164
|
-
throw new
|
|
189
|
+
throw new assert_error_1.AssertError("parameterListS, unexpected node, child");
|
|
165
190
|
}
|
|
166
191
|
const name = (_a = c.findDirectExpression(Expressions.ParameterName)) === null || _a === void 0 ? void 0 : _a.getFirstToken().getStr().toUpperCase();
|
|
167
192
|
if (name === undefined) {
|
|
168
|
-
throw new
|
|
193
|
+
throw new assert_error_1.AssertError("parameterListS, no name determined");
|
|
169
194
|
}
|
|
170
195
|
const source = c.findDirectExpression(Expressions.Source);
|
|
171
196
|
if (source === undefined) {
|
|
172
|
-
throw new
|
|
197
|
+
throw new assert_error_1.AssertError("parameterListS, no source found");
|
|
173
198
|
}
|
|
174
199
|
let targetType = undefined;
|
|
175
200
|
if (!(method instanceof basic_1.VoidType)) {
|
|
@@ -179,41 +204,43 @@ class MethodParameters {
|
|
|
179
204
|
}
|
|
180
205
|
}
|
|
181
206
|
}
|
|
182
|
-
let sourceType = new source_1.Source().runSyntax(source,
|
|
207
|
+
let sourceType = new source_1.Source().runSyntax(source, input, targetType);
|
|
183
208
|
if (sourceType === undefined) {
|
|
184
209
|
if (method instanceof basic_1.VoidType) {
|
|
185
210
|
sourceType = method;
|
|
186
211
|
}
|
|
187
212
|
else {
|
|
188
|
-
|
|
213
|
+
const message = "No source type determined for parameter " + name + " input";
|
|
214
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
215
|
+
sourceType = new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
189
216
|
}
|
|
190
217
|
}
|
|
191
218
|
ret.push({ name, source, sourceType });
|
|
192
219
|
}
|
|
193
220
|
return ret;
|
|
194
221
|
}
|
|
195
|
-
parameterListT(node,
|
|
222
|
+
parameterListT(node, input) {
|
|
196
223
|
var _a;
|
|
197
224
|
if (node === undefined) {
|
|
198
225
|
return [];
|
|
199
226
|
}
|
|
200
227
|
else if (!(node.get() instanceof Expressions.ParameterListT)) {
|
|
201
|
-
throw new
|
|
228
|
+
throw new assert_error_1.AssertError("parameterListT, unexpected node");
|
|
202
229
|
}
|
|
203
230
|
const ret = [];
|
|
204
231
|
for (const c of node.getChildren()) {
|
|
205
232
|
if (!(c.get() instanceof Expressions.ParameterT) || !(c instanceof nodes_1.ExpressionNode)) {
|
|
206
|
-
throw new
|
|
233
|
+
throw new assert_error_1.AssertError("parameterListT, unexpected node, child");
|
|
207
234
|
}
|
|
208
235
|
const name = (_a = c.findDirectExpression(Expressions.ParameterName)) === null || _a === void 0 ? void 0 : _a.getFirstToken().getStr().toUpperCase();
|
|
209
236
|
if (name === undefined) {
|
|
210
|
-
throw new
|
|
237
|
+
throw new assert_error_1.AssertError("parameterListT, no name determined");
|
|
211
238
|
}
|
|
212
239
|
const target = c.findDirectExpression(Expressions.Target);
|
|
213
240
|
if (target === undefined) {
|
|
214
|
-
throw new
|
|
241
|
+
throw new assert_error_1.AssertError("parameterListT, no target found");
|
|
215
242
|
}
|
|
216
|
-
const targetType = new target_1.Target().runSyntax(target,
|
|
243
|
+
const targetType = new target_1.Target().runSyntax(target, input);
|
|
217
244
|
ret.push({ name, target, targetType });
|
|
218
245
|
}
|
|
219
246
|
return ret;
|
|
@@ -15,27 +15,31 @@ const attribute_name_1 = require("./attribute_name");
|
|
|
15
15
|
const component_name_1 = require("./component_name");
|
|
16
16
|
const types_1 = require("../../types");
|
|
17
17
|
const version_1 = require("../../../version");
|
|
18
|
+
const _syntax_input_1 = require("../_syntax_input");
|
|
19
|
+
const assert_error_1 = require("../assert_error");
|
|
18
20
|
class MethodSource {
|
|
19
|
-
runSyntax(node,
|
|
21
|
+
runSyntax(node, input) {
|
|
20
22
|
var _a, _b, _c;
|
|
21
|
-
const helper = new _object_oriented_1.ObjectOriented(scope);
|
|
23
|
+
const helper = new _object_oriented_1.ObjectOriented(input.scope);
|
|
22
24
|
const children = node.getChildren().slice();
|
|
23
25
|
const first = children.shift();
|
|
24
26
|
if (first === undefined) {
|
|
25
|
-
throw new
|
|
27
|
+
throw new assert_error_1.AssertError("MethodSource, first child expected");
|
|
26
28
|
}
|
|
27
|
-
let context = this.findTop(first,
|
|
29
|
+
let context = this.findTop(first, input, children);
|
|
28
30
|
if (context === undefined) {
|
|
29
|
-
context = (_a = scope.findVariable("me")) === null || _a === void 0 ? void 0 : _a.getType();
|
|
31
|
+
context = (_a = input.scope.findVariable("me")) === null || _a === void 0 ? void 0 : _a.getType();
|
|
30
32
|
children.unshift(first);
|
|
31
33
|
}
|
|
32
|
-
if (scope.getVersion() === version_1.Version.Cloud
|
|
34
|
+
if (input.scope.getVersion() === version_1.Version.Cloud
|
|
33
35
|
&& first.get() instanceof Expressions.Dynamic
|
|
34
36
|
&& first instanceof nodes_1.ExpressionNode
|
|
35
37
|
&& ((_b = children[0]) === null || _b === void 0 ? void 0 : _b.concatTokens()) === "=>") {
|
|
36
38
|
const name = (_c = first.findDirectExpression(Expressions.Constant)) === null || _c === void 0 ? void 0 : _c.concatTokens().replace(/'/g, "").replace(/`/g, "");
|
|
37
|
-
if (name !== undefined && scope.findClassDefinition(name) === undefined) {
|
|
38
|
-
|
|
39
|
+
if (name !== undefined && input.scope.findClassDefinition(name) === undefined) {
|
|
40
|
+
const message = `Class "${name}" not found/released`;
|
|
41
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
42
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
if (context instanceof basic_1.VoidType) {
|
|
@@ -49,10 +53,14 @@ class MethodSource {
|
|
|
49
53
|
}
|
|
50
54
|
if (current.get() instanceof tokens_1.Dash) {
|
|
51
55
|
if (context instanceof basic_1.UnknownType) {
|
|
52
|
-
|
|
56
|
+
const message = "Not a structure, type unknown, MethodSource";
|
|
57
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
58
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
53
59
|
}
|
|
54
60
|
else if (!(context instanceof basic_1.StructureType)) {
|
|
55
|
-
|
|
61
|
+
const message = "Not a structure, MethodSource";
|
|
62
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
63
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
56
64
|
}
|
|
57
65
|
}
|
|
58
66
|
else if (current.get() instanceof tokens_1.InstanceArrow
|
|
@@ -61,35 +69,35 @@ class MethodSource {
|
|
|
61
69
|
}
|
|
62
70
|
else if (current.get() instanceof Expressions.AttributeName
|
|
63
71
|
|| current.get() instanceof Expressions.SourceField) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
if (context instanceof _abstract_type_1.AbstractType) {
|
|
73
|
+
const attr = new attribute_name_1.AttributeName().runSyntax(context, current, input, _reference_1.ReferenceType.DataReadReference, false);
|
|
74
|
+
const isSyntaxError = attr instanceof basic_1.VoidType && attr.getVoided() === _syntax_input_1.CheckSyntaxKey;
|
|
75
|
+
if (isSyntaxError === false) {
|
|
67
76
|
context = attr;
|
|
68
77
|
continue;
|
|
69
78
|
}
|
|
70
79
|
}
|
|
71
|
-
catch (_d) {
|
|
72
|
-
// ignore
|
|
73
|
-
}
|
|
74
80
|
// try looking for method name
|
|
75
81
|
const className = context instanceof basic_1.ObjectReferenceType ? context.getIdentifierName() : undefined;
|
|
76
82
|
const methodToken = current.getFirstToken();
|
|
77
83
|
const methodName = methodToken === null || methodToken === void 0 ? void 0 : methodToken.getStr();
|
|
78
|
-
const def = scope.findObjectDefinition(className);
|
|
84
|
+
const def = input.scope.findObjectDefinition(className);
|
|
79
85
|
// eslint-disable-next-line prefer-const
|
|
80
86
|
let { method, def: foundDef } = helper.searchMethodName(def, methodName);
|
|
81
87
|
if (method === undefined && (methodName === null || methodName === void 0 ? void 0 : methodName.toUpperCase()) === "CONSTRUCTOR") {
|
|
82
88
|
context = new basic_1.VoidType("CONSTRUCTOR"); // todo, this is a workaround, constructors always exists
|
|
83
89
|
}
|
|
84
90
|
else if (method === undefined && !(context instanceof basic_1.VoidType)) {
|
|
85
|
-
|
|
91
|
+
const message = "Method or attribute \"" + methodName + "\" not found, MethodSource";
|
|
92
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
93
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
86
94
|
}
|
|
87
95
|
else if (method) {
|
|
88
96
|
const extra = {
|
|
89
97
|
ooName: foundDef === null || foundDef === void 0 ? void 0 : foundDef.getName(),
|
|
90
98
|
ooType: foundDef instanceof types_1.ClassDefinition ? "CLAS" : "INTF"
|
|
91
99
|
};
|
|
92
|
-
scope.addReference(methodToken, method, _reference_1.ReferenceType.MethodReference, filename, extra);
|
|
100
|
+
input.scope.addReference(methodToken, method, _reference_1.ReferenceType.MethodReference, input.filename, extra);
|
|
93
101
|
context = method;
|
|
94
102
|
}
|
|
95
103
|
}
|
|
@@ -97,52 +105,53 @@ class MethodSource {
|
|
|
97
105
|
if (context instanceof basic_1.TableType && context.isWithHeader()) {
|
|
98
106
|
context = context.getRowType();
|
|
99
107
|
}
|
|
100
|
-
context = new component_name_1.ComponentName().runSyntax(context, current);
|
|
108
|
+
context = new component_name_1.ComponentName().runSyntax(context, current, input);
|
|
101
109
|
}
|
|
102
110
|
else if (current instanceof nodes_1.ExpressionNode && current.get() instanceof Expressions.Dynamic) {
|
|
103
|
-
new dynamic_1.Dynamic().runSyntax(current,
|
|
111
|
+
new dynamic_1.Dynamic().runSyntax(current, input);
|
|
104
112
|
context = new basic_1.VoidType("Dynamic");
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
115
|
if (context instanceof _abstract_type_1.AbstractType && !(context instanceof basic_1.VoidType)) {
|
|
108
|
-
|
|
116
|
+
const message = "Not a method, MethodSource";
|
|
117
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
118
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
109
119
|
}
|
|
110
120
|
else if (context === undefined) {
|
|
111
|
-
|
|
121
|
+
const message = "Not found, MethodSource";
|
|
122
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
123
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
112
124
|
}
|
|
113
125
|
return context;
|
|
114
126
|
}
|
|
115
127
|
//////////////////////////////////////
|
|
116
|
-
findTop(first,
|
|
128
|
+
findTop(first, input, children) {
|
|
117
129
|
if (first.get() instanceof Expressions.ClassName) {
|
|
118
130
|
// todo, refactor this part to new expression handler,
|
|
119
131
|
const token = first.getFirstToken();
|
|
120
132
|
const className = token.getStr();
|
|
121
|
-
const classDefinition = scope.findObjectDefinition(className);
|
|
122
|
-
if (classDefinition === undefined && scope.getDDIC().inErrorNamespace(className) === false) {
|
|
133
|
+
const classDefinition = input.scope.findObjectDefinition(className);
|
|
134
|
+
if (classDefinition === undefined && input.scope.getDDIC().inErrorNamespace(className) === false) {
|
|
123
135
|
const extra = { ooName: className, ooType: "Void" };
|
|
124
|
-
scope.addReference(token, undefined, _reference_1.ReferenceType.ObjectOrientedVoidReference, filename, extra);
|
|
136
|
+
input.scope.addReference(token, undefined, _reference_1.ReferenceType.ObjectOrientedVoidReference, input.filename, extra);
|
|
125
137
|
return new basic_1.VoidType(className);
|
|
126
138
|
}
|
|
127
139
|
else if (classDefinition === undefined) {
|
|
128
|
-
|
|
140
|
+
const message = "Class " + className + " not found";
|
|
141
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, first.getFirstToken(), message));
|
|
142
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
129
143
|
}
|
|
130
|
-
scope.addReference(first.getFirstToken(), classDefinition, _reference_1.ReferenceType.ObjectOrientedReference, filename);
|
|
144
|
+
input.scope.addReference(first.getFirstToken(), classDefinition, _reference_1.ReferenceType.ObjectOrientedReference, input.filename);
|
|
131
145
|
return new basic_1.ObjectReferenceType(classDefinition);
|
|
132
146
|
}
|
|
133
|
-
else if (first instanceof nodes_1.ExpressionNode && first.get() instanceof Expressions.SourceField) {
|
|
134
|
-
|
|
135
|
-
return new source_field_1.SourceField().runSyntax(first, scope, filename, _reference_1.ReferenceType.DataReadReference);
|
|
136
|
-
}
|
|
137
|
-
catch (_a) {
|
|
138
|
-
return undefined;
|
|
139
|
-
}
|
|
147
|
+
else if (first instanceof nodes_1.ExpressionNode && first.get() instanceof Expressions.SourceField && children.length > 0) {
|
|
148
|
+
return new source_field_1.SourceField().runSyntax(first, input, _reference_1.ReferenceType.DataReadReference);
|
|
140
149
|
}
|
|
141
150
|
else if (first instanceof nodes_1.ExpressionNode && first.get() instanceof Expressions.SourceFieldSymbol) {
|
|
142
|
-
return new source_field_symbol_1.SourceFieldSymbol().runSyntax(first,
|
|
151
|
+
return new source_field_symbol_1.SourceFieldSymbol().runSyntax(first, input);
|
|
143
152
|
}
|
|
144
153
|
else if (first instanceof nodes_1.ExpressionNode && first.get() instanceof Expressions.Dynamic) {
|
|
145
|
-
new dynamic_1.Dynamic().runSyntax(first,
|
|
154
|
+
new dynamic_1.Dynamic().runSyntax(first, input);
|
|
146
155
|
return new basic_1.VoidType("Dynamic");
|
|
147
156
|
}
|
|
148
157
|
return undefined;
|
|
@@ -9,51 +9,59 @@ const _object_oriented_1 = require("../_object_oriented");
|
|
|
9
9
|
const method_parameters_1 = require("./method_parameters");
|
|
10
10
|
const basic_types_1 = require("../basic_types");
|
|
11
11
|
const _type_utils_1 = require("../_type_utils");
|
|
12
|
+
const _syntax_input_1 = require("../_syntax_input");
|
|
13
|
+
const assert_error_1 = require("../assert_error");
|
|
12
14
|
class NewObject {
|
|
13
|
-
runSyntax(node,
|
|
15
|
+
runSyntax(node, input, targetType) {
|
|
14
16
|
let ret = undefined;
|
|
15
17
|
const typeExpr = node.findDirectExpression(Expressions.TypeNameOrInfer);
|
|
16
18
|
const typeToken = typeExpr === null || typeExpr === void 0 ? void 0 : typeExpr.getFirstToken();
|
|
17
19
|
const typeName = typeExpr === null || typeExpr === void 0 ? void 0 : typeExpr.concatTokens();
|
|
18
20
|
if (typeName === undefined) {
|
|
19
|
-
throw new
|
|
21
|
+
throw new assert_error_1.AssertError("NewObject, child TypeNameOrInfer not found");
|
|
20
22
|
}
|
|
21
23
|
else if (typeName === "#" && targetType && targetType instanceof basic_1.ObjectReferenceType) {
|
|
22
|
-
const clas = scope.findClassDefinition(targetType.getIdentifierName());
|
|
24
|
+
const clas = input.scope.findClassDefinition(targetType.getIdentifierName());
|
|
23
25
|
if (clas) {
|
|
24
|
-
scope.addReference(typeToken, clas, _reference_1.ReferenceType.InferredType, filename);
|
|
26
|
+
input.scope.addReference(typeToken, clas, _reference_1.ReferenceType.InferredType, input.filename);
|
|
25
27
|
}
|
|
26
28
|
else {
|
|
27
|
-
const intf = scope.findInterfaceDefinition(targetType.getIdentifierName());
|
|
29
|
+
const intf = input.scope.findInterfaceDefinition(targetType.getIdentifierName());
|
|
28
30
|
if (intf) {
|
|
29
|
-
|
|
31
|
+
const message = intf.getName() + " is an interface, cannot be instantiated";
|
|
32
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
33
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
30
34
|
}
|
|
31
35
|
}
|
|
32
36
|
ret = targetType;
|
|
33
37
|
if ((clas === null || clas === void 0 ? void 0 : clas.isAbstract()) === true) {
|
|
34
|
-
|
|
38
|
+
const message = clas.getName() + " is abstract, cannot be instantiated";
|
|
39
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
40
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
35
41
|
}
|
|
36
42
|
}
|
|
37
43
|
else if (typeName === "#" && targetType) {
|
|
38
44
|
ret = targetType;
|
|
39
45
|
}
|
|
40
46
|
else if (typeName === "#") {
|
|
41
|
-
throw new
|
|
47
|
+
throw new assert_error_1.AssertError("NewObject, todo, infer type");
|
|
42
48
|
}
|
|
43
49
|
if (ret === undefined) {
|
|
44
|
-
const objDefinition = scope.findObjectDefinition(typeName);
|
|
50
|
+
const objDefinition = input.scope.findObjectDefinition(typeName);
|
|
45
51
|
if (objDefinition) {
|
|
46
|
-
scope.addReference(typeToken, objDefinition, _reference_1.ReferenceType.ObjectOrientedReference, filename);
|
|
52
|
+
input.scope.addReference(typeToken, objDefinition, _reference_1.ReferenceType.ObjectOrientedReference, input.filename);
|
|
47
53
|
const objref = new basic_1.ObjectReferenceType(objDefinition);
|
|
48
|
-
const clas = scope.findClassDefinition(objref.getIdentifierName());
|
|
54
|
+
const clas = input.scope.findClassDefinition(objref.getIdentifierName());
|
|
49
55
|
if ((clas === null || clas === void 0 ? void 0 : clas.isAbstract()) === true) {
|
|
50
|
-
|
|
56
|
+
const message = clas.getName() + " is abstract, cannot be instantiated";
|
|
57
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
58
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
51
59
|
}
|
|
52
60
|
ret = objref;
|
|
53
61
|
}
|
|
54
62
|
}
|
|
55
63
|
if (ret === undefined) {
|
|
56
|
-
const basic = new basic_types_1.BasicTypes(
|
|
64
|
+
const basic = new basic_types_1.BasicTypes(input);
|
|
57
65
|
const type = basic.resolveTypeName(typeExpr);
|
|
58
66
|
if (type instanceof basic_1.UnknownType) {
|
|
59
67
|
ret = type;
|
|
@@ -65,26 +73,30 @@ class NewObject {
|
|
|
65
73
|
ret = type;
|
|
66
74
|
}
|
|
67
75
|
else {
|
|
68
|
-
|
|
76
|
+
const message = "Type \"" + typeName + "\" not found in scope, NewObject";
|
|
77
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
78
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
69
79
|
}
|
|
70
80
|
}
|
|
71
81
|
if (ret instanceof basic_1.ObjectReferenceType) {
|
|
72
|
-
this.parameters(node, ret,
|
|
82
|
+
this.parameters(node, ret, input);
|
|
73
83
|
}
|
|
74
84
|
else {
|
|
75
85
|
for (const s of node.findAllExpressions(Expressions.Source)) {
|
|
76
|
-
new source_1.Source().runSyntax(s,
|
|
86
|
+
new source_1.Source().runSyntax(s, input, ret);
|
|
77
87
|
}
|
|
78
88
|
}
|
|
79
|
-
if (ret instanceof basic_1.UnknownType && scope.getDDIC().inErrorNamespace(typeName) === true) {
|
|
80
|
-
|
|
89
|
+
if (ret instanceof basic_1.UnknownType && input.scope.getDDIC().inErrorNamespace(typeName) === true) {
|
|
90
|
+
const message = "Class or type \"" + typeName + "\" not found";
|
|
91
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
92
|
+
return new basic_1.VoidType(_syntax_input_1.CheckSyntaxKey);
|
|
81
93
|
}
|
|
82
94
|
return ret;
|
|
83
95
|
}
|
|
84
|
-
parameters(node, obj,
|
|
96
|
+
parameters(node, obj, input) {
|
|
85
97
|
const name = obj.getIdentifier().getName();
|
|
86
|
-
const def = scope.findObjectDefinition(name);
|
|
87
|
-
const helper = new _object_oriented_1.ObjectOriented(scope);
|
|
98
|
+
const def = input.scope.findObjectDefinition(name);
|
|
99
|
+
const helper = new _object_oriented_1.ObjectOriented(input.scope);
|
|
88
100
|
// eslint-disable-next-line prefer-const
|
|
89
101
|
let { method } = helper.searchMethodName(def, "CONSTRUCTOR");
|
|
90
102
|
const requiredParameters = (method === null || method === void 0 ? void 0 : method.getParameters().getRequiredParameters()) || [];
|
|
@@ -94,22 +106,30 @@ class NewObject {
|
|
|
94
106
|
// single unnamed parameter
|
|
95
107
|
const type = this.defaultImportingType(method);
|
|
96
108
|
if (type === undefined) {
|
|
97
|
-
|
|
109
|
+
const message = "NewObject, no default importing parameter found for constructor, " + name;
|
|
110
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
111
|
+
return;
|
|
98
112
|
}
|
|
99
|
-
const sourceType = new source_1.Source().runSyntax(source,
|
|
100
|
-
if (new _type_utils_1.TypeUtils(scope).isAssignableStrict(sourceType, type) === false) {
|
|
101
|
-
|
|
113
|
+
const sourceType = new source_1.Source().runSyntax(source, input, type);
|
|
114
|
+
if (new _type_utils_1.TypeUtils(input.scope).isAssignableStrict(sourceType, type) === false) {
|
|
115
|
+
const message = `NEW parameter type not compatible`;
|
|
116
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
117
|
+
return;
|
|
102
118
|
}
|
|
103
119
|
}
|
|
104
120
|
else if (parameters) {
|
|
105
121
|
// parameters with names
|
|
106
122
|
if (method === undefined) {
|
|
107
|
-
|
|
123
|
+
const message = "NewObject, no parameters for constructor found, " + name;
|
|
124
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
125
|
+
return;
|
|
108
126
|
}
|
|
109
|
-
new method_parameters_1.MethodParameters().checkExporting(parameters,
|
|
127
|
+
new method_parameters_1.MethodParameters().checkExporting(parameters, input, method);
|
|
110
128
|
}
|
|
111
129
|
else if (requiredParameters.length > 0) {
|
|
112
|
-
|
|
130
|
+
const message = `constructor parameter "${requiredParameters[0].getName()}" must be supplied, ` + name;
|
|
131
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
132
|
+
return;
|
|
113
133
|
}
|
|
114
134
|
}
|
|
115
135
|
defaultImportingType(method) {
|
|
@@ -4,9 +4,9 @@ exports.RaiseWith = void 0;
|
|
|
4
4
|
const Expressions = require("../../2_statements/expressions");
|
|
5
5
|
const source_1 = require("./source");
|
|
6
6
|
class RaiseWith {
|
|
7
|
-
runSyntax(node,
|
|
7
|
+
runSyntax(node, input) {
|
|
8
8
|
for (const f of node.findDirectExpressions(Expressions.SimpleSource1)) {
|
|
9
|
-
new source_1.Source().runSyntax(f,
|
|
9
|
+
new source_1.Source().runSyntax(f, input);
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
}
|