liquidscript 0.10.4 → 0.11.0.rc1
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.
- checksums.yaml +4 -4
- data/lib/liquidscript/cli.rb +28 -31
- data/lib/liquidscript/compiler/base/callable.rb +4 -2
- data/lib/liquidscript/compiler/icr.rb +42 -25
- data/lib/liquidscript/compiler/icr/directives.rb +79 -0
- data/lib/liquidscript/compiler/icr/expressions.rb +32 -1
- data/lib/liquidscript/errors.rb +4 -1
- data/lib/liquidscript/generator/base/replacements.rb +9 -4
- data/lib/liquidscript/generator/javascript/literals.rb +9 -5
- data/lib/liquidscript/generator/javascript/metas.rb +13 -3
- data/lib/liquidscript/icr/code.rb +12 -0
- data/lib/liquidscript/scanner/liquidscript.rb +4 -0
- data/lib/liquidscript/scanner/liquidscript/main.rb +7 -9
- data/lib/liquidscript/scanner/liquidscript/regexs.rb +1 -1
- data/lib/liquidscript/version.rb +1 -1
- data/spec/fixtures/class.generate.yml +5 -5
- data/spec/fixtures/combination.generate.yml +2 -2
- data/spec/fixtures/example.generate.yml +3 -3
- data/spec/fixtures/function.generate.yml +3 -1
- data/spec/fixtures/inline.generate.yml +1 -1
- data/spec/fixtures/underscore.js +32 -35
- data/spec/fixtures/underscore.liq +2 -2
- data/spec/liquidscript/compiler/icr_spec.rb +9 -19
- data/spec/liquidscript/scanner/lexer_spec.rb +3 -3
- data/spec/support/matchers/compile.rb +5 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3659bbe0464cee916b09fbfb082e40cbd630c63b
|
4
|
+
data.tar.gz: c7708c7a59d1b5ac56edecc2babcd545b21d8321
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0fb9dc4ef32911b666bc9914f64ae198e79be36f6dfad11814671717227d9e5b04b9cfd17868caa3ce40af91a81fe90a17e7333d1ecc4ff8eeb5a5391040364
|
7
|
+
data.tar.gz: 4323533b81a1fba55e715b89a5ffa3b8b369c8c46dce386fdf190fda4d4cb8ccf7204e406960848e7ad23a70ffdc765c74d156eb31b27e576d60a0ad7b8259a4
|
data/lib/liquidscript/cli.rb
CHANGED
@@ -23,13 +23,13 @@ module Liquidscript
|
|
23
23
|
puts "COMPILING: #{file}"
|
24
24
|
perform_compiliation(file,
|
25
25
|
options[:out] || file.gsub('.liq', '.js'))
|
26
|
-
end
|
26
|
+
end
|
27
27
|
end
|
28
28
|
|
29
29
|
desc "syntax FILES", "Syntax check given file"
|
30
30
|
long_desc <<-LONGDESC
|
31
31
|
It will run a syntax check on the file listed. If the file does
|
32
|
-
not pass the syntax check it will return the error code 1. If
|
32
|
+
not pass the syntax check it will return the error code 1. If
|
33
33
|
the file give is - it will check the standard input.
|
34
34
|
LONGDESC
|
35
35
|
def syntax(*files)
|
@@ -47,45 +47,42 @@ module Liquidscript
|
|
47
47
|
private
|
48
48
|
|
49
49
|
def perform_compiliation(file, out)
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
File.open(file, "r")
|
50
|
+
open_files(file, out) do |infile, outfile|
|
51
|
+
out = Liquidscript.compile(infile.read)
|
52
|
+
outfile.write(out)
|
54
53
|
end
|
54
|
+
end
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
def preform_syntax_check(file)
|
57
|
+
open_files(file) do |infile|
|
58
|
+
Liquidscript.compile(infile.read)
|
59
|
+
puts "OK"
|
60
60
|
end
|
61
|
-
|
62
|
-
out = Liquidscript.compile(infile.read)
|
63
|
-
outfile.write(out)
|
64
|
-
rescue StandardError => e
|
65
|
-
$stderr.puts "ERROR: #{e.class}: #{e.message}"
|
66
|
-
|
67
|
-
$stderr.puts e.backtrace[0..5].map { |s| "\t#{s.gsub(/^.*?\/lib\/liquidscript\//, "")}" }.join("\n")
|
68
|
-
exit 1
|
69
|
-
ensure
|
70
|
-
([infile, outfile] - [$stdin, $stdout]).each(&:close)
|
71
61
|
end
|
72
62
|
|
73
|
-
def
|
74
|
-
|
63
|
+
def open_files(inf, outf = nil)
|
64
|
+
inf = if inf == '-'
|
75
65
|
$stdin
|
76
66
|
else
|
77
|
-
File.open(
|
67
|
+
File.open(inf, 'r')
|
78
68
|
end
|
79
69
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
70
|
+
outf = if outf == '-'
|
71
|
+
$stdout
|
72
|
+
elsif outf
|
73
|
+
File.open(outf, 'w')
|
74
|
+
end
|
75
|
+
|
76
|
+
begin
|
77
|
+
yield inf, outf
|
78
|
+
rescue StandardError => e
|
85
79
|
$stderr.puts "ERROR: #{e.class}: #{e.message}"
|
86
|
-
|
87
|
-
|
88
|
-
|
80
|
+
$stderr.puts e.backtrace[0..5].map { |s| "\t" +
|
81
|
+
s.gsub(/^lib\/liquidscript\//, "") }.join("\n")
|
82
|
+
false
|
83
|
+
ensure
|
84
|
+
( [ inf, outf].compact - [$stdin, $stdout]).each(&:close)
|
85
|
+
end
|
89
86
|
end
|
90
87
|
end
|
91
88
|
end
|
@@ -3,16 +3,18 @@ module Liquidscript
|
|
3
3
|
class Base
|
4
4
|
class Callable
|
5
5
|
|
6
|
+
attr_accessor :bind
|
7
|
+
|
6
8
|
# Initialize the callable.
|
7
9
|
#
|
8
10
|
# @param bind [Object] the object that holds the method (if
|
9
11
|
# this represents a method call).
|
10
12
|
# @param block [Symbol, Block] if it's a Symbol, it represents
|
11
13
|
# a method on bind; otherwise, it's a pure block.
|
12
|
-
def initialize(bind, block)
|
14
|
+
def initialize(bind, block, prefix = "compile_")
|
13
15
|
@bind = bind
|
14
16
|
@block = if block.is_a? Symbol
|
15
|
-
:"
|
17
|
+
:"#{prefix}#{block}"
|
16
18
|
else
|
17
19
|
block
|
18
20
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "liquidscript/compiler/icr/expressions"
|
2
|
+
require "liquidscript/compiler/icr/directives"
|
2
3
|
require "liquidscript/compiler/icr/functions"
|
3
4
|
require "liquidscript/compiler/icr/literals"
|
4
5
|
require "liquidscript/compiler/icr/classes"
|
@@ -8,9 +9,49 @@ require "liquidscript/compiler/icr/groups"
|
|
8
9
|
|
9
10
|
module Liquidscript
|
10
11
|
module Compiler
|
12
|
+
|
13
|
+
# A list of codes:
|
14
|
+
#
|
15
|
+
# - :class
|
16
|
+
# - :module
|
17
|
+
# - :neg
|
18
|
+
# - :pos
|
19
|
+
# - :binop
|
20
|
+
# - :unop
|
21
|
+
# - :set
|
22
|
+
# - :expression
|
23
|
+
# - :property
|
24
|
+
# - :access
|
25
|
+
# - :call
|
26
|
+
# - :function
|
27
|
+
# - :if
|
28
|
+
# - :elsif
|
29
|
+
# - :unless
|
30
|
+
# - :else
|
31
|
+
# - :try
|
32
|
+
# - :catch
|
33
|
+
# - :finally
|
34
|
+
# - :nrange
|
35
|
+
# - :number
|
36
|
+
# - :action
|
37
|
+
# - :range
|
38
|
+
# - :while
|
39
|
+
# - :for_in
|
40
|
+
# - :for_seg
|
41
|
+
# - :regex
|
42
|
+
# - :href
|
43
|
+
# - :interop
|
44
|
+
# - :istring
|
45
|
+
# - :sstring
|
46
|
+
# - :operator
|
47
|
+
# - :keyword
|
48
|
+
# - :object
|
49
|
+
# - :array
|
50
|
+
# - :newline (depricated)
|
11
51
|
class ICR < Base
|
12
52
|
|
13
53
|
include Expressions
|
54
|
+
include Directives
|
14
55
|
include Functions
|
15
56
|
include Literals
|
16
57
|
include Classes
|
@@ -20,8 +61,6 @@ module Liquidscript
|
|
20
61
|
# (see Base#initialize)
|
21
62
|
def initialize(*)
|
22
63
|
super
|
23
|
-
|
24
|
-
handle_directives
|
25
64
|
end
|
26
65
|
|
27
66
|
# (see Base#reset!)
|
@@ -45,30 +84,8 @@ module Liquidscript
|
|
45
84
|
compile_expression
|
46
85
|
end
|
47
86
|
|
48
|
-
private
|
49
|
-
|
50
|
-
def handle_directives
|
51
|
-
return unless @scanner.metadata[:directives]
|
52
|
-
|
53
|
-
@scanner.metadata[:directives].each do |meta|
|
54
|
-
case meta[:command].downcase
|
55
|
-
when "allow"
|
56
|
-
variables = meta[:args].split(' ')
|
57
|
-
variables.map {|x| normalize(x) }.each { |v|
|
58
|
-
top.context.allow(v.intern) }
|
59
|
-
when "cvar"
|
60
|
-
variables = meta[:args].split(' ')
|
61
|
-
variables.map {|x| normalize(x) }.each { |v|
|
62
|
-
top.context.set(v.intern,
|
63
|
-
:class => true).parameter! }
|
64
|
-
else
|
65
|
-
raise UnknownDirectiveError.new(meta[:command])
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
87
|
def normalize(s)
|
71
|
-
s.gsub(/\-[a-z]/) { |p| p[1].upcase }
|
88
|
+
s.map { |x| x.gsub(/\-[a-z]/) { |p| p[1].upcase } }
|
72
89
|
end
|
73
90
|
end
|
74
91
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Liquidscript
|
2
|
+
module Compiler
|
3
|
+
class ICR < Base
|
4
|
+
module Directives
|
5
|
+
module ClassMethods
|
6
|
+
|
7
|
+
def directives
|
8
|
+
@_directives ||= {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def define_directive(name, body)
|
12
|
+
directives[name] = Base::Callable.new(nil, body, "")
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
module InstanceMethods
|
18
|
+
|
19
|
+
extend Forwardable
|
20
|
+
|
21
|
+
def handle_directive(directive)
|
22
|
+
command, args = directive[:command], directive[:arguments]
|
23
|
+
|
24
|
+
callable = directives.fetch(command)
|
25
|
+
|
26
|
+
callable.bind = self
|
27
|
+
callable.call(*args)
|
28
|
+
|
29
|
+
rescue KeyError
|
30
|
+
raise UnknownDirectiveError.new(command)
|
31
|
+
end
|
32
|
+
|
33
|
+
def directives
|
34
|
+
@_directives ||= self.class.directives.dup
|
35
|
+
end
|
36
|
+
|
37
|
+
def define_directive(name, body)
|
38
|
+
directives[name] = Base::Callable.new(nil, body, "")
|
39
|
+
end
|
40
|
+
|
41
|
+
def directive_allow(*args)
|
42
|
+
args.each do |a|
|
43
|
+
top.context.allow(a.value.intern)
|
44
|
+
end
|
45
|
+
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def directive_cvar(*args)
|
50
|
+
args.each do |a|
|
51
|
+
top.context.set(a.value.intern, :class => true).parameter!
|
52
|
+
end
|
53
|
+
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def directive_strict
|
58
|
+
top.metadata[:strict] = true
|
59
|
+
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.included(receiver)
|
66
|
+
receiver.extend ClassMethods
|
67
|
+
receiver.send :include, InstanceMethods
|
68
|
+
|
69
|
+
InstanceMethods.instance_methods.each do |m|
|
70
|
+
if m.to_s =~ /\A_?directive_([A-Za-z0-9]+)\z/
|
71
|
+
receiver.define_directive($1, m)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -9,7 +9,8 @@ module Liquidscript
|
|
9
9
|
# @return [ICR::Code]
|
10
10
|
def compile_expression
|
11
11
|
expect :if, :unless, :class, :module, :loop, :for,
|
12
|
-
:while, :action, :try, :
|
12
|
+
:while, :action, :try, :return,
|
13
|
+
:colon => :directive, :_ => :vexpression
|
13
14
|
end
|
14
15
|
|
15
16
|
# Compiles an expression that returns a value.
|
@@ -62,6 +63,11 @@ module Liquidscript
|
|
62
63
|
code :unop, shift(:unop, :preunop), compile_vexpression
|
63
64
|
end
|
64
65
|
|
66
|
+
def compile_return
|
67
|
+
shift :return
|
68
|
+
code :return, compile_vexpression
|
69
|
+
end
|
70
|
+
|
65
71
|
# Handles an assignment of the form `identifier = expression`,
|
66
72
|
# with the argument being the identifier, and the position of
|
67
73
|
# the compiler being after it.
|
@@ -100,6 +106,30 @@ module Liquidscript
|
|
100
106
|
end
|
101
107
|
end
|
102
108
|
|
109
|
+
def compile_directive
|
110
|
+
shift :colon
|
111
|
+
shift :lbrack
|
112
|
+
command = shift(:identifier).value
|
113
|
+
old, @in_directive = @in_directive, true
|
114
|
+
arguments = collect_compiles :rbrack do
|
115
|
+
expect :lbrace => action { _compile_block },
|
116
|
+
:identifier => action.shift,
|
117
|
+
:_ => :vexpression
|
118
|
+
end
|
119
|
+
|
120
|
+
directive = {
|
121
|
+
:command => command,
|
122
|
+
:arguments => arguments }
|
123
|
+
|
124
|
+
@in_directive = old
|
125
|
+
|
126
|
+
if @in_directive
|
127
|
+
directive
|
128
|
+
else
|
129
|
+
handle_directive(directive)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
103
133
|
def _compile_lparen_method
|
104
134
|
ident = shift :identifier
|
105
135
|
|
@@ -112,6 +142,7 @@ module Liquidscript
|
|
112
142
|
end
|
113
143
|
end
|
114
144
|
|
145
|
+
|
115
146
|
def _compile_lparen_method_final(ident = nil)
|
116
147
|
components = [ident].compact
|
117
148
|
|
data/lib/liquidscript/errors.rb
CHANGED
@@ -7,6 +7,8 @@ module Liquidscript
|
|
7
7
|
class GeneratorError < Error; end
|
8
8
|
|
9
9
|
class UnexpectedEndError < CompileError; end
|
10
|
+
class DirectiveError < CompileError; end
|
11
|
+
|
10
12
|
class InvalidReferenceError < CompileError
|
11
13
|
|
12
14
|
def initialize(name)
|
@@ -14,7 +16,8 @@ module Liquidscript
|
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
17
|
-
|
19
|
+
|
20
|
+
class UnknownDirectiveError < DirectiveError
|
18
21
|
def initialize(directive)
|
19
22
|
super "Unkown directive: #{directive}"
|
20
23
|
end
|
@@ -8,12 +8,17 @@ module Liquidscript
|
|
8
8
|
#
|
9
9
|
# @param code [ICR::Code, #type]
|
10
10
|
# @param context [Hash]
|
11
|
-
def replace(code)
|
12
|
-
|
13
|
-
|
11
|
+
def replace(code, options = {})
|
12
|
+
method_name = :"generate_#{code.type}"
|
13
|
+
|
14
|
+
if method(method_name).arity.abs == 1
|
15
|
+
send(method_name, code)
|
16
|
+
else
|
17
|
+
send(method_name, code, options)
|
18
|
+
end
|
14
19
|
|
15
20
|
rescue NoMethodError => e
|
16
|
-
if e.name ==
|
21
|
+
if e.name == method_name
|
17
22
|
raise InvalidCodeError.new(code.type)
|
18
23
|
else
|
19
24
|
raise
|
@@ -21,9 +21,9 @@ module Liquidscript
|
|
21
21
|
def generate_nrange(code)
|
22
22
|
start = code[1]
|
23
23
|
ending = code[2]
|
24
|
-
|
24
|
+
|
25
25
|
if (start.to_i - ending.to_i).abs > 50
|
26
|
-
generate_range(code, true)
|
26
|
+
generate_range(code, {}, true)
|
27
27
|
elsif ending > start
|
28
28
|
buffer << "[" << (start..ending).to_a.join(', ') << "]"
|
29
29
|
else
|
@@ -31,7 +31,7 @@ module Liquidscript
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
def generate_range(code, norep=false)
|
34
|
+
def generate_range(code, options = {}, norep = false)
|
35
35
|
out = buffer
|
36
36
|
a = norep ? code[1] : replace(code[1])
|
37
37
|
b = norep ? code[2] : replace(code[2])
|
@@ -46,7 +46,7 @@ module Liquidscript
|
|
46
46
|
unindent! << "};\n" <<
|
47
47
|
indent << "return t === undefined ?" <<
|
48
48
|
"out : out.reverse();\n" <<
|
49
|
-
unindent! << "})(" << a << ", " << b << ")"
|
49
|
+
unindent! << "})(" << a << ", " << b << ")"
|
50
50
|
out
|
51
51
|
end
|
52
52
|
|
@@ -130,6 +130,10 @@ module Liquidscript
|
|
130
130
|
"#{code[1].value} #{replace(code[2])}"
|
131
131
|
end
|
132
132
|
|
133
|
+
def generate_return(code)
|
134
|
+
"return #{replace(code[1])}"
|
135
|
+
end
|
136
|
+
|
133
137
|
def generate_href(code)
|
134
138
|
heredoc = code[1]
|
135
139
|
hbuf = buffer
|
@@ -207,7 +211,7 @@ module Liquidscript
|
|
207
211
|
"function(" <<
|
208
212
|
code[1].parameters.join(', ') <<
|
209
213
|
") {\n" <<
|
210
|
-
replace(code[1])
|
214
|
+
replace(code[1], :final_return => true)
|
211
215
|
unindent!
|
212
216
|
|
213
217
|
function << indent_level << "}"
|
@@ -3,10 +3,18 @@ module Liquidscript
|
|
3
3
|
class Javascript
|
4
4
|
module Metas
|
5
5
|
|
6
|
-
def generate_exec(code)
|
6
|
+
def generate_exec(code, options)
|
7
7
|
exec = buffer
|
8
|
+
return exec if code.codes.length == 0
|
8
9
|
exec << _exec_context(code)
|
9
|
-
insert_into(code.codes, exec)
|
10
|
+
insert_into(code.codes[0..-2], exec)
|
11
|
+
last = code.codes.last
|
12
|
+
|
13
|
+
if last.value? && options[:final_return]
|
14
|
+
exec << indent << "return #{replace(last)};\n"
|
15
|
+
else
|
16
|
+
exec << indent << replace(last) << ";\n"
|
17
|
+
end
|
10
18
|
end
|
11
19
|
|
12
20
|
def generate_set(code)
|
@@ -59,9 +67,11 @@ module Liquidscript
|
|
59
67
|
protected
|
60
68
|
|
61
69
|
def _exec_context(code)
|
70
|
+
out = buffer
|
62
71
|
|
72
|
+
out << "#{indent}\"use strict\";\n" if code[:strict]
|
63
73
|
unless code.locals.empty?
|
64
|
-
"#{indent_level}var #{code.locals.join(', ')};\n"
|
74
|
+
out << "#{indent_level}var #{code.locals.join(', ')};\n"
|
65
75
|
end
|
66
76
|
end
|
67
77
|
end
|
@@ -43,6 +43,18 @@ module Liquidscript
|
|
43
43
|
[@action, *@arguments]
|
44
44
|
end
|
45
45
|
|
46
|
+
# If this code respresents something with a definite
|
47
|
+
# value.
|
48
|
+
#
|
49
|
+
# @return [Boolean]
|
50
|
+
def value?
|
51
|
+
@_value ||= ![
|
52
|
+
:class, :module, :if, :elseif, :unless,
|
53
|
+
:else, :try, :catch, :finally, :while, :for_in,
|
54
|
+
:for_seg, :return
|
55
|
+
].include?(@action)
|
56
|
+
end
|
57
|
+
|
46
58
|
# If we don't respond to it, the @arguments array
|
47
59
|
# might. Ask them if they do, and if they don't,
|
48
60
|
# respond accordingly.
|
@@ -35,7 +35,6 @@ module Liquidscript
|
|
35
35
|
!
|
36
36
|
~
|
37
37
|
new
|
38
|
-
return
|
39
38
|
typeof
|
40
39
|
throw
|
41
40
|
)
|
@@ -82,13 +81,11 @@ module Liquidscript
|
|
82
81
|
end
|
83
82
|
|
84
83
|
action :directive do |_, c, a|
|
85
|
-
|
86
|
-
metadata[:directives].push :command => c,
|
87
|
-
:args => a
|
84
|
+
emit :directive, [c, a]
|
88
85
|
end
|
89
86
|
|
90
87
|
action :identifier do |m|
|
91
|
-
emit :identifier, m
|
88
|
+
emit :identifier, normalize_identifier(m)
|
92
89
|
end
|
93
90
|
|
94
91
|
set :identifier, %r{[A-Za-z_$]([A-Za-z0-9_$-]*[A-Za-z0-9_$])?}
|
@@ -104,13 +101,14 @@ module Liquidscript
|
|
104
101
|
on("try") { emit :try }
|
105
102
|
on("catch") { emit :catch }
|
106
103
|
on("finally") { emit :finally }
|
104
|
+
on("return") { emit :return }
|
107
105
|
on(:number) { |m| emit :number, m }
|
108
106
|
on(:string) { |m| emit :sstring, m }
|
109
107
|
on(:keywords) { |m| emit :keyword, m }
|
110
108
|
on(:actions) { |m| emit :action, m }
|
111
|
-
on(:binops) { |m| emit :binop,
|
112
|
-
on(:preunops) { |m| emit :preunop,
|
113
|
-
on(:unops) { |m| emit :unop,
|
109
|
+
on(:binops) { |m| emit :binop, m }
|
110
|
+
on(:preunops) { |m| emit :preunop, m }
|
111
|
+
on(:unops) { |m| emit :unop, m }
|
114
112
|
on(%r{<<([A-Z]+)}, :heredoc)
|
115
113
|
on(%r{<<-([A-Z]+)}, :iheredoc)
|
116
114
|
on(%r{r/((?:.|\/)*)/([gimy]*)}, :regex)
|
@@ -132,7 +130,7 @@ module Liquidscript
|
|
132
130
|
on("+") { emit :plus }
|
133
131
|
on("\n") { line! }
|
134
132
|
on(:identifier, :identifier)
|
135
|
-
on(%r{
|
133
|
+
on(%r{!\[\s*([A-Za-z]+)\s*(.*?)\s*\]\n}, :directive)
|
136
134
|
|
137
135
|
on(%r{#.*?\n}) { }
|
138
136
|
on(%r{\s}) { }
|
data/lib/liquidscript/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
data: |
|
2
|
-
|
2
|
+
:[allow require set-timeout]
|
3
3
|
|
4
4
|
assert = require('assert)
|
5
5
|
|
@@ -52,15 +52,15 @@ compiled: |
|
|
52
52
|
|
53
53
|
Test.prototype.initialize = function() {
|
54
54
|
"this should be init";
|
55
|
-
this.wee();
|
55
|
+
return this.wee();
|
56
56
|
};
|
57
57
|
|
58
58
|
Test.prototype.wee = function() {
|
59
|
-
console.log(this.someNumber);
|
59
|
+
return console.log(this.someNumber);
|
60
60
|
};
|
61
61
|
|
62
62
|
Test.test = function() {
|
63
|
-
"class method!";
|
63
|
+
return "class method!";
|
64
64
|
};
|
65
65
|
Something.Test = Test;
|
66
66
|
|
@@ -73,7 +73,7 @@ compiled: |
|
|
73
73
|
AnotherTest.prototype.__proto__ = Test.prototype;
|
74
74
|
|
75
75
|
AnotherTest.prototype.thing = function() {
|
76
|
-
console.log("[another test]", this.someNumber, this.anotherThing);
|
76
|
+
return console.log("[another test]", this.someNumber, this.anotherThing);
|
77
77
|
};
|
78
78
|
|
79
79
|
Something.AnotherTest = AnotherTest;;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
data: |
|
2
|
-
|
2
|
+
:[allow require]
|
3
3
|
Test = require("assert")
|
4
4
|
|
5
5
|
module SomeModule {
|
@@ -25,7 +25,7 @@ compiled: |
|
|
25
25
|
};
|
26
26
|
|
27
27
|
Thing.prototype.initialize = function() {
|
28
|
-
this.test = new Test();
|
28
|
+
return this.test = new Test();
|
29
29
|
};
|
30
30
|
|
31
31
|
Thing.prototype.do = function(thing) {
|
@@ -25,16 +25,16 @@ compiled: |
|
|
25
25
|
};
|
26
26
|
|
27
27
|
Greeter.prototype.initialize = function(name) {
|
28
|
-
this.name = name;
|
28
|
+
return this.name = name;
|
29
29
|
};
|
30
30
|
|
31
31
|
Greeter.prototype.greet = function() {
|
32
|
-
console.log("Hello " + (this.name) + "!");
|
32
|
+
return console.log("Hello " + (this.name) + "!");
|
33
33
|
};
|
34
34
|
|
35
35
|
Greeter.meet = function(first, second) {
|
36
36
|
new Greeter(first).greet();
|
37
|
-
new Greeter(second).greet();
|
37
|
+
return new Greeter(second).greet();
|
38
38
|
};;
|
39
39
|
|
40
40
|
Greeter.meet("Alice", "Bob");
|
@@ -1,6 +1,7 @@
|
|
1
1
|
data: |
|
2
2
|
console = 2
|
3
3
|
some_function = ()-> {
|
4
|
+
:[strict]
|
4
5
|
console = 3
|
5
6
|
test = 0..console
|
6
7
|
}
|
@@ -10,9 +11,10 @@ compiled: |
|
|
10
11
|
console = 2;
|
11
12
|
|
12
13
|
some_function = function() {
|
14
|
+
"use strict";
|
13
15
|
var test;
|
14
16
|
console = 3;
|
15
|
-
test = (function(a, b) {
|
17
|
+
return test = (function(a, b) {
|
16
18
|
var out, i, t;
|
17
19
|
out = [];
|
18
20
|
if(a > b) {
|
data/spec/fixtures/underscore.js
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
(function() {
|
2
|
-
|
3
|
-
var root,breaker,previousUnderscore,ArrayProto,ObjProto,FuncProto,push,slice,concat,toString,hasOwnProperty,nativeForEach,nativeMap,nativeReduce,nativeReduceRight,nativeFilter,nativeEvery,nativeSome,nativeIndexOf,nativeLastIndexOf,nativeIsArray,nativeKeys,nativeBind,_,each;
|
2
|
+
var root, breaker, previousUnderscore, ArrayProto, ObjProto, FuncProto, push, slice, concat, toString, hasOwnProperty, nativeForEach, nativeMap, nativeReduce, nativeReduceRight, nativeFilter, nativeEvery, nativeSome, nativeIndexOf, nativeLastIndexOf, nativeIsArray, nativeKeys, nativeBind, _, each;
|
4
3
|
root = this;
|
5
4
|
breaker = {};
|
6
5
|
previousUnderscore = root._;
|
@@ -26,16 +25,16 @@
|
|
26
25
|
nativeKeys = Object.keys;
|
27
26
|
nativeBind = FuncProto.bind;
|
28
27
|
_ = function(obj) {
|
29
|
-
if(
|
30
|
-
|
28
|
+
if(obj instanceof _) {
|
29
|
+
return obj;
|
31
30
|
};
|
32
|
-
if(
|
33
|
-
|
31
|
+
if(! (this instanceof _)) {
|
32
|
+
return new _(obj);
|
34
33
|
};
|
35
|
-
this._wrapped = obj;
|
34
|
+
return this._wrapped = obj;
|
36
35
|
};
|
37
|
-
if(
|
38
|
-
if(
|
36
|
+
if(typeof exports !== 'undefined') {
|
37
|
+
if(typeof root.module !== 'undefined' && root.module.exports) {
|
39
38
|
exports = root.module.exports = _;
|
40
39
|
};
|
41
40
|
exports._ = _;
|
@@ -43,46 +42,44 @@
|
|
43
42
|
root._ = _;
|
44
43
|
};
|
45
44
|
_.VERSION = "1.6.0";
|
46
|
-
each = _.each = _.forEach = function(obj,iterator,context) {
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
return obj;
|
45
|
+
each = _.each = _.forEach = function(obj, iterator, context) {
|
46
|
+
var i, length, keys;
|
47
|
+
if(obj === null) {
|
48
|
+
return obj;
|
51
49
|
};
|
52
|
-
if(
|
53
|
-
obj.forEach(iterator,context);
|
54
|
-
}else if(
|
50
|
+
if(nativeForEach && obj.forEach === nativeForEach) {
|
51
|
+
obj.forEach(iterator, context);
|
52
|
+
}else if(obj.length === (+obj.length)) {
|
55
53
|
i = 0;
|
56
54
|
length = obj.length;
|
57
|
-
for(i = 0; i < length;i++) {
|
58
|
-
|
59
|
-
|
60
|
-
|
55
|
+
for(i = 0; i < length; i++) {
|
56
|
+
if(iterator.call(context, obj[i], i, obj) === breaker) {
|
57
|
+
return null;
|
58
|
+
};
|
61
59
|
};
|
62
60
|
} else {
|
63
61
|
keys = _.keys(obj);
|
64
62
|
length = keys.length;
|
65
|
-
for(i = 0; i < length;i++) {
|
66
|
-
|
67
|
-
|
68
|
-
|
63
|
+
for(i = 0; i < length; i++) {
|
64
|
+
if(iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) {
|
65
|
+
return null;
|
66
|
+
};
|
69
67
|
};
|
70
68
|
};
|
71
|
-
|
69
|
+
return obj;
|
72
70
|
};
|
73
|
-
_.map = _.collect = function(obj,iterator,context) {
|
74
|
-
|
71
|
+
return _.map = _.collect = function(obj, iterator, context) {
|
75
72
|
var results;
|
76
73
|
results = [];
|
77
|
-
if(
|
78
|
-
|
74
|
+
if(obj == null) {
|
75
|
+
return results;
|
79
76
|
};
|
80
|
-
if(
|
81
|
-
|
77
|
+
if(nativeMap && obj.map === nativeMap) {
|
78
|
+
return obj.map(iterator, context);
|
82
79
|
};
|
83
|
-
each(obj,function(value,index,list) {
|
84
|
-
results.push(iterator.call(context,value,index,list));
|
80
|
+
each(obj, function(value, index, list) {
|
81
|
+
return results.push(iterator.call(context, value, index, list));
|
85
82
|
});
|
86
|
-
|
83
|
+
return results;
|
87
84
|
};
|
88
85
|
}).call();
|
@@ -1,6 +1,6 @@
|
|
1
1
|
(-> {
|
2
2
|
|
3
|
-
|
3
|
+
![ allow Array Object Function ]
|
4
4
|
|
5
5
|
root = this
|
6
6
|
breaker = {}
|
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
_ = (obj)-> {
|
34
34
|
if(obj instanceof _) {
|
35
|
-
|
35
|
+
obj
|
36
36
|
}
|
37
37
|
if(!(this instanceof _)) {
|
38
38
|
return new _(obj)
|
@@ -143,36 +143,26 @@ describe Compiler::ICR do
|
|
143
143
|
|
144
144
|
describe "invalid directives" do
|
145
145
|
let(:scanner) do
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
expect(scanner).to receive(:each).once.and_return(iterator)
|
151
|
-
expect(scanner).to receive(:metadata).twice.and_return(
|
152
|
-
{:directives =>
|
153
|
-
[{:command => "test", :args => ""},
|
154
|
-
{:command => "allow", :args => "test"}]})
|
155
|
-
scanner
|
146
|
+
s = Liquidscript::Scanner::Liquidscript.new(
|
147
|
+
":[test thing]\n:[allow thing]\n")
|
148
|
+
s.scan
|
149
|
+
s
|
156
150
|
end
|
157
151
|
|
158
152
|
it "raises an error" do
|
159
|
-
expect { subject }.to raise_error(Liquidscript::UnknownDirectiveError)
|
153
|
+
expect { subject.compile }.to raise_error(Liquidscript::UnknownDirectiveError)
|
160
154
|
end
|
161
155
|
end
|
162
156
|
|
163
157
|
describe "directives" do
|
164
158
|
let(:scanner) do
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
expect(scanner).to receive(:each).once.and_return(iterator)
|
170
|
-
expect(scanner).to receive(:metadata).twice.and_return(
|
171
|
-
{:directives => [{:command => "allow", :args => "test"}]})
|
172
|
-
scanner
|
159
|
+
s = Liquidscript::Scanner::Liquidscript.new(":[allow test]\n")
|
160
|
+
s.scan
|
161
|
+
s
|
173
162
|
end
|
174
163
|
|
175
164
|
it "raises an error" do
|
165
|
+
subject.compile
|
176
166
|
subject.top.context.get(:test)
|
177
167
|
end
|
178
168
|
end
|
@@ -45,7 +45,7 @@ describe Liquidscript::Scanner::Liquidscript, :lexer_helper do
|
|
45
45
|
|
46
46
|
it "scans keywords" do
|
47
47
|
scan("return test = new foo").should eq [
|
48
|
-
[:
|
48
|
+
[:return, nil],
|
49
49
|
[:identifier, "test"],
|
50
50
|
[:equal, nil],
|
51
51
|
[:preunop, "new"],
|
@@ -75,8 +75,8 @@ describe Liquidscript::Scanner::Liquidscript, :lexer_helper do
|
|
75
75
|
end
|
76
76
|
|
77
77
|
describe "scanning directives" do
|
78
|
-
subject { c = described_class.new("
|
79
|
-
its(:
|
78
|
+
subject { c = described_class.new("![ test thing ]\n"); c.scan; c }
|
79
|
+
its(:tokens) { should eq [[:directive, ["test", "thing"]]] }
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: liquidscript
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Rodi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -137,6 +137,7 @@ files:
|
|
137
137
|
- lib/liquidscript/compiler/base/helpers.rb
|
138
138
|
- lib/liquidscript/compiler/icr.rb
|
139
139
|
- lib/liquidscript/compiler/icr/classes.rb
|
140
|
+
- lib/liquidscript/compiler/icr/directives.rb
|
140
141
|
- lib/liquidscript/compiler/icr/expressions.rb
|
141
142
|
- lib/liquidscript/compiler/icr/functions.rb
|
142
143
|
- lib/liquidscript/compiler/icr/groups.rb
|
@@ -228,9 +229,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
228
229
|
version: '0'
|
229
230
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
230
231
|
requirements:
|
231
|
-
- - "
|
232
|
+
- - ">"
|
232
233
|
- !ruby/object:Gem::Version
|
233
|
-
version:
|
234
|
+
version: 1.3.1
|
234
235
|
requirements: []
|
235
236
|
rubyforge_project:
|
236
237
|
rubygems_version: 2.2.2
|