Jshint: المسافة البادئة لعلامة الجدولة تخرق قواعد متعددة

تم إنشاؤها على ٢٣ يونيو ٢٠١٧  ·  29تعليقات  ·  مصدر: jshint/jshint

يبدو أن المسافة البادئة باستخدام علامات التبويب تكسر الموضع الذي تم الإبلاغ عنه بواسطة 3 قواعد على الأقل ، وربما أكثر.

تم فحص كل ما يلي باستخدام هذا الملف .jshintrc :

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

نسخة JSHint التي تم اختبارها هي v2.9.5.

إذا كنت تريد مني إعادة صياغة هذه القضايا باعتبارها قضايا منفصلة ، فيمكنني القيام بذلك أيضًا.

W032

إذا قمت بفحص هذا الرمز:

'use strict';

    function foo() {
    };

foo();

تم الإبلاغ عن خطأ في السطر 4 ، العمود 6 ، لكن السطر 4 يحتوي على 4 أحرف فقط.

W098

إذا قمت بفحص هذا الرمز:

'use strict';

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

foobar();

تم الإبلاغ عن خطأ في السطر 4 ، العمود 9 ، لكن السطر 4 يحتوي على 7 أحرف فقط.

W117

إذا قمت بفحص هذا الرمز:

'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 لماذا أعاني من هذه المشكلة هو الحظر المريع لحياتي المتعثرة ، إصلاح هويتك

ومن الذي لا يستخدمه الفاسق للتعبير عن مسافة بادئة حرفياً لماذا ستطلق حزمة مكسورة إلى الملايين التي تربط شبيبة ؟؟؟؟؟؟؟

ال 29 كومينتر

شكرا على التقرير! تنبع المشكلة من السطر 1610 من lex.js :

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

يبدو هذا أمرًا أساسيًا إلى حد كبير بالنسبة لعدد قواعد الفحص المتعلقة بالأسلوب التي يتم تنفيذها. لقد تم إهمال هذه لبعض الوقت الآن ، لكننا ما زلنا غير مستعدين للانتقال إلى إصدار رئيسي جديد. لذا في هذه الأثناء ، سنحتاج إلى تصميم حل يحافظ على هذا السلوك.

كان تفكيري المبدئي هو تتبع هذا "الإزاحة الفعالة" كخاصية جديدة لكائن الرمز المميز المسمى column . يمكن استخدام هذا مع تلك التحذيرات المتعلقة بالأسلوب. بعد ذلك ، يمكن إعادة تطبيق السمة character لوصف إزاحة الحرف "true" ، حيث تزيد كل نقطة رمز (علامة تبويب أو غير ذلك) العدد بمقدار 1. سيتم استخدام هذه القيمة لإصدار تحذيرات. عندئذٍ تتحكم المكونات الإضافية لـ Reporter في كيفية عرض حرف الجدولة ، ويمكنها تفسير رقم "العمود" الذي تم الإبلاغ عنه وفقًا لذلك.

هل هذا يبدو جيدًا بالنسبة لك ،Arcanemagus؟

يبدو هذا مثاليًا بالنسبة لي ، على الأقل على السطح مع عدم وجود معرفة حقيقية بأجزاء JSHint الداخلية 😛. من الناحية المثالية ، أنا فقط بحاجة إلى طريقة ما للحصول على عدد الأعمدة الحقيقي (حيث يتم احتساب كل نقطة رمز كعمود واحد).

تم إخفاء هذا لفترة من الوقت بسبب هذا التحذير الذي تم تجاهله بشكل أساسي بسبب حل بديل لبعض أخطاء المحلل اللغوي القديمة مع وجود خطأ شبه شائع. عندما أعدت تنفيذ التحذير للمستخدمين بطريقة أفضل بكثير ، قمت بإخفائهم عن طريق الخطأ ، وقمت مؤخرًا بإصلاحه لجعل هذا مرئيًا مرة أخرى.

يبدو أن W030 و W033 و W009 قد تأثروا أيضًا. من وصفك أفترض أن القواعد _all_ قد تأثرت؟

أواجه هذه المشكلة أيضًا وأنا قادر على التكرار في كل من الأخطاء والتحذيرات. يبدو أن نوع القاعدة / الخطأ لا يهم.

إليك مثال على محاولة jshint تحذيري بأن '==' يجب أن يكون '==='. لاحظ الموقع الخاطئ للتسطير البرتقالي:
erroneoustargeting

نأمل أن هذا يؤكد أفكارك حول هذه القضية.

لقد حصلت على بعض الوقت للقيام ببعض التنقيب اليوم ، وأعتقد أن تعيين الخيار indent على 1 سيؤدي إلى النتائج المرجوة.

Arcanemagus هل أنت قادر على تجاوز قيمة الخيار indent لعملائك؟ إذا كان هذا ممكنًا ، فأنا أفضل القيام بذلك ، لأنني لست متأكدًا من كيفية تغيير القيمة الافتراضية في JSHint نفسها يمكن أن يؤثر على المستهلكين.

