Skip to content

Commit 5c2e7fa

Browse files
committed
Add element source tracking to HTMLElementNode
1 parent bf544a3 commit 5c2e7fa

File tree

11 files changed

+64
-0
lines changed

11 files changed

+64
-0
lines changed

config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,9 @@ nodes:
242242
- name: is_void
243243
type: boolean
244244
245+
- name: source
246+
type: element_source
247+
245248
- name: HTMLAttributeValueNode
246249
fields:
247250
- name: open_quote

src/element_source.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#include "include/element_source.h"
2+
3+
const char* element_source_to_string(element_source_t source) {
4+
switch (source) {
5+
case ELEMENT_SOURCE_HTML: return "HTML";
6+
case ELEMENT_SOURCE_ACTIONVIEW: return "ActionView";
7+
case ELEMENT_SOURCE_HAML: return "Haml";
8+
case ELEMENT_SOURCE_SLIM: return "Slim";
9+
default: return "Unknown";
10+
}
11+
}

src/include/element_source.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifndef HERB_ELEMENT_SOURCE_H
2+
#define HERB_ELEMENT_SOURCE_H
3+
4+
typedef enum {
5+
ELEMENT_SOURCE_HTML,
6+
ELEMENT_SOURCE_ACTIONVIEW,
7+
ELEMENT_SOURCE_HAML,
8+
ELEMENT_SOURCE_SLIM
9+
} element_source_t;
10+
11+
const char* element_source_to_string(element_source_t source);
12+
13+
#endif

