phlex 2.3.1 → 2.4.0.beta2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 534f2cde723f1707d19c32e8f23b06aa740cc0adaf62187318355eba8d8fdbea
4
- data.tar.gz: de396ffb79b471cd9c72d3099a66de40411184aa7ff03c6285dc9b5ace50b589
3
+ metadata.gz: 01002f30f11a82c8fce49ec63ce50cd3947c40a50d66c9fd02123c87a89f434c
4
+ data.tar.gz: 0b40acfa20d82bf9c7e6bb68c8aeca447731d56436b2876750bfc669e9ba52a4
5
5
  SHA512:
6
- metadata.gz: 707f796517d40bd0e763b3cfb00f8a10a1f7502598b0535e309b7689debcdb189a0ed49ec48928f3587e8bd724e6f2549becf68a7a3c7a0b5da9564f2543435a
7
- data.tar.gz: 790bd859f956ef99102d0bd1deabea6af89ad7c3f2268cd2522d84f6f4d0ded6c8d94c5cfe18ee3777afce2972234d851c1d58b991d491d5e2fb5f6f1e206020
6
+ metadata.gz: 68d5a712386d7da44bb013ee956dde702d6e9f68e1cc237aac8a706a27cbff312dfd81a03405c9330f3109b87e7ff312711cf07a2e022ae1a256d984d60062cb
7
+ data.tar.gz: 9dd429c7d0a3d0b962ca1d6b653abd79260134c743f6322e87e90d3af200b188695cf8a2e3a6588ba2d731f6227f0c1ef1bb45b1bfd37f9ae2d6b02764a93d3a
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Phlex::Compiler::ClassCompiler < Refract::Visitor
4
+ def initialize(component, path)
5
+ super()
6
+ @component = component
7
+ @path = path
8
+ @compiled_snippets = []
9
+ end
10
+
11
+ def compile(node)
12
+ visit(node.body)
13
+ @compiled_snippets.compact.freeze
14
+ end
15
+
16
+ visit Refract::DefNode do |node|
17
+ return if node.name == :initialize
18
+ return if node.receiver
19
+
20
+ method = begin
21
+ Phlex::UNBOUND_INSTANCE_METHOD_METHOD.bind_call(@component, node.name)
22
+ rescue NameError
23
+ nil
24
+ end
25
+
26
+ return unless method
27
+ path, lineno = method.source_location
28
+ return unless @path == path
29
+ return unless node.start_line == lineno
30
+
31
+ @compiled_snippets << Phlex::Compiler::MethodCompiler.new(
32
+ @component
33
+ ).compile(node)
34
+ end
35
+
36
+ visit Refract::ClassNode do |node|
37
+ nil
38
+ end
39
+
40
+ visit Refract::ModuleNode do |node|
41
+ nil
42
+ end
43
+
44
+ visit Refract::BlockNode do |node|
45
+ nil
46
+ end
47
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Phlex::Compiler::Compactor < Refract::MutationVisitor
4
+ visit Refract::StatementsNode do |node|
5
+ queue = []
6
+ results = []
7
+ current_buffer = nil
8
+ nil_context = false
9
+
10
+ node.body.reverse_each { |n| queue << n }
11
+
12
+ while (child_node = queue.pop)
13
+ case child_node
14
+ when Refract::StatementsNode
15
+ child_node.body.reverse_each { |n| queue << n }
16
+ when Phlex::Compiler::Concat
17
+ if current_buffer
18
+ current_buffer << child_node.node
19
+ unless nil_context
20
+ results << Refract::NilNode.new
21
+ nil_context = true
22
+ end
23
+ else
24
+ current_buffer = [child_node.node]
25
+ results << Refract::ParenthesesNode.new(
26
+ body: Refract::StatementsNode.new(
27
+ body: [
28
+ Refract::IfNode.new(
29
+ inline: false,
30
+ predicate: Refract::LocalVariableReadNode.new(
31
+ name: :__phlex_should_render__
32
+ ),
33
+ statements: Refract::StatementsNode.new(
34
+ body: [
35
+ Refract::CallNode.new(
36
+ receiver: Refract::CallNode.new(
37
+ name: :__phlex_buffer__,
38
+ ),
39
+ name: :<<,
40
+ arguments: Refract::ArgumentsNode.new(
41
+ arguments: [
42
+ Refract::InterpolatedStringNode.new(
43
+ parts: current_buffer
44
+ ),
45
+ ]
46
+ )
47
+ ),
48
+ ]
49
+ )
50
+ ),
51
+ Refract::NilNode.new,
52
+ ]
53
+ )
54
+ )
55
+ nil_context = true
56
+ end
57
+ else
58
+ resolved = visit(child_node)
59
+ case resolved
60
+ when Refract::StatementsNode
61
+ resolved.body.reverse_each { |n| queue << n }
62
+ else
63
+ current_buffer = nil
64
+ results << resolved
65
+ nil_context = false
66
+ end
67
+ end
68
+ end
69
+
70
+ node.copy(
71
+ body: results
72
+ )
73
+ end
74
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Phlex::Compiler::FileCompiler < Refract::Visitor
4
+ Result = Data.define(:namespace, :compiled_snippets)
5
+
6
+ def initialize(path)
7
+ super()
8
+ @path = path
9
+ @current_namespace = []
10
+ @results = []
11
+ end
12
+
13
+ def compile(node)
14
+ visit(node)
15
+ @results.freeze
16
+ end
17
+
18
+ visit Refract::ModuleNode do |node|
19
+ @current_namespace.push(node)
20
+ super(node)
21
+ @current_namespace.pop
22
+ end
23
+
24
+ visit Refract::ClassNode do |node|
25
+ @current_namespace.push(node)
26
+
27
+ namespace = @current_namespace.map do |node|
28
+ Refract::Formatter.new.format_node(node.constant_path).source
29
+ end.join("::")
30
+
31
+ const = eval(namespace, TOPLEVEL_BINDING)
32
+
33
+ if Class === const && Phlex::SGML > const
34
+ @results << Result.new(
35
+ namespace: @current_namespace.dup.freeze,
36
+ compiled_snippets: Phlex::Compiler::ClassCompiler.new(const, @path).compile(node)
37
+ )
38
+ else
39
+ super(node)
40
+ end
41
+
42
+ @current_namespace.pop
43
+ end
44
+
45
+ visit Refract::DefNode do |node|
46
+ nil
47
+ end
48
+
49
+ visit Refract::BlockNode do |node|
50
+ nil
51
+ end
52
+ end