عفوًا ، يستخدم هذا المشروع حاليًا واجهة CLI التي تبدو عليها. من الممكن إعادة كتابته لاستخدام Node.js API مما يجعل ذلك ممكنًا.

  • هل سيؤدي فرض قيمة indent إلى تغيير النتائج التي يراها المستهلكون؟ الهدف من هذه الحزمة هو أن تكون أقرب ما يمكن من تشغيل jshint بأنفسهم ، ولكن الحصول على النتائج مدمجة في المحرر.
  • هل لدى JSHint API طريقة مخفية للاستيلاء على التكوين لملف ، أو هل يحتاج إلى التنفيذ؟ الوثائق الحالية لا تظهر مثل هذه الوظيفة.

ماذا عن إضافة وسيطة سطر الأوامر التي تسمح لتجاوز القيم من التكوين؟
شيء من هذا القبيل شائع في أدوات مثل -g في nginx و -o في ssh و -c في git وغيرها الكثير على ما أعتقد.

$ 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 (تم إصداره في v3.1.0 من linter-jshint ) تمت إزالة جميع الحلول لتقارير JSHint's buggy point. الهدف الكامل من هذا الفحص هو العثور على أخطاء مثل هذه حيث يقوم linter بالإبلاغ عن نقاط غير صالحة حتى يمكن الإبلاغ عنها وإصلاحها لكل شخص باستخدام linter. (بعد كل شيء ، إذا كنت لا تثق في linter لمنحك بيانات دقيقة ، فلماذا تستخدمها؟)

قد يكون هناك "نقطة جيدة" قبل ظهور خطأ علامة التبويب هذا وبعد أخطاء المحلل اللغوي الرئيسية التي تسببت في وضع هذه الحلول في مكانها في المقام الأول.

Arcanemagus مسكتك ، حقًا أقدر البصيرة. استمروا في العمل الرائع 👍

إذا كانت لديك فكرة رسالة أفضل / أكثر فائدة حول كيفية قيام linter-jshint بالإبلاغ عن هذه النقاط غير الصالحة ، فلا تتردد في تقديم مشكلة / إرسال PR هناك 😉.

يرجى جميع الحلول الخاصة بك ، لقد أمضيت آخر 5 ساعات في محاولة ربط ملف JAVASCRIPT اللعين في 2017 لماذا أعاني من هذه المشكلة هو الحظر المريع لحياتي المتعثرة ، إصلاح هويتك

ومن الذي لا يستخدمه الفاسق للتعبير عن مسافة بادئة حرفياً لماذا ستطلق حزمة مكسورة إلى الملايين التي تربط شبيبة ؟؟؟؟؟؟؟

من لا يستخدم الفترات حرفيا مع لماذا تطلق هذه اللغة الإنجليزية المكسورة للملايين التي هي الإنجليزية؟

أوه. وتبدأ الأحرف الكبيرة في بداية الجملة. ليس في كل مكان.

/ ترول (آسف ، لم أستطع مساعدة نفسي)

حسنًا ، أعتقد أن الحل سيكون إلغاء تنشيط هذا في الوقت الحالي ...
من يحتاج لينت على أي حال؟

jugglinmike هل يمكنك الإجابة على الأسئلة في https://github.com/jshint/jshint/issues/3151#issuecomment -312512856؟

لدي 20 مشكلة فريدة مفتوحة لحالات مختلفة من هذه المشكلة ، حيث يبدو أن إصلاح هذا هنا سيستغرق بعض الوقت أود المضي قدمًا في الحل البديل ، على افتراض أنه لن يغير النتائج للمستخدمين.

هذه القضية تراجعت عن الرادار. أنا آسف لذلك ،Arcanemagus. لسوء الحظ ، لا أعتقد أنني سأكون قادرًا على إعطاء هذا الاهتمام الذي يستحقه حتى نهاية هذا الأسبوع. والتي تعمل من أجلك؟

تضمين التغريدة

لقد قمت بإجراء بعض عمليات التحقق من المشكلات الحالية ، لذلك يتم تصفية معظم الأشخاص إلى المشكلات المفتوحة بالفعل والتي تشير هنا.

cobexer تعجبني هذه الفكرة لأنها بالإضافة إلى منحنا طريقة للمضي قدمًا
قد يكون مفيدًا للأشخاص في سياقات أخرى. قال ذلك ، على حد علمي هناك
لم يكن أبدًا طلبًا لهذا النوع من الوظائف ، وأنا متردد في ذلك
الالتزام بأي ميزة جديدة لمجرد أنها تبدو لطيفة. وهناك سبب لذلك
تثبيط هذه الميزة على وجه الخصوص: بين ملفات "rc" ، في السطر
التكوين ، وواجهة برمجة تطبيقات Node.js ، يتعطل المستخدمون بالفعل عندما يريدون
لفهم سبب تمكين خيار معين. إضافة متجه آخر لـ config
تميل الإدارة إلى تفاقم هذه المشكلة.