src/parser.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,7 @@ static AST_HTML_ELEMENT_NODE_T* parser_parse_html_self_closing_element(
910910
NULL,
911911
NULL,
912912
true,
913+
ELEMENT_SOURCE_HTML,
913914
open_tag->base.location->start,
914915
open_tag->base.location->end,
915916
NULL
@@ -958,6 +959,7 @@ static AST_HTML_ELEMENT_NODE_T* parser_parse_html_regular_element(
958959
body,
959960
close_tag,
960961
false,
962+
ELEMENT_SOURCE_HTML,
961963
open_tag->base.location->start,
962964
close_tag->base.location->end,
963965
errors
@@ -988,6 +990,7 @@ static AST_HTML_ELEMENT_NODE_T* parser_parse_html_element(parser_T* parser) {
988990
NULL,
989991
NULL,
990992
false,
993+
ELEMENT_SOURCE_HTML,
991994
open_tag->base.location->start,
992995
open_tag->base.location->end,
993996
errors

src/parser_helpers.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ AST_HTML_ELEMENT_NODE_T* parser_handle_missing_close_tag(
173173
body,
174174
NULL,
175175
false,
176+
ELEMENT_SOURCE_HTML,
176177
open_tag->base.location->start,
177178
open_tag->base.location->end,
178179
errors

templates/javascript/packages/core/src/nodes.ts.erb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ export interface Serialized<%= node.name %> extends SerializedNode {
141141
<%= field.name %>: SerializedToken | null;
142142
<%- when Herb::Template::BooleanField -%>
143143
<%= field.name %>: boolean;
144+
<%- when Herb::Template::ElementSourceField -%>
145+
<%= field.name %>: string;
144146
<%- when Herb::Template::NodeField -%>
145147
<%- if field.specific_kind -%>
146148
<%= field.name %>: Serialized<%= field.specific_kind %> | null;
@@ -166,6 +168,8 @@ export interface <%= node.name %>Props extends BaseNodeProps {
166168
<%= field.name %>: Token | null;
167169
<%- when Herb::Template::BooleanField -%>
168170
<%= field.name %>: boolean;
171+
<%- when Herb::Template::ElementSourceField -%>
172+
<%= field.name %>: string;
169173
<%- when Herb::Template::NodeField -%>
170174
<%- if field.specific_kind -%>
171175
<%= field.name %>: <%= field.specific_kind %> | null;
@@ -195,6 +199,8 @@ export class <%= node.name %> extends Node {
195199
readonly <%= field.name %>: Token | null;
196200
<%- when Herb::Template::BooleanField -%>
197201
readonly <%= field.name %>: boolean;
202+
<%- when Herb::Template::ElementSourceField -%>
203+
readonly <%= field.name %>: string;
198204
<%- when Herb::Template::NodeField -%>
199205
<%- if field.specific_kind -%>
200206
readonly <%= field.name %>: <%= field.specific_kind %> | null;
@@ -231,6 +237,8 @@ export class <%= node.name %> extends Node {
231237
<%= field.name %>: data.<%= field.name %> ? Token.from(data.<%= field.name %>) : null,
232238
<%- when Herb::Template::BooleanField -%>
233239
<%= field.name %>: data.<%= field.name %>,
240+
<%- when Herb::Template::ElementSourceField -%>
241+
<%= field.name %>: data.<%= field.name %>,
234242
<%- when Herb::Template::NodeField -%>
235243
<%= field.name %>: data.<%= field.name %> ? fromSerializedNode((data.<%= field.name %>)) : null,
236244
<%- when Herb::Template::ArrayField -%>
@@ -258,6 +266,8 @@ export class <%= node.name %> extends Node {
258266
this.<%= field.name %> = convertToUTF8(props.<%= field.name %>);
259267
<%- when Herb::Template::BooleanField -%>
260268
this.<%= field.name %> = props.<%= field.name %>;
269+
<%- when Herb::Template::ElementSourceField -%>
270+
this.<%= field.name %> = props.<%= field.name %>;
261271
<%- when Herb::Template::PrismNodeField, Herb::Template::AnalyzedRubyField -%>
262272
// no-op for <%= field.name %>
263273
<%- else -%>
@@ -313,6 +323,8 @@ export class <%= node.name %> extends Node {
313323
<%= field.name %>: this.<%= field.name %> ? this.<%= field.name %>.toJSON() : null,
314324
<%- when Herb::Template::BooleanField -%>
315325
<%= field.name %>: this.<%= field.name %>,
326+
<%- when Herb::Template::ElementSourceField -%>
327+
<%= field.name %>: this.<%= field.name %>,
316328
<%- when Herb::Template::NodeField -%>
317329
<%= field.name %>: this.<%= field.name %> ? this.<%= field.name %>.toJSON() : null,
318330
<%- when Herb::Template::ArrayField -%>
@@ -341,6 +353,8 @@ export class <%= node.name %> extends Node {
341353
output += `<%= name %>${this.<%= field.name %> ? this.<%= field.name %>.treeInspect() : "∅"}\n`;
342354
<%- when Herb::Template::BooleanField -%>
343355
output += `<%= name %>${typeof this.<%= field.name %> === 'boolean' ? String(this.<%= field.name %>) : "∅"}\n`;
356+
<%- when Herb::Template::ElementSourceField -%>
357+
output += `<%= name %>${this.<%= field.name %> ? JSON.stringify(this.<%= field.name %>) : "∅"}\n`;
344358
<%- when Herb::Template::NodeField -%>
345359
output += `<%= name %>${this.inspectNode(this.<%= field.name %>, "<%= (node.fields.last == field) ? " " : "│ " %>")}`;
346360
<%- when Herb::Template::ArrayField -%>

templates/lib/herb/ast/nodes.rb.erb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ module Herb
7979
output += "<%= name %>"
8080
output += [true, false].include?(<%= field.name %>) ? <%= field.name %>.to_s : "∅"
8181
output += "\n"
82+
<%- when Herb::Template::ElementSourceField -%>
83+
output += %(<%= name %>#{<%= field.name %>.inspect}\n)
8284
<%- when Herb::Template::PrismNodeField -%>
8385
# no-op for <%= field.name %>
8486
<%- when Herb::Template::AnalyzedRubyField -%>

templates/src/ast_nodes.c.erb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
<%= node.human %>-><%= field.name %> = <%= field.name %>;
3131
<%- when Herb::Template::BooleanField -%>
3232
<%= node.human %>-><%= field.name %> = <%= field.name %>;
33+
<%- when Herb::Template::ElementSourceField -%>
34+
<%= node.human %>-><%= field.name %> = <%= field.name %>;
3335
<%- when Herb::Template::PrismNodeField -%>
3436
<%= node.human %>-><%= field.name %> = <%= field.name %>;
3537
<%- when Herb::Template::StringField -%>
@@ -122,6 +124,7 @@ static void ast_free_<%= node.human %>(<%= node.struct_type %>* <%= node.human %
122124
<%- when Herb::Template::VoidPointerField -%>
123125
free(<%= node.human %>-><%= field.name %>);
124126
<%- when Herb::Template::BooleanField -%>
127+
<%- when Herb::Template::ElementSourceField -%>
125128
<%- else -%>
126129
<%= field.inspect %>
127130
<%- end -%>

templates/src/ast_pretty_print.c.erb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ void ast_pretty_print_node(AST_NODE_T* node, const size_t indent, const size_t r
3838
pretty_print_array("<%= field.name %>", <%= node.human %>-><%= field.name %>, indent, relative_indent, <%= last %>, buffer);
3939
<%- when Herb::Template::BooleanField -%>
4040
pretty_print_boolean_property("<%= field.name %>", <%= node.human %>-><%= field.name %>, indent, relative_indent, <%= last %>, buffer);
41+
<%- when Herb::Template::ElementSourceField -%>
42+
pretty_print_string_property(element_source_to_string(<%= node.human %>-><%= field.name %>), "<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
4143
<%- when Herb::Template::StringField -%>
4244
pretty_print_string_property(<%= node.human %>-><%= field.name %>, "<%= field.name %>", indent, relative_indent, <%= last %>, buffer);
4345
<%- when Herb::Template::PrismNodeField -%>

templates/src/include/ast_nodes.h.erb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "location.h"
1111
#include "token_struct.h"
1212
#include "analyzed_ruby.h"
13+
#include "element_source.h"
1314

1415
typedef enum {
1516
<%- nodes.each do |node| -%>

0 commit comments

Comments
 (0)