如何在嗅探中创建多个 USE 语句

How to create multiple USE statements in sniff

我正在为 PHP_CodeSniffer 3.x 嗅探。例如,class 声明 class NoInlineFullyQualifiedClassNameUnitTestInc extends \PSR2R\Base\AbstractBase 应拆分为 usesclass AbstractBase。嗅探检测到方法签名的类似问题。

我认为问题是我在同一行生成并插入多个 use 语句(即,相同的标记),但是在单独的 fixer->beginChangeset() ... fixer->endChangeset() 序列。修复程序将对同一令牌的多组更改视为冲突,事情变得混乱(和错误)。

GitHub 问题在这里:https://github.com/php-fig-rectified/psr2r-sniffer/issues/9

有没有人知道如何为最新的 3.x CodeSniffer 编写自定义嗅探器?

问题是多个嗅探器(修正器)变更集编辑同一个标记。通过收集 USE 语句列表并将它们插入到 Sniff 处理的末尾,我能够让 Sniff 工作。

我通过从最后一个标记向后搜索以找到已注册标记列表的第一个标记来确定处理结束。

编辑: 这是嗅探:https://github.com/php-fig-rectified/psr2r-sniffer/blob/master/PSR2R/Sniffs/Namespaces/NoInlineFullyQualifiedClassNameSniff.php

您也可以使用SlevomatCodingStandard\Sniffs\Namespaces\ReferenceUsedNamesOnlySniff

变成这个

进入这个


如何使用?

最好是像这样与 EasyCodingStandard 一起使用:

# easy-coding-standard.neon
checkers:
    - SlevomatCodingStandard\Sniffs\Namespaces\ReferenceUsedNamesOnlySniff

安装它:

composer require --dev symplify\easy-coding-standard 

运行它:

vendor/bin/ecs check src

修复它:

vendor/bin/ecs check src --fix

尽情享受,让我知道它是如何为您服务的。

如果有什么麻烦,就create an issue here。我很乐意尽可能地改进这个工具。