spade-packager 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. data/.gitignore +2 -0
  2. data/.gitmodules +6 -0
  3. data/bin/spadepkg +8 -0
  4. data/lib/libgems_ext.rb +8 -0
  5. data/lib/libgems_ext/config_file.rb +33 -0
  6. data/lib/libgems_ext/dependency_installer.rb +150 -0
  7. data/lib/libgems_ext/installer.rb +39 -0
  8. data/lib/libgems_ext/libgems.rb +39 -0
  9. data/lib/libgems_ext/spec_fetcher.rb +11 -0
  10. data/lib/spade-packager.rb +1 -0
  11. data/lib/spade/packager.rb +18 -0
  12. data/lib/spade/packager/cli.rb +9 -0
  13. data/lib/spade/packager/cli/base.rb +196 -0
  14. data/lib/spade/packager/cli/owner.rb +46 -0
  15. data/lib/spade/packager/cli/project_generator.rb +117 -0
  16. data/lib/spade/packager/credentials.rb +38 -0
  17. data/lib/spade/packager/local.rb +50 -0
  18. data/lib/spade/packager/package.rb +160 -0
  19. data/lib/spade/packager/remote.rb +98 -0
  20. data/lib/spade/packager/repository.rb +18 -0
  21. data/lib/spade/packager/version.rb +5 -0
  22. data/packages/coffee-script/.gitignore +8 -0
  23. data/packages/coffee-script/.npmignore +11 -0
  24. data/packages/coffee-script/Cakefile +229 -0
  25. data/packages/coffee-script/LICENSE +22 -0
  26. data/packages/coffee-script/README +47 -0
  27. data/packages/coffee-script/Rakefile +78 -0
  28. data/packages/coffee-script/bin/cake +7 -0
  29. data/packages/coffee-script/bin/coffee +7 -0
  30. data/packages/coffee-script/documentation/coffee/aliases.coffee +11 -0
  31. data/packages/coffee-script/documentation/coffee/array_comprehensions.coffee +2 -0
  32. data/packages/coffee-script/documentation/coffee/block_comment.coffee +6 -0
  33. data/packages/coffee-script/documentation/coffee/cake_tasks.coffee +9 -0
  34. data/packages/coffee-script/documentation/coffee/classes.coffee +25 -0
  35. data/packages/coffee-script/documentation/coffee/comparisons.coffee +5 -0
  36. data/packages/coffee-script/documentation/coffee/conditionals.coffee +13 -0
  37. data/packages/coffee-script/documentation/coffee/default_args.coffee +8 -0
  38. data/packages/coffee-script/documentation/coffee/do.coffee +4 -0
  39. data/packages/coffee-script/documentation/coffee/embedded.coffee +5 -0
  40. data/packages/coffee-script/documentation/coffee/existence.coffee +10 -0
  41. data/packages/coffee-script/documentation/coffee/expressions.coffee +9 -0
  42. data/packages/coffee-script/documentation/coffee/expressions_assignment.coffee +3 -0
  43. data/packages/coffee-script/documentation/coffee/expressions_comprehension.coffee +3 -0
  44. data/packages/coffee-script/documentation/coffee/expressions_try.coffee +7 -0
  45. data/packages/coffee-script/documentation/coffee/fat_arrow.coffee +6 -0
  46. data/packages/coffee-script/documentation/coffee/functions.coffee +2 -0
  47. data/packages/coffee-script/documentation/coffee/heredocs.coffee +7 -0
  48. data/packages/coffee-script/documentation/coffee/heregexes.coffee +11 -0
  49. data/packages/coffee-script/documentation/coffee/interpolation.coffee +6 -0
  50. data/packages/coffee-script/documentation/coffee/multiple_return_values.coffee +7 -0
  51. data/packages/coffee-script/documentation/coffee/object_comprehensions.coffee +4 -0
  52. data/packages/coffee-script/documentation/coffee/object_extraction.coffee +13 -0
  53. data/packages/coffee-script/documentation/coffee/objects_and_arrays.coffee +19 -0
  54. data/packages/coffee-script/documentation/coffee/objects_reserved.coffee +5 -0
  55. data/packages/coffee-script/documentation/coffee/overview.coffee +28 -0
  56. data/packages/coffee-script/documentation/coffee/parallel_assignment.coffee +6 -0
  57. data/packages/coffee-script/documentation/coffee/patterns_and_splats.coffee +7 -0
  58. data/packages/coffee-script/documentation/coffee/prototypes.coffee +3 -0
  59. data/packages/coffee-script/documentation/coffee/range_comprehensions.coffee +2 -0
  60. data/packages/coffee-script/documentation/coffee/scope.coffee +5 -0
  61. data/packages/coffee-script/documentation/coffee/slices.coffee +7 -0
  62. data/packages/coffee-script/documentation/coffee/soaks.coffee +1 -0
  63. data/packages/coffee-script/documentation/coffee/splats.coffee +27 -0
  64. data/packages/coffee-script/documentation/coffee/splices.coffee +5 -0
  65. data/packages/coffee-script/documentation/coffee/strings.coffee +8 -0
  66. data/packages/coffee-script/documentation/coffee/switch.coffee +10 -0
  67. data/packages/coffee-script/documentation/coffee/try.coffee +8 -0
  68. data/packages/coffee-script/documentation/coffee/while.coffee +10 -0
  69. data/packages/coffee-script/documentation/css/docs.css +374 -0
  70. data/packages/coffee-script/documentation/css/idle.css +64 -0
  71. data/packages/coffee-script/documentation/docs/browser.html +25 -0
  72. data/packages/coffee-script/documentation/docs/cake.html +43 -0
  73. data/packages/coffee-script/documentation/docs/coffee-script.html +51 -0
  74. data/packages/coffee-script/documentation/docs/command.html +161 -0
  75. data/packages/coffee-script/documentation/docs/docco.css +186 -0
  76. data/packages/coffee-script/documentation/docs/grammar.html +399 -0
  77. data/packages/coffee-script/documentation/docs/helpers.html +31 -0
  78. data/packages/coffee-script/documentation/docs/index.html +3 -0
  79. data/packages/coffee-script/documentation/docs/lexer.html +490 -0
  80. data/packages/coffee-script/documentation/docs/nodes.html +1338 -0
  81. data/packages/coffee-script/documentation/docs/optparse.html +78 -0
  82. data/packages/coffee-script/documentation/docs/repl.html +24 -0
  83. data/packages/coffee-script/documentation/docs/rewriter.html +251 -0
  84. data/packages/coffee-script/documentation/docs/scope.html +54 -0
  85. data/packages/coffee-script/documentation/docs/underscore.html +295 -0
  86. data/packages/coffee-script/documentation/images/background.png +0 -0
  87. data/packages/coffee-script/documentation/images/banding.png +0 -0
  88. data/packages/coffee-script/documentation/images/button_bg.png +0 -0
  89. data/packages/coffee-script/documentation/images/button_bg_dark.gif +0 -0
  90. data/packages/coffee-script/documentation/images/button_bg_green.gif +0 -0
  91. data/packages/coffee-script/documentation/images/favicon.ico +0 -0
  92. data/packages/coffee-script/documentation/images/logo.png +0 -0
  93. data/packages/coffee-script/documentation/images/screenshadow.png +0 -0
  94. data/packages/coffee-script/documentation/index.html.erb +1607 -0
  95. data/packages/coffee-script/documentation/js/aliases.js +17 -0
  96. data/packages/coffee-script/documentation/js/array_comprehensions.js +6 -0
  97. data/packages/coffee-script/documentation/js/block_comment.js +4 -0
  98. data/packages/coffee-script/documentation/js/cake_tasks.js +10 -0
  99. data/packages/coffee-script/documentation/js/classes.js +44 -0
  100. data/packages/coffee-script/documentation/js/comparisons.js +3 -0
  101. data/packages/coffee-script/documentation/js/conditionals.js +12 -0
  102. data/packages/coffee-script/documentation/js/default_args.js +7 -0
  103. data/packages/coffee-script/documentation/js/do.js +10 -0
  104. data/packages/coffee-script/documentation/js/embedded.js +4 -0
  105. data/packages/coffee-script/documentation/js/existence.js +6 -0
  106. data/packages/coffee-script/documentation/js/expressions.js +15 -0
  107. data/packages/coffee-script/documentation/js/expressions_assignment.js +2 -0
  108. data/packages/coffee-script/documentation/js/expressions_comprehension.js +9 -0
  109. data/packages/coffee-script/documentation/js/expressions_try.js +7 -0
  110. data/packages/coffee-script/documentation/js/fat_arrow.js +9 -0
  111. data/packages/coffee-script/documentation/js/functions.js +7 -0
  112. data/packages/coffee-script/documentation/js/heredocs.js +2 -0
  113. data/packages/coffee-script/documentation/js/heregexes.js +2 -0
  114. data/packages/coffee-script/documentation/js/interpolation.js +4 -0
  115. data/packages/coffee-script/documentation/js/multiple_return_values.js +5 -0
  116. data/packages/coffee-script/documentation/js/object_comprehensions.js +15 -0
  117. data/packages/coffee-script/documentation/js/object_extraction.js +10 -0
  118. data/packages/coffee-script/documentation/js/objects_and_arrays.js +17 -0
  119. data/packages/coffee-script/documentation/js/objects_reserved.js +4 -0
  120. data/packages/coffee-script/documentation/js/overview.js +35 -0
  121. data/packages/coffee-script/documentation/js/parallel_assignment.js +4 -0
  122. data/packages/coffee-script/documentation/js/patterns_and_splats.js +4 -0
  123. data/packages/coffee-script/documentation/js/prototypes.js +3 -0
  124. data/packages/coffee-script/documentation/js/range_comprehensions.js +9 -0
  125. data/packages/coffee-script/documentation/js/scope.js +8 -0
  126. data/packages/coffee-script/documentation/js/slices.js +4 -0
  127. data/packages/coffee-script/documentation/js/soaks.js +2 -0
  128. data/packages/coffee-script/documentation/js/splats.js +15 -0
  129. data/packages/coffee-script/documentation/js/splices.js +3 -0
  130. data/packages/coffee-script/documentation/js/strings.js +2 -0
  131. data/packages/coffee-script/documentation/js/switch.js +23 -0
  132. data/packages/coffee-script/documentation/js/try.js +8 -0
  133. data/packages/coffee-script/documentation/js/while.js +18 -0
  134. data/packages/coffee-script/documentation/vendor/jquery-1.4.2.js +6240 -0
  135. data/packages/coffee-script/examples/beautiful_code/binary_search.coffee +16 -0
  136. data/packages/coffee-script/examples/beautiful_code/quicksort_runtime.coffee +13 -0
  137. data/packages/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee +34 -0
  138. data/packages/coffee-script/examples/blocks.coffee +54 -0
  139. data/packages/coffee-script/examples/code.coffee +167 -0
  140. data/packages/coffee-script/examples/computer_science/README +4 -0
  141. data/packages/coffee-script/examples/computer_science/binary_search.coffee +25 -0
  142. data/packages/coffee-script/examples/computer_science/bubble_sort.coffee +11 -0
  143. data/packages/coffee-script/examples/computer_science/linked_list.coffee +108 -0
  144. data/packages/coffee-script/examples/computer_science/luhn_algorithm.coffee +36 -0
  145. data/packages/coffee-script/examples/computer_science/merge_sort.coffee +19 -0
  146. data/packages/coffee-script/examples/computer_science/selection_sort.coffee +23 -0
  147. data/packages/coffee-script/examples/poignant.coffee +181 -0
  148. data/packages/coffee-script/examples/potion.coffee +206 -0
  149. data/packages/coffee-script/examples/underscore.coffee +682 -0
  150. data/packages/coffee-script/examples/web_server.coffee +12 -0
  151. data/packages/coffee-script/extras/EXTRAS +7 -0
  152. data/packages/coffee-script/extras/coffee-script.js +8 -0
  153. data/packages/coffee-script/extras/jsl.conf +44 -0
  154. data/packages/coffee-script/index.html +2515 -0
  155. data/packages/coffee-script/lib/browser.js +52 -0
  156. data/packages/coffee-script/lib/cake.js +76 -0
  157. data/packages/coffee-script/lib/coffee-script.js +82 -0
  158. data/packages/coffee-script/lib/command.js +263 -0
  159. data/packages/coffee-script/lib/grammar.js +581 -0
  160. data/packages/coffee-script/lib/helpers.js +66 -0
  161. data/packages/coffee-script/lib/index.js +8 -0
  162. data/packages/coffee-script/lib/lexer.js +633 -0
  163. data/packages/coffee-script/lib/nodes.js +2165 -0
  164. data/packages/coffee-script/lib/optparse.js +111 -0
  165. data/packages/coffee-script/lib/parser.js +649 -0
  166. data/packages/coffee-script/lib/repl.js +42 -0
  167. data/packages/coffee-script/lib/rewriter.js +353 -0
  168. data/packages/coffee-script/lib/scope.js +120 -0
  169. data/packages/coffee-script/lib/spade-format.js +45 -0
  170. data/packages/coffee-script/package.json +26 -0
  171. data/packages/coffee-script/src/browser.coffee +43 -0
  172. data/packages/coffee-script/src/cake.coffee +69 -0
  173. data/packages/coffee-script/src/coffee-script.coffee +92 -0
  174. data/packages/coffee-script/src/command.coffee +214 -0
  175. data/packages/coffee-script/src/grammar.coffee +590 -0
  176. data/packages/coffee-script/src/helpers.coffee +56 -0
  177. data/packages/coffee-script/src/index.coffee +2 -0
  178. data/packages/coffee-script/src/lexer.coffee +653 -0
  179. data/packages/coffee-script/src/nodes.coffee +1754 -0
  180. data/packages/coffee-script/src/optparse.coffee +99 -0
  181. data/packages/coffee-script/src/repl.coffee +42 -0
  182. data/packages/coffee-script/src/rewriter.coffee +326 -0
  183. data/packages/coffee-script/src/scope.coffee +94 -0
  184. data/packages/coffee-script/test/arguments.coffee +127 -0
  185. data/packages/coffee-script/test/assignment.coffee +98 -0
  186. data/packages/coffee-script/test/break.coffee +18 -0
  187. data/packages/coffee-script/test/comments.coffee +201 -0
  188. data/packages/coffee-script/test/conditionals.coffee +181 -0
  189. data/packages/coffee-script/test/exception_handling.coffee +90 -0
  190. data/packages/coffee-script/test/helpers.coffee +96 -0
  191. data/packages/coffee-script/test/importing.coffee +18 -0
  192. data/packages/coffee-script/test/operators.coffee +225 -0
  193. data/packages/coffee-script/test/ranges_slices_and_splices.coffee +186 -0
  194. data/packages/coffee-script/test/regular_expressions.coffee +56 -0
  195. data/packages/coffee-script/test/test.html +123 -0
  196. data/packages/coffee-script/test/test_chaining.coffee +77 -0
  197. data/packages/coffee-script/test/test_classes.coffee +372 -0
  198. data/packages/coffee-script/test/test_compilation.coffee +26 -0
  199. data/packages/coffee-script/test/test_comprehensions.coffee +318 -0
  200. data/packages/coffee-script/test/test_existence.coffee +165 -0
  201. data/packages/coffee-script/test/test_functions.coffee +379 -0
  202. data/packages/coffee-script/test/test_heredocs.coffee +111 -0
  203. data/packages/coffee-script/test/test_literals.coffee +270 -0
  204. data/packages/coffee-script/test/test_option_parser.coffee +27 -0
  205. data/packages/coffee-script/test/test_pattern_matching.coffee +162 -0
  206. data/packages/coffee-script/test/test_returns.coffee +63 -0
  207. data/packages/coffee-script/test/test_splats.coffee +102 -0
  208. data/packages/coffee-script/test/test_strings.coffee +118 -0
  209. data/packages/coffee-script/test/test_switch.coffee +103 -0
  210. data/packages/coffee-script/test/test_while.coffee +71 -0
  211. data/packages/ivory/LICENSE.txt +1 -0
  212. data/packages/ivory/README.md +19 -0
  213. data/packages/ivory/lib/buffer.js +111 -0
  214. data/packages/ivory/lib/events.js +137 -0
  215. data/packages/ivory/lib/fs.js +266 -0
  216. data/packages/ivory/lib/main.js +13 -0
  217. data/packages/ivory/lib/path.js +158 -0
  218. data/packages/ivory/lib/ruby/buffer.rb +145 -0
  219. data/packages/ivory/lib/ruby/constants.rb +585 -0
  220. data/packages/ivory/lib/ruby/events.rb +32 -0
  221. data/packages/ivory/lib/ruby/fs.rb +245 -0
  222. data/packages/ivory/lib/ruby/process.rb +28 -0
  223. data/packages/ivory/lib/stream.js +115 -0
  224. data/packages/ivory/lib/util.js +414 -0
  225. data/packages/ivory/package.json +11 -0
  226. data/packages/ivory/spade-boot.js +78 -0
  227. data/packages/jquery/main.js +7179 -0
  228. data/packages/jquery/package.json +10 -0
  229. data/packages/json/lib/main.js +14 -0
  230. data/packages/json/package.json +8 -0
  231. data/packages/lproj/README.md +77 -0
  232. data/packages/lproj/examples/demo-app/en.lproj/localized.strings +2 -0
  233. data/packages/lproj/examples/demo-app/fr.lproj/localized.strings +3 -0
  234. data/packages/lproj/examples/demo-app/index.html +8 -0
  235. data/packages/lproj/examples/demo-app/lib/main.js +7 -0
  236. data/packages/lproj/examples/demo-app/package.json +9 -0
  237. data/packages/lproj/lib/main.js +78 -0
  238. data/packages/lproj/lib/strings-format.js +6 -0
  239. data/packages/lproj/package.json +9 -0
  240. data/packages/optparse/README.md +161 -0
  241. data/packages/optparse/TODO +1 -0
  242. data/packages/optparse/examples/browser-test.html +75 -0
  243. data/packages/optparse/examples/nodejs-test.js +90 -0
  244. data/packages/optparse/lib/optparse.js +309 -0
  245. data/packages/optparse/package.json +13 -0
  246. data/packages/optparse/seed.yml +5 -0
  247. data/packages/text/lib/main.js +8 -0
  248. data/packages/text/package.json +9 -0
  249. data/packages/web-file/README.md +7 -0
  250. data/packages/web-file/lib/errors.js +32 -0
  251. data/packages/web-file/lib/file-reader.js +10 -0
  252. data/packages/web-file/lib/file-system.js +234 -0
  253. data/packages/web-file/lib/file-writer.js +10 -0
  254. data/packages/web-file/lib/file.js +9 -0
  255. data/packages/web-file/lib/main.js +34 -0
  256. data/packages/web-file/lib/platform.js +25 -0
  257. data/packages/web-file/lib/ruby/file.rb +252 -0
  258. data/packages/web-file/lib/ruby/file_reader.rb +69 -0
  259. data/packages/web-file/lib/ruby/file_system.rb +134 -0
  260. data/packages/web-file/lib/ruby/file_writer.rb +78 -0
  261. data/packages/web-file/package.json +12 -0
  262. data/packages/web-typed-array/README.md +7 -0
  263. data/packages/web-typed-array/lib/array-buffer-view.js +9 -0
  264. data/packages/web-typed-array/lib/array-buffer.js +7 -0
  265. data/packages/web-typed-array/lib/main.js +33 -0
  266. data/packages/web-typed-array/lib/platform.js +20 -0
  267. data/packages/web-typed-array/lib/ruby/array_buffer.rb +31 -0
  268. data/packages/web-typed-array/lib/ruby/array_buffer_view.rb +130 -0
  269. data/packages/web-typed-array/lib/ruby/typed_array.rb +133 -0
  270. data/packages/web-typed-array/lib/typed-array.js +26 -0
  271. data/packages/web-typed-array/package.json +9 -0
  272. data/spade-packager.gemspec +39 -0
  273. data/spec/cli/build_spec.rb +57 -0
  274. data/spec/cli/install_spec.rb +119 -0
  275. data/spec/cli/installed_spec.rb +55 -0
  276. data/spec/cli/list_spec.rb +74 -0
  277. data/spec/cli/login_spec.rb +75 -0
  278. data/spec/cli/new_spec.rb +5 -0
  279. data/spec/cli/owner_spec.rb +114 -0
  280. data/spec/cli/push_spec.rb +73 -0
  281. data/spec/cli/uninstall_spec.rb +58 -0
  282. data/spec/cli/unpack_spec.rb +72 -0
  283. data/spec/cli/unyank_spec.rb +73 -0
  284. data/spec/cli/yank_spec.rb +73 -0
  285. data/spec/credentials_spec.rb +23 -0
  286. data/spec/fixtures/badrake-0.8.7.spd +0 -0
  287. data/spec/fixtures/builder-3.0.0.spd +0 -0
  288. data/spec/fixtures/bundler-1.1.pre.spd +0 -0
  289. data/spec/fixtures/coffee-1.0.1.pre.spd +0 -0
  290. data/spec/fixtures/core-test-0.4.3.spd +0 -0
  291. data/spec/fixtures/core-test/bin/cot +3 -0
  292. data/spec/fixtures/core-test/lib/main.js +1 -0
  293. data/spec/fixtures/core-test/resources/runner.css +0 -0
  294. data/spec/fixtures/core-test/tests/test.js +1 -0
  295. data/spec/fixtures/highline-1.6.1.spd +0 -0
  296. data/spec/fixtures/ivory-0.0.1.spd +0 -0
  297. data/spec/fixtures/jquery-1.4.3.spd +0 -0
  298. data/spec/fixtures/optparse-1.0.1.spd +0 -0
  299. data/spec/fixtures/package.json +30 -0
  300. data/spec/fixtures/rake-0.8.6.spd +0 -0
  301. data/spec/fixtures/rake-0.8.7.spd +0 -0
  302. data/spec/gauntlet_spec.rb +27 -0
  303. data/spec/package_spec.rb +267 -0
  304. data/spec/spec_helper.rb +32 -0
  305. data/spec/support/cli.rb +103 -0
  306. data/spec/support/fake.rb +48 -0
  307. data/spec/support/fake_gem_server.rb +67 -0
  308. data/spec/support/fake_gemcutter.rb +50 -0
  309. data/spec/support/matchers.rb +32 -0
  310. data/spec/support/path.rb +61 -0
  311. data/templates/project/LICENSE +19 -0
  312. data/templates/project/README.md +21 -0
  313. data/templates/project/lib/main.js +9 -0
  314. data/templates/project/project.json +31 -0
  315. data/templates/project/tests/main-test.js +8 -0
  316. metadata +484 -0
