Jshint: 制表符缩进打破了多个规则

创建于 2017-06-23  ·  29评论  ·  资料来源: jshint/jshint

似乎使用制表符的缩进打破了至少 3 条规则报告的位置,可能更多。

使用此.jshintrc文件对以下所有内容进行了 linted:

{
  "strict": "global",
  "unused": true
}

测试的 JSHint 版本是 v2.9.5。

如果您希望我将这些作为单独的问题重新归档,我也可以这样做。

W032

如果你 lint 这段代码:

'use strict';

    function foo() {
    };

foo();

第 4 行第 6 列报错,但第 4 行只有 4 个字符。

W098

如果你 lint 这段代码:

'use strict';

    function foobar(
        $foo
    ) {
        return 'foo';
    }

foobar();

第 4 行第 9 列报错,但第 4 行只有 7 个字符。

W117

如果你 lint 这段代码:

'use strict';

    function foobar() {
        if (true) {
            fun1();
        }
    }

foobar();

第 5 行第 13 列报错,但第 4 行只有 11 个字符。


报告的字符位置似乎越来越远,因为相关行开头的选项卡越多。

原始文件可以在这里找到: linter-jshint_GH416.zip

最初是在调查https://github.com/AtomLinter/linter-jshint/issues/416 时发现的。

已知受影响的规则:

  • W009
  • W014
  • E015
  • W024
  • W027
  • W030
  • W032
  • W033
  • W040
  • W043
  • W069
  • W075
  • W098
  • W116
  • W119
  • W140
  • E041
  • 很多其他的...
Needs Discussion

最有用的评论

请你所有的解决方案都糟透了,我过去他妈的花了 5 个小时试图清理一个该死的 JAVASCRIPT 文件,它该死的 2017 年为什么我有这个问题原子是我该死的生活的该死的祸根,你自己解决你愚蠢的想法

和谁他妈的不使用标签来缩进 WTF 为什么你要向数百万 LINT JS 发布一个损坏的包???????

所有29条评论

感谢您的报告! 问题源于lex.js的第 1610 行

this.input = this.input.replace(/\t/g, state.tab);

这对于实现了多少与样式相关的 linting 规则似乎非常重要。 这些已经被弃用了一段时间,但我们还没有准备好继续新的主要版本。 因此,与此同时,我们需要设计一个保留该行为的解决方案。

我最初的想法是将这个“有效偏移量”作为名为column的令牌对象的新属性来跟踪。 这可用于那些与样式相关的警告。 然后,可以重新实现character属性来描述“真实”字符偏移量,其中每个代码点(制表符或其他)将计数恰好增加 1。该值将用于发出警告。 Reporter 插件将控制它们如何呈现制表符,并且它们可以相应地解释报告的“列”编号。

@Arcanemagus 对你来说听起来不错吗?

这对我来说听起来很完美,至少在表面上没有真正了解 JSHint 的内部结构😛。 理想情况下,我只需要一些获取真实列数的方法(每个代码点都算作一列)。

由于一些带有半常见错误的旧解析器错误的解决方法,这个警告基本上被忽略了,这被隐藏了一段时间。 当我以一种更好的方式重新向用户发出警告时,我不小心将他们隐藏了起来,最近刚刚修复了它,让它再次可见。

看起来W030W033W009也受到影响。 根据您的描述,我假设 _all_ 规则受到影响?

我也遇到了这个问题,并且能够复制错误和警告。 规则/错误类型似乎无关紧要。

这是一个 jshint 试图警告我的示例,我的 '==' 应该是 '==='。 注意橙色下划线的错误位置:
erroneoustargeting

希望这能证实您对这个问题的看法。

我今天有时间做一些挖掘工作,我相信将indent选项设置为1会产生预期的结果。

@Arcanemagus您是否能够为您的消费者覆盖indent选项的价值? 如果这是可能的,我宁愿这样做,因为我不确定更改 JSHint 本身的默认值会如何影响它的消费者。

嗯,目前这个项目使用它看起来的 CLI 界面。 可以重写它以使用 Node.js API,这将使这成为可能。

  • 强制indent值会改变消费者看到的结果吗? 该软件包的目标是尽可能接近自己运行jshint ,但将结果集成到编辑器中。
  • JSHint API 是否有一个隐藏的方法来获取文件的配置,还是需要实现? 当前的文档没有显示这样的功能。

添加一个允许覆盖配置值的命令行参数怎么样?
类似的东西在 nginx 中的 -g、ssh 中的 -o、git 中的 -c 等工具中很常见,我猜还有更多。

$ jshint -o "indent = 1" -o "-W034 = true" -o "globals.require = false" -o "globals.$ = null"

有谁知道这是在哪个版本中引入的? 2.9.5?

至少那时我们可以暂时降级为临时工。 使固定。

@jaredatch回到https://github.com/AtomLinter/linter-jshint/pull/386 (在linter-jshint的 v3.1.0 中发布)所有 JSHint 错误点报告的解决方法都被删除了。 该检查的全部目的是找到像这样的错误,即 linter 报告无效点,以便可以使用 linter 为_每个人_报告和修复它。 (毕竟,如果你不能相信 linter 能给你准确的数据,为什么要使用它?)

在引入此选项卡错误之前以及导致首先实施这些变通办法的主要解析器错误之后,_可能_有一个“最佳位置”。

@Arcanemagus gotcha ,非常感谢您的洞察力。 继续伟大的工作👍

