blockly 7.20211209.2 → 8.0.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 (262) hide show
  1. package/blockly.d.ts +18963 -18432
  2. package/blockly.min.js +852 -844
  3. package/blockly_compressed.js +669 -664
  4. package/blockly_compressed.js.map +1 -1
  5. package/blocks/blocks.js +47 -0
  6. package/blocks/colour.js +13 -3
  7. package/blocks/lists.js +22 -13
  8. package/blocks/logic.js +13 -3
  9. package/blocks/loops.js +24 -11
  10. package/blocks/math.js +12 -3
  11. package/blocks/procedures.js +41 -27
  12. package/blocks/text.js +22 -13
  13. package/blocks/variables.js +14 -3
  14. package/blocks/variables_dynamic.js +13 -3
  15. package/blocks_compressed.js +146 -141
  16. package/blocks_compressed.js.map +1 -1
  17. package/core/block.js +1869 -1814
  18. package/core/block_drag_surface.js +201 -200
  19. package/core/block_dragger.js +377 -373
  20. package/core/block_svg.js +1593 -1479
  21. package/core/blockly.js +8 -22
  22. package/core/blocks.js +9 -2
  23. package/core/browser_events.js +22 -5
  24. package/core/bubble.js +841 -797
  25. package/core/bubble_dragger.js +213 -206
  26. package/core/bump_objects.js +2 -2
  27. package/core/clipboard.js +9 -9
  28. package/core/comment.js +353 -332
  29. package/core/common.js +46 -17
  30. package/core/component_manager.js +181 -174
  31. package/core/config.js +87 -0
  32. package/core/connection.js +595 -584
  33. package/core/connection_checker.js +242 -244
  34. package/core/connection_db.js +235 -230
  35. package/core/contextmenu.js +9 -6
  36. package/core/contextmenu_items.js +1 -2
  37. package/core/contextmenu_registry.js +93 -89
  38. package/core/css.js +474 -474
  39. package/core/delete_area.js +45 -42
  40. package/core/drag_target.js +57 -56
  41. package/core/dropdowndiv.js +153 -163
  42. package/core/events/events.js +2 -2
  43. package/core/events/events_abstract.js +89 -77
  44. package/core/events/events_block_base.js +37 -36
  45. package/core/events/events_block_change.js +130 -124
  46. package/core/events/events_block_create.js +73 -71
  47. package/core/events/events_block_delete.js +84 -82
  48. package/core/events/events_block_drag.js +50 -49
  49. package/core/events/events_block_move.js +147 -140
  50. package/core/events/events_bubble_open.js +51 -50
  51. package/core/events/events_click.js +48 -44
  52. package/core/events/events_comment_base.js +72 -69
  53. package/core/events/events_comment_change.js +63 -61
  54. package/core/events/events_comment_create.js +44 -42
  55. package/core/events/events_comment_delete.js +42 -40
  56. package/core/events/events_comment_move.js +106 -104
  57. package/core/events/events_marker_move.js +65 -64
  58. package/core/events/events_selected.js +46 -45
  59. package/core/events/events_theme_change.js +36 -35
  60. package/core/events/events_toolbox_item_select.js +46 -45
  61. package/core/events/events_trashcan_open.js +37 -36
  62. package/core/events/events_ui.js +47 -46
  63. package/core/events/events_ui_base.js +30 -29
  64. package/core/events/events_var_base.js +37 -36
  65. package/core/events/events_var_create.js +50 -48
  66. package/core/events/events_var_delete.js +50 -48
  67. package/core/events/events_var_rename.js +51 -49
  68. package/core/events/events_viewport.js +66 -65
  69. package/core/events/utils.js +29 -14
  70. package/core/events/workspace_events.js +49 -55
  71. package/core/extensions.js +4 -3
  72. package/core/field.js +1061 -997
  73. package/core/field_angle.js +462 -442
  74. package/core/field_checkbox.js +194 -182
  75. package/core/field_colour.js +519 -505
  76. package/core/field_dropdown.js +617 -598
  77. package/core/field_image.js +229 -220
  78. package/core/field_label.js +102 -91
  79. package/core/field_label_serializable.js +42 -41
  80. package/core/field_multilineinput.js +372 -358
  81. package/core/field_number.js +272 -253
  82. package/core/field_textinput.js +499 -467
  83. package/core/field_variable.js +458 -420
  84. package/core/flyout_base.js +1005 -952
  85. package/core/flyout_button.js +277 -260
  86. package/core/flyout_horizontal.js +304 -302
  87. package/core/flyout_metrics_manager.js +64 -64
  88. package/core/flyout_vertical.js +306 -300
  89. package/core/generator.js +459 -446
  90. package/core/gesture.js +829 -813
  91. package/core/grid.js +166 -163
  92. package/core/icon.js +168 -159
  93. package/core/inject.js +7 -5
  94. package/core/input.js +257 -248
  95. package/core/insertion_marker_manager.js +655 -624
  96. package/core/internal_constants.js +0 -129
  97. package/core/keyboard_nav/ast_node.js +605 -596
  98. package/core/keyboard_nav/basic_cursor.js +166 -165
  99. package/core/keyboard_nav/cursor.js +99 -97
  100. package/core/keyboard_nav/marker.js +83 -79
  101. package/core/keyboard_nav/tab_navigate_cursor.js +18 -23
  102. package/core/marker_manager.js +153 -141
  103. package/core/menu.js +377 -372
  104. package/core/menuitem.js +223 -217
  105. package/core/metrics_manager.js +403 -390
  106. package/core/mutator.js +468 -437
  107. package/core/names.js +229 -188
  108. package/core/options.js +290 -284
  109. package/core/procedures.js +29 -17
  110. package/core/registry.js +19 -16
  111. package/core/rendered_connection.js +482 -463
  112. package/core/renderers/common/block_rendering.js +9 -3
  113. package/core/renderers/common/constants.js +1119 -1112
  114. package/core/renderers/common/debug.js +14 -0
  115. package/core/renderers/common/debugger.js +338 -316
  116. package/core/renderers/common/drawer.js +380 -370
  117. package/core/renderers/common/i_path_object.js +2 -2
  118. package/core/renderers/common/info.js +626 -618
  119. package/core/renderers/common/marker_svg.js +579 -541
  120. package/core/renderers/common/path_object.js +203 -200
  121. package/core/renderers/common/renderer.js +220 -218
  122. package/core/renderers/geras/constants.js +36 -36
  123. package/core/renderers/geras/drawer.js +155 -147
  124. package/core/renderers/geras/highlight_constants.js +244 -238
  125. package/core/renderers/geras/highlighter.js +231 -179
  126. package/core/renderers/geras/info.js +392 -369
  127. package/core/renderers/geras/measurables/inline_input.js +25 -19
  128. package/core/renderers/geras/measurables/statement_input.js +23 -17
  129. package/core/renderers/geras/path_object.js +106 -121
  130. package/core/renderers/geras/renderer.js +96 -98
  131. package/core/renderers/measurables/base.js +30 -18
  132. package/core/renderers/measurables/bottom_row.js +83 -80
  133. package/core/renderers/measurables/connection.js +22 -15
  134. package/core/renderers/measurables/external_value_input.js +35 -22
  135. package/core/renderers/measurables/field.js +35 -20
  136. package/core/renderers/measurables/hat.js +18 -13
  137. package/core/renderers/measurables/icon.js +24 -17
  138. package/core/renderers/measurables/in_row_spacer.js +15 -13
  139. package/core/renderers/measurables/inline_input.js +43 -33
  140. package/core/renderers/measurables/input_connection.js +41 -28
  141. package/core/renderers/measurables/input_row.js +50 -44
  142. package/core/renderers/measurables/jagged_edge.js +14 -12
  143. package/core/renderers/measurables/next_connection.js +16 -14
  144. package/core/renderers/measurables/output_connection.js +26 -20
  145. package/core/renderers/measurables/previous_connection.js +16 -15
  146. package/core/renderers/measurables/round_corner.js +20 -18
  147. package/core/renderers/measurables/row.js +184 -168
  148. package/core/renderers/measurables/spacer_row.js +38 -23
  149. package/core/renderers/measurables/square_corner.js +18 -16
  150. package/core/renderers/measurables/statement_input.js +23 -20
  151. package/core/renderers/measurables/top_row.js +88 -85
  152. package/core/renderers/minimalist/constants.js +8 -7
  153. package/core/renderers/minimalist/drawer.js +11 -10
  154. package/core/renderers/minimalist/info.js +18 -18
  155. package/core/renderers/minimalist/renderer.js +40 -39
  156. package/core/renderers/thrasos/info.js +258 -248
  157. package/core/renderers/thrasos/renderer.js +20 -20
  158. package/core/renderers/zelos/constants.js +898 -873
  159. package/core/renderers/zelos/drawer.js +186 -169
  160. package/core/renderers/zelos/info.js +502 -479
  161. package/core/renderers/zelos/marker_svg.js +129 -115
  162. package/core/renderers/zelos/measurables/bottom_row.js +31 -30
  163. package/core/renderers/zelos/measurables/inputs.js +22 -21
  164. package/core/renderers/zelos/measurables/row_elements.js +14 -13
  165. package/core/renderers/zelos/measurables/top_row.js +34 -33
  166. package/core/renderers/zelos/path_object.js +181 -180
  167. package/core/renderers/zelos/renderer.js +91 -92
  168. package/core/scrollbar.js +759 -713
  169. package/core/scrollbar_pair.js +250 -245
  170. package/core/serialization/blocks.js +19 -9
  171. package/core/serialization/workspaces.js +3 -2
  172. package/core/shortcut_registry.js +286 -277
  173. package/core/sprites.js +31 -0
  174. package/core/theme.js +135 -141
  175. package/core/theme_manager.js +147 -143
  176. package/core/toolbox/category.js +602 -576
  177. package/core/toolbox/collapsible_category.js +226 -227
  178. package/core/toolbox/separator.js +70 -61
  179. package/core/toolbox/toolbox.js +934 -927
  180. package/core/toolbox/toolbox_item.js +115 -99
  181. package/core/tooltip.js +108 -35
  182. package/core/touch.js +8 -3
  183. package/core/touch_gesture.js +254 -251
  184. package/core/trashcan.js +606 -595
  185. package/core/utils/coordinate.js +97 -95
  186. package/core/utils/dom.js +2 -2
  187. package/core/utils/global.js +2 -0
  188. package/core/utils/rect.js +41 -37
  189. package/core/utils/sentinel.js +25 -0
  190. package/core/utils/size.js +30 -27
  191. package/core/utils/svg.js +18 -16
  192. package/core/variable_map.js +325 -341
  193. package/core/variable_model.js +55 -54
  194. package/core/variables.js +9 -2
  195. package/core/variables_dynamic.js +3 -1
  196. package/core/warning.js +126 -120
  197. package/core/widgetdiv.js +4 -4
  198. package/core/workspace.js +685 -664
  199. package/core/workspace_audio.js +124 -118
  200. package/core/workspace_comment.js +308 -298
  201. package/core/workspace_comment_svg.js +1029 -951
  202. package/core/workspace_drag_surface_svg.js +147 -140
  203. package/core/workspace_dragger.js +70 -71
  204. package/core/workspace_svg.js +2322 -2297
  205. package/core/xml.js +30 -20
  206. package/core/zoom_controls.js +431 -439
  207. package/dart_compressed.js +40 -43
  208. package/dart_compressed.js.map +1 -1
  209. package/generators/dart/colour.js +56 -64
  210. package/generators/dart/lists.js +61 -50
  211. package/generators/dart/math.js +160 -148
  212. package/generators/dart/text.js +83 -61
  213. package/generators/javascript/colour.js +37 -34
  214. package/generators/javascript/lists.js +50 -43
  215. package/generators/javascript/math.js +123 -139
  216. package/generators/javascript/text.js +67 -81
  217. package/generators/lua/colour.js +25 -23
  218. package/generators/lua/lists.js +97 -69
  219. package/generators/lua/logic.js +1 -2
  220. package/generators/lua/math.js +182 -144
  221. package/generators/lua/text.js +116 -99
  222. package/generators/php/colour.js +38 -32
  223. package/generators/php/lists.js +109 -89
  224. package/generators/php/math.js +90 -81
  225. package/generators/php/text.js +63 -61
  226. package/generators/python/colour.js +18 -18
  227. package/generators/python/lists.js +38 -30
  228. package/generators/python/loops.js +12 -8
  229. package/generators/python/math.js +104 -106
  230. package/generators/python/text.js +34 -30
  231. package/javascript_compressed.js +37 -39
  232. package/javascript_compressed.js.map +1 -1
  233. package/lua_compressed.js +39 -42
  234. package/lua_compressed.js.map +1 -1
  235. package/msg/az.js +2 -2
  236. package/msg/be.js +4 -4
  237. package/msg/cs.js +15 -15
  238. package/msg/de.js +1 -1
  239. package/msg/diq.js +1 -1
  240. package/msg/eo.js +1 -1
  241. package/msg/es.js +1 -1
  242. package/msg/fa.js +1 -1
  243. package/msg/fr.js +4 -4
  244. package/msg/he.js +1 -1
  245. package/msg/hr.js +2 -2
  246. package/msg/hy.js +2 -2
  247. package/msg/id.js +12 -12
  248. package/msg/inh.js +14 -14
  249. package/msg/ja.js +7 -7
  250. package/msg/lv.js +29 -29
  251. package/msg/pa.js +3 -3
  252. package/msg/smn.js +436 -0
  253. package/msg/te.js +1 -1
  254. package/msg/yue.js +1 -1
  255. package/msg/zh-hans.js +3 -3
  256. package/msg/zh-hant.js +3 -3
  257. package/package.json +7 -6
  258. package/php_compressed.js +38 -42
  259. package/php_compressed.js.map +1 -1
  260. package/python_compressed.js +26 -25
  261. package/python_compressed.js.map +1 -1
  262. package/blocks/all.js +0 -23
@@ -17,7 +17,6 @@
17
17
  */
18
18
  goog.module('Blockly.BasicCursor');
19
19
 
20
- const object = goog.require('Blockly.utils.object');
21
20
  const registry = goog.require('Blockly.registry');
22
21
  const {ASTNode} = goog.require('Blockly.ASTNode');
23
22
  const {Cursor} = goog.require('Blockly.Cursor');
@@ -27,196 +26,198 @@ const {Cursor} = goog.require('Blockly.Cursor');
27
26
  * Class for a basic cursor.
28
27
  * This will allow the user to get to all nodes in the AST by hitting next or
29
28
  * previous.
30
- * @constructor
31
29
  * @extends {Cursor}
32
30
  * @alias Blockly.BasicCursor
33
31
  */
34
- const BasicCursor = function() {
35
- BasicCursor.superClass_.constructor.call(this);
36
- };
37
- object.inherits(BasicCursor, Cursor);
38
-
39
- /**
40
- * Name used for registering a basic cursor.
41
- * @const {string}
42
- */
43
- BasicCursor.registrationName = 'basicCursor';
44
-
45
- /**
46
- * Find the next node in the pre order traversal.
47
- * @return {?ASTNode} The next node, or null if the current node is
48
- * not set or there is no next value.
49
- * @override
50
- */
51
- BasicCursor.prototype.next = function() {
52
- const curNode = this.getCurNode();
53
- if (!curNode) {
54
- return null;
32
+ class BasicCursor extends Cursor {
33
+ /**
34
+ * @alias Blockly.BasicCursor
35
+ */
36
+ constructor() {
37
+ super();
55
38
  }
56
- const newNode = this.getNextNode_(curNode, this.validNode_);
57
39
 
58
- if (newNode) {
59
- this.setCurNode(newNode);
40
+ /**
41
+ * Find the next node in the pre order traversal.
42
+ * @return {?ASTNode} The next node, or null if the current node is
43
+ * not set or there is no next value.
44
+ * @override
45
+ */
46
+ next() {
47
+ const curNode = this.getCurNode();
48
+ if (!curNode) {
49
+ return null;
50
+ }
51
+ const newNode = this.getNextNode_(curNode, this.validNode_);
52
+
53
+ if (newNode) {
54
+ this.setCurNode(newNode);
55
+ }
56
+ return newNode;
60
57
  }
61
- return newNode;
62
- };
63
58
 
64
- /**
65
- * For a basic cursor we only have the ability to go next and previous, so
66
- * in will also allow the user to get to the next node in the pre order
67
- * traversal.
68
- * @return {?ASTNode} The next node, or null if the current node is
69
- * not set or there is no next value.
70
- * @override
71
- */
72
- BasicCursor.prototype.in = function() {
73
- return this.next();
74
- };
75
-
76
- /**
77
- * Find the previous node in the pre order traversal.
78
- * @return {?ASTNode} The previous node, or null if the current node
79
- * is not set or there is no previous value.
80
- * @override
81
- */
82
- BasicCursor.prototype.prev = function() {
83
- const curNode = this.getCurNode();
84
- if (!curNode) {
85
- return null;
59
+ /**
60
+ * For a basic cursor we only have the ability to go next and previous, so
61
+ * in will also allow the user to get to the next node in the pre order
62
+ * traversal.
63
+ * @return {?ASTNode} The next node, or null if the current node is
64
+ * not set or there is no next value.
65
+ * @override
66
+ */
67
+ in() {
68
+ return this.next();
86
69
  }
87
- const newNode = this.getPreviousNode_(curNode, this.validNode_);
88
70
 
89
- if (newNode) {
90
- this.setCurNode(newNode);
71
+ /**
72
+ * Find the previous node in the pre order traversal.
73
+ * @return {?ASTNode} The previous node, or null if the current node
74
+ * is not set or there is no previous value.
75
+ * @override
76
+ */
77
+ prev() {
78
+ const curNode = this.getCurNode();
79
+ if (!curNode) {
80
+ return null;
81
+ }
82
+ const newNode = this.getPreviousNode_(curNode, this.validNode_);
83
+
84
+ if (newNode) {
85
+ this.setCurNode(newNode);
86
+ }
87
+ return newNode;
91
88
  }
92
- return newNode;
93
- };
94
89
 
95
- /**
96
- * For a basic cursor we only have the ability to go next and previous, so
97
- * out will allow the user to get to the previous node in the pre order
98
- * traversal.
99
- * @return {?ASTNode} The previous node, or null if the current node is
100
- * not set or there is no previous value.
101
- * @override
102
- */
103
- BasicCursor.prototype.out = function() {
104
- return this.prev();
105
- };
90
+ /**
91
+ * For a basic cursor we only have the ability to go next and previous, so
92
+ * out will allow the user to get to the previous node in the pre order
93
+ * traversal.
94
+ * @return {?ASTNode} The previous node, or null if the current node is
95
+ * not set or there is no previous value.
96
+ * @override
97
+ */
98
+ out() {
99
+ return this.prev();
100
+ }
106
101
 
107
- /**
108
- * Uses pre order traversal to navigate the Blockly AST. This will allow
109
- * a user to easily navigate the entire Blockly AST without having to go in
110
- * and out levels on the tree.
111
- * @param {?ASTNode} node The current position in the AST.
112
- * @param {!function(ASTNode) : boolean} isValid A function true/false
113
- * depending on whether the given node should be traversed.
114
- * @return {?ASTNode} The next node in the traversal.
115
- * @protected
116
- */
117
- BasicCursor.prototype.getNextNode_ = function(node, isValid) {
118
- if (!node) {
102
+ /**
103
+ * Uses pre order traversal to navigate the Blockly AST. This will allow
104
+ * a user to easily navigate the entire Blockly AST without having to go in
105
+ * and out levels on the tree.
106
+ * @param {?ASTNode} node The current position in the AST.
107
+ * @param {!function(ASTNode) : boolean} isValid A function true/false
108
+ * depending on whether the given node should be traversed.
109
+ * @return {?ASTNode} The next node in the traversal.
110
+ * @protected
111
+ */
112
+ getNextNode_(node, isValid) {
113
+ if (!node) {
114
+ return null;
115
+ }
116
+ const newNode = node.in() || node.next();
117
+ if (isValid(newNode)) {
118
+ return newNode;
119
+ } else if (newNode) {
120
+ return this.getNextNode_(newNode, isValid);
121
+ }
122
+ const siblingOrParent = this.findSiblingOrParent_(node.out());
123
+ if (isValid(siblingOrParent)) {
124
+ return siblingOrParent;
125
+ } else if (siblingOrParent) {
126
+ return this.getNextNode_(siblingOrParent, isValid);
127
+ }
119
128
  return null;
120
129
  }
121
- const newNode = node.in() || node.next();
122
- if (isValid(newNode)) {
123
- return newNode;
124
- } else if (newNode) {
125
- return this.getNextNode_(newNode, isValid);
126
- }
127
- const siblingOrParent = this.findSiblingOrParent_(node.out());
128
- if (isValid(siblingOrParent)) {
129
- return siblingOrParent;
130
- } else if (siblingOrParent) {
131
- return this.getNextNode_(siblingOrParent, isValid);
132
- }
133
- return null;
134
- };
135
130
 
136
- /**
137
- * Reverses the pre order traversal in order to find the previous node. This
138
- * will allow a user to easily navigate the entire Blockly AST without having to
139
- * go in and out levels on the tree.
140
- * @param {?ASTNode} node The current position in the AST.
141
- * @param {!function(ASTNode) : boolean} isValid A function true/false
142
- * depending on whether the given node should be traversed.
143
- * @return {?ASTNode} The previous node in the traversal or null if no
144
- * previous node exists.
145
- * @protected
146
- */
147
- BasicCursor.prototype.getPreviousNode_ = function(node, isValid) {
148
- if (!node) {
131
+ /**
132
+ * Reverses the pre order traversal in order to find the previous node. This
133
+ * will allow a user to easily navigate the entire Blockly AST without having
134
+ * to go in and out levels on the tree.
135
+ * @param {?ASTNode} node The current position in the AST.
136
+ * @param {!function(ASTNode) : boolean} isValid A function true/false
137
+ * depending on whether the given node should be traversed.
138
+ * @return {?ASTNode} The previous node in the traversal or null if no
139
+ * previous node exists.
140
+ * @protected
141
+ */
142
+ getPreviousNode_(node, isValid) {
143
+ if (!node) {
144
+ return null;
145
+ }
146
+ let newNode = node.prev();
147
+
148
+ if (newNode) {
149
+ newNode = this.getRightMostChild_(newNode);
150
+ } else {
151
+ newNode = node.out();
152
+ }
153
+ if (isValid(newNode)) {
154
+ return newNode;
155
+ } else if (newNode) {
156
+ return this.getPreviousNode_(newNode, isValid);
157
+ }
149
158
  return null;
150
159
  }
151
- let newNode = node.prev();
152
160
 
153
- if (newNode) {
154
- newNode = this.getRightMostChild_(newNode);
155
- } else {
156
- newNode = node.out();
157
- }
158
- if (isValid(newNode)) {
159
- return newNode;
160
- } else if (newNode) {
161
- return this.getPreviousNode_(newNode, isValid);
161
+ /**
162
+ * Decides what nodes to traverse and which ones to skip. Currently, it
163
+ * skips output, stack and workspace nodes.
164
+ * @param {?ASTNode} node The AST node to check whether it is valid.
165
+ * @return {boolean} True if the node should be visited, false otherwise.
166
+ * @protected
167
+ */
168
+ validNode_(node) {
169
+ let isValid = false;
170
+ const type = node && node.getType();
171
+ if (type === ASTNode.types.OUTPUT || type === ASTNode.types.INPUT ||
172
+ type === ASTNode.types.FIELD || type === ASTNode.types.NEXT ||
173
+ type === ASTNode.types.PREVIOUS || type === ASTNode.types.WORKSPACE) {
174
+ isValid = true;
175
+ }
176
+ return isValid;
162
177
  }
163
- return null;
164
- };
165
178
 
166
- /**
167
- * Decides what nodes to traverse and which ones to skip. Currently, it
168
- * skips output, stack and workspace nodes.
169
- * @param {?ASTNode} node The AST node to check whether it is valid.
170
- * @return {boolean} True if the node should be visited, false otherwise.
171
- * @protected
172
- */
173
- BasicCursor.prototype.validNode_ = function(node) {
174
- let isValid = false;
175
- const type = node && node.getType();
176
- if (type === ASTNode.types.OUTPUT || type === ASTNode.types.INPUT ||
177
- type === ASTNode.types.FIELD || type === ASTNode.types.NEXT ||
178
- type === ASTNode.types.PREVIOUS || type === ASTNode.types.WORKSPACE) {
179
- isValid = true;
179
+ /**
180
+ * From the given node find either the next valid sibling or parent.
181
+ * @param {?ASTNode} node The current position in the AST.
182
+ * @return {?ASTNode} The parent AST node or null if there are no
183
+ * valid parents.
184
+ * @private
185
+ */
186
+ findSiblingOrParent_(node) {
187
+ if (!node) {
188
+ return null;
189
+ }
190
+ const nextNode = node.next();
191
+ if (nextNode) {
192
+ return nextNode;
193
+ }
194
+ return this.findSiblingOrParent_(node.out());
180
195
  }
181
- return isValid;
182
- };
183
196
 
184
- /**
185
- * From the given node find either the next valid sibling or parent.
186
- * @param {?ASTNode} node The current position in the AST.
187
- * @return {?ASTNode} The parent AST node or null if there are no
188
- * valid parents.
189
- * @private
190
- */
191
- BasicCursor.prototype.findSiblingOrParent_ = function(node) {
192
- if (!node) {
193
- return null;
197
+ /**
198
+ * Get the right most child of a node.
199
+ * @param {?ASTNode} node The node to find the right most child of.
200
+ * @return {?ASTNode} The right most child of the given node, or the node
201
+ * if no child exists.
202
+ * @private
203
+ */
204
+ getRightMostChild_(node) {
205
+ if (!node.in()) {
206
+ return node;
207
+ }
208
+ let newNode = node.in();
209
+ while (newNode.next()) {
210
+ newNode = newNode.next();
211
+ }
212
+ return this.getRightMostChild_(newNode);
194
213
  }
195
- const nextNode = node.next();
196
- if (nextNode) {
197
- return nextNode;
198
- }
199
- return this.findSiblingOrParent_(node.out());
200
- };
201
-
214
+ }
202
215
 
203
216
  /**
204
- * Get the right most child of a node.
205
- * @param {?ASTNode} node The node to find the right most child of.
206
- * @return {?ASTNode} The right most child of the given node, or the node
207
- * if no child exists.
208
- * @private
217
+ * Name used for registering a basic cursor.
218
+ * @const {string}
209
219
  */
210
- BasicCursor.prototype.getRightMostChild_ = function(node) {
211
- if (!node.in()) {
212
- return node;
213
- }
214
- let newNode = node.in();
215
- while (newNode.next()) {
216
- newNode = newNode.next();
217
- }
218
- return this.getRightMostChild_(newNode);
219
- };
220
+ BasicCursor.registrationName = 'basicCursor';
220
221
 
221
222
  registry.register(
222
223
  registry.Type.CURSOR, BasicCursor.registrationName, BasicCursor);
@@ -17,7 +17,6 @@
17
17
  */
18
18
  goog.module('Blockly.Cursor');
19
19
 
20
- const object = goog.require('Blockly.utils.object');
21
20
  const registry = goog.require('Blockly.registry');
22
21
  const {ASTNode} = goog.require('Blockly.ASTNode');
23
22
  const {Marker} = goog.require('Blockly.Marker');
@@ -25,117 +24,120 @@ const {Marker} = goog.require('Blockly.Marker');
25
24
  /**
26
25
  * Class for a cursor.
27
26
  * A cursor controls how a user navigates the Blockly AST.
28
- * @constructor
29
27
  * @extends {Marker}
30
28
  * @alias Blockly.Cursor
31
29
  */
32
- const Cursor = function() {
33
- Cursor.superClass_.constructor.call(this);
34
-
30
+ class Cursor extends Marker {
35
31
  /**
36
- * @override
32
+ * @alias Blockly.Cursor
37
33
  */
38
- this.type = 'cursor';
39
- };
40
- object.inherits(Cursor, Marker);
41
-
42
- /**
43
- * Find the next connection, field, or block.
44
- * @return {ASTNode} The next element, or null if the current node is
45
- * not set or there is no next value.
46
- * @public
47
- */
48
- Cursor.prototype.next = function() {
49
- const curNode = this.getCurNode();
50
- if (!curNode) {
51
- return null;
52
- }
53
-
54
- let newNode = curNode.next();
55
- while (newNode && newNode.next() &&
56
- (newNode.getType() === ASTNode.types.NEXT ||
57
- newNode.getType() === ASTNode.types.BLOCK)) {
58
- newNode = newNode.next();
59
- }
60
-
61
- if (newNode) {
62
- this.setCurNode(newNode);
63
- }
64
- return newNode;
65
- };
66
-
67
- /**
68
- * Find the in connection or field.
69
- * @return {ASTNode} The in element, or null if the current node is
70
- * not set or there is no in value.
71
- * @public
72
- */
73
- Cursor.prototype.in = function() {
74
- let curNode = this.getCurNode();
75
- if (!curNode) {
76
- return null;
77
- }
78
- // If we are on a previous or output connection, go to the block level before
79
- // performing next operation.
80
- if (curNode.getType() === ASTNode.types.PREVIOUS ||
81
- curNode.getType() === ASTNode.types.OUTPUT) {
82
- curNode = curNode.next();
83
- }
84
- const newNode = curNode.in();
85
-
86
- if (newNode) {
87
- this.setCurNode(newNode);
88
- }
89
- return newNode;
90
- };
91
-
92
- /**
93
- * Find the previous connection, field, or block.
94
- * @return {ASTNode} The previous element, or null if the current node
95
- * is not set or there is no previous value.
96
- * @public
97
- */
98
- Cursor.prototype.prev = function() {
99
- const curNode = this.getCurNode();
100
- if (!curNode) {
101
- return null;
102
- }
103
- let newNode = curNode.prev();
34
+ constructor() {
35
+ super();
104
36
 
105
- while (newNode && newNode.prev() &&
106
- (newNode.getType() === ASTNode.types.NEXT ||
107
- newNode.getType() === ASTNode.types.BLOCK)) {
108
- newNode = newNode.prev();
37
+ /**
38
+ * @override
39
+ */
40
+ this.type = 'cursor';
109
41
  }
110
42
 
111
- if (newNode) {
112
- this.setCurNode(newNode);
43
+ /**
44
+ * Find the next connection, field, or block.
45
+ * @return {ASTNode} The next element, or null if the current node is
46
+ * not set or there is no next value.
47
+ * @public
48
+ */
49
+ next() {
50
+ const curNode = this.getCurNode();
51
+ if (!curNode) {
52
+ return null;
53
+ }
54
+
55
+ let newNode = curNode.next();
56
+ while (newNode && newNode.next() &&
57
+ (newNode.getType() === ASTNode.types.NEXT ||
58
+ newNode.getType() === ASTNode.types.BLOCK)) {
59
+ newNode = newNode.next();
60
+ }
61
+
62
+ if (newNode) {
63
+ this.setCurNode(newNode);
64
+ }
65
+ return newNode;
113
66
  }
114
- return newNode;
115
- };
116
67
 
117
- /**
118
- * Find the out connection, field, or block.
119
- * @return {ASTNode} The out element, or null if the current node is
120
- * not set or there is no out value.
121
- * @public
122
- */
123
- Cursor.prototype.out = function() {
124
- const curNode = this.getCurNode();
125
- if (!curNode) {
126
- return null;
68
+ /**
69
+ * Find the in connection or field.
70
+ * @return {ASTNode} The in element, or null if the current node is
71
+ * not set or there is no in value.
72
+ * @public
73
+ */
74
+ in() {
75
+ let curNode = this.getCurNode();
76
+ if (!curNode) {
77
+ return null;
78
+ }
79
+ // If we are on a previous or output connection, go to the block level
80
+ // before performing next operation.
81
+ if (curNode.getType() === ASTNode.types.PREVIOUS ||
82
+ curNode.getType() === ASTNode.types.OUTPUT) {
83
+ curNode = curNode.next();
84
+ }
85
+ const newNode = curNode.in();
86
+
87
+ if (newNode) {
88
+ this.setCurNode(newNode);
89
+ }
90
+ return newNode;
127
91
  }
128
- let newNode = curNode.out();
129
92
 
130
- if (newNode && newNode.getType() === ASTNode.types.BLOCK) {
131
- newNode = newNode.prev() || newNode;
93
+ /**
94
+ * Find the previous connection, field, or block.
95
+ * @return {ASTNode} The previous element, or null if the current node
96
+ * is not set or there is no previous value.
97
+ * @public
98
+ */
99
+ prev() {
100
+ const curNode = this.getCurNode();
101
+ if (!curNode) {
102
+ return null;
103
+ }
104
+ let newNode = curNode.prev();
105
+
106
+ while (newNode && newNode.prev() &&
107
+ (newNode.getType() === ASTNode.types.NEXT ||
108
+ newNode.getType() === ASTNode.types.BLOCK)) {
109
+ newNode = newNode.prev();
110
+ }
111
+
112
+ if (newNode) {
113
+ this.setCurNode(newNode);
114
+ }
115
+ return newNode;
132
116
  }
133
117
 
134
- if (newNode) {
135
- this.setCurNode(newNode);
118
+ /**
119
+ * Find the out connection, field, or block.
120
+ * @return {ASTNode} The out element, or null if the current node is
121
+ * not set or there is no out value.
122
+ * @public
123
+ */
124
+ out() {
125
+ const curNode = this.getCurNode();
126
+ if (!curNode) {
127
+ return null;
128
+ }
129
+ let newNode = curNode.out();
130
+
131
+ if (newNode && newNode.getType() === ASTNode.types.BLOCK) {
132
+ newNode = newNode.prev() || newNode;
133
+ }
134
+
135
+ if (newNode) {
136
+ this.setCurNode(newNode);
137
+ }
138
+ return newNode;
136
139
  }
137
- return newNode;
138
- };
140
+ }
139
141
 
140
142
  registry.register(registry.Type.CURSOR, registry.DEFAULT, Cursor);
141
143