mt-lang 0.3.9 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/docs/language-design.md +1 -2
  4. data/docs/language-manual.md +12 -1
  5. data/lib/milk_tea/base.rb +1 -2
  6. data/lib/milk_tea/bindings/bindgen/ast_parser.rb +0 -2
  7. data/lib/milk_tea/bindings/bindgen/declaration.rb +0 -2
  8. data/lib/milk_tea/bindings/bindgen/emitter.rb +0 -2
  9. data/lib/milk_tea/bindings/bindgen/overrides.rb +0 -2
  10. data/lib/milk_tea/bindings/bindgen/type_mapper.rb +51 -53
  11. data/lib/milk_tea/bindings/imported_bindings/generator.rb +7 -9
  12. data/lib/milk_tea/bindings/imported_bindings/method_source.rb +0 -2
  13. data/lib/milk_tea/bindings/imported_bindings/naming.rb +6 -8
  14. data/lib/milk_tea/bindings/imported_bindings.rb +0 -2
  15. data/lib/milk_tea/bindings/opengl_registry.rb +3 -7
  16. data/lib/milk_tea/bindings/steamworks.rb +12 -16
  17. data/lib/milk_tea/bindings/upstream_sources.rb +10 -14
  18. data/lib/milk_tea/bindings/vendored_box2d.rb +10 -12
  19. data/lib/milk_tea/bindings/vendored_cjson.rb +6 -8
  20. data/lib/milk_tea/bindings/vendored_flecs.rb +10 -12
  21. data/lib/milk_tea/bindings/vendored_glfw.rb +11 -13
  22. data/lib/milk_tea/bindings/vendored_libuv.rb +11 -13
  23. data/lib/milk_tea/bindings/vendored_pcre2.rb +11 -13
  24. data/lib/milk_tea/bindings/vendored_raylib.rb +6 -10
  25. data/lib/milk_tea/bindings/vendored_sdl3.rb +11 -13
  26. data/lib/milk_tea/bindings/vendored_steamworks.rb +1 -5
  27. data/lib/milk_tea/core/ast.rb +109 -51
  28. data/lib/milk_tea/core/async_runtime_installer.rb +0 -2
  29. data/lib/milk_tea/core/bindings/attribute_binding.rb +1 -3
  30. data/lib/milk_tea/core/c_backend/aggregate_utils.rb +147 -84
  31. data/lib/milk_tea/core/c_backend/control_flow_emission.rb +394 -396
  32. data/lib/milk_tea/core/c_backend/expressions.rb +489 -476
  33. data/lib/milk_tea/core/c_backend/feature_detection.rb +446 -437
  34. data/lib/milk_tea/core/c_backend/format_helpers.rb +0 -2
  35. data/lib/milk_tea/core/c_backend/reachability.rb +339 -341
  36. data/lib/milk_tea/core/c_backend/reinterpret.rb +231 -217
  37. data/lib/milk_tea/core/c_backend/runtime_helpers.rb +531 -526
  38. data/lib/milk_tea/core/c_backend/statements.rb +528 -530
  39. data/lib/milk_tea/core/c_backend/type_collectors.rb +1344 -1346
  40. data/lib/milk_tea/core/c_backend/type_declaration.rb +215 -213
  41. data/lib/milk_tea/core/c_backend/type_system.rb +347 -349
  42. data/lib/milk_tea/core/c_backend.rb +17 -9
  43. data/lib/milk_tea/core/compatibility_helpers.rb +0 -2
  44. data/lib/milk_tea/core/compile_time/const_eval.rb +7 -12
  45. data/lib/milk_tea/core/compile_time.rb +32 -38
  46. data/lib/milk_tea/core/control_flow/builder.rb +3 -5
  47. data/lib/milk_tea/core/control_flow/constant_propagation.rb +14 -17
  48. data/lib/milk_tea/core/control_flow/definite_assignment.rb +0 -1
  49. data/lib/milk_tea/core/ir.rb +10 -10
  50. data/lib/milk_tea/core/lexer/character_classes.rb +5 -7
  51. data/lib/milk_tea/core/lexer/format_strings.rb +7 -9
  52. data/lib/milk_tea/core/lexer/heredocs.rb +22 -22
  53. data/lib/milk_tea/core/lexer/indentation.rb +0 -2
  54. data/lib/milk_tea/core/lexer/numbers.rb +0 -2
  55. data/lib/milk_tea/core/lexer/recovery.rb +0 -2
  56. data/lib/milk_tea/core/lexer/strings.rb +0 -2
  57. data/lib/milk_tea/core/lexer/symbols.rb +0 -2
  58. data/lib/milk_tea/core/lexer/trivia.rb +0 -2
  59. data/lib/milk_tea/core/lexer.rb +0 -2
  60. data/lib/milk_tea/core/lowering/async/analysis.rb +0 -2
  61. data/lib/milk_tea/core/lowering/async/lowering.rb +1264 -1265
  62. data/lib/milk_tea/core/lowering/async/normalization.rb +5 -3
  63. data/lib/milk_tea/core/lowering/async.rb +627 -630
  64. data/lib/milk_tea/core/lowering/block.rb +413 -416
  65. data/lib/milk_tea/core/lowering/calls.rb +1381 -1384
  66. data/lib/milk_tea/core/lowering/declarations.rb +180 -183
  67. data/lib/milk_tea/core/lowering/dyn.rb +48 -50
  68. data/lib/milk_tea/core/lowering/events.rb +983 -985
  69. data/lib/milk_tea/core/lowering/expressions.rb +1513 -1518
  70. data/lib/milk_tea/core/lowering/foreign_cstr.rb +181 -184
  71. data/lib/milk_tea/core/lowering/functions.rb +185 -188
  72. data/lib/milk_tea/core/lowering/loops.rb +1028 -1031
  73. data/lib/milk_tea/core/lowering/proc.rb +363 -366
  74. data/lib/milk_tea/core/lowering/resolve.rb +2133 -2135
  75. data/lib/milk_tea/core/lowering/scans.rb +179 -181
  76. data/lib/milk_tea/core/lowering/str_buffer.rb +102 -105
  77. data/lib/milk_tea/core/lowering/utils.rb +1040 -1044
  78. data/lib/milk_tea/core/lowering.rb +5 -7
  79. data/lib/milk_tea/core/module_binder.rb +0 -2
  80. data/lib/milk_tea/core/module_loader/errors.rb +4 -2
  81. data/lib/milk_tea/core/module_loader.rb +113 -20
  82. data/lib/milk_tea/core/module_path_resolver.rb +0 -2
  83. data/lib/milk_tea/core/module_roots.rb +6 -8
  84. data/lib/milk_tea/core/parser/attributes.rb +0 -2
  85. data/lib/milk_tea/core/parser/blocks.rb +0 -2
  86. data/lib/milk_tea/core/parser/declarations.rb +7 -9
  87. data/lib/milk_tea/core/parser/expressions.rb +15 -10
  88. data/lib/milk_tea/core/parser/recovery.rb +0 -2
  89. data/lib/milk_tea/core/parser/statements.rb +8 -2
  90. data/lib/milk_tea/core/parser/types.rb +12 -14
  91. data/lib/milk_tea/core/parser.rb +0 -2
  92. data/lib/milk_tea/core/pretty_printer/ast_formatter.rb +31 -33
  93. data/lib/milk_tea/core/pretty_printer/base_formatter.rb +0 -2
  94. data/lib/milk_tea/core/pretty_printer/ir_formatter.rb +0 -2
  95. data/lib/milk_tea/core/semantic_analyzer/analysis_context.rb +0 -2
  96. data/lib/milk_tea/core/semantic_analyzer/attributes.rb +14 -16
  97. data/lib/milk_tea/core/semantic_analyzer/calls.rb +0 -2
  98. data/lib/milk_tea/core/semantic_analyzer/expressions.rb +1 -14
  99. data/lib/milk_tea/core/semantic_analyzer/flow_refinement.rb +18 -21
  100. data/lib/milk_tea/core/semantic_analyzer/foreign_functions.rb +0 -3
  101. data/lib/milk_tea/core/semantic_analyzer/function_binding.rb +14 -17
  102. data/lib/milk_tea/core/semantic_analyzer/generics.rb +57 -59
  103. data/lib/milk_tea/core/semantic_analyzer/interface_conformance.rb +0 -2
  104. data/lib/milk_tea/core/semantic_analyzer/name_resolution.rb +5 -9
  105. data/lib/milk_tea/core/semantic_analyzer/nullability.rb +0 -3
  106. data/lib/milk_tea/core/semantic_analyzer/statements.rb +35 -40
  107. data/lib/milk_tea/core/semantic_analyzer/top_level.rb +10 -12
  108. data/lib/milk_tea/core/semantic_analyzer/type_compatibility.rb +0 -6
  109. data/lib/milk_tea/core/semantic_analyzer/type_declaration.rb +106 -109
  110. data/lib/milk_tea/core/semantic_analyzer.rb +17 -8
  111. data/lib/milk_tea/core/types/layout.rb +21 -22
  112. data/lib/milk_tea/core/types/predicates.rb +0 -2
  113. data/lib/milk_tea/core/types/registry.rb +16 -18
  114. data/lib/milk_tea/core/types/visitor.rb +0 -4
  115. data/lib/milk_tea/dap/backends/lldb_dap.rb +0 -2
  116. data/lib/milk_tea/dap/protocol.rb +1 -1
  117. data/lib/milk_tea/dap/server/breakpoints.rb +0 -2
  118. data/lib/milk_tea/dap/server/debug_map.rb +0 -2
  119. data/lib/milk_tea/dap/server/handlers.rb +0 -2
  120. data/lib/milk_tea/dap/server/launch.rb +0 -2
  121. data/lib/milk_tea/dap/server/lldb_backend.rb +8 -10
  122. data/lib/milk_tea/dap/server/pause_diagnostics.rb +14 -16
  123. data/lib/milk_tea/dap/server/utilities.rb +0 -2
  124. data/lib/milk_tea/dap/server/wire.rb +0 -2
  125. data/lib/milk_tea/dap/server.rb +0 -2
  126. data/lib/milk_tea/lsp/diagnostics.rb +16 -16
  127. data/lib/milk_tea/lsp/server/call_hierarchy.rb +11 -12
  128. data/lib/milk_tea/lsp/server/code_actions.rb +355 -357
  129. data/lib/milk_tea/lsp/server/code_lens.rb +23 -25
  130. data/lib/milk_tea/lsp/server/completion.rb +873 -875
  131. data/lib/milk_tea/lsp/server/configuration.rb +129 -131
  132. data/lib/milk_tea/lsp/server/debug_info.rb +0 -2
  133. data/lib/milk_tea/lsp/server/definition.rb +564 -565
  134. data/lib/milk_tea/lsp/server/diagnostics_scheduling.rb +191 -193
  135. data/lib/milk_tea/lsp/server/execute_command.rb +0 -2
  136. data/lib/milk_tea/lsp/server/folding_range.rb +0 -4
  137. data/lib/milk_tea/lsp/server/formatting.rb +478 -480
  138. data/lib/milk_tea/lsp/server/hover.rb +1282 -1284
  139. data/lib/milk_tea/lsp/server/inlay_hints.rb +179 -181
  140. data/lib/milk_tea/lsp/server/lifecycle.rb +192 -194
  141. data/lib/milk_tea/lsp/server/linked_editing_range.rb +0 -2
  142. data/lib/milk_tea/lsp/server/on_type_formatting.rb +0 -2
  143. data/lib/milk_tea/lsp/server/progress.rb +0 -2
  144. data/lib/milk_tea/lsp/server/references.rb +316 -318
  145. data/lib/milk_tea/lsp/server/rename.rb +445 -447
  146. data/lib/milk_tea/lsp/server/selection_range.rb +0 -4
  147. data/lib/milk_tea/lsp/server/semantic_tokens.rb +1376 -1314
  148. data/lib/milk_tea/lsp/server/signature_help.rb +146 -148
  149. data/lib/milk_tea/lsp/server/text_documents.rb +99 -101
  150. data/lib/milk_tea/lsp/server/type_hierarchy.rb +2 -4
  151. data/lib/milk_tea/lsp/server/utilities.rb +397 -399
  152. data/lib/milk_tea/lsp/server.rb +0 -3
  153. data/lib/milk_tea/lsp/workspace/analysis.rb +40 -42
  154. data/lib/milk_tea/lsp/workspace/dependency_graph.rb +4 -10
  155. data/lib/milk_tea/lsp/workspace/utilities.rb +19 -19
  156. data/lib/milk_tea/packages/atomic_write.rb +4 -5
  157. data/lib/milk_tea/packages/dependency_solver.rb +15 -15
  158. data/lib/milk_tea/packages/lock.rb +4 -4
  159. data/lib/milk_tea/packages/manager_cli.rb +1 -1
  160. data/lib/milk_tea/packages/manifest.rb +3 -3
  161. data/lib/milk_tea/packages/registry_store.rb +4 -6
  162. data/lib/milk_tea/packages/services.rb +16 -16
  163. data/lib/milk_tea/packages/source_cache.rb +4 -6
  164. data/lib/milk_tea/packages/source_resolver.rb +44 -44
  165. data/lib/milk_tea/packages/version.rb +8 -8
  166. data/lib/milk_tea/tooling/build.rb +3 -7
  167. data/lib/milk_tea/tooling/build_cache.rb +0 -2
  168. data/lib/milk_tea/tooling/cli.rb +10 -4
  169. data/lib/milk_tea/tooling/debug_info_formatter.rb +31 -33
  170. data/lib/milk_tea/tooling/debug_map.rb +8 -10
  171. data/lib/milk_tea/tooling/docs_app.rb +0 -2
  172. data/lib/milk_tea/tooling/linter/doc_tags.rb +25 -27
  173. data/lib/milk_tea/tooling/linter/fix_engine.rb +87 -24
  174. data/lib/milk_tea/tooling/linter/flow_rules.rb +44 -46
  175. data/lib/milk_tea/tooling/linter/imports_platform.rb +14 -16
  176. data/lib/milk_tea/tooling/linter/release_rules.rb +3 -5
  177. data/lib/milk_tea/tooling/linter/reserved_names.rb +23 -25
  178. data/lib/milk_tea/tooling/linter/rules.rb +87 -89
  179. data/lib/milk_tea/tooling/linter/source_helpers.rb +40 -42
  180. data/lib/milk_tea/tooling/linter/trailing_comma.rb +17 -19
  181. data/lib/milk_tea/tooling/linter/visitors.rb +112 -54
  182. data/lib/milk_tea/tooling/linter.rb +0 -2
  183. data/lib/milk_tea/tooling/project_scaffold.rb +0 -2
  184. data/lib/milk_tea/tooling/run.rb +0 -2
  185. data/lib/milk_tea/tooling/toolchain_cli.rb +0 -2
  186. data/std/cli.mt +13 -32
  187. data/std/color.mt +28 -28
  188. data/std/encoding.mt +4 -4
  189. data/std/graph.mt +1 -2
  190. data/std/hash.mt +14 -14
  191. data/std/http/server.mt +3 -3
  192. data/std/input.mt +1 -1
  193. data/std/json.mt +1 -1
  194. data/std/linear_algebra.mt +6 -6
  195. data/std/net/mux.mt +1 -1
  196. data/std/noise.mt +23 -23
  197. data/std/parse.mt +2 -2
  198. data/std/process.mt +3 -4
  199. data/std/sparse_set.mt +1 -1
  200. data/std/steering.mt +5 -5
  201. data/std/str.mt +1 -1
  202. data/std/tween.mt +4 -4
  203. data/std/utility.mt +3 -3
  204. metadata +2 -2
