@@ -16,13 +16,11 @@ def compile(node)
1616 end
1717
1818 def around_visit ( node )
19- result = super
20-
21- # We want to clear the buffer when there’s a node that isn’t a statements node,
22- # but we should ignore nils, which are usually other buffers.
23- clear_buffer unless result in Refract ::StatementsNode | nil
19+ unless node in Refract ::StatementsNode | Refract ::CallNode | nil
20+ clear_buffer
21+ end
2422
25- result
23+ super
2624 end
2725
2826 visit Refract ::ClassNode do |node |
@@ -36,14 +34,49 @@ def around_visit(node)
3634 visit Refract ::DefNode do |node |
3735 if @stack . size == 1
3836 node . copy (
39- body : Refract ::StatementsNode . new (
40- body : [
41- Refract ::StatementsNode . new (
42- body : @preamble
37+ body : Refract ::BeginNode . new (
38+ statements : Refract ::StatementsNode . new (
39+ body : [
40+ Refract ::StatementsNode . new (
41+ body : @preamble
42+ ) ,
43+ Refract ::NilNode . new ,
44+ visit ( node . body ) ,
45+ ]
46+ ) ,
47+ rescue_clause : Refract ::RescueNode . new (
48+ exceptions : [ ] ,
49+ reference : Refract ::LocalVariableTargetNode . new (
50+ name : :__phlex_exception__
4351 ) ,
44- Refract ::NilNode . new ,
45- visit ( node . body ) ,
46- ]
52+ statements : Refract ::StatementsNode . new (
53+ body : [
54+ Refract ::CallNode . new (
55+ receiver : Refract ::ConstantReadNode . new (
56+ name : :Kernel
57+ ) ,
58+ name : :raise ,
59+ arguments : Refract ::ArgumentsNode . new (
60+ arguments : [
61+ Refract ::CallNode . new (
62+ name : :__map_exception__ ,
63+ arguments : Refract ::ArgumentsNode . new (
64+ arguments : [
65+ Refract ::LocalVariableReadNode . new (
66+ name : :__phlex_exception__
67+ ) ,
68+ ]
69+ )
70+ ) ,
71+ ]
72+ )
73+ ) ,
74+ ]
75+ ) ,
76+ subsequent : nil
77+ ) ,
78+ else_clause : nil ,
79+ ensure_clause : nil
4780 )
4881 )
4982 else
@@ -72,6 +105,7 @@ def around_visit(node)
72105 end
73106 end
74107
108+ clear_buffer
75109 super ( node )
76110 end
77111
@@ -134,7 +168,8 @@ def compile_phlex_attributes(node)
134168 return raw (
135169 Phlex ::SGML ::Attributes . generate_attributes (
136170 eval (
137- "{#{ Refract ::Formatter . new . format_node ( node ) } }"
171+ "{#{ Refract ::Formatter . new . format_node ( node ) . source } }" ,
172+ TOPLEVEL_BINDING
138173 )
139174 )
140175 )
@@ -253,9 +288,10 @@ def compile_doctype_helper(node)
253288 def compile_plain_helper ( node )
254289 node => Refract ::CallNode
255290
256- if node . arguments in [ Refract ::StringNode ]
291+ if node . arguments . arguments in [ Refract ::StringNode ]
257292 raw ( node . arguments . arguments . first . unescaped )
258293 else
294+ clear_buffer
259295 node
260296 end
261297 end
@@ -315,6 +351,8 @@ def compile_comment_helper(node)
315351
316352 def compile_raw_helper ( node )
317353 node => Refract ::CallNode
354+
355+ clear_buffer
318356 node
319357 end
320358
@@ -373,28 +411,33 @@ def compile_raw_helper(node)
373411 else
374412 @current_buffer = [ node ]
375413
376- Refract ::IfNode . new (
377- inline : false ,
378- predicate : Refract ::LocalVariableReadNode . new (
379- name : should_render_local
380- ) ,
381- statements : Refract ::StatementsNode . new (
382- body : [
383- Refract ::CallNode . new (
384- receiver : Refract ::CallNode . new (
385- name : buffer_local ,
386- ) ,
387- name : :<< ,
388- arguments : Refract ::ArgumentsNode . new (
389- arguments : [
390- Refract ::InterpolatedStringNode . new (
391- parts : @current_buffer
392- ) ,
393- ]
394- )
414+ Refract ::StatementsNode . new (
415+ body : [
416+ Refract ::IfNode . new (
417+ inline : false ,
418+ predicate : Refract ::LocalVariableReadNode . new (
419+ name : should_render_local
395420 ) ,
396- ]
397- )
421+ statements : Refract ::StatementsNode . new (
422+ body : [
423+ Refract ::CallNode . new (
424+ receiver : Refract ::CallNode . new (
425+ name : buffer_local ,
426+ ) ,
427+ name : :<< ,
428+ arguments : Refract ::ArgumentsNode . new (
429+ arguments : [
430+ Refract ::InterpolatedStringNode . new (
431+ parts : @current_buffer
432+ ) ,
433+ ]
434+ )
435+ ) ,
436+ ]
437+ )
438+ ) ,
439+ Refract ::NilNode . new ,
440+ ]
398441 )
399442 end
400443 end
0 commit comments