liquidscript 0.4.1 → 0.5.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.
- checksums.yaml +4 -4
- data/lib/liquidscript/buffer.rb +2 -2
- data/lib/liquidscript/compiler/icr.rb +1 -0
- data/lib/liquidscript/compiler/icr/classes.rb +11 -3
- data/lib/liquidscript/compiler/icr/expressions.rb +56 -10
- data/lib/liquidscript/compiler/icr/functions.rb +7 -6
- data/lib/liquidscript/compiler/icr/heredoc.rb +28 -0
- data/lib/liquidscript/compiler/icr/literals.rb +102 -9
- data/lib/liquidscript/errors.rb +6 -0
- data/lib/liquidscript/generator/base.rb +1 -1
- data/lib/liquidscript/generator/base/replacements.rb +2 -2
- data/lib/liquidscript/generator/javascript.rb +21 -0
- data/lib/liquidscript/generator/javascript/exceptions.rb +42 -0
- data/lib/liquidscript/generator/javascript/literals.rb +71 -9
- data/lib/liquidscript/generator/javascript/metas.rb +14 -13
- data/lib/liquidscript/generator/javascript/objects.rb +21 -16
- data/lib/liquidscript/icr/set.rb +8 -0
- data/lib/liquidscript/scanner/base/lexer.rb +13 -10
- data/lib/liquidscript/scanner/liquidscript.rb +95 -17
- data/lib/liquidscript/template.rb +1 -2
- data/lib/liquidscript/version.rb +1 -1
- data/liquidscript.gemspec +1 -0
- data/spec/fixtures/class.compile.yml +12 -1
- data/spec/fixtures/class.generate.yml +4 -4
- data/spec/fixtures/combination.generate.yml +4 -4
- data/spec/fixtures/complex.generate.yml +5 -5
- data/spec/fixtures/expression.generate.yml +1 -1
- data/spec/fixtures/heredoc.generate.yml +9 -0
- data/spec/fixtures/literals.generate.yml +9 -1
- data/spec/fixtures/loop.generate.yml +16 -0
- data/spec/fixtures/main.compile.yml +19 -15
- data/spec/fixtures/operator.generate.yml +10 -2
- data/spec/fixtures/string.compile.yml +20 -1
- data/spec/fixtures/string.generate.yml +1 -1
- data/spec/fixtures/underscore.js +28 -0
- data/spec/fixtures/underscore.ls +2 -1
- data/spec/liquidscript/compiler/icr_spec.rb +2 -0
- data/spec/liquidscript/node_spec.rb +21 -0
- data/spec/liquidscript/scanner/lexer_spec.rb +23 -2
- data/spec/support/matchers/compile.rb +1 -1
- data/spec/support/matchers/generate.rb +6 -3
- data/spec/support/matchers/run.rb +12 -0
- metadata +28 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6fe5335e4dfdf4f906673f081655d77b96fbca14
|
4
|
+
data.tar.gz: 5c1ff4ce91cc20fa3ede9c4fc7dfe030e752fef6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 051c175bba208e2cd9154d72722a55d31a2db037a17ed87dc4b8c7e275df81c6ec344fe35bd9f7bbae431b72c9c0f4789e8dfc9d54820a302360b759a92c777b
|
7
|
+
data.tar.gz: 8f4c51719dcc4dfa40856605796694cc3bd00f579eee32fd63056126e86269fcdb302ddc217bcc1643e3191b61159255a904a50381d94f79fb88af3992cea602
|
data/lib/liquidscript/buffer.rb
CHANGED
@@ -3,6 +3,7 @@ require "liquidscript/compiler/icr/functions"
|
|
3
3
|
require "liquidscript/compiler/icr/literals"
|
4
4
|
require "liquidscript/compiler/icr/classes"
|
5
5
|
require "liquidscript/compiler/icr/helpers"
|
6
|
+
require "liquidscript/compiler/icr/heredoc"
|
6
7
|
|
7
8
|
module Liquidscript
|
8
9
|
module Compiler
|
@@ -6,10 +6,18 @@ module Liquidscript
|
|
6
6
|
def compile_class
|
7
7
|
shift :class
|
8
8
|
name = shift :identifier
|
9
|
+
inherit = nil
|
9
10
|
set name
|
11
|
+
# Inheritance ftw!
|
12
|
+
if peek?(:colon)
|
13
|
+
shift :colon
|
14
|
+
inherit = shift :identifier
|
15
|
+
ref inherit
|
16
|
+
end
|
17
|
+
|
10
18
|
body = _compile_class_body(false)
|
11
19
|
|
12
|
-
code :class, name, body
|
20
|
+
code :class, name, inherit, body
|
13
21
|
end
|
14
22
|
|
15
23
|
def compile_module
|
@@ -22,7 +30,7 @@ module Liquidscript
|
|
22
30
|
end
|
23
31
|
|
24
32
|
def _compile_class_body(mod = false)
|
25
|
-
shift :
|
33
|
+
shift :lbrace
|
26
34
|
|
27
35
|
components = []
|
28
36
|
|
@@ -34,7 +42,7 @@ module Liquidscript
|
|
34
42
|
end
|
35
43
|
|
36
44
|
loop do
|
37
|
-
expect :newline, :
|
45
|
+
expect :newline, :rbrace => action.end_loop,
|
38
46
|
:comma => action.shift,
|
39
47
|
:module => action { components << compile_module },
|
40
48
|
:class => action { components << compile_class },
|
@@ -8,7 +8,8 @@ module Liquidscript
|
|
8
8
|
#
|
9
9
|
# @return [ICR::Code]
|
10
10
|
def compile_expression
|
11
|
-
expect :if, :unless, :class, :module, :
|
11
|
+
expect :if, :unless, :class, :module, :loop, :for,
|
12
|
+
:while, :action, :try, :_ => :vexpression
|
12
13
|
end
|
13
14
|
|
14
15
|
# Compiles an expression that returns a value.
|
@@ -19,11 +20,19 @@ module Liquidscript
|
|
19
20
|
:istring, :lparen,
|
20
21
|
:sstring, :operator,
|
21
22
|
:keyword, :unop,
|
23
|
+
:regex,
|
22
24
|
:newline,
|
23
25
|
:istring_begin,
|
24
|
-
:
|
25
|
-
:lbrace => :
|
26
|
-
:
|
26
|
+
:iheredoc_begin,
|
27
|
+
:lbrace => :object,
|
28
|
+
:lbrack => :array,
|
29
|
+
:arrow => :function,
|
30
|
+
[
|
31
|
+
:heredoc_ref, :iheredoc_ref
|
32
|
+
] => :href,
|
33
|
+
[
|
34
|
+
:heredoc, :iheredoc
|
35
|
+
] => :heredoc
|
27
36
|
|
28
37
|
if peek? :binop
|
29
38
|
compile_binop(out)
|
@@ -120,9 +129,9 @@ module Liquidscript
|
|
120
129
|
shift :lparen
|
121
130
|
conditional = compile_vexpression
|
122
131
|
shift :rparen
|
123
|
-
shift :
|
132
|
+
shift :lbrace
|
124
133
|
|
125
|
-
body = collect_compiles(:expression, :
|
134
|
+
body = collect_compiles(:expression, :rbrace)
|
126
135
|
|
127
136
|
if peek?(:elsif, :else)
|
128
137
|
code key, conditional, body, expect(:elsif, :else)
|
@@ -137,21 +146,58 @@ module Liquidscript
|
|
137
146
|
shift :lparen
|
138
147
|
conditional = compile_vexpression
|
139
148
|
shift :rparen
|
140
|
-
shift :
|
149
|
+
shift :lbrace
|
141
150
|
|
142
|
-
body = collect_compiles(:expression, :
|
151
|
+
body = collect_compiles(:expression, :rbrace)
|
143
152
|
code :unless, conditional, body
|
144
153
|
end
|
145
154
|
|
146
155
|
def compile_else
|
147
156
|
shift :else
|
148
|
-
shift :
|
157
|
+
shift :lbrace
|
149
158
|
|
150
|
-
body = collect_compiles(:expression, :
|
159
|
+
body = collect_compiles(:expression, :rbrace)
|
151
160
|
|
152
161
|
code :else, body
|
153
162
|
end
|
154
163
|
|
164
|
+
def compile_try
|
165
|
+
shift :try
|
166
|
+
shift :lbrace
|
167
|
+
try_body = collect_compiles(:expression, :rbrace)
|
168
|
+
|
169
|
+
next_part = if peek?(:catch)
|
170
|
+
_compile_catch
|
171
|
+
elsif peek?(:finally)
|
172
|
+
_compile_finally
|
173
|
+
end
|
174
|
+
|
175
|
+
code :try, try_body, next_part
|
176
|
+
end
|
177
|
+
|
178
|
+
def _compile_catch
|
179
|
+
shift :catch
|
180
|
+
shift :lparen
|
181
|
+
var = shift :identifier
|
182
|
+
shift :rparen
|
183
|
+
shift :lbrace
|
184
|
+
catch_body = collect_compiles(:expression, :rbrace)
|
185
|
+
|
186
|
+
next_part = if peek?(:finally)
|
187
|
+
_compile_finally
|
188
|
+
end
|
189
|
+
|
190
|
+
code :catch, var, catch_body, next_part
|
191
|
+
end
|
192
|
+
|
193
|
+
def _compile_finally
|
194
|
+
shift :finally
|
195
|
+
shift :lbrace
|
196
|
+
finally_body = collect_compiles(:expression, :rbrace)
|
197
|
+
|
198
|
+
code :finally, finally_body
|
199
|
+
end
|
200
|
+
|
155
201
|
end
|
156
202
|
end
|
157
203
|
end
|
@@ -7,16 +7,17 @@ module Liquidscript
|
|
7
7
|
shift :prop
|
8
8
|
|
9
9
|
property = action do |ident|
|
10
|
-
code :property, prop, ident
|
10
|
+
code :property, prop, (ident.value || ident.type)
|
11
11
|
end
|
12
12
|
|
13
13
|
# Just in case there is a property named 'class' or 'module'
|
14
|
-
|
14
|
+
v = expect [:identifier, :class, :module] => property
|
15
15
|
|
16
|
-
expect :lparen => action { compile_call(
|
17
|
-
:equal => action { compile_assignment(
|
18
|
-
:prop => action { compile_property(
|
19
|
-
:
|
16
|
+
expect :lparen => action { compile_call(v) },
|
17
|
+
:equal => action { compile_assignment(v) },
|
18
|
+
:prop => action { compile_property(v) },
|
19
|
+
:unop => action { |o| code :op, v, o },
|
20
|
+
:_ => action { v }
|
20
21
|
end
|
21
22
|
|
22
23
|
def compile_call(subject)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Liquidscript
|
2
|
+
module Compiler
|
3
|
+
class ICR < Base
|
4
|
+
class Heredoc
|
5
|
+
|
6
|
+
attr_reader :name
|
7
|
+
attr_accessor :body
|
8
|
+
|
9
|
+
include Liquidscript::ICR::Representable
|
10
|
+
|
11
|
+
def initialize(name, interpolate)
|
12
|
+
@name = name
|
13
|
+
@interpolate = interpolate
|
14
|
+
@body = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def interpolate?
|
18
|
+
!!@interpolate
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_a
|
22
|
+
[:heredoc, @name, @body]
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -7,17 +7,110 @@ module Liquidscript
|
|
7
7
|
code :number, pop.value
|
8
8
|
end
|
9
9
|
|
10
|
+
def compile_action
|
11
|
+
code :action, shift(:action)
|
12
|
+
end
|
13
|
+
|
14
|
+
def compile_while
|
15
|
+
shift :while
|
16
|
+
shift :lparen
|
17
|
+
conditional = compile_vexpression
|
18
|
+
shift :rparen
|
19
|
+
shift :lbrace
|
20
|
+
body = collect_compiles(:expression, :rbrace)
|
21
|
+
code :while, conditional, body
|
22
|
+
end
|
23
|
+
|
24
|
+
def compile_for
|
25
|
+
shift :for
|
26
|
+
shift :lparen
|
27
|
+
if peek?(:identifier)
|
28
|
+
ident = shift :identifier
|
29
|
+
if peek?(:identifier)
|
30
|
+
_compile_for_in(ident)
|
31
|
+
else
|
32
|
+
_compile_for_seg(compile_identifier(ident))
|
33
|
+
end
|
34
|
+
else
|
35
|
+
compile_for_seg compile_vexpression
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def _compile_for_in(ident)
|
40
|
+
content = shift :identifier
|
41
|
+
unless content.value == "in"
|
42
|
+
raise CompileError, "Expected `in', got #{content.value}"
|
43
|
+
end
|
44
|
+
|
45
|
+
obj = shift :identifier
|
46
|
+
shift :rparen
|
47
|
+
shift :lbrace
|
48
|
+
|
49
|
+
set ident
|
50
|
+
body = collect_compiles(:expression, :rbrace)
|
51
|
+
code :for_in, ident, ref(obj), body
|
52
|
+
end
|
53
|
+
|
54
|
+
def _compile_for_seg(first)
|
55
|
+
shift :comma
|
56
|
+
second = compile_vexpression
|
57
|
+
shift :comma
|
58
|
+
third = compile_vexpression
|
59
|
+
shift :rparen
|
60
|
+
shift :lbrace
|
61
|
+
|
62
|
+
body = collect_compiles(:expression, :rbrace)
|
63
|
+
code :for_seg, first, second, third, body
|
64
|
+
end
|
65
|
+
|
10
66
|
def compile_identifier(identifier)
|
11
67
|
default = action do
|
12
68
|
code :get, ref(identifier)
|
13
69
|
end
|
14
70
|
|
15
|
-
expect :equal => action { compile_assignment(identifier)
|
16
|
-
:prop => action { compile_property(identifier)
|
17
|
-
:lparen => action { compile_call(identifier)
|
71
|
+
expect :equal => action { compile_assignment(identifier) },
|
72
|
+
:prop => action { compile_property(identifier) },
|
73
|
+
:lparen => action { compile_call(identifier) },
|
74
|
+
:unop => action { |o| code :op, ref(identifier), o },
|
18
75
|
:_ => default
|
19
76
|
end
|
20
77
|
|
78
|
+
def compile_regex
|
79
|
+
code :regex, shift(:regex)
|
80
|
+
end
|
81
|
+
|
82
|
+
def compile_href
|
83
|
+
ref = shift :heredoc_ref, :iheredoc_ref
|
84
|
+
heredoc = Heredoc.new(ref.value, ref.type == :iheredoc_ref)
|
85
|
+
top[:heredocs] ||= []
|
86
|
+
top[:herenum] ||= 0
|
87
|
+
top[:heredocs] << heredoc
|
88
|
+
code :href, heredoc
|
89
|
+
end
|
90
|
+
|
91
|
+
def compile_heredoc
|
92
|
+
h = shift(:heredoc, :iheredoc)
|
93
|
+
|
94
|
+
top[:heredocs][top[:herenum]].body = [h]
|
95
|
+
top[:herenum] += 1
|
96
|
+
nil
|
97
|
+
end
|
98
|
+
|
99
|
+
def compile_iheredoc_begin
|
100
|
+
start = shift :iheredoc_begin
|
101
|
+
contents = [start]
|
102
|
+
|
103
|
+
loop do
|
104
|
+
contents << compile_vexpression
|
105
|
+
contents << shift(:iheredoc)
|
106
|
+
peek?(:istring_begin)
|
107
|
+
end
|
108
|
+
|
109
|
+
top[:heredocs][top[:herenum]].body = contents
|
110
|
+
top[:herenum] += 1
|
111
|
+
nil
|
112
|
+
end
|
113
|
+
|
21
114
|
def compile_istring_begin
|
22
115
|
start = shift :istring_begin
|
23
116
|
contents = [start]
|
@@ -49,9 +142,9 @@ module Liquidscript
|
|
49
142
|
end
|
50
143
|
|
51
144
|
def compile_object
|
52
|
-
shift :
|
145
|
+
shift :lbrace
|
53
146
|
|
54
|
-
objects = collect_compiles :
|
147
|
+
objects = collect_compiles :rbrace,
|
55
148
|
:comma => action.shift,
|
56
149
|
:newline => action.shift do
|
57
150
|
[compile_object_key, compile_vexpression]
|
@@ -61,9 +154,9 @@ module Liquidscript
|
|
61
154
|
end
|
62
155
|
|
63
156
|
def compile_array
|
64
|
-
shift :
|
157
|
+
shift :lbrack
|
65
158
|
|
66
|
-
parts = collect_compiles(:vexpression, :
|
159
|
+
parts = collect_compiles(:vexpression, :rbrack,
|
67
160
|
:comma => action.shift)
|
68
161
|
|
69
162
|
code :array, parts
|
@@ -89,7 +182,7 @@ module Liquidscript
|
|
89
182
|
|
90
183
|
def compile_function_with_parameters(parameters)
|
91
184
|
shift :arrow
|
92
|
-
shift :
|
185
|
+
shift :lbrace
|
93
186
|
|
94
187
|
expressions = Liquidscript::ICR::Set.new
|
95
188
|
expressions.context = Liquidscript::ICR::Context.new
|
@@ -107,7 +200,7 @@ module Liquidscript
|
|
107
200
|
end
|
108
201
|
|
109
202
|
loop do
|
110
|
-
expect :
|
203
|
+
expect :rbrace => action.end_loop,
|
111
204
|
:_ => expression
|
112
205
|
end
|
113
206
|
|
data/lib/liquidscript/errors.rb
CHANGED
@@ -8,12 +8,12 @@ module Liquidscript
|
|
8
8
|
#
|
9
9
|
# @param code [ICR::Code, #type]
|
10
10
|
# @param context [Hash]
|
11
|
-
def replace(code
|
11
|
+
def replace(code)
|
12
12
|
send(:"generate_#{code.type}",
|
13
13
|
code)
|
14
14
|
|
15
15
|
rescue NoMethodError => e
|
16
|
-
if e.name == :"
|
16
|
+
if e.name == :"generate_#{code.type}"
|
17
17
|
raise InvalidCodeError.new(code.type)
|
18
18
|
else
|
19
19
|
raise
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "liquidscript/generator/javascript/literals"
|
2
2
|
require "liquidscript/generator/javascript/metas"
|
3
3
|
require "liquidscript/generator/javascript/objects"
|
4
|
+
require "liquidscript/generator/javascript/exceptions"
|
4
5
|
|
5
6
|
module Liquidscript
|
6
7
|
module Generator
|
@@ -27,11 +28,31 @@ module Liquidscript
|
|
27
28
|
include Literals
|
28
29
|
include Metas
|
29
30
|
include Objects
|
31
|
+
include Exceptions
|
30
32
|
|
31
33
|
def initialize(top)
|
32
34
|
@modules = []
|
35
|
+
@indent = 0
|
33
36
|
super
|
34
37
|
end
|
38
|
+
|
39
|
+
def indent_level
|
40
|
+
" " * @indent
|
41
|
+
end
|
42
|
+
|
43
|
+
def indent!
|
44
|
+
@indent += 1
|
45
|
+
end
|
46
|
+
|
47
|
+
def unindent!
|
48
|
+
@indent -= 1
|
49
|
+
end
|
50
|
+
|
51
|
+
def insert_into(area, buffer)
|
52
|
+
area.inject(buffer) do |m, c|
|
53
|
+
m << indent_level << replace(c) << ";\n"
|
54
|
+
end
|
55
|
+
end
|
35
56
|
end
|
36
57
|
end
|
37
58
|
end
|