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.
- data/.gitignore +2 -0
- data/.gitmodules +6 -0
- data/bin/spadepkg +8 -0
- data/lib/libgems_ext.rb +8 -0
- data/lib/libgems_ext/config_file.rb +33 -0
- data/lib/libgems_ext/dependency_installer.rb +150 -0
- data/lib/libgems_ext/installer.rb +39 -0
- data/lib/libgems_ext/libgems.rb +39 -0
- data/lib/libgems_ext/spec_fetcher.rb +11 -0
- data/lib/spade-packager.rb +1 -0
- data/lib/spade/packager.rb +18 -0
- data/lib/spade/packager/cli.rb +9 -0
- data/lib/spade/packager/cli/base.rb +196 -0
- data/lib/spade/packager/cli/owner.rb +46 -0
- data/lib/spade/packager/cli/project_generator.rb +117 -0
- data/lib/spade/packager/credentials.rb +38 -0
- data/lib/spade/packager/local.rb +50 -0
- data/lib/spade/packager/package.rb +160 -0
- data/lib/spade/packager/remote.rb +98 -0
- data/lib/spade/packager/repository.rb +18 -0
- data/lib/spade/packager/version.rb +5 -0
- data/packages/coffee-script/.gitignore +8 -0
- data/packages/coffee-script/.npmignore +11 -0
- data/packages/coffee-script/Cakefile +229 -0
- data/packages/coffee-script/LICENSE +22 -0
- data/packages/coffee-script/README +47 -0
- data/packages/coffee-script/Rakefile +78 -0
- data/packages/coffee-script/bin/cake +7 -0
- data/packages/coffee-script/bin/coffee +7 -0
- data/packages/coffee-script/documentation/coffee/aliases.coffee +11 -0
- data/packages/coffee-script/documentation/coffee/array_comprehensions.coffee +2 -0
- data/packages/coffee-script/documentation/coffee/block_comment.coffee +6 -0
- data/packages/coffee-script/documentation/coffee/cake_tasks.coffee +9 -0
- data/packages/coffee-script/documentation/coffee/classes.coffee +25 -0
- data/packages/coffee-script/documentation/coffee/comparisons.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/conditionals.coffee +13 -0
- data/packages/coffee-script/documentation/coffee/default_args.coffee +8 -0
- data/packages/coffee-script/documentation/coffee/do.coffee +4 -0
- data/packages/coffee-script/documentation/coffee/embedded.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/existence.coffee +10 -0
- data/packages/coffee-script/documentation/coffee/expressions.coffee +9 -0
- data/packages/coffee-script/documentation/coffee/expressions_assignment.coffee +3 -0
- data/packages/coffee-script/documentation/coffee/expressions_comprehension.coffee +3 -0
- data/packages/coffee-script/documentation/coffee/expressions_try.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/fat_arrow.coffee +6 -0
- data/packages/coffee-script/documentation/coffee/functions.coffee +2 -0
- data/packages/coffee-script/documentation/coffee/heredocs.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/heregexes.coffee +11 -0
- data/packages/coffee-script/documentation/coffee/interpolation.coffee +6 -0
- data/packages/coffee-script/documentation/coffee/multiple_return_values.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/object_comprehensions.coffee +4 -0
- data/packages/coffee-script/documentation/coffee/object_extraction.coffee +13 -0
- data/packages/coffee-script/documentation/coffee/objects_and_arrays.coffee +19 -0
- data/packages/coffee-script/documentation/coffee/objects_reserved.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/overview.coffee +28 -0
- data/packages/coffee-script/documentation/coffee/parallel_assignment.coffee +6 -0
- data/packages/coffee-script/documentation/coffee/patterns_and_splats.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/prototypes.coffee +3 -0
- data/packages/coffee-script/documentation/coffee/range_comprehensions.coffee +2 -0
- data/packages/coffee-script/documentation/coffee/scope.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/slices.coffee +7 -0
- data/packages/coffee-script/documentation/coffee/soaks.coffee +1 -0
- data/packages/coffee-script/documentation/coffee/splats.coffee +27 -0
- data/packages/coffee-script/documentation/coffee/splices.coffee +5 -0
- data/packages/coffee-script/documentation/coffee/strings.coffee +8 -0
- data/packages/coffee-script/documentation/coffee/switch.coffee +10 -0
- data/packages/coffee-script/documentation/coffee/try.coffee +8 -0
- data/packages/coffee-script/documentation/coffee/while.coffee +10 -0
- data/packages/coffee-script/documentation/css/docs.css +374 -0
- data/packages/coffee-script/documentation/css/idle.css +64 -0
- data/packages/coffee-script/documentation/docs/browser.html +25 -0
- data/packages/coffee-script/documentation/docs/cake.html +43 -0
- data/packages/coffee-script/documentation/docs/coffee-script.html +51 -0
- data/packages/coffee-script/documentation/docs/command.html +161 -0
- data/packages/coffee-script/documentation/docs/docco.css +186 -0
- data/packages/coffee-script/documentation/docs/grammar.html +399 -0
- data/packages/coffee-script/documentation/docs/helpers.html +31 -0
- data/packages/coffee-script/documentation/docs/index.html +3 -0
- data/packages/coffee-script/documentation/docs/lexer.html +490 -0
- data/packages/coffee-script/documentation/docs/nodes.html +1338 -0
- data/packages/coffee-script/documentation/docs/optparse.html +78 -0
- data/packages/coffee-script/documentation/docs/repl.html +24 -0
- data/packages/coffee-script/documentation/docs/rewriter.html +251 -0
- data/packages/coffee-script/documentation/docs/scope.html +54 -0
- data/packages/coffee-script/documentation/docs/underscore.html +295 -0
- data/packages/coffee-script/documentation/images/background.png +0 -0
- data/packages/coffee-script/documentation/images/banding.png +0 -0
- data/packages/coffee-script/documentation/images/button_bg.png +0 -0
- data/packages/coffee-script/documentation/images/button_bg_dark.gif +0 -0
- data/packages/coffee-script/documentation/images/button_bg_green.gif +0 -0
- data/packages/coffee-script/documentation/images/favicon.ico +0 -0
- data/packages/coffee-script/documentation/images/logo.png +0 -0
- data/packages/coffee-script/documentation/images/screenshadow.png +0 -0
- data/packages/coffee-script/documentation/index.html.erb +1607 -0
- data/packages/coffee-script/documentation/js/aliases.js +17 -0
- data/packages/coffee-script/documentation/js/array_comprehensions.js +6 -0
- data/packages/coffee-script/documentation/js/block_comment.js +4 -0
- data/packages/coffee-script/documentation/js/cake_tasks.js +10 -0
- data/packages/coffee-script/documentation/js/classes.js +44 -0
- data/packages/coffee-script/documentation/js/comparisons.js +3 -0
- data/packages/coffee-script/documentation/js/conditionals.js +12 -0
- data/packages/coffee-script/documentation/js/default_args.js +7 -0
- data/packages/coffee-script/documentation/js/do.js +10 -0
- data/packages/coffee-script/documentation/js/embedded.js +4 -0
- data/packages/coffee-script/documentation/js/existence.js +6 -0
- data/packages/coffee-script/documentation/js/expressions.js +15 -0
- data/packages/coffee-script/documentation/js/expressions_assignment.js +2 -0
- data/packages/coffee-script/documentation/js/expressions_comprehension.js +9 -0
- data/packages/coffee-script/documentation/js/expressions_try.js +7 -0
- data/packages/coffee-script/documentation/js/fat_arrow.js +9 -0
- data/packages/coffee-script/documentation/js/functions.js +7 -0
- data/packages/coffee-script/documentation/js/heredocs.js +2 -0
- data/packages/coffee-script/documentation/js/heregexes.js +2 -0
- data/packages/coffee-script/documentation/js/interpolation.js +4 -0
- data/packages/coffee-script/documentation/js/multiple_return_values.js +5 -0
- data/packages/coffee-script/documentation/js/object_comprehensions.js +15 -0
- data/packages/coffee-script/documentation/js/object_extraction.js +10 -0
- data/packages/coffee-script/documentation/js/objects_and_arrays.js +17 -0
- data/packages/coffee-script/documentation/js/objects_reserved.js +4 -0
- data/packages/coffee-script/documentation/js/overview.js +35 -0
- data/packages/coffee-script/documentation/js/parallel_assignment.js +4 -0
- data/packages/coffee-script/documentation/js/patterns_and_splats.js +4 -0
- data/packages/coffee-script/documentation/js/prototypes.js +3 -0
- data/packages/coffee-script/documentation/js/range_comprehensions.js +9 -0
- data/packages/coffee-script/documentation/js/scope.js +8 -0
- data/packages/coffee-script/documentation/js/slices.js +4 -0
- data/packages/coffee-script/documentation/js/soaks.js +2 -0
- data/packages/coffee-script/documentation/js/splats.js +15 -0
- data/packages/coffee-script/documentation/js/splices.js +3 -0
- data/packages/coffee-script/documentation/js/strings.js +2 -0
- data/packages/coffee-script/documentation/js/switch.js +23 -0
- data/packages/coffee-script/documentation/js/try.js +8 -0
- data/packages/coffee-script/documentation/js/while.js +18 -0
- data/packages/coffee-script/documentation/vendor/jquery-1.4.2.js +6240 -0
- data/packages/coffee-script/examples/beautiful_code/binary_search.coffee +16 -0
- data/packages/coffee-script/examples/beautiful_code/quicksort_runtime.coffee +13 -0
- data/packages/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee +34 -0
- data/packages/coffee-script/examples/blocks.coffee +54 -0
- data/packages/coffee-script/examples/code.coffee +167 -0
- data/packages/coffee-script/examples/computer_science/README +4 -0
- data/packages/coffee-script/examples/computer_science/binary_search.coffee +25 -0
- data/packages/coffee-script/examples/computer_science/bubble_sort.coffee +11 -0
- data/packages/coffee-script/examples/computer_science/linked_list.coffee +108 -0
- data/packages/coffee-script/examples/computer_science/luhn_algorithm.coffee +36 -0
- data/packages/coffee-script/examples/computer_science/merge_sort.coffee +19 -0
- data/packages/coffee-script/examples/computer_science/selection_sort.coffee +23 -0
- data/packages/coffee-script/examples/poignant.coffee +181 -0
- data/packages/coffee-script/examples/potion.coffee +206 -0
- data/packages/coffee-script/examples/underscore.coffee +682 -0
- data/packages/coffee-script/examples/web_server.coffee +12 -0
- data/packages/coffee-script/extras/EXTRAS +7 -0
- data/packages/coffee-script/extras/coffee-script.js +8 -0
- data/packages/coffee-script/extras/jsl.conf +44 -0
- data/packages/coffee-script/index.html +2515 -0
- data/packages/coffee-script/lib/browser.js +52 -0
- data/packages/coffee-script/lib/cake.js +76 -0
- data/packages/coffee-script/lib/coffee-script.js +82 -0
- data/packages/coffee-script/lib/command.js +263 -0
- data/packages/coffee-script/lib/grammar.js +581 -0
- data/packages/coffee-script/lib/helpers.js +66 -0
- data/packages/coffee-script/lib/index.js +8 -0
- data/packages/coffee-script/lib/lexer.js +633 -0
- data/packages/coffee-script/lib/nodes.js +2165 -0
- data/packages/coffee-script/lib/optparse.js +111 -0
- data/packages/coffee-script/lib/parser.js +649 -0
- data/packages/coffee-script/lib/repl.js +42 -0
- data/packages/coffee-script/lib/rewriter.js +353 -0
- data/packages/coffee-script/lib/scope.js +120 -0
- data/packages/coffee-script/lib/spade-format.js +45 -0
- data/packages/coffee-script/package.json +26 -0
- data/packages/coffee-script/src/browser.coffee +43 -0
- data/packages/coffee-script/src/cake.coffee +69 -0
- data/packages/coffee-script/src/coffee-script.coffee +92 -0
- data/packages/coffee-script/src/command.coffee +214 -0
- data/packages/coffee-script/src/grammar.coffee +590 -0
- data/packages/coffee-script/src/helpers.coffee +56 -0
- data/packages/coffee-script/src/index.coffee +2 -0
- data/packages/coffee-script/src/lexer.coffee +653 -0
- data/packages/coffee-script/src/nodes.coffee +1754 -0
- data/packages/coffee-script/src/optparse.coffee +99 -0
- data/packages/coffee-script/src/repl.coffee +42 -0
- data/packages/coffee-script/src/rewriter.coffee +326 -0
- data/packages/coffee-script/src/scope.coffee +94 -0
- data/packages/coffee-script/test/arguments.coffee +127 -0
- data/packages/coffee-script/test/assignment.coffee +98 -0
- data/packages/coffee-script/test/break.coffee +18 -0
- data/packages/coffee-script/test/comments.coffee +201 -0
- data/packages/coffee-script/test/conditionals.coffee +181 -0
- data/packages/coffee-script/test/exception_handling.coffee +90 -0
- data/packages/coffee-script/test/helpers.coffee +96 -0
- data/packages/coffee-script/test/importing.coffee +18 -0
- data/packages/coffee-script/test/operators.coffee +225 -0
- data/packages/coffee-script/test/ranges_slices_and_splices.coffee +186 -0
- data/packages/coffee-script/test/regular_expressions.coffee +56 -0
- data/packages/coffee-script/test/test.html +123 -0
- data/packages/coffee-script/test/test_chaining.coffee +77 -0
- data/packages/coffee-script/test/test_classes.coffee +372 -0
- data/packages/coffee-script/test/test_compilation.coffee +26 -0
- data/packages/coffee-script/test/test_comprehensions.coffee +318 -0
- data/packages/coffee-script/test/test_existence.coffee +165 -0
- data/packages/coffee-script/test/test_functions.coffee +379 -0
- data/packages/coffee-script/test/test_heredocs.coffee +111 -0
- data/packages/coffee-script/test/test_literals.coffee +270 -0
- data/packages/coffee-script/test/test_option_parser.coffee +27 -0
- data/packages/coffee-script/test/test_pattern_matching.coffee +162 -0
- data/packages/coffee-script/test/test_returns.coffee +63 -0
- data/packages/coffee-script/test/test_splats.coffee +102 -0
- data/packages/coffee-script/test/test_strings.coffee +118 -0
- data/packages/coffee-script/test/test_switch.coffee +103 -0
- data/packages/coffee-script/test/test_while.coffee +71 -0
- data/packages/ivory/LICENSE.txt +1 -0
- data/packages/ivory/README.md +19 -0
- data/packages/ivory/lib/buffer.js +111 -0
- data/packages/ivory/lib/events.js +137 -0
- data/packages/ivory/lib/fs.js +266 -0
- data/packages/ivory/lib/main.js +13 -0
- data/packages/ivory/lib/path.js +158 -0
- data/packages/ivory/lib/ruby/buffer.rb +145 -0
- data/packages/ivory/lib/ruby/constants.rb +585 -0
- data/packages/ivory/lib/ruby/events.rb +32 -0
- data/packages/ivory/lib/ruby/fs.rb +245 -0
- data/packages/ivory/lib/ruby/process.rb +28 -0
- data/packages/ivory/lib/stream.js +115 -0
- data/packages/ivory/lib/util.js +414 -0
- data/packages/ivory/package.json +11 -0
- data/packages/ivory/spade-boot.js +78 -0
- data/packages/jquery/main.js +7179 -0
- data/packages/jquery/package.json +10 -0
- data/packages/json/lib/main.js +14 -0
- data/packages/json/package.json +8 -0
- data/packages/lproj/README.md +77 -0
- data/packages/lproj/examples/demo-app/en.lproj/localized.strings +2 -0
- data/packages/lproj/examples/demo-app/fr.lproj/localized.strings +3 -0
- data/packages/lproj/examples/demo-app/index.html +8 -0
- data/packages/lproj/examples/demo-app/lib/main.js +7 -0
- data/packages/lproj/examples/demo-app/package.json +9 -0
- data/packages/lproj/lib/main.js +78 -0
- data/packages/lproj/lib/strings-format.js +6 -0
- data/packages/lproj/package.json +9 -0
- data/packages/optparse/README.md +161 -0
- data/packages/optparse/TODO +1 -0
- data/packages/optparse/examples/browser-test.html +75 -0
- data/packages/optparse/examples/nodejs-test.js +90 -0
- data/packages/optparse/lib/optparse.js +309 -0
- data/packages/optparse/package.json +13 -0
- data/packages/optparse/seed.yml +5 -0
- data/packages/text/lib/main.js +8 -0
- data/packages/text/package.json +9 -0
- data/packages/web-file/README.md +7 -0
- data/packages/web-file/lib/errors.js +32 -0
- data/packages/web-file/lib/file-reader.js +10 -0
- data/packages/web-file/lib/file-system.js +234 -0
- data/packages/web-file/lib/file-writer.js +10 -0
- data/packages/web-file/lib/file.js +9 -0
- data/packages/web-file/lib/main.js +34 -0
- data/packages/web-file/lib/platform.js +25 -0
- data/packages/web-file/lib/ruby/file.rb +252 -0
- data/packages/web-file/lib/ruby/file_reader.rb +69 -0
- data/packages/web-file/lib/ruby/file_system.rb +134 -0
- data/packages/web-file/lib/ruby/file_writer.rb +78 -0
- data/packages/web-file/package.json +12 -0
- data/packages/web-typed-array/README.md +7 -0
- data/packages/web-typed-array/lib/array-buffer-view.js +9 -0
- data/packages/web-typed-array/lib/array-buffer.js +7 -0
- data/packages/web-typed-array/lib/main.js +33 -0
- data/packages/web-typed-array/lib/platform.js +20 -0
- data/packages/web-typed-array/lib/ruby/array_buffer.rb +31 -0
- data/packages/web-typed-array/lib/ruby/array_buffer_view.rb +130 -0
- data/packages/web-typed-array/lib/ruby/typed_array.rb +133 -0
- data/packages/web-typed-array/lib/typed-array.js +26 -0
- data/packages/web-typed-array/package.json +9 -0
- data/spade-packager.gemspec +39 -0
- data/spec/cli/build_spec.rb +57 -0
- data/spec/cli/install_spec.rb +119 -0
- data/spec/cli/installed_spec.rb +55 -0
- data/spec/cli/list_spec.rb +74 -0
- data/spec/cli/login_spec.rb +75 -0
- data/spec/cli/new_spec.rb +5 -0
- data/spec/cli/owner_spec.rb +114 -0
- data/spec/cli/push_spec.rb +73 -0
- data/spec/cli/uninstall_spec.rb +58 -0
- data/spec/cli/unpack_spec.rb +72 -0
- data/spec/cli/unyank_spec.rb +73 -0
- data/spec/cli/yank_spec.rb +73 -0
- data/spec/credentials_spec.rb +23 -0
- data/spec/fixtures/badrake-0.8.7.spd +0 -0
- data/spec/fixtures/builder-3.0.0.spd +0 -0
- data/spec/fixtures/bundler-1.1.pre.spd +0 -0
- data/spec/fixtures/coffee-1.0.1.pre.spd +0 -0
- data/spec/fixtures/core-test-0.4.3.spd +0 -0
- data/spec/fixtures/core-test/bin/cot +3 -0
- data/spec/fixtures/core-test/lib/main.js +1 -0
- data/spec/fixtures/core-test/resources/runner.css +0 -0
- data/spec/fixtures/core-test/tests/test.js +1 -0
- data/spec/fixtures/highline-1.6.1.spd +0 -0
- data/spec/fixtures/ivory-0.0.1.spd +0 -0
- data/spec/fixtures/jquery-1.4.3.spd +0 -0
- data/spec/fixtures/optparse-1.0.1.spd +0 -0
- data/spec/fixtures/package.json +30 -0
- data/spec/fixtures/rake-0.8.6.spd +0 -0
- data/spec/fixtures/rake-0.8.7.spd +0 -0
- data/spec/gauntlet_spec.rb +27 -0
- data/spec/package_spec.rb +267 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/support/cli.rb +103 -0
- data/spec/support/fake.rb +48 -0
- data/spec/support/fake_gem_server.rb +67 -0
- data/spec/support/fake_gemcutter.rb +50 -0
- data/spec/support/matchers.rb +32 -0
- data/spec/support/path.rb +61 -0
- data/templates/project/LICENSE +19 -0
- data/templates/project/README.md +21 -0
- data/templates/project/lib/main.js +9 -0
- data/templates/project/project.json +31 -0
- data/templates/project/tests/main-test.js +8 -0
- 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
|