@@ -4,221 +4,219 @@ module MilkTea
4
4
  module LSP
5
5
  class Server
6
6
  module ServerInlayHints
7
- private
7
+ def handle_inlay_hint(params)
8
+ uri = params.dig('textDocument', 'uri')
9
+ range = params['range'] || {}
10
+ start_line = range.dig('start', 'line') || 0
11
+ start_char = range.dig('start', 'character') || 0
12
+ end_line = range.dig('end', 'line') || 0
13
+ end_char = range.dig('end', 'character') || 0
8
14
 
9
- def handle_inlay_hint(params)
10
- uri = params.dig('textDocument', 'uri')
11
- range = params['range'] || {}
12
- start_line = range.dig('start', 'line') || 0
13
- start_char = range.dig('start', 'character') || 0
14
- end_line = range.dig('end', 'line') || 0
15
- end_char = range.dig('end', 'character') || 0
15
+ content = @workspace.get_content(uri)
16
+ return [] if content && skip_expensive_work_reason(uri, content)
16
17
 
17
- content = @workspace.get_content(uri)
18
- return [] if content && skip_expensive_work_reason(uri, content)
18
+ facts = @workspace.get_facts(uri)
19
+ tokens = @workspace.get_tokens(uri)
20
+ return [] unless facts && tokens
19
21
 
20
- facts = @workspace.get_facts(uri)
21
- tokens = @workspace.get_tokens(uri)
22
- return [] unless facts && tokens
22
+ hints = []
23
23
 
24
- hints = []
24
+ # Parameter-name hints at call sites
25
+ hints.concat(collect_parameter_name_hints(tokens, facts, start_line, start_char, end_line, end_char))
25
26
 
26
- # Parameter-name hints at call sites
27
- hints.concat(collect_parameter_name_hints(tokens, facts, start_line, start_char, end_line, end_char))
27
+ # Type annotation hints for inferred locals
28
+ hints.concat(collect_inferred_type_hints(facts, start_line, start_char, end_line, end_char))
28
29
 
29
- # Type annotation hints for inferred locals
30
- hints.concat(collect_inferred_type_hints(facts, start_line, start_char, end_line, end_char))
30
+ # Return type hints for inferred return types
31
+ hints.concat(collect_inferred_return_hints(facts, start_line, start_char, end_line, end_char))
31
32
 
32
- # Return type hints for inferred return types
33
- hints.concat(collect_inferred_return_hints(facts, start_line, start_char, end_line, end_char))
34
-
35
- hints
36
- rescue StandardError => e
37
- warn "Error in inlayHint handler: #{e.message}"
38
- []
39
- end
33
+ hints
34
+ rescue StandardError => e
35
+ warn "Error in inlayHint handler: #{e.message}"
36
+ []
37
+ end
40
38
 
