ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Foundry Forge Lint 变更解析:`mixed-case-function` 对 public 常量 getter 命名的豁免机制

Foundry Forge Lint 变更解析:`mixed-case-function` 对 public 常量 getter 命名的豁免机制 Foundry Forge Lint 变更解析mixed-case-function对 public 常量 getter 命名的豁免机制【免费下载链接】foundryFoundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.项目地址: https://gitcode.com/GitHub_Trending/fo/foundry导读本篇文章围绕 Foundry 仓库中 public-constant-getter-naming.md 这条 changelog 变更展开forge与forge-lint两个子命令以patch级别更新允许mixed-case-function规则放过使用大写SCREAMING_SNAKE_CASE命名的public viewgetter 函数从而与既有对外部 getter 的豁免保持一致。读完本文你将理解该规则的判定边界、底层源码实现、测试用例验证方式以及在foundry.toml中如何通过mixed_case_exceptions调整行为。变更背景两条命名规范的一次对齐Solidity 官方风格指南建议函数名使用mixedCase小驼峰这也是 Forge Lint 中mixed-case-function规则严重级别Info的检查目标。然而对于读取常量/存储的 getter业界通行做法是使用SCREAMING_SNAKE_CASE例如DOMAIN_SEPARATOR()。此前该规则只豁免external view的常量风格 getter而public view的同类 getter 仍会被提示改名——这导致合约中语义等价、仅可见性不同的 getter 收到不一致的 lint 结果。本次 changelog 变更正是为了消除这一不一致Allow uppercase public view getter names inmixed-case-function, matching the existing exemption for external getters.即mixed-case-function现在同时接受public view与external view的常量风格 getter判定条件完全一致。该变更同时作用于forge与forge-lint两个包变更条目 的 frontmatter 声明了两者的patch级更新。关于该 changelog 条目格式包名: patch/minor/major 非空说明的约定可参见 .changelog/README.md。规则核心什么是常量 getter判定启发式is_constant_getter该豁免的实现位于 crates/lint/src/sol/info/mixed_case.rs。源码通过is_constant_getter函数对函数头做四项启发式判定全部满足才视为常量 getter并跳过mixed-case-function检查判定条件源码依据说明可见性为public或externalmatches!(header.visibility(), Some(Visibility::Public \| Visibility::External))内部函数不豁免仍要求mixedCase状态可变性为viewheader.state_mutability().is_view()必须是无状态修改的只读函数无参数header.parameters.is_empty()带参数的函数即使view也不豁免恰好一个返回值且类型为 elementary 或 custommatches!(header.returns(), [ret] if ret.ty.kind.is_elementary() \|\| ret.ty.kind.is_custom())单个内置类型或自定义类型数组、多返回值不豁免名字本身符合SCREAMING_SNAKE_CASEheader.name.is_some_and(\|name\| check_screaming_snake_case(name.as_str()).is_none())名字必须已经是大写蛇形否则无豁免必要其中check_screaming_snake_case定义于共享命名工具模块 crates/lint/src/sol/naming.rs基于heck::AsShoutySnakeCase生成期望值并保留首尾下划线单字符名称在所有命名规范中一律豁免naming.rs。检查流程先判规范、再判豁免在MixedCaseFunctionPass的check_item_function中mixed_case.rs执行顺序是仅当常量泛型参数FUNCTIONS为true时处理函数取函数名调用check_mixed_case含测试前缀与缩写模式两大领域豁免若名字违反mixedCase且不是常量 getter!is_constant_getter(func.header)才通过emit_rename输出带机器可应用修复建议的告警。这意味着如果一个函数名字既不合法、又不满足 getter 启发式才会收到类似consider using: hasParams的重命名提示。同一 lint pass 还被复用于可变变量的mixed-case-variable规则mixed_case.rs两者共享MixedCasePassFUNCTIONS泛型实现。测试用例豁免边界的完整覆盖仓库测试数据文件 crates/lint/testdata/MixedCase.sol 直接体现了本次变更的验证点豁免通过不报错的示例contract PublicConstantGetters { bytes32 private separator; // Public getters follow the same naming convention as external getters. function DOMAIN_SEPARATOR() public view returns (bytes32) { return separator; } function PUBLIC_CUSTOM_TYPE() public view returns (IERC20) { return IERC20(address(0)); } }// SCREAMING_SNAKE_CASE is allowed for functions that are most likely constant getters function MAX_NUMBER() external view returns (uint256) {} function CUSTOM_TYPE_RETURN() external view returns (IERC20) {}仍然报错的边界情况带~NOTE断言function PUBLIC_WITH_PARAM(uint256 value) public view returns (uint256) { return value; } // 有参数不豁免 function INTERNAL_GETTER() internal view returns (bytes32) { return separator; } // internal不豁免 function PUBLIC_MUTATOR() public returns (bytes32) { ... } // 非 view不豁免对应的期望输出记录在 crates/lint/testdata/MixedCase.stderr例如HAS_PARAMS、HAS_NO_RETURN、HAS_MORE_THAN_ONE_RETURN、NOT_ELEMENTARY_RETURN分别验证了带参数无返回值多返回值数组返回四类不满足启发式的场景均照常告警而DOMAIN_SEPARATOR与PUBLIC_CUSTOM_TYPE则没有对应告警条目。可以看出豁免的条件是组合性的任何一个条件不满足都会回退到常规mixedCase检查。其他既有豁免测试前缀、缩写模式与下划线除了常量 getter 豁免外mixed-case-function还内置了以下豁免mixed_case.rs测试函数前缀以test、invariant_、statefulFuzz开头的函数名直接放行Foundry 测试框架的既有命名约定配置的缩写模式通过has_acronym_exception匹配用户配置的缩写列表如ERC20中的ERC规则要求缩写前缀本身已是 lowerCamelCase、后缀为 UpperCamelCase 且允许中间夹数字首尾下划线保留check_mixed_case依赖的preserve_underscores会保留名字最前/最后的单个下划线因此rescueERC20__这类名字在转换建议中下划线不会丢失见 naming.rs 与 MixedCase.stderr 中的_rescueErc20/rescueErc20_建议。配置调整允许的缩写模式如果你有ERC、URI之外的自定义缩写需要放行可在foundry.toml的[lint.lint_specific]段配置mixed_case_exceptions它会整体替换默认列表ERC、URI、ID、URL、API、JSON、XML、HTML、HTTP、HTTPS[lint.lint_specific] mixed_case_exceptions [ERC, URI, NFT]该配置项的详细说明见规则文档 crates/lint/docs/mixed-case-function.md文档同时给出了违规与修复的示例get_balance/GetBalance应改写为getBalance。使用建议与注意事项命名优先遵循规范普通函数、可变变量仍应使用mixedCase只有确为常量 getterpublic/externalview 无参 单返回值 大写蛇形命名才可依赖本豁免。不要滥用豁免来规避改名若函数带参数或修改状态即使命名为SCREAMING_SNAKE_CASE也仍会被提示改名此时应遵循建议重命名而非改动签名。兼容性考量当重命名会破坏既有外部 ABI 或接口约定时规则文档建议保留原拼写并对相应声明做 lint 抑制而不是强行改变函数选择器mixed-case-function.md。验证行为可直接参照 MixedCase.sol 中的PublicConstantGetters合约在自己的项目中对public与external常量 getter 各写一个用例运行forge lint观察是否如预期豁免。小结本次public-constant-getter-naming变更是一次聚焦的规则行为对齐forge的mixed-case-functionlint 现在对public view与external view的常量风格 getter 一视同仁。从 源码实现 到 测试数据仓库提供了完整的判定条件与边界用例开发者可以据此精确预判自己的合约代码在forge lint下是否会触发mixed-case-function告警并在必要时通过mixed_case_exceptions做细粒度配置。【免费下载链接】foundryFoundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.项目地址: https://gitcode.com/GitHub_Trending/fo/foundry创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表