konpeito 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-version +1 -0
  3. data/CHANGELOG.md +75 -0
  4. data/CONTRIBUTING.md +123 -0
  5. data/LICENSE +21 -0
  6. data/README.md +257 -0
  7. data/Rakefile +11 -0
  8. data/bin/konpeito +6 -0
  9. data/konpeito.gemspec +43 -0
  10. data/lib/konpeito/ast/typed_ast.rb +620 -0
  11. data/lib/konpeito/ast/visitor.rb +78 -0
  12. data/lib/konpeito/cache/cache_manager.rb +230 -0
  13. data/lib/konpeito/cache/dependency_graph.rb +192 -0
  14. data/lib/konpeito/cache.rb +8 -0
  15. data/lib/konpeito/cli/base_command.rb +187 -0
  16. data/lib/konpeito/cli/build_command.rb +220 -0
  17. data/lib/konpeito/cli/check_command.rb +104 -0
  18. data/lib/konpeito/cli/config.rb +231 -0
  19. data/lib/konpeito/cli/deps_command.rb +128 -0
  20. data/lib/konpeito/cli/doctor_command.rb +340 -0
  21. data/lib/konpeito/cli/fmt_command.rb +199 -0
  22. data/lib/konpeito/cli/init_command.rb +312 -0
  23. data/lib/konpeito/cli/lsp_command.rb +40 -0
  24. data/lib/konpeito/cli/run_command.rb +150 -0
  25. data/lib/konpeito/cli/test_command.rb +248 -0
  26. data/lib/konpeito/cli/watch_command.rb +212 -0
  27. data/lib/konpeito/cli.rb +301 -0
  28. data/lib/konpeito/codegen/builtin_methods.rb +229 -0
  29. data/lib/konpeito/codegen/cruby_backend.rb +1090 -0
  30. data/lib/konpeito/codegen/debug_info.rb +352 -0
  31. data/lib/konpeito/codegen/inliner.rb +486 -0
  32. data/lib/konpeito/codegen/jvm_backend.rb +197 -0
  33. data/lib/konpeito/codegen/jvm_generator.rb +13412 -0
  34. data/lib/konpeito/codegen/llvm_generator.rb +13191 -0
  35. data/lib/konpeito/codegen/loop_optimizer.rb +363 -0
  36. data/lib/konpeito/codegen/monomorphizer.rb +359 -0
  37. data/lib/konpeito/codegen/profile_runtime.c +341 -0
  38. data/lib/konpeito/codegen/profiler.rb +99 -0
  39. data/lib/konpeito/compiler.rb +592 -0
  40. data/lib/konpeito/dependency_resolver.rb +296 -0
  41. data/lib/konpeito/diagnostics/collector.rb +127 -0
  42. data/lib/konpeito/diagnostics/diagnostic.rb +237 -0
  43. data/lib/konpeito/diagnostics/renderer.rb +144 -0
  44. data/lib/konpeito/formatter/formatter.rb +1214 -0
  45. data/lib/konpeito/hir/builder.rb +7167 -0
  46. data/lib/konpeito/hir/nodes.rb +2465 -0
  47. data/lib/konpeito/lsp/document_manager.rb +820 -0
  48. data/lib/konpeito/lsp/server.rb +183 -0
  49. data/lib/konpeito/lsp/transport.rb +38 -0
  50. data/lib/konpeito/parser/prism_adapter.rb +65 -0
  51. data/lib/konpeito/platform.rb +103 -0
  52. data/lib/konpeito/profile/report.rb +136 -0
  53. data/lib/konpeito/rbs_inline/preprocessor.rb +199 -0
  54. data/lib/konpeito/stdlib/compression/compression.rb +72 -0
  55. data/lib/konpeito/stdlib/compression/compression.rbs +60 -0
  56. data/lib/konpeito/stdlib/compression/compression_native.c +415 -0
  57. data/lib/konpeito/stdlib/compression/extconf.rb +19 -0
  58. data/lib/konpeito/stdlib/crypto/crypto.rb +85 -0
  59. data/lib/konpeito/stdlib/crypto/crypto.rbs +74 -0
  60. data/lib/konpeito/stdlib/crypto/crypto_native.c +312 -0
  61. data/lib/konpeito/stdlib/crypto/extconf.rb +40 -0
  62. data/lib/konpeito/stdlib/http/extconf.rb +19 -0
  63. data/lib/konpeito/stdlib/http/http.rb +125 -0
  64. data/lib/konpeito/stdlib/http/http.rbs +57 -0
  65. data/lib/konpeito/stdlib/http/http_native.c +440 -0
  66. data/lib/konpeito/stdlib/json/extconf.rb +17 -0
  67. data/lib/konpeito/stdlib/json/json.rb +44 -0
  68. data/lib/konpeito/stdlib/json/json.rbs +33 -0
  69. data/lib/konpeito/stdlib/json/json_native.c +286 -0
  70. data/lib/konpeito/stdlib/ui/extconf.rb +216 -0
  71. data/lib/konpeito/stdlib/ui/konpeito_ui_native.cpp +1625 -0
  72. data/lib/konpeito/stdlib/ui/konpeito_ui_native.h +162 -0
  73. data/lib/konpeito/stdlib/ui/ui.rb +318 -0
  74. data/lib/konpeito/stdlib/ui/ui.rbs +247 -0
  75. data/lib/konpeito/type_checker/annotation_parser.rb +67 -0
  76. data/lib/konpeito/type_checker/hm_inferrer.rb +2565 -0
  77. data/lib/konpeito/type_checker/inferrer.rb +565 -0
  78. data/lib/konpeito/type_checker/rbs_loader.rb +1621 -0
  79. data/lib/konpeito/type_checker/type_resolver.rb +276 -0
  80. data/lib/konpeito/type_checker/types.rb +1434 -0
  81. data/lib/konpeito/type_checker/unification.rb +323 -0
  82. data/lib/konpeito/ui/animation/animated_state.rb +80 -0
  83. data/lib/konpeito/ui/animation/easing.rb +59 -0
  84. data/lib/konpeito/ui/animation/value_tween.rb +66 -0
  85. data/lib/konpeito/ui/app.rb +379 -0
  86. data/lib/konpeito/ui/box.rb +38 -0
  87. data/lib/konpeito/ui/castella.rb +70 -0
  88. data/lib/konpeito/ui/castella_native.rb +76 -0
  89. data/lib/konpeito/ui/chart/area_chart.rb +305 -0
  90. data/lib/konpeito/ui/chart/bar_chart.rb +288 -0
  91. data/lib/konpeito/ui/chart/base_chart.rb +210 -0
  92. data/lib/konpeito/ui/chart/chart_helpers.rb +79 -0
  93. data/lib/konpeito/ui/chart/gauge_chart.rb +171 -0
  94. data/lib/konpeito/ui/chart/heatmap_chart.rb +222 -0
  95. data/lib/konpeito/ui/chart/line_chart.rb +289 -0
  96. data/lib/konpeito/ui/chart/pie_chart.rb +219 -0
  97. data/lib/konpeito/ui/chart/scales.rb +77 -0
  98. data/lib/konpeito/ui/chart/scatter_chart.rb +303 -0
  99. data/lib/konpeito/ui/chart/stacked_bar_chart.rb +276 -0
  100. data/lib/konpeito/ui/column.rb +271 -0
  101. data/lib/konpeito/ui/core.rb +2199 -0
  102. data/lib/konpeito/ui/dsl.rb +443 -0
  103. data/lib/konpeito/ui/frame.rb +171 -0
  104. data/lib/konpeito/ui/frame_native.rb +494 -0
  105. data/lib/konpeito/ui/markdown/ast.rb +124 -0
  106. data/lib/konpeito/ui/markdown/mermaid/layout.rb +387 -0
  107. data/lib/konpeito/ui/markdown/mermaid/models.rb +232 -0
  108. data/lib/konpeito/ui/markdown/mermaid/parser.rb +519 -0
  109. data/lib/konpeito/ui/markdown/mermaid/renderer.rb +336 -0
  110. data/lib/konpeito/ui/markdown/parser.rb +805 -0
  111. data/lib/konpeito/ui/markdown/renderer.rb +639 -0
  112. data/lib/konpeito/ui/markdown/theme.rb +165 -0
  113. data/lib/konpeito/ui/render_node.rb +260 -0
  114. data/lib/konpeito/ui/row.rb +207 -0
  115. data/lib/konpeito/ui/spacer.rb +18 -0
  116. data/lib/konpeito/ui/style.rb +799 -0
  117. data/lib/konpeito/ui/theme.rb +563 -0
  118. data/lib/konpeito/ui/themes/material.rb +35 -0
  119. data/lib/konpeito/ui/themes/tokyo_night.rb +6 -0
  120. data/lib/konpeito/ui/widgets/button.rb +103 -0
  121. data/lib/konpeito/ui/widgets/calendar.rb +1034 -0
  122. data/lib/konpeito/ui/widgets/checkbox.rb +119 -0
  123. data/lib/konpeito/ui/widgets/container.rb +91 -0
  124. data/lib/konpeito/ui/widgets/data_table.rb +667 -0
  125. data/lib/konpeito/ui/widgets/divider.rb +29 -0
  126. data/lib/konpeito/ui/widgets/image.rb +105 -0
  127. data/lib/konpeito/ui/widgets/input.rb +485 -0
  128. data/lib/konpeito/ui/widgets/markdown.rb +57 -0
  129. data/lib/konpeito/ui/widgets/modal.rb +163 -0
  130. data/lib/konpeito/ui/widgets/multiline_input.rb +968 -0
  131. data/lib/konpeito/ui/widgets/multiline_text.rb +180 -0
  132. data/lib/konpeito/ui/widgets/net_image.rb +100 -0
  133. data/lib/konpeito/ui/widgets/progress_bar.rb +70 -0
  134. data/lib/konpeito/ui/widgets/radio_buttons.rb +93 -0
  135. data/lib/konpeito/ui/widgets/slider.rb +133 -0
  136. data/lib/konpeito/ui/widgets/switch.rb +84 -0
  137. data/lib/konpeito/ui/widgets/tabs.rb +157 -0
  138. data/lib/konpeito/ui/widgets/text.rb +110 -0
  139. data/lib/konpeito/ui/widgets/tree.rb +426 -0
  140. data/lib/konpeito/version.rb +5 -0
  141. data/lib/konpeito.rb +109 -0
  142. data/test_native_array.rb +172 -0
  143. data/test_native_array_class.rb +197 -0
  144. data/test_native_class.rb +151 -0
  145. data/tools/konpeito-asm/build.sh +65 -0
  146. data/tools/konpeito-asm/lib/asm-9.7.1.jar +0 -0
  147. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KArray.class +0 -0
  148. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KCompression.class +0 -0
  149. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KConditionVariable.class +0 -0
  150. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KCrypto.class +0 -0
  151. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KFile.class +0 -0
  152. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KHTTP.class +0 -0
  153. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KHash.class +0 -0
  154. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KJSON$Parser.class +0 -0
  155. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KJSON.class +0 -0
  156. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KMath.class +0 -0
  157. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KRactor.class +0 -0
  158. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KRactorPort.class +0 -0
  159. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KSizedQueue.class +0 -0
  160. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KThread.class +0 -0
  161. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/KTime.class +0 -0
  162. data/tools/konpeito-asm/runtime-classes/konpeito/runtime/RubyDispatch.class +0 -0
  163. data/tools/konpeito-asm/src/ClassIntrospector.java +312 -0
  164. data/tools/konpeito-asm/src/KonpeitoAssembler.java +659 -0
  165. data/tools/konpeito-asm/src/konpeito/runtime/KArray.java +390 -0
  166. data/tools/konpeito-asm/src/konpeito/runtime/KCompression.java +168 -0
  167. data/tools/konpeito-asm/src/konpeito/runtime/KConditionVariable.java +48 -0
  168. data/tools/konpeito-asm/src/konpeito/runtime/KCrypto.java +151 -0
  169. data/tools/konpeito-asm/src/konpeito/runtime/KFile.java +100 -0
  170. data/tools/konpeito-asm/src/konpeito/runtime/KHTTP.java +113 -0
  171. data/tools/konpeito-asm/src/konpeito/runtime/KHash.java +228 -0
  172. data/tools/konpeito-asm/src/konpeito/runtime/KJSON.java +405 -0
  173. data/tools/konpeito-asm/src/konpeito/runtime/KMath.java +54 -0
  174. data/tools/konpeito-asm/src/konpeito/runtime/KRactor.java +244 -0
  175. data/tools/konpeito-asm/src/konpeito/runtime/KRactorPort.java +53 -0
  176. data/tools/konpeito-asm/src/konpeito/runtime/KSizedQueue.java +49 -0
  177. data/tools/konpeito-asm/src/konpeito/runtime/KThread.java +49 -0
  178. data/tools/konpeito-asm/src/konpeito/runtime/KTime.java +53 -0
  179. data/tools/konpeito-asm/src/konpeito/runtime/RubyDispatch.java +416 -0
  180. metadata +267 -0
