diff --git a/package.json b/package.json index e171ba37..ef68986e 100644 --- a/package.json +++ b/package.json @@ -394,6 +394,11 @@ "type": "boolean", "default": true, "description": "Show method ID hints for functions with method_id" + }, + "ton.func.hints.implicitConstantType": { + "type": "boolean", + "default": true, + "description": "Show type hints for constants without explicit type" } } }, diff --git a/server/src/languages/func/documentation/documentation.ts b/server/src/languages/func/documentation/documentation.ts index 1e04c173..7a386048 100644 --- a/server/src/languages/func/documentation/documentation.ts +++ b/server/src/languages/func/documentation/documentation.ts @@ -4,6 +4,8 @@ import {NamedNode} from "@server/languages/func/psi/FuncNode" import {Constant, Func, GlobalVariable, TypeParameter} from "@server/languages/func/psi/Decls" import {parentOfType} from "@server/psi/utils" import type {Node as SyntaxNode} from "web-tree-sitter" +import {typeOf} from "@server/languages/func/types/infer" +import {UnknownTy} from "@server/languages/func/types/ty" /** * Returns the documentation for the given symbol in Markdown format, or null @@ -36,8 +38,8 @@ export function generateFuncDocFor(node: NamedNode, _place: SyntaxNode): string } case "constant_declaration": { const constant = new Constant(astNode, node.file) - const type = node.node.childForFieldName("type") - const typeName = type?.text ?? "unknown" + const type = typeOf(astNode, node.file) ?? UnknownTy.UNKNOWN + const typeName = type.name() const value = constant.value() if (!value) return null diff --git a/server/src/languages/func/inlays/implicit-constant-type.ts b/server/src/languages/func/inlays/implicit-constant-type.ts new file mode 100644 index 00000000..463384ab --- /dev/null +++ b/server/src/languages/func/inlays/implicit-constant-type.ts @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2025 TON Core +import type {Node as SyntaxNode} from "web-tree-sitter" +import * as lsp from "vscode-languageserver-types" +import {FuncFile} from "@server/languages/func/psi/FuncFile" +import {typeOf} from "@server/languages/func/types/infer" + +export function implicitConstantType(n: SyntaxNode, file: FuncFile, result: lsp.InlayHint[]): void { + const type = n.childForFieldName("type") + if (type) { + // const int FOO = 100; + // ^^^ no need for hint + return + } + + const value = n.childForFieldName("value") + if (!value) return + + const ty = typeOf(value, file) + if (!ty) return + + const nameIdent = n.firstChild + if (!nameIdent) return + + result.push({ + kind: lsp.InlayHintKind.Type, + label: ty.name(), + paddingRight: true, + position: { + line: nameIdent.startPosition.row, + character: nameIdent.startPosition.column, + }, + }) +} diff --git a/server/src/languages/func/inlays/index.ts b/server/src/languages/func/inlays/index.ts index eda976d6..39ba53a9 100644 --- a/server/src/languages/func/inlays/index.ts +++ b/server/src/languages/func/inlays/index.ts @@ -4,12 +4,14 @@ import * as lsp from "vscode-languageserver-types" import {RecursiveVisitor} from "@server/visitor/visitor" import {getMethodId} from "@server/languages/func/inlays/get-method-id" import {FuncFile} from "@server/languages/func/psi/FuncFile" +import {implicitConstantType} from "@server/languages/func/inlays/implicit-constant-type" export function collectFuncInlays( file: FuncFile, hints: { disable: boolean showMethodId: boolean + showImplicitConstantType: boolean }, ): lsp.InlayHint[] | null { if (hints.disable) return [] @@ -23,6 +25,10 @@ export function collectFuncInlays( getMethodId(n, file, result) } + if (type === "constant_declaration" && hints.showImplicitConstantType) { + implicitConstantType(n, file, result) + } + return true }) diff --git a/server/src/languages/func/tree-sitter-func/grammar.js b/server/src/languages/func/tree-sitter-func/grammar.js index 1c1a57e3..36642838 100644 --- a/server/src/languages/func/tree-sitter-func/grammar.js +++ b/server/src/languages/func/tree-sitter-func/grammar.js @@ -359,9 +359,9 @@ const FUNC_GRAMMAR = { primitive_type: $ => choice("int", "cell", "slice", "builder", "cont", "tuple"), // constant_type: $ => choice("int", "slice"), - tensor_type: $ => choice(seq("(", ")"), seq("(", commaSep2($._type_hint), ")")), + tensor_type: $ => choice(seq("(", ")"), seq("(", field("types", commaSep2($._type_hint)), ")")), - tuple_type: $ => seq("[", commaSep($._type_hint), "]"), + tuple_type: $ => seq("[", field("types", commaSep($._type_hint)), "]"), var_type: _ => "var", hole_type: $ => alias($.underscore, $.hole_type), diff --git a/server/src/languages/func/tree-sitter-func/src/grammar.json b/server/src/languages/func/tree-sitter-func/src/grammar.json index eed93060..585bca13 100644 --- a/server/src/languages/func/tree-sitter-func/src/grammar.json +++ b/server/src/languages/func/tree-sitter-func/src/grammar.json @@ -2375,29 +2375,33 @@ "value": "(" }, { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "_type_hint" - }, - { - "type": "REPEAT1", - "content": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "," - }, - { - "type": "SYMBOL", - "name": "_type_hint" - } - ] + "type": "FIELD", + "name": "types", + "content": { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_type_hint" + }, + { + "type": "REPEAT1", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "SYMBOL", + "name": "_type_hint" + } + ] + } } - } - ] + ] + } }, { "type": "STRING", @@ -2415,37 +2419,41 @@ "value": "[" }, { - "type": "CHOICE", - "members": [ - { - "type": "SEQ", - "members": [ - { - "type": "SYMBOL", - "name": "_type_hint" - }, - { - "type": "REPEAT", - "content": { - "type": "SEQ", - "members": [ - { - "type": "STRING", - "value": "," - }, - { - "type": "SYMBOL", - "name": "_type_hint" - } - ] + "type": "FIELD", + "name": "types", + "content": { + "type": "CHOICE", + "members": [ + { + "type": "SEQ", + "members": [ + { + "type": "SYMBOL", + "name": "_type_hint" + }, + { + "type": "REPEAT", + "content": { + "type": "SEQ", + "members": [ + { + "type": "STRING", + "value": "," + }, + { + "type": "SYMBOL", + "name": "_type_hint" + } + ] + } } - } - ] - }, - { - "type": "BLANK" - } - ] + ] + }, + { + "type": "BLANK" + } + ] + } }, { "type": "STRING", diff --git a/server/src/languages/func/tree-sitter-func/src/node-types.json b/server/src/languages/func/tree-sitter-func/src/node-types.json index 3dc7ab35..2c7f92d5 100644 --- a/server/src/languages/func/tree-sitter-func/src/node-types.json +++ b/server/src/languages/func/tree-sitter-func/src/node-types.json @@ -2649,40 +2649,53 @@ { "type": "tensor_type", "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": false, - "types": [ - { - "type": "function_type", - "named": true - }, - { - "type": "hole_type", - "named": true - }, - { - "type": "primitive_type", - "named": true - }, - { - "type": "tensor_type", - "named": true - }, - { - "type": "tuple_type", - "named": true - }, - { - "type": "type_identifier", - "named": true - }, - { - "type": "var_type", - "named": true - } - ] + "fields": { + "types": { + "multiple": true, + "required": false, + "types": [ + { + "type": "(", + "named": false + }, + { + "type": ")", + "named": false + }, + { + "type": ",", + "named": false + }, + { + "type": "function_type", + "named": true + }, + { + "type": "hole_type", + "named": true + }, + { + "type": "primitive_type", + "named": true + }, + { + "type": "tensor_type", + "named": true + }, + { + "type": "tuple_type", + "named": true + }, + { + "type": "type_identifier", + "named": true + }, + { + "type": "var_type", + "named": true + } + ] + } } }, { @@ -2742,40 +2755,53 @@ { "type": "tuple_type", "named": true, - "fields": {}, - "children": { - "multiple": true, - "required": false, - "types": [ - { - "type": "function_type", - "named": true - }, - { - "type": "hole_type", - "named": true - }, - { - "type": "primitive_type", - "named": true - }, - { - "type": "tensor_type", - "named": true - }, - { - "type": "tuple_type", - "named": true - }, - { - "type": "type_identifier", - "named": true - }, - { - "type": "var_type", - "named": true - } - ] + "fields": { + "types": { + "multiple": true, + "required": false, + "types": [ + { + "type": "(", + "named": false + }, + { + "type": ")", + "named": false + }, + { + "type": ",", + "named": false + }, + { + "type": "function_type", + "named": true + }, + { + "type": "hole_type", + "named": true + }, + { + "type": "primitive_type", + "named": true + }, + { + "type": "tensor_type", + "named": true + }, + { + "type": "tuple_type", + "named": true + }, + { + "type": "type_identifier", + "named": true + }, + { + "type": "var_type", + "named": true + } + ] + } } }, { diff --git a/server/src/languages/func/tree-sitter-func/src/parser.c b/server/src/languages/func/tree-sitter-func/src/parser.c index bde35949..fab9f973 100644 --- a/server/src/languages/func/tree-sitter-func/src/parser.c +++ b/server/src/languages/func/tree-sitter-func/src/parser.c @@ -13,10 +13,10 @@ #define ALIAS_COUNT 0 #define TOKEN_COUNT 98 #define EXTERNAL_TOKEN_COUNT 0 -#define FIELD_COUNT 26 +#define FIELD_COUNT 27 #define MAX_ALIAS_SEQUENCE_LENGTH 8 #define MAX_RESERVED_WORD_SET_SIZE 0 -#define PRODUCTION_ID_COUNT 46 +#define PRODUCTION_ID_COUNT 48 #define SUPERTYPE_COUNT 0 enum ts_symbol_identifiers { @@ -1308,8 +1308,9 @@ enum ts_field_identifiers { field_specifiers = 22, field_type = 23, field_type_parameters = 24, - field_value = 25, - field_vars = 26, + field_types = 25, + field_value = 26, + field_vars = 27, }; static const char * const ts_field_names[] = { @@ -1338,6 +1339,7 @@ static const char * const ts_field_names[] = { [field_specifiers] = "specifiers", [field_type] = "type", [field_type_parameters] = "type_parameters", + [field_types] = "types", [field_value] = "value", [field_vars] = "vars", }; @@ -1349,43 +1351,45 @@ static const TSMapSlice ts_field_map_slices[PRODUCTION_ID_COUNT] = { [6] = {.index = 3, .length = 1}, [7] = {.index = 4, .length = 2}, [8] = {.index = 6, .length = 1}, - [9] = {.index = 7, .length = 2}, - [10] = {.index = 9, .length = 2}, - [11] = {.index = 11, .length = 1}, + [9] = {.index = 7, .length = 1}, + [10] = {.index = 8, .length = 2}, + [11] = {.index = 10, .length = 2}, [12] = {.index = 12, .length = 1}, - [13] = {.index = 13, .length = 4}, - [14] = {.index = 17, .length = 4}, - [15] = {.index = 21, .length = 3}, - [16] = {.index = 24, .length = 2}, - [17] = {.index = 26, .length = 2}, - [18] = {.index = 28, .length = 3}, - [19] = {.index = 31, .length = 5}, - [20] = {.index = 36, .length = 5}, - [21] = {.index = 41, .length = 4}, - [22] = {.index = 45, .length = 5}, - [23] = {.index = 50, .length = 5}, - [24] = {.index = 55, .length = 4}, - [25] = {.index = 59, .length = 1}, - [26] = {.index = 60, .length = 6}, - [27] = {.index = 66, .length = 6}, - [28] = {.index = 72, .length = 5}, - [29] = {.index = 77, .length = 2}, - [30] = {.index = 79, .length = 2}, - [31] = {.index = 81, .length = 1}, - [32] = {.index = 82, .length = 3}, - [33] = {.index = 85, .length = 2}, - [34] = {.index = 87, .length = 2}, - [35] = {.index = 89, .length = 2}, - [36] = {.index = 91, .length = 1}, + [13] = {.index = 13, .length = 2}, + [14] = {.index = 15, .length = 1}, + [15] = {.index = 16, .length = 4}, + [16] = {.index = 20, .length = 4}, + [17] = {.index = 24, .length = 3}, + [18] = {.index = 27, .length = 2}, + [19] = {.index = 29, .length = 2}, + [20] = {.index = 31, .length = 3}, + [21] = {.index = 34, .length = 5}, + [22] = {.index = 39, .length = 5}, + [23] = {.index = 44, .length = 4}, + [24] = {.index = 48, .length = 5}, + [25] = {.index = 53, .length = 5}, + [26] = {.index = 58, .length = 4}, + [27] = {.index = 62, .length = 1}, + [28] = {.index = 63, .length = 6}, + [29] = {.index = 69, .length = 6}, + [30] = {.index = 75, .length = 5}, + [31] = {.index = 80, .length = 2}, + [32] = {.index = 82, .length = 2}, + [33] = {.index = 84, .length = 1}, + [34] = {.index = 85, .length = 3}, + [35] = {.index = 88, .length = 2}, + [36] = {.index = 90, .length = 2}, [37] = {.index = 92, .length = 2}, - [38] = {.index = 94, .length = 2}, - [39] = {.index = 96, .length = 2}, - [40] = {.index = 98, .length = 1}, + [38] = {.index = 94, .length = 1}, + [39] = {.index = 95, .length = 2}, + [40] = {.index = 97, .length = 2}, [41] = {.index = 99, .length = 2}, [42] = {.index = 101, .length = 1}, - [43] = {.index = 102, .length = 4}, - [44] = {.index = 106, .length = 7}, - [45] = {.index = 113, .length = 2}, + [43] = {.index = 102, .length = 2}, + [44] = {.index = 104, .length = 1}, + [45] = {.index = 105, .length = 4}, + [46] = {.index = 109, .length = 7}, + [47] = {.index = 116, .length = 2}, }; static const TSFieldMapEntry ts_field_map_entries[] = { @@ -1403,140 +1407,145 @@ static const TSFieldMapEntry ts_field_map_entries[] = { [6] = {field_name, 1}, [7] = + {field_types, 1}, + [8] = {field_decls, 1}, {field_decls, 2}, - [9] = + [10] = {field_name, 0}, {field_value, 2}, - [11] = - {field_lhs, 0}, [12] = - {field_type, 0}, + {field_lhs, 0}, [13] = + {field_types, 1}, + {field_types, 2}, + [15] = + {field_type, 0}, + [16] = {field_asm_body, 3}, {field_name, 1}, {field_parameters, 2}, {field_return_type, 0}, - [17] = + [20] = {field_body, 3}, {field_name, 1}, {field_parameters, 2}, {field_return_type, 0}, - [21] = + [24] = {field_name, 1}, {field_parameters, 2}, {field_return_type, 0}, - [24] = + [27] = {field_key, 2}, {field_value, 4}, - [26] = + [29] = {field_arguments, 1}, {field_callee, 0}, - [28] = + [31] = {field_name, 1}, {field_type, 0}, {field_value, 3}, - [31] = + [34] = {field_asm_body, 4}, {field_name, 2}, {field_parameters, 3}, {field_return_type, 1}, {field_type_parameters, 0}, - [36] = + [39] = {field_body, 4}, {field_name, 2}, {field_parameters, 3}, {field_return_type, 1}, {field_type_parameters, 0}, - [41] = + [44] = {field_name, 2}, {field_parameters, 3}, {field_return_type, 1}, {field_type_parameters, 0}, - [45] = + [48] = {field_asm_body, 4}, {field_name, 1}, {field_parameters, 2}, {field_return_type, 0}, {field_specifiers, 3}, - [50] = + [53] = {field_body, 4}, {field_name, 1}, {field_parameters, 2}, {field_return_type, 0}, {field_specifiers, 3}, - [55] = + [58] = {field_name, 1}, {field_parameters, 2}, {field_return_type, 0}, {field_specifiers, 3}, - [59] = + [62] = {field_vars, 1}, - [60] = + [63] = {field_asm_body, 5}, {field_name, 2}, {field_parameters, 3}, {field_return_type, 1}, {field_specifiers, 4}, {field_type_parameters, 0}, - [66] = + [69] = {field_body, 5}, {field_name, 2}, {field_parameters, 3}, {field_return_type, 1}, {field_specifiers, 4}, {field_type_parameters, 0}, - [72] = + [75] = {field_name, 2}, {field_parameters, 3}, {field_return_type, 1}, {field_specifiers, 4}, {field_type_parameters, 0}, - [77] = + [80] = {field_name, 1}, {field_name, 2, .inherited = true}, - [79] = + [82] = {field_name, 0, .inherited = true}, {field_name, 1, .inherited = true}, - [81] = + [84] = {field_name, 2, .inherited = true}, - [82] = + [85] = {field_alternative, 1, .inherited = true}, {field_condition, 1, .inherited = true}, {field_consequent, 1, .inherited = true}, - [85] = + [88] = {field_expressions, 1}, {field_expressions, 2}, - [87] = + [90] = {field_vars, 1}, {field_vars, 2}, - [89] = + [92] = {field_arguments, 2}, {field_method_name, 1}, - [91] = + [94] = {field_value, 2}, - [92] = + [95] = {field_body, 2}, {field_count, 1}, - [94] = + [97] = {field_condition, 0}, {field_consequent, 1}, - [96] = + [99] = {field_body, 2}, {field_precondition, 1}, - [98] = + [101] = {field_body, 1}, - [99] = + [102] = {field_body, 1}, {field_postcondition, 3}, - [101] = + [104] = {field_catch_body, 1}, - [102] = + [105] = {field_alternative, 2}, {field_alternative, 3}, {field_condition, 0}, {field_consequent, 1}, - [106] = + [109] = {field_alternative, 2}, {field_alternative, 3}, {field_alternative, 3, .inherited = true}, @@ -1544,7 +1553,7 @@ static const TSFieldMapEntry ts_field_map_entries[] = { {field_condition, 3, .inherited = true}, {field_consequent, 1}, {field_consequent, 3, .inherited = true}, - [113] = + [116] = {field_catch_body, 2}, {field_catch_expr, 1}, }; @@ -18395,8 +18404,8 @@ static const TSParseActionEntry ts_parse_actions[] = { [25] = {.entry = {.count = 1, .reusable = false}}, SHIFT(254), [27] = {.entry = {.count = 1, .reusable = false}}, SHIFT(260), [29] = {.entry = {.count = 1, .reusable = false}}, SHIFT(256), - [31] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_application, 2, 0, 17), - [33] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_application, 2, 0, 17), + [31] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_application, 2, 0, 19), + [33] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_application, 2, 0, 19), [35] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym_function_application_repeat1, 2, 0, 0), SHIFT_REPEAT(3), [38] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym_function_application_repeat1, 2, 0, 0), [40] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_function_application_repeat1, 2, 0, 0), SHIFT_REPEAT(113), @@ -18469,42 +18478,42 @@ static const TSParseActionEntry ts_parse_actions[] = { [199] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__expr30, 1, 0, 0), [201] = {.entry = {.count = 1, .reusable = false}}, SHIFT(150), [203] = {.entry = {.count = 1, .reusable = true}}, SHIFT(150), - [205] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_local_vars_declaration, 1, 90, 11), - [207] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_local_vars_declaration, 1, 90, 11), + [205] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_local_vars_declaration, 1, 90, 12), + [207] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_local_vars_declaration, 1, 90, 12), [209] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__expr30, 2, 0, 0), [211] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__expr30, 2, 0, 0), [213] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_var_declaration, 2, 0, 7), [215] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_var_declaration, 2, 0, 7), [217] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parenthesized_expression, 3, 0, 0), [219] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parenthesized_expression, 3, 0, 0), - [221] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_vars_declaration, 3, 0, 25), - [223] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_vars_declaration, 3, 0, 25), + [221] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_vars_declaration, 3, 0, 27), + [223] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_vars_declaration, 3, 0, 27), [225] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_typed_tuple, 3, 0, 0), [227] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_typed_tuple, 3, 0, 0), - [229] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_vars_declaration, 3, 0, 25), - [231] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_vars_declaration, 3, 0, 25), + [229] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_vars_declaration, 3, 0, 27), + [231] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_vars_declaration, 3, 0, 27), [233] = {.entry = {.count = 1, .reusable = false}}, REDUCE(aux_sym__expr30_repeat1, 2, 0, 0), [235] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym__expr30_repeat1, 2, 0, 0), [237] = {.entry = {.count = 2, .reusable = false}}, REDUCE(aux_sym__expr30_repeat1, 2, 0, 0), SHIFT_REPEAT(150), [240] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym__expr30_repeat1, 2, 0, 0), SHIFT_REPEAT(150), - [243] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_expression, 4, 0, 33), - [245] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_expression, 4, 0, 33), - [247] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_vars_declaration, 4, 0, 25), - [249] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_vars_declaration, 4, 0, 25), - [251] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_vars_declaration, 4, 0, 34), - [253] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_vars_declaration, 4, 0, 34), + [243] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_expression, 4, 0, 35), + [245] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_expression, 4, 0, 35), + [247] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_vars_declaration, 4, 0, 27), + [249] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_vars_declaration, 4, 0, 27), + [251] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_vars_declaration, 4, 0, 36), + [253] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_vars_declaration, 4, 0, 36), [255] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_typed_tuple, 4, 0, 0), [257] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_typed_tuple, 4, 0, 0), - [259] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_vars_declaration, 4, 0, 25), - [261] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_vars_declaration, 4, 0, 25), - [263] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_vars_declaration, 4, 0, 34), - [265] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_vars_declaration, 4, 0, 34), - [267] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_method_call, 3, 0, 35), - [269] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_method_call, 3, 0, 35), - [271] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_vars_declaration, 5, 0, 34), - [273] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_vars_declaration, 5, 0, 34), - [275] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_vars_declaration, 5, 0, 34), - [277] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_vars_declaration, 5, 0, 34), + [259] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_vars_declaration, 4, 0, 27), + [261] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_vars_declaration, 4, 0, 27), + [263] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_vars_declaration, 4, 0, 36), + [265] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_vars_declaration, 4, 0, 36), + [267] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_method_call, 3, 0, 37), + [269] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_method_call, 3, 0, 37), + [271] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_vars_declaration, 5, 0, 36), + [273] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_vars_declaration, 5, 0, 36), + [275] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_vars_declaration, 5, 0, 36), + [277] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_vars_declaration, 5, 0, 36), [279] = {.entry = {.count = 1, .reusable = true}}, SHIFT(166), [281] = {.entry = {.count = 1, .reusable = true}}, SHIFT(210), [283] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__expr75, 2, 0, 0), @@ -18632,37 +18641,37 @@ static const TSParseActionEntry ts_parse_actions[] = { [551] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_block_statement, 3, 0, 0), [553] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_block_statement, 2, 0, 0), [555] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_block_statement, 2, 0, 0), - [557] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__if_statement_contents, 2, 0, 38), - [559] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_statement_contents, 2, 0, 38), + [557] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__if_statement_contents, 2, 0, 40), + [559] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_statement_contents, 2, 0, 40), [561] = {.entry = {.count = 1, .reusable = false}}, SHIFT(356), [563] = {.entry = {.count = 1, .reusable = false}}, SHIFT(100), - [565] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_repeat_statement, 3, 0, 37), - [567] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_repeat_statement, 3, 0, 37), - [569] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__if_statement_contents, 4, 0, 43), - [571] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_statement_contents, 4, 0, 43), - [573] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_if_statement, 2, 0, 32), - [575] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_if_statement, 2, 0, 32), + [565] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_repeat_statement, 3, 0, 39), + [567] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_repeat_statement, 3, 0, 39), + [569] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__if_statement_contents, 4, 0, 45), + [571] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_statement_contents, 4, 0, 45), + [573] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_if_statement, 2, 0, 34), + [575] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_if_statement, 2, 0, 34), [577] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression_statement, 2, 0, 0), [579] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression_statement, 2, 0, 0), - [581] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_catch_clause, 3, 0, 45), - [583] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_catch_clause, 3, 0, 45), + [581] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_catch_clause, 3, 0, 47), + [583] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_catch_clause, 3, 0, 47), [585] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_empty_statement, 1, 0, 0), [587] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_empty_statement, 1, 0, 0), - [589] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_while_statement, 3, 0, 39), - [591] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_while_statement, 3, 0, 39), + [589] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_while_statement, 3, 0, 41), + [591] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_while_statement, 3, 0, 41), [593] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_return_statement, 3, 0, 0), [595] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_return_statement, 3, 0, 0), - [597] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_try_catch_statement, 3, 0, 40), - [599] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_try_catch_statement, 3, 0, 40), - [601] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_do_while_statement, 4, 0, 41), - [603] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_do_while_statement, 4, 0, 41), - [605] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_catch_clause, 2, 0, 42), - [607] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_catch_clause, 2, 0, 42), + [597] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_try_catch_statement, 3, 0, 42), + [599] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_try_catch_statement, 3, 0, 42), + [601] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_do_while_statement, 4, 0, 43), + [603] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_do_while_statement, 4, 0, 43), + [605] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_catch_clause, 2, 0, 44), + [607] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_catch_clause, 2, 0, 44), [609] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_expression_statement, 1, 0, 0), [611] = {.entry = {.count = 1, .reusable = false}}, SHIFT(171), [613] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_expression_statement, 1, 0, 0), - [615] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__if_statement_contents, 4, 0, 44), - [617] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_statement_contents, 4, 0, 44), + [615] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__if_statement_contents, 4, 0, 46), + [617] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__if_statement_contents, 4, 0, 46), [619] = {.entry = {.count = 1, .reusable = true}}, SHIFT(183), [621] = {.entry = {.count = 1, .reusable = true}}, SHIFT(63), [623] = {.entry = {.count = 1, .reusable = true}}, SHIFT(192), @@ -18688,30 +18697,30 @@ static const TSParseActionEntry ts_parse_actions[] = { [663] = {.entry = {.count = 1, .reusable = false}}, SHIFT(290), [665] = {.entry = {.count = 1, .reusable = false}}, SHIFT(272), [667] = {.entry = {.count = 1, .reusable = false}}, SHIFT(275), - [669] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 6, 0, 26), - [671] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 6, 0, 26), - [673] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 6, 0, 28), - [675] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 6, 0, 28), + [669] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 6, 0, 28), + [671] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 6, 0, 28), + [673] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 6, 0, 30), + [675] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 6, 0, 30), [677] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_asm_function_body, 3, 0, 0), [679] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_asm_function_body, 3, 0, 0), - [681] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constant_declarations, 4, 0, 9), - [683] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_constant_declarations, 4, 0, 9), + [681] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constant_declarations, 4, 0, 10), + [683] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_constant_declarations, 4, 0, 10), [685] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_asm_function_body, 5, 0, 0), [687] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_asm_function_body, 5, 0, 0), [689] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_asm_function_body, 6, 0, 0), [691] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_asm_function_body, 6, 0, 0), - [693] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 4, 0, 13), - [695] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 4, 0, 13), - [697] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 4, 0, 14), - [699] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 4, 0, 14), + [693] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 4, 0, 15), + [695] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 4, 0, 15), + [697] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 4, 0, 16), + [699] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 4, 0, 16), [701] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_asm_function_body, 7, 0, 0), [703] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_asm_function_body, 7, 0, 0), [705] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_asm_function_body, 8, 0, 0), [707] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_asm_function_body, 8, 0, 0), - [709] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 4, 0, 15), - [711] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 4, 0, 15), - [713] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_pragma_directive, 5, 0, 16), - [715] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_pragma_directive, 5, 0, 16), + [709] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 4, 0, 17), + [711] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 4, 0, 17), + [713] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_pragma_directive, 5, 0, 18), + [715] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_pragma_directive, 5, 0, 18), [717] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_import_directive, 3, 0, 4), [719] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_import_directive, 3, 0, 4), [721] = {.entry = {.count = 1, .reusable = false}}, SHIFT(235), @@ -18719,24 +18728,24 @@ static const TSParseActionEntry ts_parse_actions[] = { [725] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_pragma_directive, 3, 0, 5), [727] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constant_declarations, 3, 0, 6), [729] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_constant_declarations, 3, 0, 6), - [731] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 19), - [733] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 19), - [735] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 20), - [737] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 20), - [739] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 21), - [741] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 21), - [743] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 22), - [745] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 22), - [747] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 23), - [749] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 23), - [751] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 24), - [753] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 24), + [731] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 21), + [733] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 21), + [735] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 22), + [737] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 22), + [739] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 23), + [741] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 23), + [743] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 24), + [745] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 24), + [747] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 25), + [749] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 25), + [751] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 5, 0, 26), + [753] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 5, 0, 26), [755] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_import_directive, 4, 0, 4), [757] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_import_directive, 4, 0, 4), - [759] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_global_var_declarations, 4, 0, 9), - [761] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_global_var_declarations, 4, 0, 9), - [763] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 6, 0, 27), - [765] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 6, 0, 27), + [759] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_global_var_declarations, 4, 0, 10), + [761] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_global_var_declarations, 4, 0, 10), + [763] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_declaration, 6, 0, 29), + [765] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_declaration, 6, 0, 29), [767] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_global_var_declarations, 3, 0, 6), [769] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_global_var_declarations, 3, 0, 6), [771] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_type_parameters, 4, 0, 0), @@ -18770,18 +18779,18 @@ static const TSParseActionEntry ts_parse_actions[] = { [832] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter_list, 3, 0, 0), [834] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_list, 4, 0, 0), [836] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter_list, 4, 0, 0), - [838] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_type, 4, 0, 0), - [840] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_type, 4, 0, 0), - [842] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_type, 4, 0, 0), - [844] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_type, 4, 0, 0), + [838] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_type, 4, 0, 13), + [840] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_type, 4, 0, 13), + [842] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tensor_type, 4, 0, 13), + [844] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tensor_type, 4, 0, 13), [846] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_primitive_type, 1, 0, 0), [848] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_primitive_type, 1, 0, 0), [850] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_type_identifier, 1, 0, 1), SHIFT(203), [853] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_type_identifier, 1, 0, 1), SHIFT(268), [856] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__parenthesized_type, 3, 0, 0), [858] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__parenthesized_type, 3, 0, 0), - [860] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_type, 3, 0, 0), - [862] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_type, 3, 0, 0), + [860] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_tuple_type, 3, 0, 9), + [862] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_tuple_type, 3, 0, 9), [864] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym__type_hint, 1, 0, 0), [866] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym__type_hint, 1, 0, 0), [868] = {.entry = {.count = 1, .reusable = true}}, SHIFT(209), @@ -18801,15 +18810,15 @@ static const TSParseActionEntry ts_parse_actions[] = { [899] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_list_relaxed, 3, 0, 8), [901] = {.entry = {.count = 1, .reusable = true}}, SHIFT(241), [903] = {.entry = {.count = 1, .reusable = false}}, SHIFT(372), - [905] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter_list_relaxed, 4, 0, 31), - [907] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_list_relaxed, 4, 0, 31), + [905] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter_list_relaxed, 4, 0, 33), + [907] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_list_relaxed, 4, 0, 33), [909] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_type_identifier, 1, 0, 1), REDUCE(aux_sym_parameter_list_relaxed_repeat1, 2, 0, 8), [912] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_function_type, 3, 0, 0), [914] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_function_type, 3, 0, 0), [916] = {.entry = {.count = 1, .reusable = true}}, SHIFT(371), [918] = {.entry = {.count = 2, .reusable = true}}, REDUCE(sym_hole_type, 1, 0, 2), REDUCE(aux_sym_parameter_list_relaxed_repeat1, 2, 0, 8), - [921] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter_list_relaxed, 4, 0, 29), - [923] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_list_relaxed, 4, 0, 29), + [921] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_parameter_list_relaxed, 4, 0, 31), + [923] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_list_relaxed, 4, 0, 31), [925] = {.entry = {.count = 1, .reusable = false}}, SHIFT(391), [927] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_tensor_expression_repeat1, 2, 0, 0), SHIFT_REPEAT(128), [930] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_tensor_expression_repeat1, 2, 0, 0), @@ -18823,7 +18832,7 @@ static const TSParseActionEntry ts_parse_actions[] = { [946] = {.entry = {.count = 1, .reusable = true}}, SHIFT(205), [948] = {.entry = {.count = 1, .reusable = true}}, SHIFT(249), [950] = {.entry = {.count = 1, .reusable = false}}, SHIFT(378), - [952] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_declaration, 1, 0, 12), + [952] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_declaration, 1, 0, 14), [954] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_inline, 1, 0, 0), [956] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_inline, 1, 0, 0), [958] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_tuple_vars_declaration_repeat1, 2, 0, 0), SHIFT_REPEAT(195), @@ -18869,8 +18878,8 @@ static const TSParseActionEntry ts_parse_actions[] = { [1044] = {.entry = {.count = 1, .reusable = false}}, SHIFT(221), [1046] = {.entry = {.count = 1, .reusable = true}}, SHIFT(128), [1048] = {.entry = {.count = 1, .reusable = true}}, SHIFT(62), - [1050] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_method_id, 4, 0, 36), - [1052] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_method_id, 4, 0, 36), + [1050] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_method_id, 4, 0, 38), + [1052] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_method_id, 4, 0, 38), [1054] = {.entry = {.count = 1, .reusable = true}}, SHIFT(193), [1056] = {.entry = {.count = 1, .reusable = true}}, SHIFT(64), [1058] = {.entry = {.count = 1, .reusable = false}}, SHIFT(222), @@ -18900,8 +18909,8 @@ static const TSParseActionEntry ts_parse_actions[] = { [1107] = {.entry = {.count = 1, .reusable = true}}, SHIFT(186), [1109] = {.entry = {.count = 1, .reusable = true}}, SHIFT(86), [1111] = {.entry = {.count = 1, .reusable = true}}, SHIFT(87), - [1113] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_parameter_list_relaxed_repeat1, 2, 0, 30), SHIFT_REPEAT(203), - [1116] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_parameter_list_relaxed_repeat1, 2, 0, 30), + [1113] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_parameter_list_relaxed_repeat1, 2, 0, 32), SHIFT_REPEAT(203), + [1116] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_parameter_list_relaxed_repeat1, 2, 0, 32), [1118] = {.entry = {.count = 1, .reusable = true}}, SHIFT(190), [1120] = {.entry = {.count = 1, .reusable = true}}, SHIFT(89), [1122] = {.entry = {.count = 1, .reusable = true}}, SHIFT(243), @@ -18915,8 +18924,8 @@ static const TSParseActionEntry ts_parse_actions[] = { [1139] = {.entry = {.count = 1, .reusable = true}}, SHIFT(326), [1141] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_type_parameter, 2, 0, 8), [1143] = {.entry = {.count = 1, .reusable = true}}, SHIFT(354), - [1145] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_constant_declaration, 3, 0, 10), - [1147] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constant_declaration, 3, 0, 10), + [1145] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_constant_declaration, 3, 0, 11), + [1147] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constant_declaration, 3, 0, 11), [1149] = {.entry = {.count = 1, .reusable = true}}, SHIFT(321), [1151] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_constant_declarations_repeat1, 2, 0, 0), [1153] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_global_var_declaration, 2, 0, 7), @@ -18924,8 +18933,8 @@ static const TSParseActionEntry ts_parse_actions[] = { [1157] = {.entry = {.count = 1, .reusable = true}}, SHIFT(325), [1159] = {.entry = {.count = 1, .reusable = true}}, SHIFT(255), [1161] = {.entry = {.count = 1, .reusable = true}}, REDUCE(aux_sym_parameter_list_relaxed_repeat1, 2, 0, 0), - [1163] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_constant_declaration, 4, 0, 18), - [1165] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constant_declaration, 4, 0, 18), + [1163] = {.entry = {.count = 1, .reusable = false}}, REDUCE(sym_constant_declaration, 4, 0, 20), + [1165] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_constant_declaration, 4, 0, 20), [1167] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_type_parameter, 1, 0, 3), [1169] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_parameter_declaration, 2, 0, 7), [1171] = {.entry = {.count = 2, .reusable = true}}, REDUCE(aux_sym_parameter_list_repeat1, 2, 0, 0), REDUCE(aux_sym_parameter_list_relaxed_repeat1, 2, 0, 0), diff --git a/server/src/languages/func/tree-sitter-func/tree-sitter-func.wasm b/server/src/languages/func/tree-sitter-func/tree-sitter-func.wasm index d56d6259..7457aad7 100755 Binary files a/server/src/languages/func/tree-sitter-func/tree-sitter-func.wasm and b/server/src/languages/func/tree-sitter-func/tree-sitter-func.wasm differ diff --git a/server/src/languages/func/types/infer.ts b/server/src/languages/func/types/infer.ts new file mode 100644 index 00000000..35f78c9e --- /dev/null +++ b/server/src/languages/func/types/infer.ts @@ -0,0 +1,112 @@ +import type {Node as SyntaxNode} from "web-tree-sitter" +import { + FuncTy, + HoleTy, + PrimitiveTy, + TensorTy, + TupleTy, + Ty, + UnknownTy, + VarTy, +} from "@server/languages/func/types/ty" +import {Func} from "@server/languages/func/psi/Decls" +import {FuncFile} from "@server/languages/func/psi/FuncFile" +import {Reference} from "@server/languages/func/psi/Reference" +import {NamedNode} from "@server/languages/func/psi/FuncNode" + +export function convertTy(node: SyntaxNode | null | undefined): Ty | undefined { + if (!node) return undefined + + if (node.type === "primitive_type") { + return new PrimitiveTy(node.text) + } + + if (node.type === "var_type") { + return VarTy.VAR + } + + if (node.type === "hole_type") { + return HoleTy.HOLE + } + + if (node.type === "tensor_type") { + const types = node + .childrenForFieldName("types") + .filter(it => it?.isNamed) + .filter(it => it !== null) + + return new TensorTy(types.map(it => convertTy(it) ?? UnknownTy.UNKNOWN)) + } + + if (node.type === "tuple_type") { + const types = node + .childrenForFieldName("types") + .filter(it => it?.isNamed) + .filter(it => it !== null) + + return new TupleTy(types.map(it => convertTy(it) ?? UnknownTy.UNKNOWN)) + } + + if (node.firstChild?.type === "(") { + const type = node.child(1) + if (!type) return undefined + + return convertTy(type) + } + + return undefined +} + +export function typeOf(node: SyntaxNode, file: FuncFile): Ty | undefined { + if ( + node.type === "parameter_declaration" || + node.type === "global_var_declaration" || + node.type === "var_declaration" + ) { + const type = node.childForFieldName("type") + if (!type) return undefined + return convertTy(type) + } + + if (node.type === "constant_declaration") { + const type = node.childForFieldName("type") + if (!type) { + const value = node.childForFieldName("value") + if (!value) return undefined + return typeOf(value, file) + } + return convertTy(type) + } + + if (node.type === "number_literal" || node.type === "number_string_literal") { + return PrimitiveTy.INT + } + + if (node.type === "string_literal" || node.type === "slice_string_literal") { + return PrimitiveTy.SLICE + } + + if (node.type === "function_declaration") { + const func = new Func(node, file) + const parameterTypes = func + .parameters() + .map(it => typeOf(it.node, it.file) ?? UnknownTy.UNKNOWN) + const returnTy = convertTy(func.returnType()?.node) ?? UnknownTy.UNKNOWN + + return new FuncTy(parameterTypes, returnTy) + } + + if (node.type === "identifier" || node.type === "type_identifier") { + const parent = node.parent + if (parent?.type === "tensor_expression" && parent.parent?.type === "catch_clause") { + return UnknownTy.UNKNOWN + } + + const resolved = Reference.resolve(new NamedNode(node, file)) + if (!resolved) return undefined + + return typeOf(resolved.node, file) + } + + return undefined +} diff --git a/server/src/languages/func/types/ty.ts b/server/src/languages/func/types/ty.ts new file mode 100644 index 00000000..9aed61c4 --- /dev/null +++ b/server/src/languages/func/types/ty.ts @@ -0,0 +1,127 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2025 TON Core +export interface Ty { + name(): string + + equals(other: Ty): boolean +} + +export abstract class NonNamedTy implements Ty { + public abstract name(): string + + public equals(other: Ty): boolean { + return this === other + } +} + +export class TensorTy extends NonNamedTy { + public constructor(public elements: Ty[]) { + super() + } + + public name(): string { + return `(${this.elements.map(it => it.name()).join(", ")})` + } + + public override equals(other: Ty): boolean { + if (this === other) return true + if (!(other instanceof TensorTy)) return false + if (this.elements.length !== other.elements.length) return false + return this.elements.every((element, i) => element.equals(other.elements[i])) + } +} + +export class TupleTy extends NonNamedTy { + public constructor(public elements: Ty[]) { + super() + } + + public name(): string { + return `[${this.elements.map(it => it.name()).join(", ")}]` + } + + public override equals(other: Ty): boolean { + if (this === other) return true + if (!(other instanceof TupleTy)) return false + if (this.elements.length !== other.elements.length) return false + return this.elements.every((element, i) => element.equals(other.elements[i])) + } +} + +export class FuncTy extends NonNamedTy { + public constructor( + public params: Ty[], + public returnTy: Ty, + ) { + super() + } + + public name(): string { + const params = this.params.map(it => it.name()).join(", ") + return `(${params}) -> ${this.returnTy.name()}` + } + + public override equals(other: Ty): boolean { + if (this === other) return true + if (!(other instanceof FuncTy)) return false + if (this.params.length !== other.params.length) return false + + return ( + this.params.every((param, i) => param.equals(other.params[i])) && + this.returnTy.equals(other.returnTy) + ) + } +} + +export class PrimitiveTy extends NonNamedTy { + public constructor(private readonly name_: string) { + super() + } + + public name(): string { + return this.name_ + } + + public static INT: PrimitiveTy = new PrimitiveTy("int") + public static CELL: PrimitiveTy = new PrimitiveTy("cell") + public static SLICE: PrimitiveTy = new PrimitiveTy("slice") + public static BUILDER: PrimitiveTy = new PrimitiveTy("builder") + public static CONT: PrimitiveTy = new PrimitiveTy("cont") + public static TUPLE: PrimitiveTy = new PrimitiveTy("tuple") +} + +export class VarTy extends NonNamedTy { + public name(): string { + return "var" + } + + public override equals(other: Ty): boolean { + return other instanceof VarTy + } + + public static VAR: VarTy = new VarTy() +} + +export class HoleTy extends NonNamedTy { + public name(): string { + return "_" + } + + public override equals(other: Ty): boolean { + return other instanceof HoleTy + } + + public static HOLE: HoleTy = new HoleTy() +} + +export class UnknownTy extends NonNamedTy { + public name(): string { + return "unknown" + } + + public override equals(other: Ty): boolean { + return other instanceof UnknownTy + } + + public static UNKNOWN: UnknownTy = new UnknownTy() +} diff --git a/server/src/settings/settings.ts b/server/src/settings/settings.ts index 63ec2825..d5837c5e 100644 --- a/server/src/settings/settings.ts +++ b/server/src/settings/settings.ts @@ -54,6 +54,7 @@ export interface FuncSettings { readonly hints: { readonly disable: boolean readonly showMethodId: boolean + readonly showImplicitConstantType: boolean } readonly inspections: { readonly disabled: readonly string[] // list of disabled inspection ids @@ -108,7 +109,8 @@ const defaultSettings: ServerSettings = { func: { hints: { disable: false, - showMethodId: false, + showMethodId: true, + showImplicitConstantType: true, }, inspections: { disabled: [], // no disabled inspections by default @@ -181,6 +183,9 @@ function mergeSettings(vsSettings: Partial): ServerSettings { disable: vsSettings.func?.hints.disable ?? defaultSettings.func.hints.disable, showMethodId: vsSettings.func?.hints.showMethodId ?? defaultSettings.func.hints.showMethodId, + showImplicitConstantType: + vsSettings.func?.hints.showImplicitConstantType ?? + defaultSettings.func.hints.showImplicitConstantType, }, inspections: { disabled: