@rcrsr/rill 0.1.0 → 0.2.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 (260) hide show
  1. package/README.md +16 -8
  2. package/dist/check/config.d.ts +20 -0
  3. package/dist/check/config.d.ts.map +1 -0
  4. package/dist/check/config.js +151 -0
  5. package/dist/check/config.js.map +1 -0
  6. package/dist/check/fixer.d.ts +39 -0
  7. package/dist/check/fixer.d.ts.map +1 -0
  8. package/dist/check/fixer.js +119 -0
  9. package/dist/check/fixer.js.map +1 -0
  10. package/dist/check/index.d.ts +10 -0
  11. package/dist/check/index.d.ts.map +1 -0
  12. package/dist/check/index.js +21 -0
  13. package/dist/check/index.js.map +1 -0
  14. package/dist/check/rules/anti-patterns.d.ts +65 -0
  15. package/dist/check/rules/anti-patterns.d.ts.map +1 -0
  16. package/dist/check/rules/anti-patterns.js +427 -0
  17. package/dist/check/rules/anti-patterns.js.map +1 -0
  18. package/dist/check/rules/closures.d.ts +66 -0
  19. package/dist/check/rules/closures.d.ts.map +1 -0
  20. package/dist/check/rules/closures.js +373 -0
  21. package/dist/check/rules/closures.js.map +1 -0
  22. package/dist/check/rules/collections.d.ts +90 -0
  23. package/dist/check/rules/collections.d.ts.map +1 -0
  24. package/dist/check/rules/collections.js +373 -0
  25. package/dist/check/rules/collections.js.map +1 -0
  26. package/dist/check/rules/conditionals.d.ts +41 -0
  27. package/dist/check/rules/conditionals.d.ts.map +1 -0
  28. package/dist/check/rules/conditionals.js +106 -0
  29. package/dist/check/rules/conditionals.js.map +1 -0
  30. package/dist/check/rules/flow.d.ts +46 -0
  31. package/dist/check/rules/flow.d.ts.map +1 -0
  32. package/dist/check/rules/flow.js +206 -0
  33. package/dist/check/rules/flow.js.map +1 -0
  34. package/dist/check/rules/formatting.d.ts +133 -0
  35. package/dist/check/rules/formatting.d.ts.map +1 -0
  36. package/dist/check/rules/formatting.js +639 -0
  37. package/dist/check/rules/formatting.js.map +1 -0
  38. package/dist/check/rules/helpers.d.ts +26 -0
  39. package/dist/check/rules/helpers.d.ts.map +1 -0
  40. package/dist/check/rules/helpers.js +66 -0
  41. package/dist/check/rules/helpers.js.map +1 -0
  42. package/dist/check/rules/index.d.ts +21 -0
  43. package/dist/check/rules/index.d.ts.map +1 -0
  44. package/dist/check/rules/index.js +78 -0
  45. package/dist/check/rules/index.js.map +1 -0
  46. package/dist/check/rules/loops.d.ts +70 -0
  47. package/dist/check/rules/loops.d.ts.map +1 -0
  48. package/dist/check/rules/loops.js +227 -0
  49. package/dist/check/rules/loops.js.map +1 -0
  50. package/dist/check/rules/naming.d.ts +21 -0
  51. package/dist/check/rules/naming.d.ts.map +1 -0
  52. package/dist/check/rules/naming.js +167 -0
  53. package/dist/check/rules/naming.js.map +1 -0
  54. package/dist/check/rules/strings.d.ts +28 -0
  55. package/dist/check/rules/strings.d.ts.map +1 -0
  56. package/dist/check/rules/strings.js +80 -0
  57. package/dist/check/rules/strings.js.map +1 -0
  58. package/dist/check/rules/types.d.ts +41 -0
  59. package/dist/check/rules/types.d.ts.map +1 -0
  60. package/dist/check/rules/types.js +162 -0
  61. package/dist/check/rules/types.js.map +1 -0
  62. package/dist/check/types.d.ts +106 -0
  63. package/dist/check/types.d.ts.map +1 -0
  64. package/dist/check/types.js +6 -0
  65. package/dist/check/types.js.map +1 -0
  66. package/dist/check/validator.d.ts +18 -0
  67. package/dist/check/validator.d.ts.map +1 -0
  68. package/dist/check/validator.js +88 -0
  69. package/dist/check/validator.js.map +1 -0
  70. package/dist/check/visitor.d.ts +33 -0
  71. package/dist/check/visitor.d.ts.map +1 -0
  72. package/dist/check/visitor.js +243 -0
  73. package/dist/check/visitor.js.map +1 -0
  74. package/dist/cli-check.d.ts +43 -0
  75. package/dist/cli-check.d.ts.map +1 -0
  76. package/dist/cli-check.js +356 -0
  77. package/dist/cli-check.js.map +1 -0
  78. package/dist/cli-eval.d.ts +15 -0
  79. package/dist/cli-eval.d.ts.map +1 -0
  80. package/dist/cli-eval.js +120 -0
  81. package/dist/cli-eval.js.map +1 -0
  82. package/dist/cli-exec.d.ts +49 -0
  83. package/dist/cli-exec.d.ts.map +1 -0
  84. package/dist/cli-exec.js +191 -0
  85. package/dist/cli-exec.js.map +1 -0
  86. package/dist/cli-module-loader.d.ts +19 -0
  87. package/dist/cli-module-loader.d.ts.map +1 -0
  88. package/dist/cli-module-loader.js +83 -0
  89. package/dist/cli-module-loader.js.map +1 -0
  90. package/dist/cli-shared.d.ts +36 -0
  91. package/dist/cli-shared.d.ts.map +1 -0
  92. package/dist/cli-shared.js +101 -0
  93. package/dist/cli-shared.js.map +1 -0
  94. package/dist/cli.d.ts +2 -0
  95. package/dist/cli.d.ts.map +1 -1
  96. package/dist/cli.js +4 -11
  97. package/dist/cli.js.map +1 -1
  98. package/dist/index.d.ts +1 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +1 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/lexer/readers.d.ts +1 -1
  103. package/dist/lexer/readers.d.ts.map +1 -1
  104. package/dist/lexer/readers.js +62 -32
  105. package/dist/lexer/readers.js.map +1 -1
  106. package/dist/lexer/tokenizer.d.ts.map +1 -1
  107. package/dist/lexer/tokenizer.js +5 -6
  108. package/dist/lexer/tokenizer.js.map +1 -1
  109. package/dist/parser/index.js +1 -1
  110. package/dist/parser/index.js.map +1 -1
  111. package/dist/parser/parser-expr.js +23 -5
  112. package/dist/parser/parser-expr.js.map +1 -1
  113. package/dist/parser/parser-functions.d.ts +2 -2
  114. package/dist/parser/parser-functions.d.ts.map +1 -1
  115. package/dist/parser/parser-functions.js +2 -1
  116. package/dist/parser/parser-functions.js.map +1 -1
  117. package/dist/parser/parser-literals.js +2 -2
  118. package/dist/parser/parser-literals.js.map +1 -1
  119. package/dist/parser/parser-script.js +9 -7
  120. package/dist/parser/parser-script.js.map +1 -1
  121. package/dist/parser/parser-variables.js +4 -3
  122. package/dist/parser/parser-variables.js.map +1 -1
  123. package/dist/runtime/core/callable.d.ts +5 -6
  124. package/dist/runtime/core/callable.d.ts.map +1 -1
  125. package/dist/runtime/core/callable.js.map +1 -1
  126. package/dist/runtime/core/context.d.ts.map +1 -1
  127. package/dist/runtime/core/context.js +19 -32
  128. package/dist/runtime/core/context.js.map +1 -1
  129. package/dist/runtime/core/equals.js +1 -1
  130. package/dist/runtime/core/equals.js.map +1 -1
  131. package/dist/runtime/core/eval/evaluator.d.ts +78 -0
  132. package/dist/runtime/core/eval/evaluator.d.ts.map +1 -1
  133. package/dist/runtime/core/eval/evaluator.js +78 -0
  134. package/dist/runtime/core/eval/evaluator.js.map +1 -1
  135. package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -1
  136. package/dist/runtime/core/eval/mixins/closures.js +9 -1
  137. package/dist/runtime/core/eval/mixins/closures.js.map +1 -1
  138. package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -1
  139. package/dist/runtime/core/eval/mixins/variables.js +143 -2
  140. package/dist/runtime/core/eval/mixins/variables.js.map +1 -1
  141. package/dist/runtime/core/types.d.ts +15 -2
  142. package/dist/runtime/core/types.d.ts.map +1 -1
  143. package/dist/runtime/core/types.js.map +1 -1
  144. package/dist/runtime/ext/extensions.d.ts +51 -0
  145. package/dist/runtime/ext/extensions.d.ts.map +1 -0
  146. package/dist/runtime/ext/extensions.js +67 -0
  147. package/dist/runtime/ext/extensions.js.map +1 -0
  148. package/dist/runtime/index.d.ts +3 -0
  149. package/dist/runtime/index.d.ts.map +1 -1
  150. package/dist/runtime/index.js +1 -0
  151. package/dist/runtime/index.js.map +1 -1
  152. package/dist/types.d.ts +8 -4
  153. package/dist/types.d.ts.map +1 -1
  154. package/dist/types.js +5 -4
  155. package/dist/types.js.map +1 -1
  156. package/docs/00_INDEX.md +1 -0
  157. package/docs/01_guide.md +3 -3
  158. package/docs/02_types.md +8 -10
  159. package/docs/03_variables.md +10 -0
  160. package/docs/04_operators.md +3 -3
  161. package/docs/05_control-flow.md +21 -0
  162. package/docs/07_collections.md +2 -0
  163. package/docs/10_parsing.md +9 -9
  164. package/docs/11_reference.md +1 -1
  165. package/docs/12_examples.md +36 -62
  166. package/docs/14_host-integration.md +116 -111
  167. package/docs/15_grammar.ebnf +1 -5
  168. package/docs/16_conventions.md +3 -4
  169. package/docs/17_cli-tools.md +184 -0
  170. package/docs/99_llm-reference.txt +46 -5
  171. package/package.json +13 -4
  172. package/dist/demo.d.ts +0 -6
  173. package/dist/demo.d.ts.map +0 -1
  174. package/dist/demo.js +0 -121
  175. package/dist/demo.js.map +0 -1
  176. package/dist/lexer.d.ts +0 -19
  177. package/dist/lexer.d.ts.map +0 -1
  178. package/dist/lexer.js +0 -344
  179. package/dist/lexer.js.map +0 -1
  180. package/dist/parser/arithmetic.d.ts +0 -16
  181. package/dist/parser/arithmetic.d.ts.map +0 -1
  182. package/dist/parser/arithmetic.js +0 -128
  183. package/dist/parser/arithmetic.js.map +0 -1
  184. package/dist/parser/boolean.d.ts +0 -15
  185. package/dist/parser/boolean.d.ts.map +0 -1
  186. package/dist/parser/boolean.js +0 -20
  187. package/dist/parser/boolean.js.map +0 -1
  188. package/dist/parser/control-flow.d.ts +0 -56
  189. package/dist/parser/control-flow.d.ts.map +0 -1
  190. package/dist/parser/control-flow.js +0 -167
  191. package/dist/parser/control-flow.js.map +0 -1
  192. package/dist/parser/expressions.d.ts +0 -23
  193. package/dist/parser/expressions.d.ts.map +0 -1
  194. package/dist/parser/expressions.js +0 -950
  195. package/dist/parser/expressions.js.map +0 -1
  196. package/dist/parser/extraction.d.ts +0 -48
  197. package/dist/parser/extraction.d.ts.map +0 -1
  198. package/dist/parser/extraction.js +0 -279
  199. package/dist/parser/extraction.js.map +0 -1
  200. package/dist/parser/functions.d.ts +0 -20
  201. package/dist/parser/functions.d.ts.map +0 -1
  202. package/dist/parser/functions.js +0 -96
  203. package/dist/parser/functions.js.map +0 -1
  204. package/dist/parser/literals.d.ts +0 -37
  205. package/dist/parser/literals.d.ts.map +0 -1
  206. package/dist/parser/literals.js +0 -373
  207. package/dist/parser/literals.js.map +0 -1
  208. package/dist/parser/script.d.ts +0 -14
  209. package/dist/parser/script.d.ts.map +0 -1
  210. package/dist/parser/script.js +0 -196
  211. package/dist/parser/script.js.map +0 -1
  212. package/dist/parser/variables.d.ts +0 -10
  213. package/dist/parser/variables.d.ts.map +0 -1
  214. package/dist/parser/variables.js +0 -215
  215. package/dist/parser/variables.js.map +0 -1
  216. package/dist/runtime/ast-equals.d.ts +0 -13
  217. package/dist/runtime/ast-equals.d.ts.map +0 -1
  218. package/dist/runtime/ast-equals.js +0 -447
  219. package/dist/runtime/ast-equals.js.map +0 -1
  220. package/dist/runtime/builtins.d.ts +0 -13
  221. package/dist/runtime/builtins.d.ts.map +0 -1
  222. package/dist/runtime/builtins.js +0 -180
  223. package/dist/runtime/builtins.js.map +0 -1
  224. package/dist/runtime/callable.d.ts +0 -88
  225. package/dist/runtime/callable.d.ts.map +0 -1
  226. package/dist/runtime/callable.js +0 -98
  227. package/dist/runtime/callable.js.map +0 -1
  228. package/dist/runtime/context.d.ts +0 -13
  229. package/dist/runtime/context.d.ts.map +0 -1
  230. package/dist/runtime/context.js +0 -73
  231. package/dist/runtime/context.js.map +0 -1
  232. package/dist/runtime/core/evaluate.d.ts +0 -42
  233. package/dist/runtime/core/evaluate.d.ts.map +0 -1
  234. package/dist/runtime/core/evaluate.debug.js +0 -1251
  235. package/dist/runtime/core/evaluate.js +0 -1913
  236. package/dist/runtime/core/evaluate.js.map +0 -1
  237. package/dist/runtime/evaluate.d.ts +0 -32
  238. package/dist/runtime/evaluate.d.ts.map +0 -1
  239. package/dist/runtime/evaluate.js +0 -1111
  240. package/dist/runtime/evaluate.js.map +0 -1
  241. package/dist/runtime/execute.d.ts +0 -26
  242. package/dist/runtime/execute.d.ts.map +0 -1
  243. package/dist/runtime/execute.js +0 -121
  244. package/dist/runtime/execute.js.map +0 -1
  245. package/dist/runtime/signals.d.ts +0 -19
  246. package/dist/runtime/signals.d.ts.map +0 -1
  247. package/dist/runtime/signals.js +0 -26
  248. package/dist/runtime/signals.js.map +0 -1
  249. package/dist/runtime/types.d.ts +0 -169
  250. package/dist/runtime/types.d.ts.map +0 -1
  251. package/dist/runtime/types.js +0 -50
  252. package/dist/runtime/types.js.map +0 -1
  253. package/dist/runtime/values.d.ts +0 -50
  254. package/dist/runtime/values.d.ts.map +0 -1
  255. package/dist/runtime/values.js +0 -209
  256. package/dist/runtime/values.js.map +0 -1
  257. package/dist/runtime.d.ts +0 -254
  258. package/dist/runtime.d.ts.map +0 -1
  259. package/dist/runtime.js +0 -2014
  260. package/dist/runtime.js.map +0 -1
