Skip to content

Commit 5aad5c8

Browse files
authored
Ruby: Generate build factories for AST nodes (#2055)
Follow up on the recently added `Herb::Location.zero`, `Herb::Range.zero` and `Herb::Token.from` constructors, applying the same idea one level up to AST nodes. Constructing a node by hand means repeating the node type as a string, passing an empty errors array, and then positionally filling every field, including the ones you don't care about: ```ruby Herb::AST::ERBContentNode.new( "ERBContentNode", element_node.location, [], Herb::Token.from("TOKEN_ERB_START", "<%="), Herb::Token.from("TOKEN_ERB_CONTENT", " #{code}"), Herb::Token.from("TOKEN_ERB_END", "%>"), nil, false, true, nil ) ``` The same `ERBContentNode` from above with this pull request: ```ruby Herb::AST::ERBContentNode.build( location: element_node.location, tag_opening: Herb::Token.from("TOKEN_ERB_START", "<%="), content: Herb::Token.from("TOKEN_ERB_CONTENT", " #{code}"), tag_closing: Herb::Token.from("TOKEN_ERB_END", "%>"), valid: true ) ```
1 parent 71540cf commit 5aad5c8

6 files changed

Lines changed: 199 additions & 68 deletions

File tree

‎lib/herb/engine/auto_close_omitted_tags_visitor.rb‎

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,11 @@ def inspect
3434

3535
#: (Herb::Token, Herb::Location) -> Herb::AST::HTMLCloseTagNode
3636
def explicit_close_tag(tag_name, location)
37-
Herb::AST::HTMLCloseTagNode.new(
38-
"HTMLCloseTagNode",
39-
location,
40-
[],
41-
Herb::Token.from("TOKEN_HTML_TAG_START_CLOSE", "</", location: location),
42-
tag_name,
43-
[],
44-
Herb::Token.from("TOKEN_HTML_TAG_END", ">", location: location)
37+
Herb::AST::HTMLCloseTagNode.build(
38+
location: location,
39+
tag_opening: Herb::Token.from("TOKEN_HTML_TAG_START_CLOSE", "</", location: location),
40+
tag_name: tag_name,
41+
tag_closing: Herb::Token.from("TOKEN_HTML_TAG_END", ">", location: location)
4542
)
4643
end
4744
end

‎lib/herb/engine/component_visitor.rb‎

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -204,48 +204,34 @@ def escape(content)
204204

205205
#: (Herb::AST::HTMLElementNode, String) -> Herb::AST::ERBContentNode
206206
def erb_content_node(element_node, code)
207-
Herb::AST::ERBContentNode.new(
208-
"ERBContentNode",
209-
element_node.location,
210-
[],
211-
Herb::Token.from("TOKEN_ERB_START", "<%="),
212-
Herb::Token.from("TOKEN_ERB_CONTENT", " #{code}"),
213-
Herb::Token.from("TOKEN_ERB_END", "%>"),
214-
nil,
215-
false,
216-
true,
217-
nil
207+
Herb::AST::ERBContentNode.build(
208+
location: element_node.location,
209+
tag_opening: Herb::Token.from("TOKEN_ERB_START", "<%="),
210+
content: Herb::Token.from("TOKEN_ERB_CONTENT", " #{code}"),
211+
tag_closing: Herb::Token.from("TOKEN_ERB_END", "%>"),
212+
valid: true
218213
)
219214
end
220215

221216
#: (Herb::AST::HTMLElementNode, String, Array[Herb::AST::Node]) -> Herb::AST::ERBBlockNode
222217
def erb_block_node(element_node, code, body)
223-
Herb::AST::ERBBlockNode.new(
224-
"ERBBlockNode",
225-
element_node.location,
226-
[],
227-
Herb::Token.from("TOKEN_ERB_START", "<%="),
228-
Herb::Token.from("TOKEN_ERB_CONTENT", " #{code}"),
229-
Herb::Token.from("TOKEN_ERB_END", "%>"),
230-
nil,
231-
body,
232-
[],
233-
nil,
234-
nil,
235-
nil,
236-
erb_end_node(element_node)
218+
Herb::AST::ERBBlockNode.build(
219+
location: element_node.location,
220+
tag_opening: Herb::Token.from("TOKEN_ERB_START", "<%="),
221+
content: Herb::Token.from("TOKEN_ERB_CONTENT", " #{code}"),
222+
tag_closing: Herb::Token.from("TOKEN_ERB_END", "%>"),
223+
body: body,
224+
end_node: erb_end_node(element_node)
237225
)
238226
end
239227

240228
#: (Herb::AST::HTMLElementNode) -> Herb::AST::ERBEndNode
241229
def erb_end_node(element_node)
242-
Herb::AST::ERBEndNode.new(
243-
"ERBEndNode",
244-
element_node.location,
245-
[],
246-
Herb::Token.from("TOKEN_ERB_START", "<%"),
247-
Herb::Token.from("TOKEN_ERB_CONTENT", " end "),
248-
Herb::Token.from("TOKEN_ERB_END", "%>")
230+
Herb::AST::ERBEndNode.build(
231+
location: element_node.location,
232+
tag_opening: Herb::Token.from("TOKEN_ERB_START", "<%"),
233+
content: Herb::Token.from("TOKEN_ERB_CONTENT", " end "),
234+
tag_closing: Herb::Token.from("TOKEN_ERB_END", "%>")
249235
)
250236
end
251237
end

‎lib/herb/engine/debug_visitor.rb‎

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -187,16 +187,22 @@ def add_debug_attributes_to_element(open_tag_node)
187187
end
188188

189189
def create_debug_attribute(name, value)
190-
name_literal = Herb::AST::LiteralNode.new("LiteralNode", Herb::Location.zero, [], name.dup)
191-
name_node = Herb::AST::HTMLAttributeNameNode.new("HTMLAttributeNameNode", Herb::Location.zero, [], [name_literal])
192-
193-
value_literal = Herb::AST::LiteralNode.new("LiteralNode", Herb::Location.zero, [], value.dup)
194-
value_node = Herb::AST::HTMLAttributeValueNode.new("HTMLAttributeValueNode", Herb::Location.zero, [], Herb::Token.from(:quote, '"'),
195-
[value_literal], Herb::Token.from(:quote, '"'), true)
196-
197-
equals_token = Herb::Token.from(:equals, "=")
190+
name_literal = Herb::AST::LiteralNode.build(content: name.dup)
191+
name_node = Herb::AST::HTMLAttributeNameNode.build(children: [name_literal])
192+
193+
value_literal = Herb::AST::LiteralNode.build(content: value.dup)
194+
value_node = Herb::AST::HTMLAttributeValueNode.build(
195+
open_quote: Herb::Token.from(:quote, '"'),
196+
children: [value_literal],
197+
close_quote: Herb::Token.from(:quote, '"'),
198+
quoted: true
199+
)
198200

199-
Herb::AST::HTMLAttributeNode.new("HTMLAttributeNode", Herb::Location.zero, [], name_node, equals_token, value_node)
201+
Herb::AST::HTMLAttributeNode.build(
202+
name: name_node,
203+
equals: Herb::Token.from(:equals, "="),
204+
value: value_node
205+
)
200206
end
201207

202208
def create_debug_span_for_erb(erb_node)
@@ -233,29 +239,26 @@ def create_debug_span_for_erb(erb_node)
233239

234240
tag_name_token = Herb::Token.from(:tag_name, "span")
235241

236-
open_tag = Herb::AST::HTMLOpenTagNode.new(
237-
"HTMLOpenTagNode",
238-
Herb::Location.zero,
239-
[],
240-
Herb::Token.from(:tag_opening, "<"),
241-
tag_name_token,
242-
Herb::Token.from(:tag_closing, ">"),
243-
debug_attributes,
244-
false
242+
open_tag = Herb::AST::HTMLOpenTagNode.build(
243+
tag_opening: Herb::Token.from(:tag_opening, "<"),
244+
tag_name: tag_name_token,
245+
tag_closing: Herb::Token.from(:tag_closing, ">"),
246+
children: debug_attributes
245247
)
246248

247-
close_tag = Herb::AST::HTMLCloseTagNode.new(
248-
"HTMLCloseTagNode",
249-
Herb::Location.zero,
250-
[],
251-
Herb::Token.from(:tag_opening, "</"),
252-
Herb::Token.from(:tag_name, "span"),
253-
[],
254-
Herb::Token.from(:tag_closing, ">")
249+
close_tag = Herb::AST::HTMLCloseTagNode.build(
250+
tag_opening: Herb::Token.from(:tag_opening, "</"),
251+
tag_name: Herb::Token.from(:tag_name, "span"),
252+
tag_closing: Herb::Token.from(:tag_closing, ">")
255253
)
256254

257-
Herb::AST::HTMLElementNode.new("HTMLElementNode", Herb::Location.zero, [], open_tag, tag_name_token, [erb_node], close_tag,
258-
false, "Debug")
255+
Herb::AST::HTMLElementNode.build(
256+
open_tag: open_tag,
257+
tag_name: tag_name_token,
258+
body: [erb_node],
259+
close_tag: close_tag,
260+
element_source: "Debug"
261+
)
259262
end
260263

261264
def determine_view_type

0 commit comments

Comments
 (0)