@@ -0,0 +1,590 @@
1
+ # The CoffeeScript parser is generated by [Jison](http://github.com/zaach/jison)
2
+ # from this grammar file. Jison is a bottom-up parser generator, similar in
3
+ # style to [Bison](http://www.gnu.org/software/bison), implemented in JavaScript.
4
+ # It can recognize [LALR(1), LR(0), SLR(1), and LR(1)](http://en.wikipedia.org/wiki/LR_grammar)
5
+ # type grammars. To create the Jison parser, we list the pattern to match
6
+ # on the left-hand side, and the action to take (usually the creation of syntax
7
+ # tree nodes) on the right. As the parser runs, it
8
+ # shifts tokens from our token stream, from left to right, and
9
+ # [attempts to match](http://en.wikipedia.org/wiki/Bottom-up_parsing)
10
+ # the token sequence against the rules below. When a match can be made, it
11
+ # reduces into the [nonterminal](http://en.wikipedia.org/wiki/Terminal_and_nonterminal_symbols)
12
+ # (the enclosing name at the top), and we proceed from there.
13
+ #
14
+ # If you run the `cake build:parser` command, Jison constructs a parse table
15
+ # from our rules and saves it into `lib/parser.js`.
16
+
17
+ # The only dependency is on the **Jison.Parser**.
18
+ {Parser} = require 'jison'
19
+
20
+ # Jison DSL
21
+ # ---------
22
+
23
+ # Since we're going to be wrapped in a function by Jison in any case, if our
24
+ # action immediately returns a value, we can optimize by removing the function
25
+ # wrapper and just returning the value directly.
26
+ unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/
27
+
28
+ # Our handy DSL for Jison grammar generation, thanks to
29
+ # [Tim Caswell](http://github.com/creationix). For every rule in the grammar,
30
+ # we pass the pattern-defining string, the action to run, and extra options,
31
+ # optionally. If no action is specified, we simply pass the value of the
32
+ # previous nonterminal.
33
+ o = (patternString, action, options) ->
34
+ patternString = patternString.replace /\s{2,}/g, ' '
35
+ return [patternString, '$$ = $1;', options] unless action
36
+ action = if match = unwrap.exec action then match[1] else "(#{action}())"
37
+ action = action.replace /\bnew /g, '$&yy.'
38
+ action = action.replace /\b(?:Expressions\.wrap|extend)\b/g, 'yy.$&'
39
+ [patternString, "$$ = #{action};", options]
40
+
41
+ # Grammatical Rules
42
+ # -----------------
43
+
44
+ # In all of the rules that follow, you'll see the name of the nonterminal as
45
+ # the key to a list of alternative matches. With each match's action, the
46
+ # dollar-sign variables are provided by Jison as references to the value of
47
+ # their numeric position, so in this rule:
48
+ #
49
+ # "Expression UNLESS Expression"
50
+ #
51
+ # `$1` would be the value of the first `Expression`, `$2` would be the token
52
+ # for the `UNLESS` terminal, and `$3` would be the value of the second
53
+ # `Expression`.
54
+ grammar =
55
+
56
+ # The **Root** is the top-level node in the syntax tree. Since we parse bottom-up,
57
+ # all parsing must end here.
58
+ Root: [
59
+ o '', -> new Expressions
60
+ o 'Body'
61
+ o 'Block TERMINATOR'
62
+ ]
63
+
64
+ # Any list of statements and expressions, separated by line breaks or semicolons.
65
+ Body: [
66
+ o 'Line', -> Expressions.wrap [$1]
67
+ o 'Body TERMINATOR Line', -> $1.push $3
68
+ o 'Body TERMINATOR'
69
+ ]
70
+
71
+ # Expressions and statements, which make up a line in a body.
72
+ Line: [
73
+ o 'Expression'
74
+ o 'Statement'
75
+ ]
76
+
77
+ # Pure statements which cannot be expressions.
78
+ Statement: [
79
+ o 'Return'
80
+ o 'Throw'
81
+ o 'Comment'
82
+ o 'STATEMENT', -> new Literal $1
83
+ ]
84
+
85
+ # All the different types of expressions in our language. The basic unit of
86
+ # CoffeeScript is the **Expression** -- everything that can be an expression
87
+ # is one. Expressions serve as the building blocks of many other rules, making
88
+ # them somewhat circular.
89
+ Expression: [
90
+ o 'Value'
91
+ o 'Invocation'
92
+ o 'Code'
93
+ o 'Operation'
94
+ o 'Assign'
95
+ o 'If'
96
+ o 'Try'
97
+ o 'While'
98
+ o 'For'
99
+ o 'Switch'
100
+ o 'Class'
101
+ ]
102
+
103
+ # An indented block of expressions. Note that the [Rewriter](rewriter.html)
104
+ # will convert some postfix forms into blocks for us, by adjusting the
105
+ # token stream.
106
+ Block: [
107
+ o 'INDENT OUTDENT', -> new Expressions
108
+ o 'INDENT Body OUTDENT', -> $2
109
+ ]
110
+
111
+ # A literal identifier, a variable name or property.
112
+ Identifier: [
113
+ o 'IDENTIFIER', -> new Literal $1
114
+ ]
115
+
116
+ # Alphanumerics are separated from the other **Literal** matchers because
117
+ # they can also serve as keys in object literals.
118
+ AlphaNumeric: [
119
+ o 'NUMBER', -> new Literal $1
120
+ o 'STRING', -> new Literal $1
121
+ ]
122
+
123
+ # All of our immediate values. These can (in general), be passed straight
124
+ # through and printed to JavaScript.
125
+ Literal: [
126
+ o 'AlphaNumeric'
127
+ o 'JS', -> new Literal $1
128
+ o 'REGEX', -> new Literal $1
129
+ o 'BOOL', ->
130
+ new Literal if $1 is 'undefined' then 'void 0' else $1
131
+ ]
132
+
133
+ # Assignment of a variable, property, or index to a value.
134
+ Assign: [
135
+ o 'Assignable = Expression', -> new Assign $1, $3
136
+ o 'Assignable = INDENT Expression OUTDENT', -> new Assign $1, $4
137
+ ]
138
+
139
+ # Assignment when it happens within an object literal. The difference from
140
+ # the ordinary **Assign** is that these allow numbers and strings as keys.
141
+ AssignObj: [
142
+ o 'ObjAssignable', -> new Value $1
143
+ o 'ObjAssignable : Expression', -> new Assign new Value($1), $3, 'object'
144
+ o 'ObjAssignable :
145
+ INDENT Expression OUTDENT', -> new Assign new Value($1), $4, 'object'
146
+ o 'Comment'
147
+ ]
148
+
149
+ ObjAssignable: [
150
+ o 'Identifier'
151
+ o 'AlphaNumeric'
152
+ o 'ThisProperty'
153
+ ]
154
+
155
+ # A return statement from a function body.
156
+ Return: [
157
+ o 'RETURN Expression', -> new Return $2
158
+ o 'RETURN', -> new Return
159
+ ]
160
+
161
+ # A block comment.
162
+ Comment: [
163
+ o 'HERECOMMENT', -> new Comment $1
164
+ ]
165
+
166
+ # The **Code** node is the function literal. It's defined by an indented block
167
+ # of **Expressions** preceded by a function arrow, with an optional parameter
168
+ # list.
169
+ Code: [
170
+ o 'PARAM_START ParamList PARAM_END FuncGlyph Block', -> new Code $2, $5, $4
171
+ o 'FuncGlyph Block', -> new Code [], $2, $1
172
+ ]
173
+
174
+ # CoffeeScript has two different symbols for functions. `->` is for ordinary
175
+ # functions, and `=>` is for functions bound to the current value of *this*.
176
+ FuncGlyph: [
177
+ o '->', -> 'func'
178
+ o '=>', -> 'boundfunc'
179
+ ]
180
+
181
+ # An optional, trailing comma.
182
+ OptComma: [
183
+ o ''
184
+ o ','
185
+ ]
186
+
187
+ # The list of parameters that a function accepts can be of any length.
188
+ ParamList: [
189
+ o '', -> []
190
+ o 'Param', -> [$1]
191
+ o 'ParamList , Param', -> $1.concat $3
192
+ ]
193
+
194
+ # A single parameter in a function definition can be ordinary, or a splat
195
+ # that hoovers up the remaining arguments.
196
+ Param: [
197
+ o 'ParamVar', -> new Param $1
198
+ o 'ParamVar ...', -> new Param $1, null, on
199
+ o 'ParamVar = Expression', -> new Param $1, $3
200
+ ]
201
+
202
+ ParamVar: [
203
+ o 'Identifier'
204
+ o 'ThisProperty'
205
+ o 'Array'
206
+ o 'Object'
207
+ ]
208
+
209
+ # A splat that occurs outside of a parameter list.
210
+ Splat: [
211
+ o 'Expression ...', -> new Splat $1
212
+ ]
213
+
214
+ # Variables and properties that can be assigned to.
215
+ SimpleAssignable: [
216
+ o 'Identifier', -> new Value $1
217
+ o 'Value Accessor', -> $1.push $2
218
+ o 'Invocation Accessor', -> new Value $1, [$2]
219
+ o 'ThisProperty'
220
+ ]
221
+
222
+ # Everything that can be assigned to.
223
+ Assignable: [
224
+ o 'SimpleAssignable'
225
+ o 'Array', -> new Value $1
226
+ o 'Object', -> new Value $1
227
+ ]
228
+
229
+ # The types of things that can be treated as values -- assigned to, invoked
230
+ # as functions, indexed into, named as a class, etc.
231
+ Value: [
232
+ o 'Assignable'
233
+ o 'Literal', -> new Value $1
234
+ o 'Parenthetical', -> new Value $1
235
+ o 'Range', -> new Value $1
236
+ o 'This'
237
+ ]
238
+
239
+ # The general group of accessors into an object, by property, by prototype
240
+ # or by array index or slice.
241
+ Accessor: [
242
+ o '. Identifier', -> new Access $2
243
+ o '?. Identifier', -> new Access $2, 'soak'
244
+ o ':: Identifier', -> new Access $2, 'proto'
245
+ o '::', -> new Access new Literal 'prototype'
246
+ o 'Index'
247
+ o 'Slice', -> new Slice $1
248
+ ]
249
+
250
+ # Indexing into an object or array using bracket notation.
251
+ Index: [
252
+ o 'INDEX_START Expression INDEX_END', -> new Index $2
253
+ o 'INDEX_SOAK Index', -> extend $2, soak : yes
254
+ o 'INDEX_PROTO Index', -> extend $2, proto: yes
255
+ ]
256
+
257
+ # In CoffeeScript, an object literal is simply a list of assignments.
258
+ Object: [
259
+ o '{ AssignList OptComma }', -> new Obj $2, $1.generated
260
+ ]
261
+
262
+ # Assignment of properties within an object literal can be separated by
263
+ # comma, as in JavaScript, or simply by newline.
264
+ AssignList: [
265
+ o '', -> []
266
+ o 'AssignObj', -> [$1]
267
+ o 'AssignList , AssignObj', -> $1.concat $3
268
+ o 'AssignList OptComma TERMINATOR AssignObj', -> $1.concat $4
269
+ o 'AssignList OptComma INDENT AssignList OptComma OUTDENT', -> $1.concat $4
270
+ ]
271
+
272
+ # Class definitions have optional bodies of prototype property assignments,
273
+ # and optional references to the superclass.
274
+ Class: [
275
+ o 'CLASS', -> new Class
276
+ o 'CLASS Block', -> new Class null, null, $2
277
+ o 'CLASS EXTENDS Value', -> new Class null, $3
278
+ o 'CLASS EXTENDS Value Block', -> new Class null, $3, $4
279
+ o 'CLASS SimpleAssignable', -> new Class $2
280
+ o 'CLASS SimpleAssignable Block', -> new Class $2, null, $3
281
+ o 'CLASS SimpleAssignable EXTENDS Value', -> new Class $2, $4
282
+ o 'CLASS SimpleAssignable EXTENDS Value Block', -> new Class $2, $4, $5
283
+ ]
284
+
285
+ # Ordinary function invocation, or a chained series of calls.
286
+ Invocation: [
287
+ o 'Value OptFuncExist Arguments', -> new Call $1, $3, $2
288
+ o 'Invocation OptFuncExist Arguments', -> new Call $1, $3, $2
289
+ o 'SUPER', -> new Call 'super', [new Splat new Literal 'arguments']
290
+ o 'SUPER Arguments', -> new Call 'super', $2
291
+ ]
292
+
293
+ # An optional existence check on a function.
294
+ OptFuncExist: [
295
+ o '', -> no
296
+ o 'FUNC_EXIST', -> yes
297
+ ]
298
+
299
+ # The list of arguments to a function call.
300
+ Arguments: [
301
+ o 'CALL_START CALL_END', -> []
302
+ o 'CALL_START ArgList OptComma CALL_END', -> $2
303
+ ]
304
+
305
+ # A reference to the *this* current object.
306
+ This: [
307
+ o 'THIS', -> new Value new Literal 'this'
308
+ o '@', -> new Value new Literal 'this'
309
+ ]
310
+
311
+ # A reference to a property on *this*.
312
+ ThisProperty: [
313
+ o '@ Identifier', -> new Value new Literal('this'), [new Access($2)], 'this'
314
+ ]
315
+
316
+ # The array literal.
317
+ Array: [
318
+ o '[ ]', -> new Arr []
319
+ o '[ ArgList OptComma ]', -> new Arr $2
320
+ ]
321
+
322
+ # Inclusive and exclusive range dots.
323
+ RangeDots: [
324
+ o '..', -> 'inclusive'
325
+ o '...', -> 'exclusive'
326
+ ]
327
+
328
+ # The CoffeeScript range literal.
329
+ Range: [
330
+ o '[ Expression RangeDots Expression ]', -> new Range $2, $4, $3
331
+ ]
332
+
333
+ # Array slice literals.
334
+ Slice: [
335
+ o 'INDEX_START Expression RangeDots Expression INDEX_END', -> new Range $2, $4, $3
336
+ o 'INDEX_START Expression RangeDots INDEX_END', -> new Range $2, null, $3
337
+ o 'INDEX_START RangeDots Expression INDEX_END', -> new Range null, $3, $2
338
+ ]
339
+
340
+ # The **ArgList** is both the list of objects passed into a function call,
341
+ # as well as the contents of an array literal
342
+ # (i.e. comma-separated expressions). Newlines work as well.
343
+ ArgList: [
344
+ o 'Arg', -> [$1]
345
+ o 'ArgList , Arg', -> $1.concat $3
346
+ o 'ArgList OptComma TERMINATOR Arg', -> $1.concat $4
347
+ o 'INDENT ArgList OptComma OUTDENT', -> $2
348
+ o 'ArgList OptComma INDENT ArgList OptComma OUTDENT', -> $1.concat $4
349
+ ]
350
+
351
+ # Valid arguments are Expressions or Splats.
352
+ Arg: [
353
+ o 'Expression'
354
+ o 'Splat'
355
+ ]
356
+
357
+ # Just simple, comma-separated, required arguments (no fancy syntax). We need
358
+ # this to be separate from the **ArgList** for use in **Switch** blocks, where
359
+ # having the newlines wouldn't make sense.
360
+ SimpleArgs: [
361
+ o 'Expression'
362
+ o 'SimpleArgs , Expression', -> [].concat $1, $3
363
+ ]
364
+
365
+ # The variants of *try/catch/finally* exception handling blocks.
366
+ Try: [
367
+ o 'TRY Block', -> new Try $2
368
+ o 'TRY Block Catch', -> new Try $2, $3[0], $3[1]
369
+ o 'TRY Block FINALLY Block', -> new Try $2, null, null, $4
370
+ o 'TRY Block Catch FINALLY Block', -> new Try $2, $3[0], $3[1], $5
371
+ ]
372
+
373
+ # A catch clause names its error and runs a block of code.
374
+ Catch: [
375
+ o 'CATCH Identifier Block', -> [$2, $3]
376
+ ]
377
+
378
+ # Throw an exception object.
379
+ Throw: [
380
+ o 'THROW Expression', -> new Throw $2
381
+ ]
382
+
383
+ # Parenthetical expressions. Note that the **Parenthetical** is a **Value**,
384
+ # not an **Expression**, so if you need to use an expression in a place
385
+ # where only values are accepted, wrapping it in parentheses will always do
386
+ # the trick.
387
+ Parenthetical: [
388
+ o '( Body )', -> new Parens $2
389
+ o '( INDENT Body OUTDENT )', -> new Parens $3
390
+ ]
391
+
392
+ # The condition portion of a while loop.
393
+ WhileSource: [
394
+ o 'WHILE Expression', -> new While $2
395
+ o 'WHILE Expression WHEN Expression', -> new While $2, guard: $4
396
+ o 'UNTIL Expression', -> new While $2, invert: true
397
+ o 'UNTIL Expression WHEN Expression', -> new While $2, invert: true, guard: $4
398
+ ]
399
+
400
+ # The while loop can either be normal, with a block of expressions to execute,
401
+ # or postfix, with a single expression. There is no do..while.
402
+ While: [
403
+ o 'WhileSource Block', -> $1.addBody $2
404
+ o 'Statement WhileSource', -> $2.addBody Expressions.wrap [$1]
405
+ o 'Expression WhileSource', -> $2.addBody Expressions.wrap [$1]
406
+ o 'Loop', -> $1
407
+ ]
408
+
409
+ Loop: [
410
+ o 'LOOP Block', -> new While(new Literal 'true').addBody $2
411
+ o 'LOOP Expression', -> new While(new Literal 'true').addBody Expressions.wrap [$2]
412
+ ]
413
+
414
+ # Array, object, and range comprehensions, at the most generic level.
415
+ # Comprehensions can either be normal, with a block of expressions to execute,
416
+ # or postfix, with a single expression.
417
+ For: [
418
+ o 'Statement ForBody', -> new For $1, $2
419
+ o 'Expression ForBody', -> new For $1, $2
420
+ o 'ForBody Block', -> new For $2, $1
421
+ ]
422
+
423
+ ForBody: [
424
+ o 'FOR Range', -> source: new Value($2)
425
+ o 'ForStart ForSource', -> $2.own = $1.own; $2.name = $1[0]; $2.index = $1[1]; $2
426
+ ]
427
+
428
+ ForStart: [
429
+ o 'FOR ForVariables', -> $2
430
+ o 'FOR OWN ForVariables', -> $3.own = yes; $3
431
+ ]
432
+
433
+ # An array of all accepted values for a variable inside the loop.
434
+ # This enables support for pattern matching.
435
+ ForValue: [
436
+ o 'Identifier'
437
+ o 'Array', -> new Value $1
438
+ o 'Object', -> new Value $1
439
+ ]
440
+
441
+ # An array or range comprehension has variables for the current element
442
+ # and (optional) reference to the current index. Or, *key, value*, in the case
443
+ # of object comprehensions.
444
+ ForVariables: [
445
+ o 'ForValue', -> [$1]
446
+ o 'ForValue , ForValue', -> [$1, $3]
447
+ ]
448
+
449
+ # The source of a comprehension is an array or object with an optional guard
450
+ # clause. If it's an array comprehension, you can also choose to step through
451
+ # in fixed-size increments.
452
+ ForSource: [
453
+ o 'FORIN Expression', -> source: $2
454
+ o 'FOROF Expression', -> source: $2, object: yes
455
+ o 'FORIN Expression WHEN Expression', -> source: $2, guard: $4
456
+ o 'FOROF Expression WHEN Expression', -> source: $2, guard: $4, object: yes
457
+ o 'FORIN Expression BY Expression', -> source: $2, step: $4
458
+ o 'FORIN Expression WHEN Expression BY Expression', -> source: $2, guard: $4, step: $6
459
+ o 'FORIN Expression BY Expression WHEN Expression', -> source: $2, step: $4, guard: $6
460
+ ]
461
+
462
+ Switch: [
463
+ o 'SWITCH Expression INDENT Whens OUTDENT', -> new Switch $2, $4
464
+ o 'SWITCH Expression INDENT Whens ELSE Block OUTDENT', -> new Switch $2, $4, $6
465
+ o 'SWITCH INDENT Whens OUTDENT', -> new Switch null, $3
466
+ o 'SWITCH INDENT Whens ELSE Block OUTDENT', -> new Switch null, $3, $5
467
+ ]
468
+
469
+ Whens: [
470
+ o 'When'
471
+ o 'Whens When', -> $1.concat $2
472
+ ]
473
+
474
+ # An individual **When** clause, with action.
475
+ When: [
476
+ o 'LEADING_WHEN SimpleArgs Block', -> [[$2, $3]]
477
+ o 'LEADING_WHEN SimpleArgs Block TERMINATOR', -> [[$2, $3]]
478
+ ]
479
+
480
+ # The most basic form of *if* is a condition and an action. The following
481
+ # if-related rules are broken up along these lines in order to avoid
482
+ # ambiguity.
483
+ IfBlock: [
484
+ o 'IF Expression Block', -> new If $2, $3, type: $1
485
+ o 'IfBlock ELSE IF Expression Block', -> $1.addElse new If $4, $5, type: $3
486
+ o 'IfBlock ELSE Block', -> $1.addElse $3
487
+ ]
488
+
489
+ # The full complement of *if* expressions, including postfix one-liner
490
+ # *if* and *unless*.
491
+ If: [
492
+ o 'IfBlock'
493
+ o 'Statement POST_IF Expression', -> new If $3, Expressions.wrap([$1]), type: $2, statement: true
494
+ o 'Expression POST_IF Expression', -> new If $3, Expressions.wrap([$1]), type: $2, statement: true
495
+ ]
496
+
497
+ # Arithmetic and logical operators, working on one or more operands.
498
+ # Here they are grouped by order of precedence. The actual precedence rules
499
+ # are defined at the bottom of the page. It would be shorter if we could
500
+ # combine most of these rules into a single generic *Operand OpSymbol Operand*
501
+ # -type rule, but in order to make the precedence binding possible, separate
502
+ # rules are necessary.
503
+ Operation: [
504
+ o 'UNARY Expression', -> new Op $1 , $2
505
+ o '- Expression', (-> new Op '-', $2), prec: 'UNARY'
506
+ o '+ Expression', (-> new Op '+', $2), prec: 'UNARY'
507
+
508
+ o '-- SimpleAssignable', -> new Op '--', $2
509
+ o '++ SimpleAssignable', -> new Op '++', $2
510
+ o 'SimpleAssignable --', -> new Op '--', $1, null, true
511
+ o 'SimpleAssignable ++', -> new Op '++', $1, null, true
512
+
513
+ # [The existential operator](http://jashkenas.github.com/coffee-script/#existence).
514
+ o 'Expression ?', -> new Existence $1
515
+
516
+ o 'Expression + Expression', -> new Op '+' , $1, $3
517
+ o 'Expression - Expression', -> new Op '-' , $1, $3
518
+
519
+ o 'Expression MATH Expression', -> new Op $2, $1, $3
520
+ o 'Expression SHIFT Expression', -> new Op $2, $1, $3
521
+ o 'Expression COMPARE Expression', -> new Op $2, $1, $3
522
+ o 'Expression LOGIC Expression', -> new Op $2, $1, $3
523
+ o 'Expression RELATION Expression', ->
524
+ if $2.charAt(0) is '!'
525
+ new Op($2.slice(1), $1, $3).invert()
526
+ else
527
+ new Op $2, $1, $3
528
+
529
+ o 'SimpleAssignable COMPOUND_ASSIGN
530
+ Expression', -> new Assign $1, $3, $2
531
+ o 'SimpleAssignable COMPOUND_ASSIGN
532
+ INDENT Expression OUTDENT', -> new Assign $1, $4, $2
533
+ o 'SimpleAssignable EXTENDS Expression', -> new Extends $1, $3
534
+ ]
535
+
536
+
537
+ # Precedence
538
+ # ----------
539
+
540
+ # Operators at the top of this list have higher precedence than the ones lower
541
+ # down. Following these rules is what makes `2 + 3 * 4` parse as:
542
+ #
543
+ # 2 + (3 * 4)
544
+ #
545
+ # And not:
546
+ #
547
+ # (2 + 3) * 4
548
+ operators = [
549
+ ['left', '.', '?.', '::']
550
+ ['left', 'CALL_START', 'CALL_END']
551
+ ['nonassoc', '++', '--']
552
+ ['left', '?']
553
+ ['right', 'UNARY']
554
+ ['left', 'MATH']
555
+ ['left', '+', '-']
556
+ ['left', 'SHIFT']
557
+ ['left', 'RELATION']
558
+ ['left', 'COMPARE']
559
+ ['left', 'LOGIC']
560
+ ['nonassoc', 'INDENT', 'OUTDENT']
561
+ ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS']
562
+ ['right', 'FORIN', 'FOROF', 'BY', 'WHEN']
563
+ ['right', 'IF', 'ELSE', 'FOR', 'DO', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS']
564
+ ['right', 'POST_IF']
565
+ ]
566
+
567
+ # Wrapping Up
568
+ # -----------
569
+
570
+ # Finally, now what we have our **grammar** and our **operators**, we can create
571
+ # our **Jison.Parser**. We do this by processing all of our rules, recording all
572
+ # terminals (every symbol which does not appear as the name of a rule above)
573
+ # as "tokens".
574
+ tokens = []
575
+ for name, alternatives of grammar
576
+ grammar[name] = for alt in alternatives
577
+ for token in alt[0].split ' '
578
+ tokens.push token unless grammar[token]
579
+ alt[1] = "return #{alt[1]}" if name is 'Root'
580
+ alt
581
+
582
+ # Initialize the **Parser** with our list of terminal **tokens**, our **grammar**
583
+ # rules, and the name of the root. Reverse the operators because Jison orders
584
+ # precedence from low to high, and we have it high to low
585
+ # (as in [Yacc](http://dinosaur.compilertools.net/yacc/index.html)).
586
+ exports.parser = new Parser
587
+ tokens : tokens.join ' '
588
+ bnf : grammar
589
+ operators : operators.reverse()
590
+ startSymbol : 'Root'