@@ -0,0 +1,639 @@
1
+ /**
2
+ * Formatting Rules
3
+ * Enforces style conventions from docs/16_conventions.md:465-662.
4
+ */
5
+ import { extractContextLine, isBareReference } from './helpers.js';
6
+ // ============================================================
7
+ // SPACING_OPERATOR RULE
8
+ // ============================================================
9
+ /**
10
+ * Enforces space on both sides of operators.
11
+ * Operators like +, -, ->, :>, ==, etc. should have spaces on both sides.
12
+ *
13
+ * Detection:
14
+ * - Extract operator text from source using source spans
15
+ * - Check if space exists before/after operator
16
+ *
17
+ * References:
18
+ * - docs/16_conventions.md:467-482
19
+ */
20
+ export const SPACING_OPERATOR = {
21
+ code: 'SPACING_OPERATOR',
22
+ category: 'formatting',
23
+ severity: 'info',
24
+ nodeTypes: ['BinaryExpr', 'PipeChain', 'Capture'],
25
+ validate(node, context) {
26
+ const diagnostics = [];
27
+ if (node.type === 'BinaryExpr') {
28
+ const binaryNode = node;
29
+ const operator = binaryNode.op;
30
+ // Check spacing around operator in source
31
+ const violation = checkOperatorSpacing(operator, binaryNode.span, context.source);
32
+ if (violation) {
33
+ diagnostics.push({
34
+ location: binaryNode.span.start,
35
+ severity: 'info',
36
+ code: 'SPACING_OPERATOR',
37
+ message: `Operator '${operator}' should have spaces on both sides`,
38
+ context: extractContextLine(binaryNode.span.start.line, context.source),
39
+ fix: null, // Complex to fix without AST reconstruction
40
+ });
41
+ }
42
+ }
43
+ if (node.type === 'PipeChain') {
44
+ const pipeNode = node;
45
+ // Check -> operators between pipes
46
+ const violation = checkPipeSpacing(pipeNode.span, context.source);
47
+ if (violation) {
48
+ diagnostics.push({
49
+ location: pipeNode.span.start,
50
+ severity: 'info',
51
+ code: 'SPACING_OPERATOR',
52
+ message: "Pipe operator '->' should have spaces on both sides",
53
+ context: extractContextLine(pipeNode.span.start.line, context.source),
54
+ fix: null,
55
+ });
56
+ }
57
+ }
58
+ if (node.type === 'Capture') {
59
+ const captureNode = node;
60
+ // Check :> operator
61
+ const violation = checkCaptureSpacing(captureNode.span, context.source);
62
+ if (violation) {
63
+ diagnostics.push({
64
+ location: captureNode.span.start,
65
+ severity: 'info',
66
+ code: 'SPACING_OPERATOR',
67
+ message: "Capture operator ':>' should have spaces on both sides",
68
+ context: extractContextLine(captureNode.span.start.line, context.source),
69
+ fix: null,
70
+ });
71
+ }
72
+ }
73
+ return diagnostics;
74
+ },
75
+ };
76
+ /**
77
+ * Check if operator has proper spacing in source.
78
+ */
79
+ function checkOperatorSpacing(operator, span, source) {
80
+ const text = extractSpanText(span, source);
81
+ // Look for operator without spaces
82
+ const patterns = [
83
+ new RegExp(`\\S${escapeRegex(operator)}`), // No space before
84
+ new RegExp(`${escapeRegex(operator)}\\S`), // No space after
85
+ ];
86
+ return patterns.some((pattern) => pattern.test(text));
87
+ }
88
+ /**
89
+ * Check pipe operator spacing.
90
+ */
91
+ function checkPipeSpacing(span, source) {
92
+ const text = extractSpanText(span, source);
93
+ // Check for -> without spaces
94
+ return /\S->/.test(text) || /->[\S&&[^\s]]/.test(text);
95
+ }
96
+ /**
97
+ * Check capture operator spacing.
98
+ */
99
+ function checkCaptureSpacing(span, source) {
100
+ const text = extractSpanText(span, source);
101
+ // Check for :> without spaces
102
+ return /\S:>/.test(text) || /:>\S/.test(text);
103
+ }
104
+ // ============================================================
105
+ // SPACING_BRACES RULE
106
+ // ============================================================
107
+ /**
108
+ * Enforces space after { and before } in blocks.
109
+ * Braces for blocks, closures, etc. should have internal spacing.
110
+ *
111
+ * Detection:
112
+ * - Extract brace content from source
113
+ * - Check if opening { has space after, closing } has space before
114
+ *
115
+ * References:
116
+ * - docs/16_conventions.md:497-508
117
+ */
118
+ export const SPACING_BRACES = {
119
+ code: 'SPACING_BRACES',
120
+ category: 'formatting',
121
+ severity: 'info',
122
+ nodeTypes: ['Block', 'Closure'],
123
+ validate(node, context) {
124
+ const diagnostics = [];
125
+ const span = node.span;
126
+ // Extract source text for the node
127
+ const text = extractSpanText(span, context.source);
128
+ // Check for opening brace without space after
129
+ if (/\{[^\s]/.test(text) && !text.includes('{\n')) {
130
+ diagnostics.push({
131
+ location: span.start,
132
+ severity: 'info',
133
+ code: 'SPACING_BRACES',
134
+ message: 'Space required after opening brace {',
135
+ context: extractContextLine(span.start.line, context.source),
136
+ fix: null,
137
+ });
138
+ }
139
+ // Check for closing brace without space before
140
+ if (/[^\s]\}/.test(text) && !text.includes('\n}')) {
141
+ diagnostics.push({
142
+ location: span.start,
143
+ severity: 'info',
144
+ code: 'SPACING_BRACES',
145
+ message: 'Space required before closing brace }',
146
+ context: extractContextLine(span.start.line, context.source),
147
+ fix: null,
148
+ });
149
+ }
150
+ return diagnostics;
151
+ },
152
+ };
153
+ // ============================================================
154
+ // SPACING_BRACKETS RULE
155
+ // ============================================================
156
+ /**
157
+ * Enforces no inner spaces for indexing brackets.
158
+ * Array/dict indexing should use $list[0] not $list[ 0 ].
159
+ *
160
+ * Detection:
161
+ * - PostfixExpr nodes with index access
162
+ * - Check for spaces inside brackets
163
+ *
164
+ * References:
165
+ * - docs/16_conventions.md:526-535
166
+ */
167
+ export const SPACING_BRACKETS = {
168
+ code: 'SPACING_BRACKETS',
169
+ category: 'formatting',
170
+ severity: 'info',
171
+ nodeTypes: ['PostfixExpr'],
172
+ validate(node, context) {
173
+ const diagnostics = [];
174
+ const postfixNode = node;
175
+ // Only process if primary is a Variable (contains accessChain)
176
+ if (postfixNode.primary.type !== 'Variable') {
177
+ return diagnostics;
178
+ }
179
+ const variableNode = postfixNode.primary;
180
+ // Check each BracketAccess in the accessChain
181
+ for (const access of variableNode.accessChain) {
182
+ // Skip non-bracket accesses
183
+ if (!('accessKind' in access) || access.accessKind !== 'bracket') {
184
+ continue;
185
+ }
186
+ const bracketAccess = access;
187
+ // EC-3: Skip if span is missing (graceful handling)
188
+ if (!bracketAccess.span) {
189
+ continue;
190
+ }
191
+ // EC-4: Skip if span coordinates are invalid (graceful handling)
192
+ if (!bracketAccess.span.start ||
193
+ !bracketAccess.span.end ||
194
+ bracketAccess.span.start.line < 1 ||
195
+ bracketAccess.span.end.line < 1 ||
196
+ bracketAccess.span.start.column < 1 ||
197
+ bracketAccess.span.end.column < 1) {
198
+ continue;
199
+ }
200
+ // Extract text from bracket span
201
+ const text = extractSpanText(bracketAccess.span, context.source);
202
+ // Check for space after opening bracket: /\[\s/
203
+ // Check for space before closing bracket: /\s\]/
204
+ const hasSpaceAfterOpen = /\[\s/.test(text);
205
+ const hasSpaceBeforeClose = /\s\]/.test(text);
206
+ if (hasSpaceAfterOpen || hasSpaceBeforeClose) {
207
+ // Extract content between brackets for error message
208
+ const content = text.substring(1, text.length - 1).trim();
209
+ diagnostics.push({
210
+ location: bracketAccess.span.start,
211
+ severity: 'info',
212
+ code: 'SPACING_BRACKETS',
213
+ message: `No spaces inside brackets: remove spaces around ${content}`,
214
+ context: extractContextLine(bracketAccess.span.start.line, context.source),
215
+ fix: null,
216
+ });
217
+ }
218
+ }
219
+ return diagnostics;
220
+ },
221
+ fix(node, context) {
222
+ const postfixNode = node;
223
+ // Only process if primary is a Variable (contains accessChain)
224
+ if (postfixNode.primary.type !== 'Variable') {
225
+ return null;
226
+ }
227
+ const variableNode = postfixNode.primary;
228
+ // Find the first BracketAccess with spacing violation
229
+ for (const access of variableNode.accessChain) {
230
+ // Skip non-bracket accesses
231
+ if (!('accessKind' in access) || access.accessKind !== 'bracket') {
232
+ continue;
233
+ }
234
+ const bracketAccess = access;
235
+ // Skip if span is missing or invalid
236
+ if (!bracketAccess.span ||
237
+ !bracketAccess.span.start ||
238
+ !bracketAccess.span.end ||
239
+ bracketAccess.span.start.line < 1 ||
240
+ bracketAccess.span.end.line < 1 ||
241
+ bracketAccess.span.start.column < 1 ||
242
+ bracketAccess.span.end.column < 1) {
243
+ continue;
244
+ }
245
+ // Extract text from bracket span
246
+ const text = extractSpanText(bracketAccess.span, context.source);
247
+ // Check for spacing violations
248
+ const hasSpaceAfterOpen = /\[\s/.test(text);
249
+ const hasSpaceBeforeClose = /\s\]/.test(text);
250
+ if (hasSpaceAfterOpen || hasSpaceBeforeClose) {
251
+ // Build replacement text by removing inner spaces
252
+ // Replace [ followed by whitespace with [
253
+ // Replace whitespace followed by ] with ]
254
+ const replacement = text.replace(/\[\s+/g, '[').replace(/\s+\]/g, ']');
255
+ return {
256
+ description: 'Remove spaces inside brackets',
257
+ applicable: true,
258
+ range: bracketAccess.span,
259
+ replacement,
260
+ };
261
+ }
262
+ }
263
+ // No fixable violation found
264
+ return null;
265
+ },
266
+ };
267
+ // ============================================================
268
+ // SPACING_CLOSURE RULE
269
+ // ============================================================
270
+ /**
271
+ * Enforces no space before pipe, space after in closures.
272
+ * Closure parameters: |x| not | x |.
273
+ *
274
+ * Detection:
275
+ * - Extract closure parameter section from source
276
+ * - Check spacing around pipes
277
+ *
278
+ * References:
279
+ * - docs/16_conventions.md:549-560
280
+ */
281
+ export const SPACING_CLOSURE = {
282
+ code: 'SPACING_CLOSURE',
283
+ category: 'formatting',
284
+ severity: 'info',
285
+ nodeTypes: ['Closure'],
286
+ validate(node, context) {
287
+ const diagnostics = [];
288
+ const closureNode = node;
289
+ const text = extractSpanText(closureNode.span, context.source);
290
+ // Check for space before opening pipe
291
+ if (/\s\|/.test(text.substring(0, text.indexOf('|') + 1))) {
292
+ diagnostics.push({
293
+ location: closureNode.span.start,
294
+ severity: 'info',
295
+ code: 'SPACING_CLOSURE',
296
+ message: 'No space before opening pipe in closure parameters',
297
+ context: extractContextLine(closureNode.span.start.line, context.source),
298
+ fix: null,
299
+ });
300
+ }
301
+ // Check for missing space after params (only if params exist)
302
+ if (closureNode.params.length > 0) {
303
+ // Look for pattern |params|( or |params|{ without space
304
+ const afterPipeIdx = text.lastIndexOf('|', text.indexOf('{') || text.indexOf('('));
305
+ if (afterPipeIdx !== -1) {
306
+ const afterPipe = text.substring(afterPipeIdx + 1, afterPipeIdx + 2);
307
+ if (afterPipe &&
308
+ /[^\s]/.test(afterPipe) &&
309
+ afterPipe !== '{' &&
310
+ afterPipe !== '(') {
311
+ // This is complex - skip for now as it requires better parsing
312
+ }
313
+ }
314
+ }
315
+ return diagnostics;
316
+ },
317
+ };
318
+ // ============================================================
319
+ // INDENT_CONTINUATION RULE
320
+ // ============================================================
321
+ /**
322
+ * Enforces 2-space indent for continued lines.
323
+ * Pipe chains should indent continuation lines by 2 spaces.
324
+ *
325
+ * Detection:
326
+ * - Multi-line pipe chains
327
+ * - Check indentation of continuation lines
328
+ *
329
+ * References:
330
+ * - docs/16_conventions.md:636-662
331
+ */
332
+ export const INDENT_CONTINUATION = {
333
+ code: 'INDENT_CONTINUATION',
334
+ category: 'formatting',
335
+ severity: 'info',
336
+ nodeTypes: ['PipeChain'],
337
+ validate(node, context) {
338
+ const diagnostics = [];
339
+ const pipeNode = node;
340
+ // EC-5: Single-line chain - Return []
341
+ if (pipeNode.span.start.line === pipeNode.span.end.line) {
342
+ return [];
343
+ }
344
+ // Extract full text and check continuation indentation
345
+ const text = extractSpanText(pipeNode.span, context.source);
346
+ const lines = text.split('\n');
347
+ // KNOWN LIMITATION: This rule validates multi-line pipe chains where the pipe
348
+ // operator (`->`) and its target appear on the same line. The parser requires
349
+ // pipe targets to be on the same line as the `->` operator, so patterns like
350
+ // `value ->\n .method()` are invalid. See tests/language/statement-boundaries.test.ts:211-215
351
+ // for authoritative language behavior.
352
+ if (lines.length > 1) {
353
+ // Check each continuation line (skip first line which establishes baseline)
354
+ for (let i = 1; i < lines.length; i++) {
355
+ const line = lines[i];
356
+ // EC-6: Empty continuation line - Skip line
357
+ if (!line)
358
+ continue;
359
+ const indent = line.match(/^(\s*)/)?.[1] || '';
360
+ // Continuation = line starting with -> (after whitespace)
361
+ // Should have at least 2 spaces for continuation
362
+ if (line.trim().startsWith('->') && indent.length < 2) {
363
+ diagnostics.push({
364
+ location: {
365
+ line: pipeNode.span.start.line + i,
366
+ column: 1,
367
+ offset: 0,
368
+ },
369
+ severity: 'info',
370
+ code: 'INDENT_CONTINUATION',
371
+ message: 'Continuation lines should be indented by 2 spaces',
372
+ context: line.trim(),
373
+ fix: null,
374
+ });
375
+ }
376
+ }
377
+ }
378
+ return diagnostics;
379
+ },
380
+ };
381
+ // ============================================================
382
+ // IMPLICIT_DOLLAR_METHOD RULE
383
+ // ============================================================
384
+ /**
385
+ * Detect explicit $.method() patterns replaceable with .method.
386
+ *
387
+ * Flags method calls where the receiver is a bare $ (pipe variable).
388
+ * The implicit form .method is preferred when $ represents the current
389
+ * piped value (e.g., in blocks, closures, conditionals).
390
+ *
391
+ * Detection:
392
+ * - MethodCallNode with non-null receiverSpan
393
+ * - Receiver is bare $ (zero-width or single-char span)
394
+ * - Method call is first in chain (receiverSpan.end.offset <= 1)
395
+ *
396
+ * Note: Cannot use isBareReference() helper here because MethodCallNode.receiverSpan
397
+ * is a SourceSpan (position range), not an ExpressionNode. The helper requires
398
+ * an AST node to traverse. Instead, we detect bare $ by checking:
399
+ * 1. receiverSpan is zero-width (start == end) or single-char
400
+ * 2. Character at offset is '$'
401
+ * 3. Next character is '.' (not a variable name continuation)
402
+ *
403
+ * Examples:
404
+ * - $.upper() -> .upper
405
+ * - $.len -> .len
406
+ * - $.trim().upper() -> First method flagged, second is chained (not bare $)
407
+ *
408
+ * Not flagged:
409
+ * - .upper (receiverSpan is null)
410
+ * - $var.method() (receiverSpan is not bare $)
411
+ * - $.trim().upper() second method (receiverSpan covers $.trim())
412
+ *
413
+ * References:
414
+ * - docs/16_conventions.md:587-598
415
+ */
416
+ export const IMPLICIT_DOLLAR_METHOD = {
417
+ code: 'IMPLICIT_DOLLAR_METHOD',
418
+ category: 'formatting',
419
+ severity: 'info',
420
+ nodeTypes: ['MethodCall'],
421
+ validate(node, context) {
422
+ const methodNode = node;
423
+ // EC-7: No receiverSpan means implicit receiver (already correct form)
424
+ if (methodNode.receiverSpan === null) {
425
+ return [];
426
+ }
427
+ // Detect bare $ receiver by analyzing the receiverSpan
428
+ // For bare $, the span is either:
429
+ // 1. Zero-width (start.offset == end.offset) at the $ character
430
+ // 2. Single-char span covering just $
431
+ const receiverSpan = methodNode.receiverSpan;
432
+ const spanLength = receiverSpan.end.offset - receiverSpan.start.offset;
433
+ // EC-8: Receiver is not bare $ if span is longer than 1 character
434
+ // This filters out chains like $.trim().upper() where second method
435
+ // has receiverSpan covering "$.trim()."
436
+ if (spanLength > 1) {
437
+ return [];
438
+ }
439
+ // Check that the character at the span is '$' and not part of a variable name
440
+ const offset = receiverSpan.start.offset;
441
+ const charAtOffset = context.source[offset];
442
+ const nextChar = context.source[offset + 1];
443
+ // Must be '$' followed by '.' (method call)
444
+ // This distinguishes $.method() from $var.method()
445
+ if (charAtOffset !== '$' || nextChar !== '.') {
446
+ return [];
447
+ }
448
+ // Generate diagnostic for bare $ receiver
449
+ const suggestedCode = methodNode.args.length === 0
450
+ ? `.${methodNode.name}`
451
+ : `.${methodNode.name}()`;
452
+ return [
453
+ {
454
+ code: 'IMPLICIT_DOLLAR_METHOD',
455
+ message: `Prefer implicit '${suggestedCode}' over explicit '$.${methodNode.name}()'`,
456
+ severity: 'info',
457
+ location: {
458
+ line: methodNode.span.start.line,
459
+ column: methodNode.span.start.column,
460
+ offset: methodNode.span.start.offset,
461
+ },
462
+ context: extractContextLine(methodNode.span.start.line, context.source),
463
+ fix: null,
464
+ },
465
+ ];
466
+ },
467
+ };
468
+ // ============================================================
469
+ // IMPLICIT_DOLLAR_FUNCTION RULE
470
+ // ============================================================
471
+ /**
472
+ * Prefer foo over foo($) for global function calls.
473
+ * When single argument is bare $, prefer implicit form.
474
+ *
475
+ * Detection:
476
+ * - HostCall with single argument that is bare $
477
+ *
478
+ * References:
479
+ * - docs/16_conventions.md:599-607
480
+ */
481
+ export const IMPLICIT_DOLLAR_FUNCTION = {
482
+ code: 'IMPLICIT_DOLLAR_FUNCTION',
483
+ category: 'formatting',
484
+ severity: 'info',
485
+ nodeTypes: ['HostCall'],
486
+ validate(node, context) {
487
+ const hostCallNode = node;
488
+ // EC-9: Zero args - Return []
489
+ if (hostCallNode.args.length === 0) {
490
+ return [];
491
+ }
492
+ // EC-10: Multiple args - Return []
493
+ if (hostCallNode.args.length > 1) {
494
+ return [];
495
+ }
496
+ // EC-11: Single arg not bare $ - Return []
497
+ const singleArg = hostCallNode.args[0];
498
+ if (!isBareReference(singleArg)) {
499
+ return [];
500
+ }
501
+ // Generate diagnostic for bare $ argument
502
+ return [
503
+ {
504
+ code: 'IMPLICIT_DOLLAR_FUNCTION',
505
+ message: `Prefer pipe syntax '-> ${hostCallNode.name}' over explicit '${hostCallNode.name}($)'`,
506
+ severity: 'info',
507
+ location: {
508
+ line: hostCallNode.span.start.line,
509
+ column: hostCallNode.span.start.column,
510
+ offset: hostCallNode.span.start.offset,
511
+ },
512
+ context: extractContextLine(hostCallNode.span.start.line, context.source),
513
+ fix: null,
514
+ },
515
+ ];
516
+ },
517
+ };
518
+ // ============================================================
519
+ // IMPLICIT_DOLLAR_CLOSURE RULE
520
+ // ============================================================
521
+ /**
522
+ * Prefer $fn over $fn($) for closure invocation.
523
+ * When single argument is bare $, prefer implicit form.
524
+ *
525
+ * Detection:
526
+ * - ClosureCall with single argument that is bare $
527
+ *
528
+ * References:
529
+ * - docs/16_conventions.md:608-615
530
+ */
531
+ export const IMPLICIT_DOLLAR_CLOSURE = {
532
+ code: 'IMPLICIT_DOLLAR_CLOSURE',
533
+ category: 'formatting',
534
+ severity: 'info',
535
+ nodeTypes: ['ClosureCall'],
536
+ validate(node, context) {
537
+ const closureCallNode = node;
538
+ // EC-12: Zero args - Return []
539
+ if (closureCallNode.args.length === 0) {
540
+ return [];
541
+ }
542
+ // EC-13: Multiple args - Return []
543
+ if (closureCallNode.args.length > 1) {
544
+ return [];
545
+ }
546
+ // EC-14: Single arg not bare $ - Return []
547
+ const singleArg = closureCallNode.args[0];
548
+ if (!isBareReference(singleArg)) {
549
+ return [];
550
+ }
551
+ // Build closure name with access chain for display
552
+ const closureName = closureCallNode.accessChain.length > 0
553
+ ? `$${closureCallNode.name}.${closureCallNode.accessChain.join('.')}`
554
+ : `$${closureCallNode.name}`;
555
+ // Generate diagnostic for bare $ argument
556
+ return [
557
+ {
558
+ code: 'IMPLICIT_DOLLAR_CLOSURE',
559
+ message: `Prefer pipe syntax '-> ${closureName}' over explicit '${closureName}($)'`,
560
+ severity: 'info',
561
+ location: {
562
+ line: closureCallNode.span.start.line,
563
+ column: closureCallNode.span.start.column,
564
+ offset: closureCallNode.span.start.offset,
565
+ },
566
+ context: extractContextLine(closureCallNode.span.start.line, context.source),
567
+ fix: null,
568
+ },
569
+ ];
570
+ },
571
+ };
572
+ // ============================================================
573
+ // THROWAWAY_CAPTURE RULE
574
+ // ============================================================
575
+ /**
576
+ * Warns on capture-only-to-continue patterns.
577
+ * Capturing a value just to use it immediately in the next line is unnecessary.
578
+ *
579
+ * Detection:
580
+ * - Capture node followed by immediate use of that variable only
581
+ * - Variable not referenced later in the script
582
+ *
583
+ * References:
584
+ * - docs/16_conventions.md:617-634
585
+ */
586
+ export const THROWAWAY_CAPTURE = {
587
+ code: 'THROWAWAY_CAPTURE',
588
+ category: 'formatting',
589
+ severity: 'info',
590
+ nodeTypes: ['Capture'],
591
+ validate(_node, _context) {
592
+ // [DEBT] Stubbed - Requires full script analysis across statement boundaries
593
+ // Must track: 1) All captures 2) All variable references 3) Single-use detection
594
+ return [];
595
+ },
596
+ };
597
+ // ============================================================
598
+ // HELPER FUNCTIONS
599
+ // ============================================================
600
+ /**
601
+ * Extract text from source using span coordinates.
602
+ */
603
+ function extractSpanText(span, source) {
604
+ const lines = source.split('\n');
605
+ if (span.start.line === span.end.line) {
606
+ // Single line
607
+ const line = lines[span.start.line - 1];
608
+ if (!line)
609
+ return '';
610
+ return line.substring(span.start.column - 1, span.end.column - 1);
611
+ }
612
+ // Multi-line
613
+ const result = [];
614
+ for (let i = span.start.line - 1; i < span.end.line; i++) {
615
+ const line = lines[i];
616
+ if (!line)
617
+ continue;
618
+ if (i === span.start.line - 1) {
619
+ // First line: from start column to end
620
+ result.push(line.substring(span.start.column - 1));
621
+ }
622
+ else if (i === span.end.line - 1) {
623
+ // Last line: from start to end column
624
+ result.push(line.substring(0, span.end.column - 1));
625
+ }
626
+ else {
627
+ // Middle lines: full line
628
+ result.push(line);
629
+ }
630
+ }
631
+ return result.join('\n');
632
+ }
633
+ /**
634
+ * Escape special regex characters.
635
+ */
636
+ function escapeRegex(str) {
637
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
638
+ }
639
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../src/check/rules/formatting.ts"],"names":[],"mappings":"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"}