liquidscript 0.10.4 → 0.11.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|