41
- def collect_parameter_name_hints(tokens, facts, start_line, start_char, end_line, end_char)
42
- hints = []
43
- i = 0
44
- while i < tokens.length - 1
45
- callee = tokens[i]
46
- next_tok = tokens[i + 1]
47
- prev_tok = i > 0 ? tokens[i - 1] : nil
48
-
49
- binding = nil
50
- lparen_index = nil
51
-
52
- if callee.type == :identifier && prev_tok&.type != :function
53
- # Direct function call: func(...)
54
- if next_tok&.type == :lparen
55
- binding = facts.functions[callee.lexeme]
56
- binding ||= facts.imports.each_value.find { |mod| mod.functions.key?(callee.lexeme) }&.functions&.dig(callee.lexeme)
57
- lparen_index = i + 1
58
- elsif next_tok&.type == :dot
59
- member = tokens[i + 2]
60
- member_lparen = tokens[i + 3]
61
- if member&.type == :identifier && member_lparen&.type == :lparen
62
- # Module-qualified call: mod.func(...)
63
- mod_binding = facts.imports[callee.lexeme]
64
- if mod_binding
65
- binding = mod_binding.functions[member.lexeme]
66
- else
67
- # Instance method call: obj.method(...) or Type.static(...)
68
- receiver_type = resolve_dot_receiver_value_type(facts, callee.lexeme, callee.line, callee.column)
69
- receiver_type ||= facts.types[callee.lexeme]
70
- unless receiver_type
71
- receiver_type = facts.imports.each_value.find { |mod| mod.types.key?(callee.lexeme) }&.types&.dig(callee.lexeme)
72
- end
73
- if receiver_type
74
- methods = methods_for_receiver_type(facts, receiver_type)
75
- binding = methods[member.lexeme] || methods["static:#{member.lexeme}"]
39
+ def collect_parameter_name_hints(tokens, facts, start_line, start_char, end_line, end_char)
40
+ hints = []
41
+ i = 0
42
+ while i < tokens.length - 1
43
+ callee = tokens[i]
44
+ next_tok = tokens[i + 1]
45
+ prev_tok = i > 0 ? tokens[i - 1] : nil
46
+
47
+ binding = nil
48
+ lparen_index = nil
49
+
50
+ if callee.type == :identifier && prev_tok&.type != :function
51
+ # Direct function call: func(...)
52
+ if next_tok&.type == :lparen
53
+ binding = facts.functions[callee.lexeme]
54
+ binding ||= facts.imports.each_value.find { |mod| mod.functions.key?(callee.lexeme) }&.functions&.dig(callee.lexeme)
55
+ lparen_index = i + 1
56
+ elsif next_tok&.type == :dot
57
+ member = tokens[i + 2]
58
+ member_lparen = tokens[i + 3]
59
+ if member&.type == :identifier && member_lparen&.type == :lparen
60
+ # Module-qualified call: mod.func(...)
61
+ mod_binding = facts.imports[callee.lexeme]
62
+ if mod_binding
63
+ binding = mod_binding.functions[member.lexeme]
64
+ else
65
+ # Instance method call: obj.method(...) or Type.static(...)
66
+ receiver_type = resolve_dot_receiver_value_type(facts, callee.lexeme, callee.line, callee.column)
67
+ receiver_type ||= facts.types[callee.lexeme]
68
+ unless receiver_type
69
+ receiver_type = facts.imports.each_value.find { |mod| mod.types.key?(callee.lexeme) }&.types&.dig(callee.lexeme)
70
+ end
71
+ if receiver_type
72
+ methods = methods_for_receiver_type(facts, receiver_type)
73
+ binding = methods[member.lexeme] || methods["static:#{member.lexeme}"]
74
+ end
76
75
  end
76
+ lparen_index = i + 3
77
77
  end
78
- lparen_index = i + 3
79
78
  end
80
79
  end
81
- end
82
80
 
83
- if binding && lparen_index
84
- arg_starts, closing_index = collect_call_argument_starts(tokens, lparen_index)
85
- params_list = binding.respond_to?(:type) ? binding.type.params : []
86
-
87
- arg_starts.each_with_index do |arg_tok, index|
88
- break if index >= params_list.length
89
- next unless position_in_range?(arg_tok.line - 1, arg_tok.column - 1, start_line, start_char, end_line, end_char)
90
- next if self_describing_argument_expression?(tokens, arg_tok)
91
- param_name = params_list[index].name
92
- next if arg_tok.type == :identifier && arg_tok.lexeme == param_name
93
-
94
- hints << {
95
- position: { line: arg_tok.line - 1, character: arg_tok.column - 1 },
96
- label: "#{params_list[index].name}: ",
97
- kind: 2,
98
- paddingRight: true
99
- }
81
+ if binding && lparen_index
82
+ arg_starts, closing_index = collect_call_argument_starts(tokens, lparen_index)
83
+ params_list = binding.respond_to?(:type) ? binding.type.params : []
84
+
85
+ arg_starts.each_with_index do |arg_tok, index|
86
+ break if index >= params_list.length
87
+ next unless position_in_range?(arg_tok.line - 1, arg_tok.column - 1, start_line, start_char, end_line, end_char)
88
+ next if self_describing_argument_expression?(tokens, arg_tok)
89
+ param_name = params_list[index].name
90
+ next if arg_tok.type == :identifier && arg_tok.lexeme == param_name
91
+
92
+ hints << {
93
+ position: { line: arg_tok.line - 1, character: arg_tok.column - 1 },
94
+ label: "#{params_list[index].name}: ",
95
+ kind: 2,
96
+ paddingRight: true
97
+ }
98
+ end
99
+
100
+ i = closing_index if closing_index
100
101
  end
