phlex 0.5.3 → 1.0.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of phlex might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +2 -20
- data/config/sus.rb +0 -5
- data/lib/phlex/buffered.rb +2 -0
- data/lib/phlex/collection.rb +2 -0
- data/lib/phlex/elements.rb +1 -5
- data/lib/phlex/experimental.rb +10 -0
- data/lib/phlex/helpers.rb +23 -10
- data/lib/phlex/html.rb +72 -86
- data/lib/phlex/table.rb +1 -0
- data/lib/phlex/turbo/frame.rb +2 -0
- data/lib/phlex/turbo/stream.rb +2 -0
- data/lib/phlex/version.rb +1 -1
- data/lib/phlex.rb +2 -19
- metadata +6 -166
- data/Procfile.dev +0 -3
- data/Rakefile +0 -8
- data/config.ru +0 -9
- data/docs/assets/application.css +0 -32
- data/docs/assets/logo.png +0 -0
- data/docs/build.rb +0 -30
- data/docs/components/callout.rb +0 -9
- data/docs/components/code_block.rb +0 -26
- data/docs/components/code_span.rb +0 -9
- data/docs/components/example.rb +0 -32
- data/docs/components/heading.rb +0 -9
- data/docs/components/layout.rb +0 -91
- data/docs/components/markdown.rb +0 -25
- data/docs/components/nav/item.rb +0 -33
- data/docs/components/nav.rb +0 -6
- data/docs/components/tabs/tab.rb +0 -28
- data/docs/components/tabs.rb +0 -30
- data/docs/components/title.rb +0 -9
- data/docs/page_builder.rb +0 -39
- data/docs/pages/application_page.rb +0 -7
- data/docs/pages/helpers.rb +0 -97
- data/docs/pages/index.rb +0 -27
- data/docs/pages/library/collections.rb +0 -83
- data/docs/pages/rails/getting_started.rb +0 -57
- data/docs/pages/rails/helpers.rb +0 -55
- data/docs/pages/rails/layouts.rb +0 -61
- data/docs/pages/rails/migrating.rb +0 -37
- data/docs/pages/rails/rendering_views.rb +0 -35
- data/docs/pages/rails_integration.rb +0 -58
- data/docs/pages/templates.rb +0 -144
- data/docs/pages/testing/capybara.rb +0 -48
- data/docs/pages/testing/getting_started.rb +0 -44
- data/docs/pages/testing/nokogiri.rb +0 -83
- data/docs/pages/testing/rails.rb +0 -17
- data/docs/pages/translations.rb +0 -81
- data/docs/pages/views.rb +0 -184
- data/fixtures/compiler_test_helpers.rb +0 -19
- data/fixtures/content.rb +0 -60
- data/fixtures/dummy/app/assets/config/manifest.js +0 -0
- data/fixtures/dummy/app/components/comment_component.html.erb +0 -14
- data/fixtures/dummy/app/components/comment_component.rb +0 -8
- data/fixtures/dummy/app/components/reaction_component.html.erb +0 -3
- data/fixtures/dummy/app/components/reaction_component.rb +0 -7
- data/fixtures/dummy/app/controllers/articles_controller.rb +0 -4
- data/fixtures/dummy/app/controllers/comments_controller.rb +0 -4
- data/fixtures/dummy/app/views/application_view.rb +0 -8
- data/fixtures/dummy/app/views/articles/form.rb +0 -15
- data/fixtures/dummy/app/views/articles/index.html.erb +0 -14
- data/fixtures/dummy/app/views/articles/new.html.erb +0 -1
- data/fixtures/dummy/app/views/card.rb +0 -15
- data/fixtures/dummy/app/views/comments/comment.rb +0 -25
- data/fixtures/dummy/app/views/comments/index.html.erb +0 -3
- data/fixtures/dummy/app/views/comments/reaction.rb +0 -17
- data/fixtures/dummy/app/views/comments/show.html.erb +0 -3
- data/fixtures/dummy/app/views/heading.rb +0 -9
- data/fixtures/dummy/config/database.yml +0 -3
- data/fixtures/dummy/config/routes.rb +0 -5
- data/fixtures/dummy/config/storage.yml +0 -3
- data/fixtures/dummy/db/schema.rb +0 -6
- data/fixtures/dummy/log/.gitignore +0 -1
- data/fixtures/dummy/public/favicon.ico +0 -0
- data/fixtures/rails_helper.rb +0 -11
- data/fixtures/standard_element.rb +0 -87
- data/fixtures/void_element.rb +0 -31
- data/lib/generators/phlex/collection/USAGE +0 -8
- data/lib/generators/phlex/collection/collection_generator.rb +0 -13
- data/lib/generators/phlex/collection/templates/collection.rb.erb +0 -16
- data/lib/generators/phlex/controller/USAGE +0 -10
- data/lib/generators/phlex/controller/controller_generator.rb +0 -54
- data/lib/generators/phlex/controller/templates/controller.rb.erb +0 -10
- data/lib/generators/phlex/controller/templates/view.rb.erb +0 -14
- data/lib/generators/phlex/layout/USAGE +0 -8
- data/lib/generators/phlex/layout/layout_generator.rb +0 -13
- data/lib/generators/phlex/layout/templates/layout.rb.erb +0 -31
- data/lib/generators/phlex/page/USAGE +0 -8
- data/lib/generators/phlex/page/page_generator.rb +0 -13
- data/lib/generators/phlex/page/templates/page.rb.erb +0 -13
- data/lib/generators/phlex/table/USAGE +0 -8
- data/lib/generators/phlex/table/table_generator.rb +0 -14
- data/lib/generators/phlex/table/templates/table.rb.erb +0 -11
- data/lib/generators/phlex/view/USAGE +0 -8
- data/lib/generators/phlex/view/templates/view.rb.erb +0 -14
- data/lib/generators/phlex/view/view_generator.rb +0 -21
- data/lib/install/phlex.rb +0 -39
- data/lib/phlex/block.rb +0 -16
- data/lib/phlex/compiler/elements.rb +0 -49
- data/lib/phlex/compiler/formatter.rb +0 -91
- data/lib/phlex/compiler/generators/content.rb +0 -103
- data/lib/phlex/compiler/generators/element.rb +0 -61
- data/lib/phlex/compiler/nodes/base.rb +0 -19
- data/lib/phlex/compiler/nodes/call.rb +0 -9
- data/lib/phlex/compiler/nodes/command.rb +0 -13
- data/lib/phlex/compiler/nodes/fcall.rb +0 -18
- data/lib/phlex/compiler/nodes/method_add_block.rb +0 -33
- data/lib/phlex/compiler/nodes/vcall.rb +0 -9
- data/lib/phlex/compiler/optimizer.rb +0 -66
- data/lib/phlex/compiler/visitors/base.rb +0 -15
- data/lib/phlex/compiler/visitors/file.rb +0 -29
- data/lib/phlex/compiler/visitors/stable_scope.rb +0 -28
- data/lib/phlex/compiler/visitors/statements.rb +0 -36
- data/lib/phlex/compiler/visitors/view.rb +0 -19
- data/lib/phlex/compiler/visitors/view_method.rb +0 -59
- data/lib/phlex/compiler.rb +0 -70
- data/lib/phlex/html/callbacks.rb +0 -11
- data/lib/phlex/markdown.rb +0 -76
- data/lib/phlex/rails/engine.rb +0 -10
- data/lib/phlex/rails/form.rb +0 -67
- data/lib/phlex/rails/helpers.rb +0 -118
- data/lib/phlex/rails/layout.rb +0 -15
- data/lib/phlex/rails.rb +0 -11
- data/lib/phlex/renderable.rb +0 -47
- data/lib/phlex/testing/capybara.rb +0 -25
- data/lib/phlex/testing/nokogiri.rb +0 -24
- data/lib/phlex/testing/rails.rb +0 -19
- data/lib/phlex/translation.rb +0 -23
- data/lib/tasks/phlex_tasks.rake +0 -11
- data/package-lock.json +0 -1195
- data/package.json +0 -5
- data/tailwind.config.js +0 -7
@@ -1,91 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex
|
4
|
-
class Compiler
|
5
|
-
class Formatter < SyntaxTree::Formatter
|
6
|
-
def genspace
|
7
|
-
-> (n) { "\t" * (n / 2) }
|
8
|
-
end
|
9
|
-
|
10
|
-
def format(node, stackable: true)
|
11
|
-
stack << node if stackable
|
12
|
-
doc = node.format(self)
|
13
|
-
stack.pop if stackable
|
14
|
-
doc
|
15
|
-
end
|
16
|
-
|
17
|
-
def flush
|
18
|
-
text "" if @open_string_append
|
19
|
-
|
20
|
-
super
|
21
|
-
end
|
22
|
-
|
23
|
-
def breakable(*args, **kwargs)
|
24
|
-
if !@texting && @open_string_append
|
25
|
-
@broken = kwargs
|
26
|
-
else
|
27
|
-
super
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def chain_append(&block)
|
32
|
-
@appending = true
|
33
|
-
|
34
|
-
if @open_string_append
|
35
|
-
text '" << '
|
36
|
-
elsif @open_chain_append
|
37
|
-
text " << "
|
38
|
-
else
|
39
|
-
text "@_target << "
|
40
|
-
end
|
41
|
-
|
42
|
-
@open_string_append = false
|
43
|
-
@open_chain_append = true
|
44
|
-
|
45
|
-
yield(self)
|
46
|
-
|
47
|
-
@appending = false
|
48
|
-
end
|
49
|
-
|
50
|
-
def append(&block)
|
51
|
-
@appending = true
|
52
|
-
|
53
|
-
unless @open_string_append
|
54
|
-
if @open_chain_append
|
55
|
-
text ' << "'
|
56
|
-
else
|
57
|
-
text '@_target << "'
|
58
|
-
end
|
59
|
-
|
60
|
-
@open_chain_append = false
|
61
|
-
@open_string_append = true
|
62
|
-
end
|
63
|
-
|
64
|
-
yield(self)
|
65
|
-
|
66
|
-
@appending = false
|
67
|
-
end
|
68
|
-
|
69
|
-
def text(value, ...)
|
70
|
-
@texting = true
|
71
|
-
|
72
|
-
unless @appending
|
73
|
-
if @open_string_append
|
74
|
-
super('"')
|
75
|
-
@open_string_append = false
|
76
|
-
end
|
77
|
-
|
78
|
-
@open_chain_append = false
|
79
|
-
|
80
|
-
breakable(**@broken) if @broken
|
81
|
-
end
|
82
|
-
|
83
|
-
@broken = false
|
84
|
-
|
85
|
-
super
|
86
|
-
|
87
|
-
@texting = false
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex
|
4
|
-
class Compiler
|
5
|
-
module Generators
|
6
|
-
class Content
|
7
|
-
def initialize(formatter, content:, mutating: false)
|
8
|
-
@formatter = formatter
|
9
|
-
@content = content
|
10
|
-
@mutating = mutating
|
11
|
-
end
|
12
|
-
|
13
|
-
def call
|
14
|
-
return if nil_value?
|
15
|
-
return bare_string_value if bare_string_value?
|
16
|
-
return symbol_value if symbol_value?
|
17
|
-
return numeric_value if numeric_value?
|
18
|
-
return variable_value if variable_value?
|
19
|
-
|
20
|
-
unknown_value
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def nil_value?
|
26
|
-
case @content
|
27
|
-
in SyntaxTree::VarRef[value: SyntaxTree::Kw[value: "nil"]]
|
28
|
-
true
|
29
|
-
else
|
30
|
-
false
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def bare_string_value?
|
35
|
-
case @content
|
36
|
-
in SyntaxTree::StringLiteral[parts: [SyntaxTree::TStringContent]]
|
37
|
-
true
|
38
|
-
else
|
39
|
-
false
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def symbol_value?
|
44
|
-
@content.is_a?(SyntaxTree::SymbolLiteral)
|
45
|
-
end
|
46
|
-
|
47
|
-
def numeric_value?
|
48
|
-
@content.is_a?(SyntaxTree::Int) || @content.is_a?(SyntaxTree::FloatLiteral)
|
49
|
-
end
|
50
|
-
|
51
|
-
def variable_value?
|
52
|
-
@content.is_a?(SyntaxTree::VarRef)
|
53
|
-
end
|
54
|
-
|
55
|
-
def bare_string_value
|
56
|
-
@formatter.append do |f|
|
57
|
-
f.text Hescape.escape_html(
|
58
|
-
@content.parts.first.value
|
59
|
-
)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def symbol_value
|
64
|
-
@formatter.append do |f|
|
65
|
-
f.text Hescape.escape_html(
|
66
|
-
@content.value.value
|
67
|
-
)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def numeric_value
|
72
|
-
@formatter.append do |f|
|
73
|
-
f.text Hescape.escape_html(
|
74
|
-
@content.value
|
75
|
-
)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def variable_value
|
80
|
-
@formatter.chain_append do |f|
|
81
|
-
f.text "Hescape.escape_html("
|
82
|
-
@content.format(f)
|
83
|
-
f.text ")"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def unknown_value
|
88
|
-
@formatter.breakable(force: true)
|
89
|
-
if @mutating
|
90
|
-
@content.format(@formatter)
|
91
|
-
else
|
92
|
-
@formatter.text "yield_content {"
|
93
|
-
@formatter.breakable(force: true)
|
94
|
-
@content.format(@formatter)
|
95
|
-
@formatter.breakable(force: true)
|
96
|
-
@formatter.text "}"
|
97
|
-
end
|
98
|
-
@formatter.breakable(force: true)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
@@ -1,61 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex
|
4
|
-
class Compiler
|
5
|
-
module Generators
|
6
|
-
class Element
|
7
|
-
def initialize(node, formatter:, mutating: false)
|
8
|
-
@node = node
|
9
|
-
@formatter = formatter
|
10
|
-
@mutating = mutating
|
11
|
-
end
|
12
|
-
|
13
|
-
def call
|
14
|
-
@formatter.append do |f|
|
15
|
-
f.text "<"
|
16
|
-
f.text tag
|
17
|
-
end
|
18
|
-
|
19
|
-
if @node.arguments&.parts&.any?
|
20
|
-
@formatter.chain_append do |f|
|
21
|
-
f.text "_attributes("
|
22
|
-
@node.arguments.format(@formatter)
|
23
|
-
f.text ")"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
@formatter.append do |f|
|
28
|
-
f.text ">"
|
29
|
-
end
|
30
|
-
|
31
|
-
return if void?
|
32
|
-
|
33
|
-
case @node.content
|
34
|
-
in SyntaxTree::Statements[body: [c]]
|
35
|
-
Content.new(@formatter, content: c, mutating: @mutating).call
|
36
|
-
in nil
|
37
|
-
nil
|
38
|
-
else
|
39
|
-
@node.content.format(@formatter)
|
40
|
-
end
|
41
|
-
|
42
|
-
@formatter.append do |f|
|
43
|
-
f.text "</"
|
44
|
-
f.text tag
|
45
|
-
f.text ">"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
private
|
50
|
-
|
51
|
-
def tag
|
52
|
-
HTML::STANDARD_ELEMENTS[@node.name] || HTML::VOID_ELEMENTS[@node.name]
|
53
|
-
end
|
54
|
-
|
55
|
-
def void?
|
56
|
-
HTML::VOID_ELEMENTS.key?(@node.name)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex::Compiler::Nodes
|
4
|
-
class FCall < Base
|
5
|
-
def name
|
6
|
-
@node.value.value.to_sym
|
7
|
-
end
|
8
|
-
|
9
|
-
def arguments
|
10
|
-
case @node.arguments
|
11
|
-
in SyntaxTree::Args
|
12
|
-
@node.arguments
|
13
|
-
in SyntaxTree::ArgParen
|
14
|
-
@node.arguments.arguments
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex::Compiler::Nodes
|
4
|
-
class MethodAddBlock < Base
|
5
|
-
def name
|
6
|
-
method_call.name
|
7
|
-
end
|
8
|
-
|
9
|
-
def arguments
|
10
|
-
method_call.arguments
|
11
|
-
end
|
12
|
-
|
13
|
-
def method_call
|
14
|
-
@method_call ||= case @node.call
|
15
|
-
in SyntaxTree::FCall
|
16
|
-
Phlex::Compiler::Nodes::FCall.new(@node.call)
|
17
|
-
in SyntaxTree::Command
|
18
|
-
Phlex::Compiler::Nodes::Command.new(@node.call)
|
19
|
-
in SyntaxTree::Call
|
20
|
-
Phlex::Compiler::Nodes::Call.new(@node.call)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def content
|
25
|
-
case @node.block
|
26
|
-
in SyntaxTree::BraceBlock
|
27
|
-
@node.block.statements
|
28
|
-
in SyntaxTree::DoBlock
|
29
|
-
@node.block.bodystmt.statements
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Phlex::Compiler
|
4
|
-
class Optimizer
|
5
|
-
def initialize(node, compiler:)
|
6
|
-
@node = node
|
7
|
-
@compiler = compiler
|
8
|
-
end
|
9
|
-
|
10
|
-
def call
|
11
|
-
return optimize_element if optimize_element?
|
12
|
-
|
13
|
-
false
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def optimize_element
|
19
|
-
case @node
|
20
|
-
in Nodes::VCall
|
21
|
-
@node.node.extend(Phlex::Compiler::Elements::VCall)
|
22
|
-
in Nodes::FCall
|
23
|
-
@node.node.extend(Phlex::Compiler::Elements::FCall)
|
24
|
-
in Nodes::Command
|
25
|
-
@node.node.extend(Phlex::Compiler::Elements::Command)
|
26
|
-
in Nodes::MethodAddBlock
|
27
|
-
optimize_add_method_block_element
|
28
|
-
end
|
29
|
-
|
30
|
-
true
|
31
|
-
end
|
32
|
-
|
33
|
-
def optimize_add_method_block_element
|
34
|
-
visitor = Phlex::Compiler::Visitors::Statements.new(@compiler)
|
35
|
-
visitor.visit(@node.content)
|
36
|
-
|
37
|
-
if visitor.mutating?
|
38
|
-
@node.node.extend(Phlex::Compiler::Elements::MutatingMethodAddBlock)
|
39
|
-
else
|
40
|
-
@node.node.extend(Phlex::Compiler::Elements::MethodAddBlock)
|
41
|
-
end
|
42
|
-
|
43
|
-
Phlex::Compiler::Visitors::ViewMethod.new(@compiler).visit(@node.content)
|
44
|
-
end
|
45
|
-
|
46
|
-
def optimize_element?
|
47
|
-
element? && !redefined?
|
48
|
-
end
|
49
|
-
|
50
|
-
def element?
|
51
|
-
standard_element? || void_element?
|
52
|
-
end
|
53
|
-
|
54
|
-
def redefined?
|
55
|
-
@compiler.redefined?(@node.name)
|
56
|
-
end
|
57
|
-
|
58
|
-
def standard_element?
|
59
|
-
Phlex::HTML::STANDARD_ELEMENTS.key?(@node.name)
|
60
|
-
end
|
61
|
-
|
62
|
-
def void_element?
|
63
|
-
Phlex::HTML::VOID_ELEMENTS.key?(@node.name)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex::Compiler::Visitors
|
4
|
-
class Base < SyntaxTree::Visitor
|
5
|
-
def initialize(compiler = nil)
|
6
|
-
@compiler = compiler
|
7
|
-
end
|
8
|
-
|
9
|
-
private
|
10
|
-
|
11
|
-
def format(node)
|
12
|
-
Phlex::Compiler::Formatter.format("", node)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex::Compiler::Visitors
|
4
|
-
class File < Base
|
5
|
-
def initialize(compiler)
|
6
|
-
@scope = []
|
7
|
-
super
|
8
|
-
end
|
9
|
-
|
10
|
-
visit_method def visit_class(node)
|
11
|
-
@scope.push(node)
|
12
|
-
|
13
|
-
if node.location.start_line == @compiler.line
|
14
|
-
@compiler.scope = @scope
|
15
|
-
View.new(@compiler).visit_all(node.child_nodes)
|
16
|
-
else
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
@scope.pop
|
21
|
-
end
|
22
|
-
|
23
|
-
visit_method def visit_module(node)
|
24
|
-
@scope.push(node)
|
25
|
-
super
|
26
|
-
@scope.pop
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# A mixin for visitors that stops them from visiting other scopes.
|
4
|
-
|
5
|
-
module Phlex::Compiler::Visitors::StableScope
|
6
|
-
def visit_class(node)
|
7
|
-
nil
|
8
|
-
end
|
9
|
-
|
10
|
-
def visit_module(node)
|
11
|
-
nil
|
12
|
-
end
|
13
|
-
|
14
|
-
def visit_brace_block(node)
|
15
|
-
nil
|
16
|
-
end
|
17
|
-
|
18
|
-
def visit_do_block(node)
|
19
|
-
nil
|
20
|
-
end
|
21
|
-
|
22
|
-
def visit_method_add_block(node)
|
23
|
-
node = Phlex::Compiler::Nodes::MethodAddBlock.new(node)
|
24
|
-
if node.method_call.name == :render
|
25
|
-
visit(node.content)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex::Compiler::Visitors
|
4
|
-
class Statements < Base
|
5
|
-
MUTATING_METHODS = [:raw, :whitespace, :comment, :text, :doctype]
|
6
|
-
|
7
|
-
include StableScope
|
8
|
-
|
9
|
-
def mutating?
|
10
|
-
!!@mutating
|
11
|
-
end
|
12
|
-
|
13
|
-
visit_method def visit_vcall(node)
|
14
|
-
check Phlex::Compiler::Nodes::VCall.new(node)
|
15
|
-
end
|
16
|
-
|
17
|
-
visit_method def visit_fcall(node)
|
18
|
-
check Phlex::Compiler::Nodes::FCall.new(node)
|
19
|
-
end
|
20
|
-
|
21
|
-
visit_method def visit_command(node)
|
22
|
-
check Phlex::Compiler::Nodes::Command.new(node)
|
23
|
-
end
|
24
|
-
|
25
|
-
visit_method def visit_method_add_block(node)
|
26
|
-
check Phlex::Compiler::Nodes::MethodAddBlock.new(node)
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def check(node)
|
32
|
-
@mutating = true if @compiler.tag_method?(node.name)
|
33
|
-
@mutating = true if MUTATING_METHODS.include?(node.name) && !@compiler.redefined?(node.name)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex::Compiler::Visitors
|
4
|
-
class View < Base
|
5
|
-
include StableScope
|
6
|
-
|
7
|
-
visit_method def visit_def(node)
|
8
|
-
visitor = ViewMethod.new(@compiler)
|
9
|
-
visitor.visit_all(node.child_nodes)
|
10
|
-
|
11
|
-
if visitor.optimized_something?
|
12
|
-
@compiler.redefine(
|
13
|
-
format(node),
|
14
|
-
line: node.location.start_line
|
15
|
-
)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex::Compiler::Visitors
|
4
|
-
class ViewMethod < Base
|
5
|
-
include StableScope
|
6
|
-
|
7
|
-
def optimized_something?
|
8
|
-
!!@optimized_something
|
9
|
-
end
|
10
|
-
|
11
|
-
visit_method def visit_method_add_block(node)
|
12
|
-
return super if node.call.is_a?(SyntaxTree::Call)
|
13
|
-
|
14
|
-
optimizer = Phlex::Compiler::Optimizer.new(
|
15
|
-
Phlex::Compiler::Nodes::MethodAddBlock.new(node),
|
16
|
-
compiler: @compiler
|
17
|
-
)
|
18
|
-
|
19
|
-
if optimizer.call
|
20
|
-
@optimized_something = true
|
21
|
-
end
|
22
|
-
|
23
|
-
super
|
24
|
-
end
|
25
|
-
|
26
|
-
visit_method def visit_vcall(node)
|
27
|
-
optimizer = Phlex::Compiler::Optimizer.new(
|
28
|
-
Phlex::Compiler::Nodes::VCall.new(node),
|
29
|
-
compiler: @compiler
|
30
|
-
)
|
31
|
-
|
32
|
-
if optimizer.call
|
33
|
-
@optimized_something = true
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
visit_method def visit_fcall(node)
|
38
|
-
optimizer = Phlex::Compiler::Optimizer.new(
|
39
|
-
Phlex::Compiler::Nodes::FCall.new(node),
|
40
|
-
compiler: @compiler
|
41
|
-
)
|
42
|
-
|
43
|
-
if optimizer.call
|
44
|
-
@optimized_something = true
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
visit_method def visit_command(node)
|
49
|
-
optimizer = Phlex::Compiler::Optimizer.new(
|
50
|
-
Phlex::Compiler::Nodes::Command.new(node),
|
51
|
-
compiler: @compiler
|
52
|
-
)
|
53
|
-
|
54
|
-
if optimizer.call
|
55
|
-
@optimized_something = true
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/lib/phlex/compiler.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Phlex
|
4
|
-
class Compiler
|
5
|
-
def initialize(view)
|
6
|
-
@view = view
|
7
|
-
end
|
8
|
-
|
9
|
-
attr_writer :scope
|
10
|
-
|
11
|
-
def inspect
|
12
|
-
"#{self.class.name} for #{@view.name} view class"
|
13
|
-
end
|
14
|
-
|
15
|
-
def call
|
16
|
-
Visitors::File.new(self).visit(tree)
|
17
|
-
end
|
18
|
-
|
19
|
-
def tag_method?(method_name)
|
20
|
-
(HTML::STANDARD_ELEMENTS.key?(method_name) || HTML::VOID_ELEMENTS.key?(method_name)) && !redefined?(method_name)
|
21
|
-
end
|
22
|
-
|
23
|
-
def redefined?(method_name)
|
24
|
-
prototype = @view.allocate
|
25
|
-
|
26
|
-
@view.instance_method(method_name).bind(prototype) !=
|
27
|
-
Phlex::HTML.instance_method(method_name).bind(prototype)
|
28
|
-
end
|
29
|
-
|
30
|
-
def redefine(method, line:)
|
31
|
-
patch = scope + method + unscope
|
32
|
-
eval(patch, Kernel.binding, file, (line - 1))
|
33
|
-
end
|
34
|
-
|
35
|
-
def scope
|
36
|
-
@scope.map do |scope|
|
37
|
-
case scope
|
38
|
-
in SyntaxTree::ModuleDeclaration then "module #{scope.constant.constant.value};"
|
39
|
-
in SyntaxTree::ClassDeclaration then "class #{scope.constant.constant.value};"
|
40
|
-
end
|
41
|
-
end.join + "\n"
|
42
|
-
end
|
43
|
-
|
44
|
-
def unscope
|
45
|
-
"; end" * @scope.size
|
46
|
-
end
|
47
|
-
|
48
|
-
def line
|
49
|
-
location[1]
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
def tree
|
55
|
-
@tree ||= SyntaxTree.parse(source)
|
56
|
-
end
|
57
|
-
|
58
|
-
def source
|
59
|
-
SyntaxTree.read(file)
|
60
|
-
end
|
61
|
-
|
62
|
-
def file
|
63
|
-
location[0]
|
64
|
-
end
|
65
|
-
|
66
|
-
def location
|
67
|
-
::Module.const_source_location(@view.name)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
data/lib/phlex/html/callbacks.rb
DELETED