@@ -0,0 +1,271 @@
1
+ # rbs_inline: enabled
2
+
3
+ # Column layout - vertical arrangement of children
4
+ # Port of Castella LinearLayout (vertical axis)
5
+
6
+ class Column < Layout
7
+ def initialize
8
+ super
9
+ @spacing = 0.0
10
+ @is_scrollable = false
11
+ @scroll_offset = 0.0
12
+ @content_height = 0.0
13
+ @pin_bottom = false
14
+ @sb_dragging = false
15
+ @sb_drag_start_y = 0.0
16
+ @sb_drag_start_offset = 0.0
17
+ end
18
+
19
+ #: (Float s) -> Column
20
+ def spacing(s)
21
+ @spacing = s
22
+ self
23
+ end
24
+
25
+ #: () -> Column
26
+ def scrollable
27
+ @is_scrollable = true
28
+ self
29
+ end
30
+
31
+ #: () -> Column
32
+ def pin_to_bottom
33
+ @pin_bottom = true
34
+ self
35
+ end
36
+
37
+ #: () -> bool
38
+ def is_scrollable
39
+ @is_scrollable
40
+ end
41
+
42
+ #: (bool is_direction_x) -> bool
43
+ def has_scrollbar(is_direction_x)
44
+ if is_direction_x
45
+ false
46
+ else
47
+ @is_scrollable
48
+ end
49
+ end
50
+
51
+ #: () -> Float
52
+ def get_scroll_offset
53
+ @scroll_offset
54
+ end
55
+
56
+ #: (Float v) -> void
57
+ def set_scroll_offset(v)
58
+ @scroll_offset = v
59
+ mark_dirty
60
+ update
61
+ end
62
+
63
+ #: (untyped painter) -> Size
64
+ def measure(painter)
65
+ total_h = 0.0
66
+ max_w = 0.0
67
+ i = 0
68
+ while i < @children.length
69
+ cs = @children[i].measure(painter)
70
+ total_h = total_h + cs.height
71
+ total_h = total_h + @spacing if i > 0
72
+ max_w = cs.width if cs.width > max_w
73
+ i = i + 1
74
+ end
75
+ Size.new(max_w, total_h)
76
+ end
77
+
78
+ #: (untyped painter) -> void
79
+ def relocate_children(painter)
80
+ remaining = @height
81
+ expanding_total_flex = 0
82
+
83
+ # First pass: measure FIXED/CONTENT children, collect EXPANDING
84
+ i = 0
85
+ while i < @children.length
86
+ c = @children[i]
87
+ if c.get_height_policy != EXPANDING
88
+ # Set width before measure so word-wrapping can calculate line count
89
+ if c.get_width_policy == EXPANDING
90
+ c.resize_wh(@width, c.get_height)
91
+ end
92
+ cs = c.measure(painter)
93
+ c.resize_wh(@width, cs.height)
94
+ remaining = remaining - cs.height
95
+ else
96
+ expanding_total_flex = expanding_total_flex + c.get_flex
97
+ end
98
+ remaining = remaining - @spacing if i > 0
99
+ i = i + 1
100
+ end
101
+
102
+ if remaining < 0.0
103
+ remaining = 0.0
104
+ end
105
+
106
+ # Second pass: distribute remaining space to EXPANDING children, position all
107
+ cy = @y
108
+ if @is_scrollable
109
+ cy = cy - @scroll_offset
110
+ end
111
+ total_content_h = 0.0
112
+ i = 0
113
+ while i < @children.length
114
+ c = @children[i]
115
+ if c.get_height_policy == EXPANDING
116
+ h = 0.0
117
+ if expanding_total_flex > 0 && remaining > 0.0
118
+ h = remaining * c.get_flex / expanding_total_flex
119
+ end
120
+ c.resize_wh(@width, h)
121
+ else
122
+ # Set width for non-expanding too
123
+ if c.get_width_policy == EXPANDING
124
+ c.resize_wh(@width, c.get_height)
125
+ end
126
+ end
127
+ c.move_xy(@x, cy)
128
+ cy = cy + c.get_height + @spacing
129
+ total_content_h = total_content_h + c.get_height
130
+ total_content_h = total_content_h + @spacing if i > 0
131
+ i = i + 1
132
+ end
133
+ @content_height = total_content_h
134
+
135
+ # Auto-scroll to bottom when pinned
136
+ if @pin_bottom && @is_scrollable
137
+ max_scroll = @content_height - @height
138
+ if max_scroll > 0.0
139
+ @scroll_offset = max_scroll
140
+ end
141
+ end
142
+ end
143
+
144
+ #: (untyped painter, bool completely) -> void
145
+ def redraw(painter, completely)
146
+ relocate_children(painter)
147
+ redraw_children(painter, completely)
148
+ draw_scrollbar(painter) if @is_scrollable
149
+ end
150
+
151
+ #: (untyped painter) -> void
152
+ def draw_scrollbar(painter)
153
+ viewport_h = @height
154
+ content_h = @content_height
155
+ return if content_h <= viewport_h
156
+
157
+ bar_width = 8.0
158
+ thumb_color = 0xC0AAAAAA
159
+
160
+ # Thumb
161
+ thumb_h = viewport_h * viewport_h / content_h
162
+ if thumb_h < 20.0
163
+ thumb_h = 20.0
164
+ end
165
+ thumb_y = (@scroll_offset / content_h) * viewport_h
166
+ if thumb_y + thumb_h > viewport_h
167
+ thumb_y = viewport_h - thumb_h
168
+ end
169
+ painter.fill_round_rect(@width - bar_width + 2.0, thumb_y, bar_width - 4.0, thumb_h, 2.0, thumb_color)
170
+ end
171
+
172
+ # Intercept clicks on the scrollbar area before dispatching to children
173
+ #: (Point p) -> Array
174
+ def dispatch(p)
175
+ if @is_scrollable && @content_height > @height && contain(p)
176
+ local_x = p.x - @x
177
+ if local_x >= @width - 8.0
178
+ local_p = Point.new(local_x, p.y - @y)
179
+ return [self, local_p]
180
+ end
181
+ end
182
+ super(p)
183
+ end
184
+
185
+ #: (MouseEvent ev) -> void
186
+ def mouse_down(ev)
187
+ if @is_scrollable && @content_height > @height
188
+ @sb_dragging = true
189
+ @sb_drag_start_y = ev.pos.y
190
+ @sb_drag_start_offset = @scroll_offset
191
+ # Jump scroll to clicked position
192
+ viewport_h = @height
193
+ content_h = @content_height
194
+ max_scroll = content_h - viewport_h
195
+ @scroll_offset = (ev.pos.y / viewport_h) * max_scroll
196
+ if @scroll_offset < 0.0
197
+ @scroll_offset = 0.0
198
+ end
199
+ if @scroll_offset > max_scroll
200
+ @scroll_offset = max_scroll
201
+ end
202
+ mark_dirty
203
+ update
204
+ end
205
+ end
206
+
207
+ #: (MouseEvent ev) -> void
208
+ def mouse_drag(ev)
209
+ if @sb_dragging
210
+ viewport_h = @height
211
+ content_h = @content_height
212
+ if content_h > viewport_h
213
+ max_scroll = content_h - viewport_h
214
+ @scroll_offset = (ev.pos.y / viewport_h) * max_scroll
215
+ if @scroll_offset < 0.0
216
+ @scroll_offset = 0.0
217
+ end
218
+ if @scroll_offset > max_scroll
219
+ @scroll_offset = max_scroll
220
+ end
221
+ mark_dirty
222
+ update
223
+ end
224
+ end
225
+ end
226
+
227
+ #: (MouseEvent ev) -> void
228
+ def mouse_up(ev)
229
+ @sb_dragging = false
230
+ end
231
+
232
+ #: (WheelEvent ev) -> void
233
+ def mouse_wheel(ev)
234
+ if @is_scrollable
235
+ scroll_speed = 30.0
236
+ @scroll_offset = @scroll_offset - ev.delta_y * scroll_speed
237
+ # Clamp scroll offset
238
+ max_scroll = @content_height - @height
239
+ if max_scroll < 0.0
240
+ max_scroll = 0.0
241
+ end
242
+ if @scroll_offset < 0.0
243
+ @scroll_offset = 0.0
244
+ end
245
+ if @scroll_offset > max_scroll
246
+ @scroll_offset = max_scroll
247
+ end
248
+ # Toggle pin_to_bottom: disable on scroll up, re-enable at bottom
249
+ if ev.delta_y > 0.0
250
+ @pin_bottom = false
251
+ end
252
+ if max_scroll > 0.0 && @scroll_offset >= max_scroll
253
+ @pin_bottom = true
254
+ end
255
+ mark_dirty
256
+ update
257
+ end
258
+ end
259
+ end
260
+
261
+ # Top-level helper
262
+ #: (*untyped children) -> Column
263
+ def Column(*children)
264
+ col = Column.new
265
+ i = 0
266
+ while i < children.length
267
+ col.add(children[i])
268
+ i = i + 1
269
+ end
270
+ col
271
+ end