101
102
 
102
- i = closing_index if closing_index
103
+ i += 1
103
104
  end
104
-
105
- i += 1
105
+ hints
106
106
  end
107
- hints
108
- end
109
107
 
110
- def collect_inferred_type_hints(facts, start_line, start_char, end_line, end_char)
111
- hints = []
112
- collect_local_decls(facts.ast).each do |decl|
113
- next unless decl.type.nil?
114
- next unless position_in_range?(decl.line - 1, decl.column - 1, start_line, start_char, end_line, end_char)
108
+ def collect_inferred_type_hints(facts, start_line, start_char, end_line, end_char)
109
+ hints = []
110
+ collect_local_decls(facts.ast).each do |decl|
111
+ next unless decl.type.nil?
112
+ next unless position_in_range?(decl.line - 1, decl.column - 1, start_line, start_char, end_line, end_char)
115
113
 
116
- binding = facts.values[decl.name]
117
- next unless binding
114
+ binding = facts.values[decl.name]
115
+ next unless binding
118
116
 
119
- display_type = describe_type_for_hint(binding.storage_type)
120
- next unless display_type
117
+ display_type = describe_type_for_hint(binding.storage_type)
118
+ next unless display_type
121
119
 
122
- hints << {
123
- position: { line: decl.line - 1, character: decl.column - 1 + decl.name.length },
124
- label: ": #{display_type}",
125
- kind: 1,
126
- paddingRight: false
127
- }
120
+ hints << {
121
+ position: { line: decl.line - 1, character: decl.column - 1 + decl.name.length },
122
+ label: ": #{display_type}",
123
+ kind: 1,
124
+ paddingRight: false
125
+ }
126
+ end
127
+ hints
128
128
  end
