spade-packager 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,94 @@
1
+ # The **Scope** class regulates lexical scoping within CoffeeScript. As you
2
+ # generate code, you create a tree of scopes in the same shape as the nested
3
+ # function bodies. Each scope knows about the variables declared within it,
4
+ # and has a reference to its parent enclosing scope. In this way, we know which
5
+ # variables are new and need to be declared with `var`, and which are shared
6
+ # with the outside.
7
+
8
+ # Import the helpers we plan to use.
9
+ {extend, last} = require './helpers'
10
+
11
+ exports.Scope = class Scope
12
+
13
+ # The top-level **Scope** object.
14
+ @root: null
15
+
16
+ # Initialize a scope with its parent, for lookups up the chain,
17
+ # as well as a reference to the **Expressions** node is belongs to, which is
18
+ # where it should declare its variables, and a reference to the function that
19
+ # it wraps.
20
+ constructor:(@parent, @expressions, @method) ->
21
+ @variables = [{name: 'arguments', type: 'arguments'}]
22
+ @positions = {}
23
+ Scope.root = this unless @parent
24
+
25
+ # Adds a new variable or overrides an existing one.
26
+ add: (name, type, immediate) ->
27
+ return @parent.add name, type, immediate if @shared and not immediate
28
+ if typeof (pos = @positions[name]) is 'number'
29
+ @variables[pos].type = type
30
+ else
31
+ @positions[name] = @variables.push({name, type}) - 1
32
+
33
+ # Look up a variable name in lexical scope, and declare it if it does not
34
+ # already exist.
35
+ find: (name, options) ->
36
+ return yes if @check name, options
37
+ @add name, 'var'
38
+ no
39
+
40
+ # Reserve a variable name as originating from a function parameter for this
41
+ # scope. No `var` required for internal references.
42
+ parameter: (name) ->
43
+ return if @shared and @parent.check name, yes
44
+ @add name, 'param'
45
+
46
+ # Just check to see if a variable has already been declared, without reserving,
47
+ # walks up to the root scope.
48
+ check: (name, immediate) ->
49
+ found = !!@type(name)
50
+ return found if found or immediate
51
+ !!@parent?.check name
52
+
53
+ # Generate a temporary variable name at the given index.
54
+ temporary: (name, index) ->
55
+ if name.length > 1
56
+ '_' + name + if index > 1 then index else ''
57
+ else
58
+ '_' + (index + parseInt name, 36).toString(36).replace /\d/g, 'a'
59
+
60
+ # Gets the type of a variable.
61
+ type: (name) ->
62
+ return v.type for v in @variables when v.name is name
63
+ null
64
+
65
+ # If we need to store an intermediate result, find an available name for a
66
+ # compiler-generated variable. `_var`, `_var2`, and so on...
67
+ freeVariable: (type) ->
68
+ index = 0
69
+ index++ while @check((temp = @temporary type, index), true)
70
+ @add temp, 'var', yes
71
+ temp
72
+
73
+ # Ensure that an assignment is made at the top of this scope
74
+ # (or at the top-level scope, if requested).
75
+ assign: (name, value) ->
76
+ @add name, value: value, assigned: true
77
+ @hasAssignments = yes
78
+
79
+ # Does this scope have any declared variables?
80
+ hasDeclarations: ->
81
+ !!@declaredVariables().length
82
+
83
+ # Return the list of variables first declared in this scope.
84
+ declaredVariables: ->
85
+ realVars = []
86
+ tempVars = []
87
+ for v in @variables when v.type is 'var'
88
+ (if v.name.charAt(0) is '_' then tempVars else realVars).push v.name
89
+ realVars.sort().concat tempVars.sort()
90
+
91
+ # Return the list of assignments that are supposed to be made at the top
92
+ # of this scope.
93
+ assignedVariables: ->
94
+ "#{v.name} = #{v.type.value}" for v in @variables when v.type.assigned
@@ -0,0 +1,127 @@
1
+ # Arguments
2
+ # ---------
3
+
4
+ # shared identity function
5
+ id = (_) -> if arguments.length is 1 then _ else Array::slice.call(arguments)
6
+
7
+ test "basic argument passing tests", ->
8
+ a = {}
9
+ b = {}
10
+ c = {}
11
+ eq 1, (id 1)
12
+ eq 2, (id 1, 2)[1]
13
+ eq a, (id a)
14
+ eq c, (id a, b, c)[2]
15
+
16
+ test "passing arguments on separate lines", ->
17
+ a = {}
18
+ b = {}
19
+ c = {}
20
+ ok(id(
21
+ a
22
+ b
23
+ c
24
+ )[1] is b)
25
+ eq(0, id(
26
+ 0
27
+ 10
28
+ )[0])
29
+ eq(a,id(
30
+ a
31
+ ))
32
+ eq b,
33
+ (id b)
34
+
35
+ test "reference `arguments` inside of functions", ->
36
+ sumOfArgs = ->
37
+ sum = (a,b) -> a + b
38
+ sum = 0
39
+ sum += num for num in arguments
40
+ sum
41
+
42
+ eq 10, sumOfArgs(0, 1, 2, 3, 4)
43
+
44
+
45
+ #### Parameter List Features
46
+
47
+ test "splats", ->
48
+ arrayEq [0, 1, 2], (((splat...) -> splat) 0, 1, 2)
49
+ arrayEq [2, 3], (((_, _, splat...) -> splat) 0, 1, 2, 3)
50
+ arrayEq [0, 1], (((splat..., _, _) -> splat) 0, 1, 2, 3)
51
+ arrayEq [2], (((_, _, splat..., _) -> splat) 0, 1, 2, 3)
52
+
53
+ test "@-parameters: automatically assign an argument's value to a property of the context", ->
54
+ nonce = {}
55
+
56
+ ((@prop) ->).call context = {}, nonce
57
+ eq nonce, context.prop
58
+
59
+ # allow splats along side the special argument
60
+ ((splat..., @prop) ->).apply context = {}, [0, 0, nonce]
61
+ eq nonce, context.prop
62
+
63
+ # allow the argument itself to be a splat
64
+ ((@prop...) ->).call context = {}, 0, nonce, 0
65
+ eq nonce, context.prop[1]
66
+
67
+ # the argument should still be able to be referenced normally
68
+ eq nonce, (((@prop) -> prop).call {}, nonce)
69
+
70
+ test "@-parameters and splats with constructors", ->
71
+ a = {}
72
+ b = {}
73
+ class Klass
74
+ constructor: (@first, splat..., @last) ->
75
+
76
+ obj = new Klass a, 0, 0, b
77
+ eq a, obj.first
78
+ eq b, obj.last
79
+
80
+ test "destructuring in function definition", ->
81
+ (([{a: [b], c}]...) ->
82
+ eq 1, b
83
+ eq 2, c
84
+ ) {a: [1], c: 2}
85
+
86
+ test "default values", ->
87
+ nonceA = {}
88
+ nonceB = {}
89
+ a = (_,_,arg=nonceA) -> arg
90
+ eq nonceA, a()
91
+ eq nonceA, a(0)
92
+ eq nonceB, a(0,0,nonceB)
93
+ eq nonceA, a(0,0,undefined)
94
+ eq nonceA, a(0,0,null)
95
+ eq false , a(0,0,false)
96
+ eq nonceB, a(undefined,undefined,nonceB,undefined)
97
+ b = (_,arg=nonceA,_,_) -> arg
98
+ eq nonceA, b()
99
+ eq nonceA, b(0)
100
+ eq nonceB, b(0,nonceB)
101
+ eq nonceA, b(0,undefined)
102
+ eq nonceA, b(0,null)
103
+ eq false , b(0,false)
104
+ eq nonceB, b(undefined,nonceB,undefined)
105
+ c = (arg=nonceA,_,_) -> arg
106
+ eq nonceA, c()
107
+ eq 0, c(0)
108
+ eq nonceB, c(nonceB)
109
+ eq nonceA, c(undefined)
110
+ eq nonceA, c(null)
111
+ eq false , c(false)
112
+ eq nonceB, c(nonceB,undefined,undefined)
113
+
114
+ test "default values with @-parameters", ->
115
+ a = {}
116
+ b = {}
117
+ obj = f: (q = a, @p = b) -> q
118
+ eq a, obj.f()
119
+ eq b, obj.p
120
+
121
+ test "default values with splatted arguments", ->
122
+ withSplats = (a = 2, b..., c = 3, d = 5) -> a * (b.length + 1) * c * d
123
+ eq 30, withSplats()
124
+ eq 15, withSplats(1)
125
+ eq 5, withSplats(1,1)
126
+ eq 1, withSplats(1,1,1)
127
+ eq 2, withSplats(1,1,1,1)
@@ -0,0 +1,98 @@
1
+ # Assignment
2
+ # ----------
3
+
4
+ test "context property assignment (using @)", ->
5
+ nonce = {}
6
+ addMethod = ->
7
+ @method = -> nonce
8
+ this
9
+ eq nonce, addMethod.call({}).method()
10
+
11
+ test "unassignable values", ->
12
+ nonce = {}
13
+ for nonref in ['', '""', '0', 'f()'].concat CoffeeScript.RESERVED
14
+ eq nonce, (try CoffeeScript.compile "#{nonref} = v" catch e then nonce)
15
+
16
+ test "compound assignments should not declare", ->
17
+ # TODO: make description more clear
18
+ # TODO: remove reference to Math
19
+ eq Math, (-> Math or= 0)()
20
+
21
+
22
+ #### Statements as Expressions
23
+
24
+ test "assign the result of a try/catch block", ->
25
+ # multiline
26
+ result = try
27
+ nonexistent * missing
28
+ catch error
29
+ true
30
+ eq true, result
31
+
32
+ # single line
33
+ result = try nonexistent * missing catch error then true
34
+ eq true, result
35
+
36
+ test "conditionals", ->
37
+ # assign inside the condition of a conditional statement
38
+ nonce = {}
39
+ if a = nonce then 1
40
+ eq nonce, a
41
+ 1 if b = nonce
42
+ eq nonce, b
43
+
44
+ # assign the result of a conditional statement
45
+ c = if true then nonce
46
+ eq nonce, c
47
+
48
+ test "assign inside the condition of a `while` loop", ->
49
+ nonce = {}
50
+ count = 1
51
+ a = nonce while count--
52
+ eq nonce, a
53
+ count = 1
54
+ while count--
55
+ b = nonce
56
+ eq nonce, b
57
+
58
+
59
+ #### Compound Assignment
60
+
61
+ test "compound assignment (math operators)", ->
62
+ num = 10
63
+ num -= 5
64
+ eq 5, num
65
+
66
+ num *= 10
67
+ eq 50, num
68
+
69
+ num /= 10
70
+ eq 5, num
71
+
72
+ num %= 3
73
+ eq 2, num
74
+
75
+ test "more compound assignment", ->
76
+ a = {}
77
+ val = undefined
78
+ val ||= a
79
+ val ||= true
80
+ eq a, val
81
+
82
+ b = {}
83
+ val &&= true
84
+ eq val, true
85
+ val &&= b
86
+ eq b, val
87
+
88
+ c = {}
89
+ val = null
90
+ val ?= c
91
+ val ?= true
92
+ eq c, val
93
+
94
+
95
+ #### Destructuring Assignment
96
+
97
+ # NO TESTS?!
98
+ # TODO: make tests for destructuring assignment
@@ -0,0 +1,18 @@
1
+ # Break
2
+ # -----
3
+
4
+ test "break at the top level", ->
5
+ for i in [1,2,3]
6
+ result = i
7
+ if i == 2
8
+ break
9
+ eq 2, result
10
+
11
+ test "break *not* at the top level", ->
12
+ someFunc = () ->
13
+ i = 0
14
+ while ++i < 3
15
+ result = i
16
+ break if i > 1
17
+ result
18
+ eq 2, someFunc()
@@ -0,0 +1,201 @@
1
+ # Comments
2
+ # --------
3
+
4
+ # Note: awkward spacing seen in some tests is likely intentional.
5
+
6
+ test "comments in objects", ->
7
+ obj1 = {
8
+ # comment
9
+ # comment
10
+ # comment
11
+ one: 1
12
+ # comment
13
+ two: 2
14
+ # comment
15
+ }
16
+
17
+ ok Object::hasOwnProperty.call(obj1,'one')
18
+ eq obj1.one, 1
19
+ ok Object::hasOwnProperty.call(obj1,'two')
20
+ eq obj1.two, 2
21
+
22
+ test "comments in YAML-style objects", ->
23
+ obj2 =
24
+ # comment
25
+ # comment
26
+ # comment
27
+ three: 3
28
+ # comment
29
+ four: 4
30
+ # comment
31
+
32
+ ok Object::hasOwnProperty.call(obj2,'three')
33
+ eq obj2.three, 3
34
+ ok Object::hasOwnProperty.call(obj2,'four')
35
+ eq obj2.four, 4
36
+
37
+ test "comments following operators that continue lines", ->
38
+ sum =
39
+ 1 +
40
+ 1 + # comment
41
+ 1
42
+ eq 3, sum
43
+
44
+ test "comments in functions", ->
45
+ fn = ->
46
+ # comment
47
+ false
48
+ false # comment
49
+ false
50
+ # comment
51
+
52
+ # comment
53
+ true
54
+
55
+ ok fn()
56
+
57
+ fn2 = -> #comment
58
+ fn()
59
+ # comment
60
+
61
+ ok fn2()
62
+
63
+ test "trailing comment before an outdent", ->
64
+ nonce = {}
65
+ fn3 = ->
66
+ if true
67
+ undefined # comment
68
+ nonce
69
+
70
+ eq nonce, fn3()
71
+
72
+ test "comments in a switch", ->
73
+ nonce = {}
74
+ result = switch nonce #comment
75
+ # comment
76
+ when false then undefined
77
+ # comment
78
+ when null #comment
79
+ undefined
80
+ else nonce # comment
81
+
82
+ eq nonce, result
83
+
84
+ test "comment with conditional statements", ->
85
+ nonce = {}
86
+ result = if false # comment
87
+ undefined
88
+ #comment
89
+ else # comment
90
+ nonce
91
+ # comment
92
+ eq nonce, result
93
+
94
+ test "spaced comments with conditional statements", ->
95
+ nonce = {}
96
+ result = if false
97
+ undefined
98
+
99
+ # comment
100
+ else if false
101
+ undefined
102
+
103
+ # comment
104
+ else
105
+ nonce
106
+
107
+ eq nonce, result
108
+
109
+
110
+ #### Block Comments
111
+
112
+ ###
113
+ This is a here-comment.
114
+ Kind of like a heredoc.
115
+ ###
116
+
117
+ test "block comments in objects", ->
118
+ a = {}
119
+ b = {}
120
+ obj = {
121
+ a: a
122
+ ###
123
+ comment
124
+ ###
125
+ b: b
126
+ }
127
+
128
+ eq a, obj.a
129
+ eq b, obj.b
130
+
131
+ test "block comments in YAML-style", ->
132
+ a = {}
133
+ b = {}
134
+ obj =
135
+ a: a
136
+ ###
137
+ comment
138
+ ###
139
+ b: b
140
+
141
+ eq a, obj.a
142
+ eq b, obj.b
143
+
144
+
145
+ test "block comments in functions", ->
146
+ nonce = {}
147
+
148
+ fn1 = ->
149
+ true
150
+ ###
151
+ false
152
+ ###
153
+
154
+ ok fn1()
155
+
156
+ fn2 = ->
157
+ ###
158
+ block comment
159
+ ###
160
+ nonce
161
+
162
+ eq nonce, fn2()
163
+
164
+ fn3 = ->
165
+ nonce
166
+ ###
167
+ block comment
168
+ ###
169
+
170
+ eq nonce, fn3()
171
+
172
+ fn4 = ->
173
+ one = ->
174
+ ###
175
+ block comment
176
+ ###
177
+ two = ->
178
+ three = ->
179
+ nonce
180
+
181
+ eq nonce, fn4()()()()
182
+
183
+ test "block comments inside class bodies", ->
184
+ class A
185
+ a: ->
186
+
187
+ ###
188
+ Comment
189
+ ###
190
+ b: ->
191
+
192
+ ok A.prototype.b instanceof Function
193
+
194
+ class B
195
+ ###
196
+ Comment
197
+ ###
198
+ a: ->
199
+ b: ->
200
+
201
+ ok B.prototype.a instanceof Function