diff --git a/javascript/packages/linter/src/rules/action-view-utils.ts b/javascript/packages/linter/src/rules/action-view-utils.ts index 5930970e4..b5fed3d12 100644 --- a/javascript/packages/linter/src/rules/action-view-utils.ts +++ b/javascript/packages/linter/src/rules/action-view-utils.ts @@ -1,19 +1,11 @@ -import { isPrismNodeType } from "@herb-tools/core" +import { isPrismNodeType, getHelperEntries } from "@herb-tools/core" import type { PrismNode } from "@herb-tools/core" -// TODO: use Action View Helper Registry -export const ACTION_VIEW_HELPER_NAMES = new Set([ - "content_tag", - "link_to", - "turbo_frame_tag", - "javascript_tag", - "javascript_include_tag", - "image_tag", - "button_to", - "form_with", - "form_for", - "form_tag", -]) +const ACTION_VIEW_HELPER_NAMES = new Set( + getHelperEntries() + .filter(helper => helper.output === "html" && helper.visibility === "public" && helper.name !== "tag") + .flatMap(helper => [helper.name, ...helper.aliases]) +) export function isTagBuilderCall(prismNode: PrismNode): boolean { if (!isPrismNodeType(prismNode, "CallNode")) return false diff --git a/sig/herb/action_view/helper_registry.rbs b/sig/herb/action_view/helper_registry.rbs index f29141856..a00fd658d 100644 --- a/sig/herb/action_view/helper_registry.rbs +++ b/sig/herb/action_view/helper_registry.rbs @@ -558,6 +558,8 @@ module Herb attr_reader output: Symbol + attr_reader visibility: String + attr_reader tag_name: String? attr_reader detect_style: Symbol @@ -578,8 +580,8 @@ module Herb attr_reader aliases: Array[String] - # : (name: String, type: Symbol, source: String, gem: String, output: Symbol, tag_name: String?, is_void: bool, supports_block: bool, preferred_for_tag: bool, supported: bool, detect_style: Symbol, description: String, signature: String, documentation_url: String, implicit_attribute: HelperImplicitAttribute?, arguments: Array[HelperArgument], options: Array[HelperOption], special_behaviors: Array[Symbol], aliases: Array[String]) -> void - def initialize: (name: String, type: Symbol, source: String, gem: String, output: Symbol, tag_name: String?, is_void: bool, supports_block: bool, preferred_for_tag: bool, supported: bool, detect_style: Symbol, description: String, signature: String, documentation_url: String, implicit_attribute: HelperImplicitAttribute?, arguments: Array[HelperArgument], options: Array[HelperOption], special_behaviors: Array[Symbol], aliases: Array[String]) -> void + # : (name: String, type: Symbol, source: String, gem: String, output: Symbol, visibility: String, tag_name: String?, is_void: bool, supports_block: bool, preferred_for_tag: bool, supported: bool, detect_style: Symbol, description: String, signature: String, documentation_url: String, implicit_attribute: HelperImplicitAttribute?, arguments: Array[HelperArgument], options: Array[HelperOption], special_behaviors: Array[Symbol], aliases: Array[String]) -> void + def initialize: (name: String, type: Symbol, source: String, gem: String, output: Symbol, visibility: String, tag_name: String?, is_void: bool, supports_block: bool, preferred_for_tag: bool, supported: bool, detect_style: Symbol, description: String, signature: String, documentation_url: String, implicit_attribute: HelperImplicitAttribute?, arguments: Array[HelperArgument], options: Array[HelperOption], special_behaviors: Array[Symbol], aliases: Array[String]) -> void # : () -> bool def void?: () -> bool diff --git a/templates/java/org/herb/ast/HelperRegistry.java.erb b/templates/java/org/herb/ast/HelperRegistry.java.erb index 7d6d7ed87..abafd7b09 100644 --- a/templates/java/org/herb/ast/HelperRegistry.java.erb +++ b/templates/java/org/herb/ast/HelperRegistry.java.erb @@ -117,6 +117,7 @@ class HelperEntry { private final String source; private final String gem; private final String output; + private final String visibility; private final String tagName; private final boolean isVoid; private final boolean supportsBlock; @@ -133,7 +134,7 @@ class HelperEntry { private final List aliases; HelperEntry( - String name, HelperType type, String source, String gem, String output, String tagName, + String name, HelperType type, String source, String gem, String output, String visibility, String tagName, boolean isVoid, boolean supportsBlock, boolean preferredForTag, boolean supported, String detectStyle, String description, String signature, String documentationUrl, HelperImplicitAttribute implicitAttribute, List arguments, List options, List specialBehaviors, List aliases @@ -143,6 +144,7 @@ class HelperEntry { this.source = source; this.gem = gem; this.output = output; + this.visibility = visibility; this.tagName = tagName; this.isVoid = isVoid; this.supportsBlock = supportsBlock; @@ -164,6 +166,7 @@ class HelperEntry { public String getSource() { return source; } public String getGem() { return gem; } public String getOutput() { return output; } + public String getVisibility() { return visibility; } public String getTagName() { return tagName; } public boolean isVoid() { return isVoid; } public boolean supportsBlock() { return supportsBlock; } @@ -206,6 +209,7 @@ public final class HelperRegistry { "<%= helper.source %>", "<%= helper.gem %>", "<%= helper.output %>", + "<%= helper.visibility %>", <%= helper.tag_name ? "\"#{helper.tag_name}\"" : "null" %>, <%= helper.void? %>, <%= helper.supports_block %>, diff --git a/templates/javascript/packages/core/src/action-view-helpers.ts.erb b/templates/javascript/packages/core/src/action-view-helpers.ts.erb index f54c34fc6..ec45730e0 100644 --- a/templates/javascript/packages/core/src/action-view-helpers.ts.erb +++ b/templates/javascript/packages/core/src/action-view-helpers.ts.erb @@ -38,6 +38,7 @@ export interface HelperEntry { readonly source: string readonly gem: string readonly output: HelperOutput + readonly visibility: "public" | "internal" readonly tagName: string | null readonly isVoid: boolean readonly supportsBlock: boolean @@ -61,6 +62,7 @@ const <%= helper.lower_camel_case_name %>Entry: HelperEntry = { source: "<%= helper.source %>", gem: "<%= helper.gem %>", output: "<%= helper.output %>", + visibility: "<%= helper.visibility %>", tagName: <%= helper.tag_name ? "\"#{helper.tag_name}\"" : "null" %>, isVoid: <%= helper.void? %>, supportsBlock: <%= helper.supports_block %>, diff --git a/templates/lib/herb/action_view/helper_registry.rb.erb b/templates/lib/herb/action_view/helper_registry.rb.erb index 7560bcde4..40c1b0d4f 100644 --- a/templates/lib/herb/action_view/helper_registry.rb.erb +++ b/templates/lib/herb/action_view/helper_registry.rb.erb @@ -81,6 +81,7 @@ module Herb attr_reader :source #: String attr_reader :gem #: String attr_reader :output #: Symbol + attr_reader :visibility #: String attr_reader :tag_name #: String? attr_reader :detect_style #: Symbol attr_reader :description #: String @@ -92,9 +93,9 @@ module Herb attr_reader :special_behaviors #: Array[Symbol] attr_reader :aliases #: Array[String] - #: (name: String, type: Symbol, source: String, gem: String, output: Symbol, tag_name: String?, is_void: bool, supports_block: bool, preferred_for_tag: bool, supported: bool, detect_style: Symbol, description: String, signature: String, documentation_url: String, implicit_attribute: HelperImplicitAttribute?, arguments: Array[HelperArgument], options: Array[HelperOption], special_behaviors: Array[Symbol], aliases: Array[String]) -> void + #: (name: String, type: Symbol, source: String, gem: String, output: Symbol, visibility: String, tag_name: String?, is_void: bool, supports_block: bool, preferred_for_tag: bool, supported: bool, detect_style: Symbol, description: String, signature: String, documentation_url: String, implicit_attribute: HelperImplicitAttribute?, arguments: Array[HelperArgument], options: Array[HelperOption], special_behaviors: Array[Symbol], aliases: Array[String]) -> void def initialize( # rubocop:disable Metrics/ParameterLists - name:, type:, source:, gem:, output:, tag_name:, is_void:, supports_block:, + name:, type:, source:, gem:, output:, visibility:, tag_name:, is_void:, supports_block:, preferred_for_tag:, supported:, detect_style:, description:, signature:, documentation_url:, implicit_attribute:, arguments:, options:, special_behaviors:, aliases: ) @@ -103,6 +104,7 @@ module Herb @source = source @gem = gem @output = output + @visibility = visibility @tag_name = tag_name @is_void = is_void @supports_block = supports_block @@ -152,6 +154,7 @@ module Herb source: "<%= helper.source %>", gem: "<%= helper.gem %>", output: :<%= helper.output %>, + visibility: "<%= helper.visibility %>", tag_name: <%= helper.tag_name ? "\"#{helper.tag_name}\"" : "nil" %>, is_void: <%= helper.void? %>, supports_block: <%= helper.supports_block %>, diff --git a/templates/rust/src/action_view_helpers.rs.erb b/templates/rust/src/action_view_helpers.rs.erb index e27da95cb..21555a480 100644 --- a/templates/rust/src/action_view_helpers.rs.erb +++ b/templates/rust/src/action_view_helpers.rs.erb @@ -60,6 +60,7 @@ pub struct HelperEntry { pub source: &'static str, pub gem: &'static str, pub output: &'static str, + pub visibility: &'static str, pub tag_name: Option<&'static str>, pub is_void: bool, pub supports_block: bool, @@ -97,6 +98,7 @@ static REGISTRY: [HelperEntry; <%= helpers.size %>] = [ source: "<%= helper.source %>", gem: "<%= helper.gem %>", output: "<%= helper.output %>", + visibility: "<%= helper.visibility %>", tag_name: <%= helper.tag_name ? "Some(\"#{helper.tag_name}\")" : "None" %>, is_void: <%= helper.void? %>, supports_block: <%= helper.supports_block %>, diff --git a/templates/src/analyze/action_view/helper_registry.c.erb b/templates/src/analyze/action_view/helper_registry.c.erb index 103ed2d9a..b8ce0c207 100644 --- a/templates/src/analyze/action_view/helper_registry.c.erb +++ b/templates/src/analyze/action_view/helper_registry.c.erb @@ -43,6 +43,7 @@ static const helper_registry_entry_T registry_entries[HELPER_COUNT] = { .source = HB_STRING_LITERAL("<%= helper.source %>"), .gem = "<%= helper.gem %>", .output = HELPER_OUTPUT_<%= helper.output.upcase %>, + .visibility = "<%= helper.visibility %>", .tag_name = <%= helper.tag_name ? "\"#{helper.tag_name}\"" : "NULL" %>, .is_void = <%= helper.void? %>, .supports_block = <%= helper.supports_block %>, diff --git a/templates/src/include/analyze/action_view/helper_registry.h.erb b/templates/src/include/analyze/action_view/helper_registry.h.erb index bcfab899e..f40c64060 100644 --- a/templates/src/include/analyze/action_view/helper_registry.h.erb +++ b/templates/src/include/analyze/action_view/helper_registry.h.erb @@ -55,6 +55,7 @@ typedef struct { hb_string_T source; const char* gem; helper_output_T output; + const char* visibility; const char* tag_name; bool is_void; bool supports_block;