如果您对linter-jshint如何报告这些无效点有更好/更有用的消息想法,请随时提交问题/在那里提交 PR 😉。

请你所有的解决方案都糟透了,我过去他妈的花了 5 个小时试图清理一个该死的 JAVASCRIPT 文件,它该死的 2017 年为什么我有这个问题原子是我该死的生活的该死的祸根,你自己解决你愚蠢的想法

和谁他妈的不使用标签来缩进 WTF 为什么你要向数百万 LINT JS 发布一个损坏的包???????

谁不按字面意思使用句号,为什么您将这种破碎的英语发布给数以百万计的英语?

哦。 大写字符位于句子的开头。 不是到处都是。

/巨魔(对不起,忍不住)

好吧,我想解决方案将暂时停用它......
谁还需要短绒?

@jugglinmike你能回答https://github.com/jshint/jshint/issues/3151#issuecomment -312512856 中的问题吗?

对于触发此事件的不同情况,我有 20 个独特的问题未解决,因为看起来在这里修复此问题需要一段时间我想继续解决此问题,假设它不会改变用户的结果。

这个问题从我的雷达上消失了; 对此我很抱歉,@Arcanemagus。 不幸的是,我认为直到本周末我才能给予它应有的关注。 这对你有用吗?

@jugglinmike当然😉

我对现有问题进行了一些检查,因此在大多数情况下,人们被过滤到指向此处的已经打开的问题。

@cobexer我喜欢这个主意,因为除了给我们提供了前进的方向之外,它
在其他情况下可能对人们有用。 也就是说,据我所知
从来没有要求过那种功能,我也不愿意
承诺任何新功能只是因为它看起来不错。 而且有理由
特别不鼓励该功能:在“rc”文件之间,内联
配置和 Node.js API,用户已经在他们想要的时候被绊倒了
了解为什么启用给定选项。 为配置添加另一个向量
管理往往会加剧这个问题。

我认为这里最可行的解决方案是基于我之前的建议
但是,我们必须将character属性视为公共 API——Atom
毕竟,编辑器插件本身就是建立在它之上的。 所以而不是修改那个
我认为属性并定义一个具有当前语义的新属性
我们需要保留character并在新的
属性名称。

这个周末我开始研究这个新功能。 我想避免回归
所有成本,因此我们需要扩展项目的测试以始终如一地断言
预期的字符数。 当我开始这样做时,我发现了
需要首先解决的测试套件。 gh-3174 是迈向的第一步
那个目标。

这就是说:看起来这可能需要一些时间。 @Arcanemagus我知道
你首当其冲受到这个错误的影响,我很感激你把它当作一个
有机会看到 JSHint 得到改进。 我也喜欢你有兴趣
避免任何对您的用户不透明的解决方案。 简而言之
术语,您有没有运气推荐用户将indent选项设置为1
这并不理想,但这样做应该以某种方式解决他们的短期问题
即使我们修复了这个问题,它也将继续工作。

@Arcanemagus我知道你首当其冲受到这个错误的影响,我很感激你把它当作一个
有机会看到 JSHint 得到改进。

我将检查添加到大多数 Linter 提供程序用于 Atom 的通用库中的全部原因是这样的错误可以在源 linter 中捕获并报告/修复😉。 这实际上会更早被捕获,但是当解析器在大多数文档上完全失败并且我们没有很好的报告方式时, linter-jshint中的检查基本上隐藏了所有无效点错误。给用户或删除重复的问题报告。 既然这些都已经弄清楚了,我删除了那张支票,我们到了😛。

我也喜欢您有兴趣避免任何对您的用户不透明的解决方案。

实际上,针对此特定问题的透明解决方案会很好,我只是不知道将indent设置强制为1是否会改变他们看到的结果与他们从中获得的结果相比自己运行jshint

在短期内,你有没有运气推荐用户将缩进选项设置为 1?

那是……一个绝妙的主意,我实际上没有想过在这些问题上发布。 我一定会在更多评论的问题中提到这一点!

哦,是的,在 .jshintrc 中将 'indent' 属性设置为 1 是一个很好的解决方法。 我希望我能早点知道。 我已经有一个 .jshintrc 因为 jshint 不默认为 es6,所以添加起来很简单。 👍

很高兴听到这个消息,@tustin2121!

更新:我仍在努力支持 JSHint 测试套件以避免回归。 最新的努力是 gh-3176。

关于这个问题的任何更新?
image

看起来我们现在至少有 40 条不同的规则受此错误影响😛。

对此的任何更新,自从我遇到这个错误以来已经有几个月了,让我发疯:)

嗨@xcrap! 我刚刚检查了评论线程,似乎没有人发布任何更新。 好消息是 JSHint 是一个开源项目,所以如果它给您带来压力,您可以帮助解决问题! 你愿意伸出援手吗? 我很乐意为您提供建议。

@jugglinmike我希望! 我总是尝试小型项目,但我的 js 技能非常基础且有限:)

我为此错误设置了 50 美元的赏金,其他人可以通过此链接增加赏金: https ://www.bountysource.com/issues/46533252-tab-indentation-breaks-multiple-rules

如果其他人遇到此问题,则在本地引入 @tzvipm的 fork 并重建 jshint 可以为我解决问题:

git clone https://github.com/tzvipm/jshint
git remote add upstream [email protected]:jshint/jshint.git
git fetch upstream
git stash
git merge upstream/master
git mergetool --tool=opendiff
npm run build
此页面是否有帮助?
0 / 5 - 0 等级