129
- hints
130
- end
131
129
 
132
- def collect_inferred_return_hints(facts, start_line, start_char, end_line, end_char)
133
- hints = []
134
- collect_function_defs(facts.ast).each do |func|
135
- next unless func.return_type.nil?
136
- next unless position_in_range?(func.line - 1, func.column - 1, start_line, start_char, end_line, end_char)
137
-
138
- binding = facts.functions[func.name]
139
- unless binding
140
- facts.imports.each_value do |mod|
141
- binding = mod.functions[func.name]
142
- break if binding
130
+ def collect_inferred_return_hints(facts, start_line, start_char, end_line, end_char)
131
+ hints = []
132
+ collect_function_defs(facts.ast).each do |func|
133
+ next unless func.return_type.nil?
134
+ next unless position_in_range?(func.line - 1, func.column - 1, start_line, start_char, end_line, end_char)
135
+
136
+ binding = facts.functions[func.name]
137
+ unless binding
138
+ facts.imports.each_value do |mod|
139
+ binding = mod.functions[func.name]
140
+ break if binding
141
+ end
143
142
  end
143
+ next unless binding
144
+
145
+ return_type = binding.type.return_type
146
+ next unless return_type
147
+
148
+ display_type = describe_type_for_hint(return_type)
149
+ next unless display_type
150
+ next if display_type == "void"
151
+
152
+ label = "-> #{display_type}"
153
+ hints << {
154
+ position: { line: func.line - 1, character: func.column - 1 + func.name.length },
155
+ label: label,
156
+ kind: 1,
157
+ paddingRight: false
158
+ }
144
159
  end
145
- next unless binding
146
-
147
- return_type = binding.type.return_type
148
- next unless return_type
149
-
150
- display_type = describe_type_for_hint(return_type)
151
- next unless display_type
152
- next if display_type == "void"
153
-
154
- label = "-> #{display_type}"
155
- hints << {
156
- position: { line: func.line - 1, character: func.column - 1 + func.name.length },
157
- label: label,
158
- kind: 1,
159
- paddingRight: false
160
- }
160
+ hints
161
161
  end
162
- hints
163
- end
164
162
 