أعتقد أن الحل الأكثر قابلية للتطبيق هنا يعتمد على ما قدمته سابقًااقتراح .
ومع ذلك ، يجب أن نعتبر الخاصية character واجهة برمجة تطبيقات عامة - وهي Atom
البرنامج المساعد المحرر هو نفسه مبني عليه ، بعد كل شيء. لذلك بدلا من تعديل ذلك
الخاصية وتحديد واحدة جديدة لها دلالات التيار ، على ما أعتقد
نحتاج إلى ترك character كما هو وفضح البيانات المطلوبة في ملف
اسم الخاصية.

لقد بدأت العمل على الميزة الجديدة في نهاية هذا الأسبوع. أريد تجنب الانحدارات في
جميع التكاليف ، لذلك نحن بحاجة إلى تمديد اختبارات المشروع لتأكيد باستمرار
رقم الحرف المتوقع. عندما بدأت في القيام بذلك ، وجدت أوجه قصور في
مجموعة الاختبار التي يجب معالجتها أولاً. تعتبر gh-3174 الخطوة الأولى نحو تنسيق
هذا الهدف.

كل هذا يعني: يبدو أن هذا قد يستغرق بعض الوقت. تضمين التغريدة
أنت تتحمل العبء الأكبر من هذا الخطأ ، وأنا أقدر أنك تأخذ هذا على أنه
فرصة لرؤية تحسين JSHint. أنا أيضا أحب أن كنت مهتما في
تجنب أي حل غير شفاف للمستخدمين. باختصار
مصطلح ، هل كان لديك أي حظ في التوصية للمستخدمين بتعيين الخيار indent على 1 ؟
إنه ليس مثاليًا ، لكن القيام بذلك يجب أن يحل مشكلتهم قصيرة المدى بطريقة ما
التي ستستمر في العمل حتى بعد تصحيح هذا الأمر.

Arcanemagus أعلم أنك تتحمل العبء الأكبر من هذا الخطأ ، وأنا أقدر أنك تأخذ هذا على أنه
فرصة لرؤية تحسين JSHint.

السبب الكامل لإضافة الشيك إلى المكتبة العامة التي يستخدمها معظم مزودي Linter لـ Atom هو أن مثل هذه الأخطاء يمكن اكتشافها في linters المصدر والإبلاغ عنها / إصلاحها 😉. كان من الممكن أن يتم اكتشاف هذا مسبقًا ، ولكن كان هناك شيك في linter-jshint أخفى بشكل أساسي جميع أخطاء النقاط غير الصالحة من _way_ مرة أخرى عندما فشل المحلل اللغوي تمامًا في معظم المستندات ولم يكن لدينا طريقة جيدة للإبلاغ عنها للمستخدمين أو إلغاء تكرار تقارير المشكلات. الآن وقد تم اكتشاف ذلك ، قمت بإزالة هذا الشيك وها نحن ذا 😛.

يعجبني أيضًا أنك مهتم بتجنب أي حل غير شفاف لمستخدميك.

في الواقع ، سيكون الحل الشفاف لهذه المشكلة بالذات جيدًا ، ولا أعرف ما إذا كان فرض إعداد indent على 1 سيغير النتائج التي يشاهدونها مقارنة بما سيحصلون عليه. تشغيل jshint بأنفسهم.

على المدى القصير ، هل كان لديك أي حظ في توصية المستخدمين بتعيين خيار المسافة البادئة على 1؟

هذه ... فكرة ممتازة لم أفكر في نشرها في هذه القضايا. سوف أتأكد من ذكر ذلك في المزيد من التعليقات على القضايا!

أوه ، نعم ، يعد تعيين خاصية "المسافة البادئة" على 1 في .jshintrc حلاً ممتازًا. أتمنى لو علمت بذلك عاجلاً. لدي بالفعل ملف .jshintrc لأن jshint لا يكون افتراضيًا على es6 ، لذلك من السهل إضافته. 👍

سعيد لسماع ذلك ، @ tustin2121!

تحديث: ما زلت أعمل على دعم مجموعة اختبار JSHint لتجنب الانحدارات. آخر جهد في هذا الجهد هو gh-3176.

أي تعديل حدث في هذه القضية؟
image

يبدو أننا على الأقل 40 قاعدة مختلفة متأثرة بهذا الخطأ الآن 😛.

أي تحديثات على هذا ، مرت بضعة أشهر منذ أن أواجه هذه الأخطاء ، مما جعلني أشعر بالجنون :)

مرحباxcrap! لقد راجعت للتو سلسلة التعليقات ، ولا يبدو أن أي شخص قد نشر أي تحديثات. الخبر السار هو أن JSHint هو مشروع مفتوح المصدر ، لذا يمكنك المساعدة في حل المشكلة إذا كانت تسبب لك التوتر! هل ترغب في مد يد المساعدة؟ يسعدني أن أنصحك.

تضمين التغريدة أحاول دائمًا في مشاريع صغيرة ولكن مهاراتي js أساسية للغاية ومحدودة :)

لقد وضعت مكافأة قدرها 50 دولارًا على هذا الخطأ ، يمكن للآخرين المساهمة في زيادة المكافأة عبر هذا الرابط: https://www.bountysource.com/issues/46533252-tab-indentation-breaks-multiple-rules

عمل سحب مفترق tzvipm محليًا وإعادة بناء 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 التقييمات