165
- def collect_local_decls(ast_node)
166
- results = []
167
- case ast_node
168
- when Array
169
- ast_node.each { |n| results.concat(collect_local_decls(n)) }
170
- when AST::SourceFile
171
- ast_node.declarations.each { |d| results.concat(collect_local_decls(d)) }
172
- when AST::FunctionDef
173
- results.concat(collect_local_decls(ast_node.body)) if ast_node.body
174
- when AST::MethodDef
175
- results.concat(collect_local_decls(ast_node.body)) if ast_node.body
176
- when AST::ExtendingBlock
177
- ast_node.methods.each { |m| results.concat(collect_local_decls(m)) }
178
- when AST::IfStmt
179
- ast_node.branches.each { |b| results.concat(collect_local_decls(b.body)) }
180
- results.concat(collect_local_decls(ast_node.else_body)) if ast_node.else_body
181
- when AST::MatchStmt
182
- ast_node.arms.each { |a| results.concat(collect_local_decls(a.body)) }
183
- when AST::ForStmt
184
- results.concat(collect_local_decls(ast_node.body))
185
- when AST::WhileStmt
186
- results.concat(collect_local_decls(ast_node.body))
187
- when AST::UnsafeStmt
188
- results.concat(collect_local_decls(ast_node.body))
189
- when AST::LocalDecl
190
- results << ast_node
191
- when AST::VariantArm
192
- # no body
163
+ def collect_local_decls(ast_node)
164
+ results = []
165
+ case ast_node
166
+ when Array
167
+ ast_node.each { |n| results.concat(collect_local_decls(n)) }
168
+ when AST::SourceFile
169
+ ast_node.declarations.each { |d| results.concat(collect_local_decls(d)) }
170
+ when AST::FunctionDef
171
+ results.concat(collect_local_decls(ast_node.body)) if ast_node.body
172
+ when AST::MethodDef
173
+ results.concat(collect_local_decls(ast_node.body)) if ast_node.body
174
+ when AST::ExtendingBlock
175
+ ast_node.methods.each { |m| results.concat(collect_local_decls(m)) }
176
+ when AST::IfStmt
177
+ ast_node.branches.each { |b| results.concat(collect_local_decls(b.body)) }
178
+ results.concat(collect_local_decls(ast_node.else_body)) if ast_node.else_body
179
+ when AST::MatchStmt
180
+ ast_node.arms.each { |a| results.concat(collect_local_decls(a.body)) }
181
+ when AST::ForStmt
182
+ results.concat(collect_local_decls(ast_node.body))
183
+ when AST::WhileStmt
184
+ results.concat(collect_local_decls(ast_node.body))
185
+ when AST::UnsafeStmt
186
+ results.concat(collect_local_decls(ast_node.body))
187
+ when AST::LocalDecl
188
+ results << ast_node
189
+ when AST::VariantArm
190
+ # no body
191
+ end
192
+ results
193
193
  end
194
- results
195
- end
196
194
 
197
- def collect_function_defs(ast_node)
198
- results = []
199
- case ast_node
200
- when Array
201
- ast_node.each { |n| results.concat(collect_function_defs(n)) }
202
- when AST::SourceFile
203
- ast_node.declarations.each do |d|
204
- case d
205
- when AST::FunctionDef
206
- results << d
207
- when AST::ExtendingBlock
208
- results.concat(d.methods)
195
+ def collect_function_defs(ast_node)
196
+ results = []
197
+ case ast_node
198
+ when Array
199
+ ast_node.each { |n| results.concat(collect_function_defs(n)) }
200
+ when AST::SourceFile
201
+ ast_node.declarations.each do |d|
202
+ case d
203
+ when AST::FunctionDef
204
+ results << d
205
+ when AST::ExtendingBlock
206
+ results.concat(d.methods)
207
+ end
209
208
  end
210
209
  end
210
+ results
211
211
  end
212
- results
213
- end
214
212
 
215
- def describe_type_for_hint(type)
216
- return nil unless type
213
+ def describe_type_for_hint(type)
214
+ return nil unless type
217
215
 
218
- type.to_s
219
- rescue StandardError
220
- nil
221
- end
216
+ type.to_s
217
+ rescue StandardError
218
+ nil
219
+ end
222
220
  end
223
221
  end
224
222
  end